當前位置: 妍妍網 > 碼農

【運維幹貨分享】如何在 Kubernetes 上設定 Nginx Ingress controller – 詳細指南

2024-09-01碼農


在本全面的 Ingress 指南中,你將學習如何在 Kubernetes 上設定 Nginx Ingress controller並使用 DNS 配置Ingress 。

如果你想了解 Kubernetes Ingress 是如何工作的,請閱讀(我的上一篇文章) Kubernetes Ingress 教程。適合初學者。我已經解釋了所有Ingress 核心概念,包括 Ingress 物件如何與 Ingress controller配合使用。

有兩個 Nginx Ingress controller。

  • Kubernetes 社群的 Nginx Ingress controller

  • Nginx Inc 的 Nginx Ingress controller

  • 我們將使用 Kubernetes 社群 Nginx controller。

    Ingress & Nginx Ingress controller架構

    以下是使用 Nginx Ingress controller的 Kubernetes Ingress 的高級架構。在本指南中,我們將學習如何在架構中構建設定。

    (註:點選圖片以高分辨率檢視)

    Nginx Ingress Controller 部署架構

    先決條件

  • 1.Kubernetes 集群

  • 2.kubectl 實用程式並驗證了 Kubernetes 集群。

  • 3.對 kubernetes 集群的管理員存取許可權。

  • 4.指向Ingress controller負載均衡器 IP 的有效域。(可選)

  • 如果你在 Google Cloud 上嘗試此設定,請為你的帳戶分配管理員許可權以啟用集群角色。

    ACCOUNT=$(gcloud info --format='value(config.account)')
    kubectl create clusterrolebinding owner-cluster-admin-binding \
    --clusterrole cluster-admin \
    --user $ACCOUNT

    Nginx Ingress controller Kubernetes manifests

    本教程中使用的所有 kubernetes 清單都托管在 Github 儲存庫中(github.com/techiescamp/nginx-ingress-controller)。

    複制它,然後你可以按照指南直接部署 YAML 檔。這些清單取自官方 Nginx 社群儲存庫。

    git clone https://github.com/techiescamp/nginx-ingress-controller

    首先,我們將透過使用 YAML 清單部署 Nginx controller來了解所有相關的 Kubernetes 物件。一旦我們了解了,我們將使用 Helm Chart 進行部署。

    註意:如果你想了解所有的 Nginx Ingress controller物件以及它們之間的關系,我建議你從 repo 中單獨建立物件。了解其工作原理後,可以使用單個清單或 helm 圖表來部署它。

    如果要一次性部署所有物件,請在 termal 中開啟複制的儲存庫。

    cd 到 manifest 資料夾並執行以下命令。它將部署本部落格中介紹的所有清單。

    kubectl apply -f .

    使用 manifest 部署 nginx Ingress Controller

    我們需要部署以下 Kubernetes 物件才能擁有一個有效的 Nginx controller。

  • ingress-nginx名稱空間

  • Nginx admission controller的 service account/Roles/ClusterRoles

  • 驗證 Webhook 配置

  • 用於建立/更新 Webhook CA 捆綁包的作業

  • Nginx Controller deployment的 Service account/Roles/ClusterRoles

  • Nginx controller configmap

  • nginx controller和admission controller的Service

  • Ingress controller deployment

  • 註意:你可以自己建立所有清單,也可以使用 Github 儲存庫。但是,我強烈建議你仔細閱讀每個清單並了解你正在部署的內容。

    需要admission controller和驗證Webhook

    Kubernetes admission controller是一小段程式碼,用於在建立 Kubernetes 物件之前對其進行驗證或更新。在本例中,它是一個用於驗證 Ingress 物件的admission controller。admission Controller 程式碼是 Nginx controller的一部份,用於監聽 8443 埠

    為什麽需要 admission controller來 ingress?

    如果沒有admission controller,你可以部署可能包含錯誤配置的 Ingress 物件。錯誤的配置可能會破壞與 Ingress controller關聯的所有 Ingress 規則。

    使用admission controller後,如果部署配置錯誤的 Ingress 物件,它將引發錯誤。這樣,你可以確保你建立的 Ingress 物件具有正確的配置並且不會違反路由規則。

    以下是 Nginx 的admission controller是如何工作的。

    nginx Ingress controller驗證admission controller解釋
  • 1.當你部署Ingress YAML 時,驗證admission 會攔截請求。

  • 2.然後,Kubernetes API 根據admission Webhook 端點將Ingress 物件發送到驗證admission controller伺服端點。

  • 3.Service 將請求發送到埠 8443 上的 Nginx deployment,以驗證 Ingress 物件。

  • 4.然後,admission controller向 k8s API 發送響應。

  • 5.如果是有效響應,API 將建立 Ingress 物件。

  • 現在讓我們開始為 Ingress controller建立 Kubernetes 物件。

    註意:在以下部份中,你不一定必須復制和建立 YAML 檔。你可以直接使用儲存庫中的檔並部署它。我在這裏提供了完整的 YAML 以供參考。

    建立 Namespace

    我們將在名稱空間中部署所有 Nginx controller物件。ingress-nginx

    讓我們建立名稱空間。

    kubectl create ns ingress-nginx

    建立admission controller角色和服務帳戶

    我們需要一個具有所需許可權的 Role 和 ClusterRole 並繫結到 service account。ingress-nginx-admission

    建立一個名為admission-service-account.yaml的檔並復制以下內容。

    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
    labels:
    app.kubernetes.io/component: admission -webhook
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
    name: ingress-nginx-admission 
    namespace: ingress-nginx
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
    annotations:
    app.kubernetes.io/component: admission -webhook
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
    name: ingress-nginx-admission 
    namespace: ingress-nginx
    rules:
    - apiGroups:
    ""
    resources:
    - secrets
    verbs:
    - get
    - create
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
    labels:
    app.kubernetes.io/component: admission -webhook
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
    name: ingress-nginx-admission 
    namespace: ingress-nginx
    roleRef:
    apiGroup: rbac.authorization.k8s.io
    kind: Role
    name: ingress-nginx-admission 
    subjects:
    - kind: ServiceAccount
    name: ingress-nginx-admission 
    namespace: ingress-nginx

    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
    labels:
    app.kubernetes.io/component: admission -webhook
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
    name: ingress-nginx-admission 
    rules:
    - apiGroups:
    - admission registration.k8s.io
    resources:
    - validatingwebhookconfigurations
    verbs:
    - get
    - update
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
    labels:
    app.kubernetes.io/component: admission -webhook
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
    name: ingress-nginx-admission 
    roleRef:
    apiGroup: rbac.authorization.k8s.io
    kind: ClusterRole
    name: ingress-nginx-admission 
    subjects:
    - kind: ServiceAccount
    name: ingress-nginx-admission 
    namespace: ingress-nginx


    部署清單。

    kubectl apply -f admission -service-account.yaml 

    建立驗證 Webhook 配置

    建立一個名為validating-webhook.yaml的檔並復制以下內容。

    ---
    apiVersion: admission registration.k8s.io/v1
    kind: ValidatingWebhookConfiguration
    metadata:
    labels:
    app.kubernetes.io/component: admission -webhook
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
    name: ingress-nginx-admission 
    webhooks:
    - admission ReviewVersions:
    - v1
    clientConfig:
    service:
    name: ingress-nginx-controller-admission 
    namespace: ingress-nginx
    path: /networking/v1/ingresses
    failurePolicy: Fail
    matchPolicy: Equivalent
    name: validate.nginx.ingress.kubernetes.io
    rules:
    - apiGroups:
    - networking.k8s.io
    apiVersions:
    - v1
    operations:
    - CREATE
    - UPDATE
    resources:
    - ingresses
    sideEffects: None

    建立ValidatingWebhookConfiguration

    kubectl apply -f validating-webhook.yaml

    部署作業以更新 Webhook 證書

    只能透過 HTTPS 工作。因此,它需要一個 CA 捆綁包。ValidatingWebhookConfiguration

    我們使用 kube-webhook-certgen 為第一個作業生成 CA 證書包。生成的 CA 證書儲存在名為ingress-nginx-admission

    第二個任務使用 CA 捆綁包修補物件。ValidatingWebhookConfiguration

    建立一個名為jobs.yaml的檔並復制以下內容。

    ---
    apiVersion: batch/v1
    kind: Job
    metadata:
    labels:
    app.kubernetes.io/component: controller
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
    name: ingress-nginx-admission -create
    namespace: ingress-nginx
    spec:
    template:
    metadata:
    labels:
    app.kubernetes.io/component: controller
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
    name: ingress-nginx-admission -create
    spec:
    containers:
    - args:
    - create
    - --host=ingress-nginx-controller-admission ,ingress-nginx-controller-admission .$(POD_NAMESPACE).svc
    - --namespace=$(POD_NAMESPACE)
    - --secret-name=ingress-nginx-admission 
    env:
    - name: POD_NAMESPACE
    valueFrom:
    fieldRef:
    fieldPath: metadata.namespace
    image: registry.k8s.io/ingress-nginx/kube-webhook-certgen:v20231011-8b53cabe0
    imagePullPolicy: IfNotPresent
    name: create
    securityContext:
    allowPrivilegeEscalation: false
    nodeSelector:
    kubernetes.io/os: linux
    restartPolicy: OnFailure
    securityContext:
    runAsNonRoot: true
    runAsUser: 2000
    serviceAccountName: ingress-nginx-admission 
    ---
    apiVersion: batch/v1
    kind: Job
    metadata:
    labels:
    app.kubernetes.io/component: admission -webhook
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
    name: ingress-nginx-admission -patch
    namespace: ingress-nginx
    spec:
    template:
    metadata:
    labels:
    app.kubernetes.io/component: admission -webhook
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
    name: ingress-nginx-admission -patch
    spec:
    containers:
    - args:
    - patch
    - --webhook-name=ingress-nginx-admission 
    - --namespace=$(POD_NAMESPACE)
    - --patch-mutating=false
    - --secret-name=ingress-nginx-admission 
    - --patch-failure-policy=Fail
    env:
    - name: POD_NAMESPACE
    valueFrom:
    fieldRef:
    fieldPath: metadata.namespace
    image: registry.k8s.io/ingress-nginx/kube-webhook-certgen:v20231011-8b53cabe0
    imagePullPolicy: IfNotPresent
    name: patch
    securityContext:
    allowPrivilegeEscalation: false
    nodeSelector:
    kubernetes.io/os: linux
    restartPolicy: OnFailure
    securityContext:
    runAsNonRoot: true
    runAsUser: 2000
    serviceAccountName: ingress-nginx-admission 

    建立任務

    kubectl apply -f jobs.yaml

    使用以下命令驗證作業完成情況。

    kubectl get jobs -n ingress-nginx

    執行作業後,你可以描述 ,你將看到修補的捆綁包。ValidatingWebhookConfigurationand

    kubectl describe ValidatingWebhookConfiguration ingress-nginx-admission 

    建立Ingress controller角色和服務帳戶

    建立一個名為ingress-service-account.yaml的檔並復制以下內容。

    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
    labels:
    app.kubernetes.io/component: admission -webhook
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
    name: ingress-nginx
    namespace: ingress-nginx
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
    labels:
    app.kubernetes.io/component: controller
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
    name: ingress-nginx
    namespace: ingress-nginx
    rules:
    - apiGroups:
    ""
    resources:
    - namespaces
    verbs:
    - get
    - apiGroups:
    ""
    resources:
    - configmaps
    - pods
    - secrets
    - endpoints
    verbs:
    - get
    - list
    - watch
    - apiGroups:
    ""
    resources:
    - services
    verbs:
    - get
    - list
    - watch
    - apiGroups:
    - networking.k8s.io
    resources:
    - ingresses
    verbs:
    - get
    - list
    - watch
    - apiGroups:
    - networking.k8s.io
    resources:
    - ingresses/status
    verbs:
    - update
    - apiGroups:
    - networking.k8s.io
    resources:
    - ingress classes
    verbs:
    - get
    - list
    - watch
    - apiGroups:
    ""
    resourceNames:
    - ingress-controller-leader
    resources:
    - configmaps
    verbs:
    - get
    - update
    - apiGroups:
    ""
    resources:
    - configmaps
    verbs:
    - create
    - apiGroups:
    ""
    resources:
    - events
    verbs:
    - create
    - patch
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
    labels:
    app.kubernetes.io/component: controller
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
    name: ingress-nginx
    namespace: ingress-nginx
    roleRef:
    apiGroup: rbac.authorization.k8s.io
    kind: Role
    name: ingress-nginx
    subjects:
    - kind: ServiceAccount
    name: ingress-nginx
    namespace: ingress-nginx
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
    labels:
    app.kubernetes.io/component: controller
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
    name: ingress-nginx
    rules:
    - apiGroups:
    ""
    resources:
    - configmaps
    - endpoints
    - nodes
    - pods
    - secrets
    - namespaces
    verbs:
    - list
    - watch
    - apiGroups:
    ""
    resources:
    - nodes
    verbs:
    - get
    - apiGroups:
    ""
    resources:
    - services
    verbs:
    - get
    - list
    - watch
    - apiGroups:
    - networking.k8s.io
    resources:
    - ingresses
    verbs:
    - get
    - list
    - watch
    - apiGroups:
    ""
    resources:
    - events
    verbs:
    - create
    - patch
    - apiGroups:
    - networking.k8s.io
    resources:
    - ingresses/status
    verbs:
    - update
    - apiGroups:
    - networking.k8s.io
    resources:
    - ingress classes
    verbs:
    - get
    - list
    - watch
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
    labels:
    app.kubernetes.io/component: controller
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
    name: ingress-nginx
    roleRef:
    apiGroup: rbac.authorization.k8s.io
    kind: ClusterRole
    name: ingress-nginx
    subjects:
    - kind: ServiceAccount
    name: ingress-nginx
    namespace: ingress-nginx


    部署清單。

     kubectl apply -f ingress-service-account.yaml

    建立 Configmap

    使用此 configmap,你可以自訂 Nginx 設定。例如,你可以設定自訂檔頭和大多數 Nginx 設定。

    請參閱官方社群文件,了解所有支持的配置。

    建立一個名為configmap.yaml的檔並復制以下內容。

    ---
    apiVersion: v1
    data:
    allow-snippet-annotations: "true"
    kind: ConfigMap
    metadata:
    labels:
    app.kubernetes.io/component: controller
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
    name: ingress-nginx-controller
    namespace: ingress-nginx

    建立 configmap。

    kubectl apply -f configmap.yaml

    建立Ingress controller和admission controller服務

    建立一個名為services.yaml的檔並復制以下內容。

    ---
    apiVersion: v1
    kind: Service
    metadata:
    labels:
    app.kubernetes.io/component: controller
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
    name: ingress-nginx-controller
    namespace: ingress-nginx
    spec:
    externalTrafficPolicy: Local
    ipFamilies:
    - IPv4
    ipFamilyPolicy: SingleStack
    ports:
    - appProtocol: http
    name: http
    port: 80
    protocol: TCP
    targetPort: http
    - appProtocol: https
    name: https
    port: 443
    protocol: TCP
    targetPort: https
    selector:
    app.kubernetes.io/component: controller
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
    type: LoadBalancer
    ---
    apiVersion: v1
    kind: Service
    metadata:
    labels:
    app.kubernetes.io/component: controller
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
    name: ingress-nginx-controller-admission 
    namespace: ingress-nginx
    spec:
    ports:
    - appProtocol: https
    name: https-webhook
    port: 443
    targetPort: webhook
    selector:
    app.kubernetes.io/component: controller
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
    type: ClusterIP

    建立服務。

    kubectl apply -f services.yaml

    ingress-nginx-controller service 會在你正在部署的相應雲平台中建立 Loadbalancer。

    你可以使用以下命令獲取負載均衡器 IP/DNS。

    kubectl --namespace ingress-nginx get services -o wide -w ingress-nginx-controller

    註意:對於每個雲提供商,都有特定的註釋可用於將靜態 IP 地址和其他配置對映到 Loadbalancer。

    建立 Ingress class

    建立一個名為ingress class.yaml的檔並復制以下內容。

    apiVersion: networking.k8s.io/v1 kind: Ingress class metadata: labels: app.kubernetes.io/component: admission -webhook app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx name: nginx spec: controller: k8s.io/ingress-nginx 部署 ingress 類。

    kubectl apply -f ingress class.yaml

    它將建立一個名為 nginx 的 Ingress 類。我們必須在我們建立的 Ingress 物件中使用這個 Ingress 類名。

    建立 Ingress Controller 部署

    建立一個名為deployment.yaml的檔並復制以下內容。

    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
    labels:
    app.kubernetes.io/component: controller
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
    name: ingress-nginx-controller
    namespace: ingress-nginx
    spec:
    minReadySeconds: 0
    revisionHistoryLimit: 10
    selector:
    matchLabels:
    app.kubernetes.io/component: controller
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
    template:
    metadata:
    labels:
    app.kubernetes.io/component: controller
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
    spec:
    containers:
    - args:
    - /nginx-ingress-controller
    - --publish-service=$(POD_NAMESPACE)/ingress-nginx-controller
    - --election-id=ingress-controller-leader
    - --controller- class=k8s.io/ingress-nginx
    - --configmap=$(POD_NAMESPACE)/ingress-nginx-controller
    - --validating-webhook=:8443
    - --validating-webhook-certificate=/usr/local/certificates/cert
    - --validating-webhook-key=/usr/local/certificates/key
    env:
    - name: POD_NAME
    valueFrom:
    fieldRef:
    fieldPath: metadata.name
    - name: POD_NAMESPACE
    valueFrom:
    fieldRef:
    fieldPath: metadata.namespace
    - name: LD_PRELOAD
    value: /usr/local/lib/libmimalloc.so
    image: registry.k8s.io/ingress-nginx/controller:v1.9.5
    imagePullPolicy: IfNotPresent
    lifecycle:
    preStop:
    exec:
    command:
    - /wait-shutdown
    livenessProbe:
    failureThreshold: 5
    httpGet:
    path: /healthz
    port: 10254
    scheme: HTTP
    initialDelaySeconds: 10
    periodSeconds: 10
    successThreshold: 1
    timeoutSeconds: 1
    name: controller
    ports:
    - containerPort: 80
    name: http
    protocol: TCP
    - containerPort: 443
    name: https
    protocol: TCP
    - containerPort: 8443
    name: webhook
    protocol: TCP
    readinessProbe:
    failureThreshold: 3
    httpGet:
    path: /healthz
    port: 10254
    scheme: HTTP
    initialDelaySeconds: 10
    periodSeconds: 10
    successThreshold: 1
    timeoutSeconds: 1
    resources:
    requests:
    cpu: 100m
    memory: 90Mi
    securityContext:
    allowPrivilegeEscalation: true
    capabilities:
    add:
    - NET_BIND_SERVICE
    drop:
    - ALL
    runAsUser: 101
    volumeMounts:
    - mountPath: /usr/local/certificates/
    name: webhook-cert
    readOnly: true
    dnsPolicy: ClusterFirst
    nodeSelector:
    kubernetes.io/os: linux
    serviceAccountName: ingress-nginx
    terminationGracePeriodSeconds: 300
    volumes:
    - name: webhook-cert
    secret:
    secretName: ingress-nginx-admission 

    建立部署。

    kubectl apply -f deployment.yaml

    要確保部署正常工作,請檢查 Pod 狀態。

    kubectl get pods -n ingress-nginx

    驗證 Ingress Controller 部署

    你可以使用服務建立的 LoadBlancer 終端節點驗證 Ingress Controller 部署。

    Nginx Ingress controller有一個預設的後端。所有在 Ingress 中沒有條目的請求都將發送到此預設後端。

    我們將使用預設後端驗證 controller。

    獲取 Loadbalancer 終端節點,嘗試存取它。你應該會收到 404 錯誤,如下所示。

    現在嘗試使用 curl 存取 /heathz url,如下所示。你應該會收到 200 響應。將 替換為你的 Loadbalancer 終端節點。

    curl http:// /healthz

    Nginx Ingress Controller Helm 部署

    如果你是 Helm 使用者,則可以使用社群 helm 圖表部署 Ingress controller。 在 中預設處於禁用狀態。ValidatingWebhookConfigurationvalues.yaml

    部署 helm chart。如果不存在,它將建立名稱空間。ingress-nginx

    helm upgrade --install ingress-nginx ingress-nginx \
    --repo https://kubernetes.github.io/ingress-nginx \
    --namespace ingress-nginx --create-namespace

    驗證 helm 版本。

    helm list -n ingress-nginx

    要清理資源,請解除安裝該版本。

     helm uninstall ingress-nginx -n ingress-nginx

    將網域名稱對映到 Nginx Ingress Loadbalancer IP

    Ingress 的主要目標是接收到 Kubernetes 上執行的服務的外部流量。理想情況下,在計畫中,DNS 將對映到Ingress controller Loadbalancer IP。

    這可以透過擁有你擁有的網域名稱的相應 DNS 提供商來完成。

    Info: 對於面向 Internet 的應用程式,它將是指向負載均衡器的公有 IP 的公有 DNS。如果是內部應用程式,它將是對映到私有負載均衡器 IP 的組織私有 DNS。

    單個 DNS 對映

    你可以將單個域直接作為 A 記錄對映到負載均衡器 IP。使用此功能,你只能為Ingress controller設定一個域,並采用多個基於路徑的流量路由。

    例如

    www.example.com --> Loadbalancer IP

    你還可以使用此模型進行基於路徑的路由。

    幾個例子,

    http://www.example.com/app1
    http://www.example.com/app2
    http://www.example.com/app1/api
    http://www.example.com/app2/api

    通配符 DNS 對映

    如果將通配符 DNS 對映到負載均衡器,則可以透過Ingress 擁有動態 DNS 終端節點。

    在 DNS 記錄中添加通配符條目後,你需要在 Ingress 物件中提及所需的 DNS,Nginx Ingress controller將負責將其路由到所需的服務終端節點。

    例如,檢查以下兩個對映。

    *.example.com --> Loadbalancer IP
    *.apps.example.com --> Loadbalancer IP 

    這樣,你可以透過單個Ingress controller擁有多個動態子體,並且每個 DNS 都可以擁有自己的基於路徑的路由。

    幾個例子,

    #URL one
    http://demo1.example.com/api
    http://demo1.example.com/api/v1
    http://demo1.example.com/api/v2
    #app specific urls
    http://grafana.apps.example.com
    http://prometheus.apps.example.com
    #URL two
    http://demo2.apps.example.com/api
    http://demo2.apps.example.com/api/v1
    http://demo2.apps.example.com/api/v2



    出於演示目的,我已將通配符 DNS 對映到 LoadBalancer IP。根據你的 DNS 提供商,你可以添加 DNS 記錄。

    下圖顯示了我用於此部落格演示的 DNS 記錄。我使用了 EKS,因此我有一個網路負載均衡器終端節點的 DNS,而不是 Loadnbalacer IP,它將是一個 CNAME。對於 GKE,你將獲得一個 IP,在這種情況下,你需要建立一個 A 記錄。

    部署演示應用程式

    為了測試 Ingress,我們將部署一個 demo 應用程式並向其添加 ClusterIp 服務。此應用程式只能在集群內存取,無需Ingress 。

    步驟1: 建立名為 dev 的名稱空間

    kubectl create namespace dev

    步驟 2:建立一個名為 你好-app.yaml 的檔,並復制以下內容。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: hello-app
    namespace: dev
    spec:
    selector:
    matchLabels:
    app: hello
    replicas: 2
    template:
    metadata:
    labels:
    app: hello
    spec:
    containers:
    - name: hello
    image: "gcr.io/google-samples/hello-app:2.0"

    步驟3:使用 kubectl 建立部署

    kubectl create -f hello-app.yaml

    檢查部署狀態。

    kubectl get deployments -n dev

    步驟5:建立一個名為 的檔,並復制以下內容並保存該檔。hello-app-service.yaml

    apiVersion: v1
    kind: Service
    metadata:
    name: hello-service
    namespace: dev
    labels:
    app: hello
    spec:
    type: ClusterIP
    selector:
    app: hello
    ports:
    - port: 80
    targetPort: 8080
    protocol: TCP

    步驟6:使用 kubectl 建立服務。

    kubectl create -f hello-app-service.yaml

    為應用程式建立 Ingress 物件

    現在讓我們建立一個Ingress 物件以使用 DNS 存取我們的你好應用程式。Ingress 物件只不過是一組路由規則。

    如果你想知道 Ingress 物件如何連線到 Nginx controller,Ingress controller Pod 會連線到 Ingress API 以檢查規則,並相應地更新規則。nginx.conf

    由於我已將通配符 DNS () 與 DNS 提供程式對映,因此我將用於指向你好應用程式服務。*.apps.mlopshub.comdemo.apps.mlopshub.com

    步驟1:建立一個名為ingress.yaml

    步驟2:復制以下內容並保存檔。

    替換為你的網域名稱。此外,我們在名稱空間中建立此Ingress 物件,因為你好應用程式正在名稱空間中執行。demo.apps.mlopshub.comdevdev

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
    name: test-ingress
    namespace: dev
    spec:
    ingress className: nginx
    rules:
    - host: "demo.apps.mlopshub.com"
    http:
    paths:
    - pathType: Prefix
    path: "/"
    backend:
    service:
    name: hello-service
    port:
    number: 80

    步驟3:描述建立的 Ingress 物件,以檢查配置。

    kubectl describe ingress -n dev

    現在,如果我嘗試存取域,我將能夠存取你好應用程式,如下所示。(你應該將其替換為你的網域名稱)demo.apps.mlopshub.com

    你可能會在瀏覽器中遇到 https 錯誤。在這種情況下,你可以使用 curl 命令來驗證Ingress 終端節點。

    curl demo.apps.mlopshub.com

    使用 nginx Ingress 的 TLS

    你可以為每個 Ingress 物件配置 TLS 證書。TLS 在 Ingress controller級別終止。

    下圖顯示了Ingress TLS 配置。需要將 TLS 證書添加為 secret 物件。

    結論

    在本文中,我們學習了如何設定 Nginx Ingress controller。

    這很容易上手。但是,對於計畫實施,請確保你完成所有 Nginx 配置並根據要求進行調整。

    使用 Nginx controller configmap,你可以配置所有 Nginx 設定,而無需重新部署controller。

    我希望你喜歡這個關於 Nginx Ingress controller的指南。