UK8S Ingress 配置

UK8S Ingress 配置

參照 UK8S nginx ingress 配置

kubectl apply -f http://uk8s.cn-bj.ufileos.com/yaml/ingress/nginx/mandatory.yaml

在上述文章第二步的時候,參照 通過外網(wǎng)ULB訪問Service,在 yaml 中添加關(guān)于 ULB 配置的聲明,
具體例如如下:

apiVersion: v1
kind: Service
metadata:
  name: ingress-nginx
  namespace: ingress-nginx
  annotations:
    service.beta.kubernetes.io/ucloud-load-balancer-id: "ulb-xxx"
    service.beta.kubernetes.io/ucloud-load-balancer-vserver-protocol: "TCP"
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
spec:
  type: LoadBalancer
  ports:
    - name: http
      port: 80
      targetPort: 80
      protocol: TCP
    - name: https
      port: 443
      targetPort: 443
      protocol: TCP
  selector:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx

上面是TCP L4層的代理,沒有搞L7,因為存在不同namespace下,需要用到不同 https 證書, 的場景,我們后續(xù)會使用 cert-manager 來解決 https 證書問題。

Nginx 配置

由于特定業(yè)務(wù)的特殊需求,需要對 Nginx 進(jìn)行特殊配置,例如增大客戶端允許上傳數(shù)據(jù)的大小??蓞⒖次臋n Annotation-NGINX Ingress Controller

Multi Ingress

以上是外網(wǎng) Ingress 配置,我們還需要個內(nèi)網(wǎng) ingress 配置,解決思路有兩種,1種是切換另一種 ingress,還有一種是繼續(xù)使用 nginx ingress。我們選擇第二種方案,方便維護(hù)。

具體來講,就是對 http://uk8s.cn-bj.ufileos.com/yaml/ingress/nginx/mandatory.yaml 進(jìn)行定制??蓞⒄?Google Multi Nginx-ingress 文檔,具體步驟如下:

1. 修改 外網(wǎng) Nignx Controller 配置

  1. 給 外網(wǎng) Nignx Controller 添加 Label, 方便和內(nèi)網(wǎng)區(qū)分開來,如: ingress-type: outer
  2. 給 外網(wǎng) Ingress 添加 Selector, 內(nèi)容為第一步多加的 Label

2. 修改 Role 配置

nginx-ingress-roleresourceNames 添加一行 ingress-controller-leader-internal-nginx。
使得先前創(chuàng)建的 nginx-ingress-serviceaccount 可以操縱將要創(chuàng)建的 internal-nginx。

3. 部署 internal-nginx-controller

kind: ConfigMap
apiVersion: v1
metadata:
  name: internal-nginx-configuration
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx

---
kind: ConfigMap
apiVersion: v1
metadata:
  name: internal-tcp-services
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx

---
kind: ConfigMap
apiVersion: v1
metadata:
  name: internal-udp-services
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: internal-nginx-ingress-controller
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app.kubernetes.io/name: ingress-nginx
      app.kubernetes.io/part-of: ingress-nginx
  template:
    metadata:
      labels:
        app.kubernetes.io/name: ingress-nginx
        app.kubernetes.io/part-of: ingress-nginx
        ingress-type: inner
      annotations:
        prometheus.io/port: "10254"
        prometheus.io/scrape: "true"
    spec:
      serviceAccountName: nginx-ingress-serviceaccount
      containers:
        - name: internal-nginx-ingress-controller
          image: uhub.service.ucloud.cn/library/nginx-ingress-controller:0.23.0
          args:
            - /nginx-ingress-controller
            - --configmap=$(POD_NAMESPACE)/internal-nginx-configuration
            - --tcp-services-configmap=$(POD_NAMESPACE)/internal-tcp-services
            - --udp-services-configmap=$(POD_NAMESPACE)/internal-udp-services
            - --publish-service=$(POD_NAMESPACE)/internal-ingress-nginx
            - --ingress-class=internal-nginx
            - --annotations-prefix=nginx.ingress.kubernetes.io
          securityContext:
            allowPrivilegeEscalation: true
            capabilities:
              drop:
                - ALL
              add:
                - NET_BIND_SERVICE
            # www-data -> 33
            runAsUser: 33
          env:
            - name: POD_NAME
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name
            - name: POD_NAMESPACE
              valueFrom:
                fieldRef:
                  fieldPath: metadata.namespace
          ports:
            - name: http
              containerPort: 80
            - name: https
              containerPort: 443
          livenessProbe:
            failureThreshold: 3
            httpGet:
              path: /healthz
              port: 10254
              scheme: HTTP
            initialDelaySeconds: 10
            periodSeconds: 10
            successThreshold: 1
            timeoutSeconds: 10
          readinessProbe:
            failureThreshold: 3
            httpGet:
              path: /healthz
              port: 10254
              scheme: HTTP
            periodSeconds: 10
            successThreshold: 1
            timeoutSeconds: 10
---
apiVersion: v1
kind: Service
metadata:
  name: internal-ingress-nginx
  namespace: ingress-nginx
  annotations:
    service.beta.kubernetes.io/ucloud-load-balancer-id: "ulb-xxx"
    service.beta.kubernetes.io/ucloud-load-balancer-vserver-protocol: "TCP"
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
spec:
  type: LoadBalancer
  ports:
    - name: http
      port: 80
      targetPort: 80
      protocol: TCP
    - name: https
      port: 443
      targetPort: 443
      protocol: TCP
  selector:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
    ingress-type: inner

這個 yaml 對比老的來說,修改點有:

  1. nginx-ingress-controller 的 args、label 和 名稱 ,尤其是 --ingress-class=internal-nginx, Ingress 要用到,前面的 nginx-ingress-role 的修改也和它有關(guān)聯(lián)。
  2. service 對應(yīng)的內(nèi)網(wǎng)ULB ID,以及 selector 里的 ingress-type: inner
  3. ConfigMap 的名稱,如果你想內(nèi)外網(wǎng)都用統(tǒng)一的配置,也可以不改。

Ingress 區(qū)分使用

以上配置默認(rèn)會使用外網(wǎng)Ingress Controller,
內(nèi)網(wǎng) Ingress 的 Annotation 里面要添加 kubernetes.io/ingress.class: internal-nginx, 才能告知 內(nèi)網(wǎng)Ingress Controller 如何 forward 流量。

獲取客戶端IP

參考 UCloud 文檔: https://docs.ucloud.cn/compute/uk8s/service/getresourceip

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容