在本全面的 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 的高級架構。在本指南中,我們將學習如何在架構中構建設定。
(註:點選圖片以高分辨率檢視)
先決條件
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是如何工作的。
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 響應。將
curl http://
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的指南。