在同一個k8s集羣,定義多個ingress nginx實例

這個網上有一些參考,

最終我都測試在成功,並運用到在公司了。

作一個記錄.

============================

概念

ingress可以簡單理解爲serviceservice,他通過獨立的ingress對象來制定請求轉發的規則,把請求路由到一個或多個service中。這樣就把服務與請求規則解耦了,可以從業務維度統一考慮業務的暴露,而不用爲每個service單獨考慮。

ingress可以簡單理解爲serviceservice,他通過獨立的ingress對象來制定請求轉發的規則,把請求路由到一個或多個service中。這樣就把服務與請求規則解耦了,可以從業務維度統一考慮業務的暴露,而不用爲每個service單獨考慮。

在同一個k8s集羣裏,部署兩個ingress nginx。一個deploy部署給A的API網關項目用。另一個daemonset部署給其它項目作域名訪問用。這兩個項目的更新頻率和用法不一致,暫時不用合成一個。

 

 

 

 

方案

A項目組的,按標準的yaml文檔作部署。而更改daemonset的配置文件,讓其支持不同的ingress-class名稱。

 

步驟

  1.更新ingress-controller的啓動參數(yaml文件中)

  

containers:
        - name: nginx-ingress-controller
          image: harbor.demo.cn/3rd_part/nginx-ingress-controller:0.26.1
          args:
            - /nginx-ingress-controller
            - --configmap=$(POD_NAMESPACE)/nginx-configuration
            - --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services
            - --udp-services-configmap=$(POD_NAMESPACE)/udp-services
            - --annotations-prefix=nginx.ingress.kubernetes.io
            # - --publish-service=$(POD_NAMESPACE)/ingress-nginx
            - --report-node-internal-ip-address
            - --ingress-class=ngx-ds
            - --election-id=ingress-controller-leader-bg

 

  • λ--ingress-class=ngx-ds 當設置這個參數後只會Watch Ingress class ngx-ds
  • λ--election-id= ingress-controller-leader-bg 用於Ingress狀態更新的選舉ID。(默認ingress-controller-leader
  • λ--report-node-internal-ip-address 默認情況下是–publish-service但是在裸機部署的時候要使用kubectl get ingress無法顯示ADDRESS,所以我們需要使用–report-node-internal-ip-address參數
  • λ--publish-service=$(POD_NAMESPACE)/ingress-nginx 非公有云情況下使用kubectl get ingress無法顯示ADDRESS

  2.更新configmap對應的resourceName(yaml文件中)

apiVersion: rbac.authorization.k8s.io/v1beta1
kind: Role
metadata:
  name: nginx-ingress-role
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
rules:
  - apiGroups:
      - ""
    resources:
      - configmaps
      - pods
      - secrets
      - namespaces
    verbs:
      - get
  - apiGroups:
      - ""
    resources:
      - configmaps
    resourceNames:
      # Defaults to "-"
      # Here: "-"
      # This has to be adapted if you change either parameter
      # when launching the nginx-ingress-controller.
      # - "ingress-controller-leader-nginx"
      - "ingress-controller-leader-bg-ngx-ds"

 

  • λ注意:這裏的名稱是<election-id>-<ingress-class>拼接而成
  • λ此段主要是允許訪問一個叫ingress-controller-leader-ngx-dsconfigmap(通過RoleBinding綁定從而限制針對某一個命名空間中定義的一個ConfigMap實例的訪問)

3.更新ClusterRole對應的name(在yaml文件中)

---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRole
metadata:
  name: nginx-ingress-ds-clusterrole
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx

 

4.更新ClusterRoleBinding對應的roleRefName(在yaml文件中)

---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: nginx-ingress-clusterrole-ds-binding
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: nginx-ingress-ds-clusterrole
subjects:
  - kind: ServiceAccount
    name: nginx-ingress-serviceaccount
    namespace: ingress-nginx

      ##### 有了前面4步,纔可以讓ingress nginx在不同的namespace及cluster範圍內完全隔開。

      ##### 官網文檔,及網上大多數文檔,並未涉及第3,4兩步。我今天遇到rbac權限問題了。切記切記。

   5.應用到羣集

 

Kubectl apply -f (SIS-ITIL-INGRESS-NGX)

 

   6.更改Ingress配置文件,指向新的ingress實例。

---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: other-ngx-k8s
  namespace: other-ngx
  annotations:
    kubernetes.io/ingress.class: "ngx-ds"
spec:
  rules:
  - host: other-ngx-k8s.demo.com.cn
    http:
      paths:
      - path: /
        backend:
          serviceName: other-ngx-k8s-ngx-svc
          servicePort: 9001

 

  1.  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章