Nginx ingress 控制器设置指南
翻译
原文:https://devopscube.com/setup-ingress-kubernetes-nginx-controller/
- name: 翻译
desc: 原文:https://devopscube.com/setup-ingress-kubernetes-nginx-controller/
bgColor: '#F0DFB1'
textColor: 'green'
2
3
4
# Nginx ingress 控制器设置指南
在这份全面的 ingress 指南中,您将学习如何在 Kubernetes 上设置 Nginx ingress 控制器并使用 DNS 配置 ingress。
如果您想了解 Kubernetes Ingress 是如何工作的,请阅读我的 Kubernetes Ingress 教程 (opens new window)。对于初学者来说,我已经解释了所有的核心 ingress 概念,包括 ingress 对象如何与 ingress 控制器一起工作。
有两种 Nginx ingress 控制器:
- kubernetes 社区的 Nginx ingress 控制器 (opens new window)
- 由 Nginx Inc 开发的 Nginx ingress 控制器 (opens new window)
在本指南中,我们将使用 kubernetes 社区的 Nginx 控制器。
# 1Ingress和Nginx Ingress控制器架构
下面是使用 Nginx ingress 控制器的 Kubernetes ingress 的高级架构。在本指南中,我们将学习如何在架构中构建设置。
# 2先决条件
- 一个 Kubernetes 集群 (opens new window)
- 已安装 kubectl 实用程序并通过了 kubernetes 集群验证。
- 拥有对 kubernetes 集群的管理员访问权限。
- 一个指向 ingress 控制器的负载均衡器有效 IP 。(可选)
如果您在 Google Cloud 上尝试此设置,请启用集群角色,并为您的帐户分配管理员权限。
ACCOUNT=$(gcloud info --format='value(config.account)')
kubectl create clusterrolebinding owner-cluster-admin-binding \
--clusterrole cluster-admin \
--user $ACCOUNT
2
3
4
# 3Nginx Ingress控制器Kubernetes清单
本教程中使用的所有 kubernetes 清单都托管在 Github 存储库上。克隆它并将其用于部署。这些清单来自 Nginx 社区的官方仓库。
git clone https://github.com/techiescamp/nginx-ingress-controller
首先,我们将使用 YAML 清单部署 Nginx 控制器,然后理解所有相关的 Kubernetes 对象。当我们有所了解之后,我们将改为使用 Helm chart 部署它。
此外,这里是用于部署所有对象的一行代码。
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.1.1/deploy/static/provider/cloud/deploy.yaml
笔记
如果您想了解所有 Nginx ingress 控制器对象以及它们之间的关系,我建议您从仓库中单独创建每一个对象。在您了解其工作原理后,可以改为使用一个整体清单或 helm chart 来部署它。
# 4使用配置清单部署Nginx Ingress控制器
我们需要部署以下 Kubernetes 资源对象才能拥有一个正常工作的 Nginx 控制器。
- 命名空间
ingress-nginx
- Nginx 准入控制器的 ServiceAccount/Roles/ClusterRoles
- 验证 Webhook 配置
- 创建/更新用于 Webhook CA 捆绑包的 Jobs
- Nginx 控制器 deployment 的 ServiceAccount/Roles/ClusterRoles
- Nginx 控制器 configmap
- Nginx 控制器和准入控制器的服务
- Ingress 控制器 deployment
笔记
您可以自己创建所有配置清单,也可以直接使用 Github 存储库。但是,我强烈建议您仔细阅读每一份清单,并了解您正在部署的内容。
# 4.1准入控制器需求 & Webhook验证
Kubernetes 准入控制器是一小段代码,用于在创建 Kubernetes 对象之前对其进行验证或更新。在本例中,这个准入控制器是用于验证 ingress 对象的。准入控制器代码是 Nginx 控制器的一部分,它监听端口8443
。
为什么需要准入控制器?
如果没有准入控制器,您可能会部署包含错误配置的 ingress 对象。错误的配置可能会破坏与 ingress 控制器关联的所有 ingress 规则。
有了准入控制器,我们可以确保自己创建的 ingress 对象具有正确的配置,并且不会破坏路由规则。
以下是准入控制器在 Nginx 中的工作方式。
- 当您部署一个 ingress YAML 时,准入验证会拦截请求。
- 然后,Kubernetes API 根据 Webhook 准入端点将 ingress 对象发送到准入验证控制器的 Service 端点。
- Service 将请求发送到 Nginx deployment 上的
8443
端口,以验证入口对象。 - 然后,准入控制器向 k8s API 发送响应。
- 如果这是一个有效的响应,则 API 将创建 ingress 对象。
# 4.2创建命名空间
我们将在ingress-nginx
命名空间中部署所有 Nginx 控制器对象。
让我们创建命名空间。
kubectl create ns ingress-nginx
# 4.3创建准入控制器角色 & 服务账户
我们需要一个具有所需权限的 Role 和 ClusterRole,并绑定到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:
- admissionregistration.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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
部署资源。
kubectl apply -f admission-service-account.yaml
# 4.4创建Validating Webhook Configuration
创建一个名为validating-webhook.yaml
的文件并复制以下内容。
---
apiVersion: admissionregistration.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:
- admissionReviewVersions:
- 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
创建ValidatingWebhookConfiguration
kubectl apply -f validating-webhook.yaml
# 4.5部署 Jobs 以更新 Webhook 证书
ValidatingWebhookConfiguration
只能通过 HTTPS 工作。因此它需要一个 CA 捆绑包。
我们使用 kube-webhook-certgen (opens new window) 为第一个 job 生成 CA 证书捆绑包。生成的 CA 证书存储在名为ingress-nginx-admission
的 secret 中。
第二个 job 使用 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: k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.1.1
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: k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.1.1
imagePullPolicy: IfNotPresent
name: patch
securityContext:
allowPrivilegeEscalation: false
nodeSelector:
kubernetes.io/os: linux
restartPolicy: OnFailure
securityContext:
runAsNonRoot: true
runAsUser: 2000
serviceAccountName: ingress-nginx-admission
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
执行 job 之后,您可以查看ValidatingWebhookConfiguration
的详情,并且您将看到已更新的捆绑包。
kubectl describe ValidatingWebhookConfiguration ingress-nginx-admission
# 4.6创建Ingress控制器角色 & 服务账户
创建一个名为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:
- ingressclasses
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:
- ingressclasses
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
部署资源。
kubectl apply -f ingress-service-account.yaml
# 4.7创建Configmap
使用此 configmap 之后,您可以自定义 Nginx 设置。例如,您可以设置自定义标头和大多数 Nginx 功能。请参阅官方社区文档 (opens new window)以了解所有支持的配置项。
创建一个名为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
2
3
4
5
6
7
8
9
10
11
12
创建这个 configmap。
kubectl apply -f configmap.yaml
# 4.8创建Ingress控制器 & 准入控制器服务
创建一个名为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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
创建服务。
kubectl apply -f services.yaml
ingress-nginx-controller
会在您部署的相应云平台中创建 Loadbalancer。
您可以使用以下命令获取负载均衡器的 IP/DNS。
kubectl --namespace ingress-nginx get services -o wide -w ingress-nginx-controller
笔记
对于每个云提供商,您可以使用特定的注释将静态 IP 地址和其他配置映射到 Loadbalancer。在此处查阅 GCP 注释 (opens new window),在此处查阅 AWS 注释 (opens new window)。
# 4.9创建Ingress控制器Deployment
创建一个名为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: k8s.gcr.io/ingress-nginx/controller:v1.1.1
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
创建 deployment。
kubectl apply -f deployment.yaml
为确保 deployment 工作正常,请检查 pod 状态。
kubectl get pods -n ingress-nginx
# 5通过Helm部署Nginx Ingress控制器
如果您是 Helm 用户,则可以使用社区 helm chart 来部署 ingress 控制器。默认情况下,ValidatingWebhookConfiguration
在values.yaml
中处于禁用状态。
通过 helm chart 部署。它将创建命名空间ingress-nginx
(如果不存在的话)。
helm upgrade --install ingress-nginx ingress-nginx \
--repo https://kubernetes.github.io/ingress-nginx \
--namespace ingress-nginx --create-namespace
2
3
确认 helm 状态。
helm list -n ingress-nginx
若要清理资源,请卸载该版本。
helm uninstall ingress-nginx -n ingress-nginx
# 6将域名映射到Ingress Loadbalancer的IP
Ingress 的主要任务是接收 Kubernetes 上运行的 Service 的外部流量。理想情况下,在项目中,DNS 将映射到 ingress 控制器所在的负载均衡器 IP。
这可以通过具有您域名的相应 DNS 提供商来完成。
信息
对于面向互联网的应用程序,它将指向负载均衡器的公共 IP 上的公共 DNS。如果是内部应用,则它将映射到私有负载均衡器 IP 上的私有 DNS。
# 6.1单一DNS映射
您可以直接将单个域作为 A 记录映射到负载均衡器 IP。使用这种方法,您只能为 ingress 控制器设置一个域,并基于多个路径进行流量路由。
例如:
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
2
3
4
# 6.2通配符DNS映射
如果您将通配符 DNS 映射到负载均衡器,则可以通过 ingress 获得动态 DNS 端点。
在 DNS 记录中添加通配符条目后,需要在 ingress 对象中提及所需的 DNS,然后 Nginx ingress 控制器会负责将其路由到所需的服务端点。
例如以下两个映射:
*.example.com --> Loadbalancer IP
*.apps.example.com --> Loadbalancer IP
2
这样一来,您可以通过单个 ingress 控制器拥有多个动态子域,并且每个 DNS 都可以设置自己的基于路径的路由。
几个例子:
# URL 1
http://demo1.example.com/api
http://demo1.example.com/api/v1
http://demo1.example.com/api/v2
# 特定于应用的 URL
http://grafana.apps.example.com
http://prometheus.apps.example.com
# URL 2
http://demo2.apps.example.com/api
http://demo2.apps.example.com/api/v1
http://demo2.apps.example.com/api/v2
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
出于演示目的,我已将一个通配符 DNS 映射到 LoadBalancer IP。根据您的 DNS 提供商,您可以添加相应的 DNS 记录。
下图展示了我在这个博客演示中使用的 DNS 记录。我使用了 EKS,而不是 Loadnbalacer IP,因此我有一个具备网络负载均衡器的 DNS 端点,可以作为一个 CNAME。另外在 GKE 的情况下,您将得到一个 IP,在这种情况下,您需要自己创建一个 A 记录。
# 7部署演示应用程序
为了测试 ingress,我们将部署一个演示用的应用程序(demo),并向其添加一个 ClusterIp 服务。此应用程序只能在没有 ingress 的集群内访问。
步骤 1:创建一个名为dev
的命名空间:
kubectl create namespace dev
步骤 2:创建一个名为hello-app.yaml
的文件。
步骤 3:复制以下内容并保存文件。
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-app
namespace: dev
spec:
selector:
matchLabels:
app: hello
replicas: 3
template:
metadata:
labels:
app: hello
spec:
containers:
- name: hello
image: "gcr.io/google-samples/hello-app:2.0"
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
步骤 4:使用 kubectl 创建 deployment:
kubectl create -f hello-app.yaml
# 检查 deployment 状态
kubectl get deployments -n dev
2
3
4
步骤 5:创建一个名为hello-app-service.yaml
的文件。
步骤 6:复制以下内容并保存文件。
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
步骤 7:使用 kubectl 创建 service。
kubectl create -f hello-app-service.yaml
# 8为应用程序创建Ingress对象
现在,让我们创建一个 ingress 对象,以使用 DNS 访问我们的 hello 应用程序。ingress 对象只不过是路由规则的设置。
如果您想知道 ingress 对象是如何连接到 Nginx 控制器的,ingress 控制器的 pod 会连接到 Ingress API 以检查规则,并相应地更新其nginx.conf
。
由于我在 DNS 提供商中已经映射过通配符 DNS(*.apps.mlopshub.com
)了,因此我将使用demo.apps.mlopshub.com
指向 hello 应用服务。
步骤 1:创建一个名为ingress.yaml
的文件。
步骤 2:复制以下内容并保存文件。
将demo.apps.mlopshub.com
替换为您自己的域名。此外,我们正在dev
命名空间中创建这个 ingress 对象,因为 hello 应用程序在dev
命名空间中运行。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: test-ingress
namespace: dev
spec:
ingressClassName: nginx
rules:
- host: "demo.apps.mlopshub.com"
http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: hello-service
port:
number: 80
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
步骤 3:查看已创建 Ingress 对象的详情,检查其配置。
kubectl describe ingress -n dev
现在,如果我尝试访问demo.apps.mlopshub.com
域,我将能够访问 hello 应用程序,如下所示。(您应该将其替换为您的域名)
# 9TLS与Nginx Ingress
您可以为每个 ingress 对象配置 TLS 证书。但 TLS 将在 ingress 控制器层面终止效果。
下图展示了 ingress TLS 配置。TLS 证书需要作为 secret 对象添加。
我写了一篇关于 Ingress TLS 配置的详细文章。
👉 查看在 Kubernetes 上配置 ingress TLS 的指南 (opens new window)。
# 10结论
在本文中,我们学习了如何设置 Nginx ingress 控制器。
这很容易上手。但是,对于项目实施,请确保您检查了所有 Nginx 配置并根据需求进行调优。
通过使用 Nginx 控制器中的 configmap,您可以配置所有 Nginx 选项,而无需重新部署控制器。
我希望你喜欢这份关于 Nginx ingress 控制器的指南。
在评论部分让我知道您的想法和疑问。
另外,如果您正在学习 Kubernetes,请查看我的全面 Kubernetes 教程 (opens new window)。
本文原作者:Bibin Wilson
https://devopscube.com/author/bibinwilson/
- name: 本文原作者:Bibin Wilson
desc: https://devopscube.com/author/bibinwilson/
bgColor: '#38b6ff'
textColor: 'black'
2
3
4