Kubernetes1.11 nginx-ingress安装部署

部署Ingress

ingress的部署文件在kubernetes Ingress 修改nodeselector 指定nodes上。
Pod.spec.nodeSelector是通过kubernetes的label-selector机制进行节点选择,由scheduler调度策略MatchNodeSelector进行label匹配,调度pod到目标节点,该匹配规则是强制约束。启用节点选择器的步骤为:

Node添加label标记

查询lable

1
2
3
kubectl get nodes --show-labels
标记规则:kubectl label nodes <node-name> <label-key>=<label-value>
kubectl label node 192.168.7.93 role=nginx-ingress

crt

1
2
镜像v0.17.1:docker pull wtingdocker/nginx-ingress-controller
https://github.com/kubernetes/ingress-nginx/releases

部署部署default backend 部署nginx-ingress-controller.yaml

修改

1
2
3
 kubectl label nodes  192.168.7.93  kubernetes.io/app=nginx-ingress
nodeSelector:
kubernetes.io/app: nginx-ingress

1
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
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
---

apiVersion: v1
kind: Namespace
metadata:
name: ingress-nginx
---

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: default-http-backend
labels:
app: default-http-backend
namespace: ingress-nginx
spec:
replicas: 1
selector:
matchLabels:
app: default-http-backend
template:
metadata:
labels:
app: default-http-backend
spec:
terminationGracePeriodSeconds: 60
containers:
- name: default-http-backend
# Any image is permissible as long as:

# 1. It serves a 404 page at /
# 2. It serves 200 on a /healthz endpoint
image: 192.168.19.111/gc/defaultbackend:1.4
livenessProbe:
httpGet:
path: /healthz
port: 8080
scheme: HTTP
initialDelaySeconds: 30
timeoutSeconds: 5
ports:
- containerPort: 8080
resources:

limits:
cpu: 10m
memory: 20Mi
requests:
cpu: 10m
memory: 20Mi
---

apiVersion: v1
kind: Service
metadata:
name: default-http-backend
namespace: ingress-nginx
labels:
app: default-http-backend
spec:
ports:
- port: 80
targetPort: 8080

selector:
app: default-http-backend
---

kind: ConfigMap
apiVersion: v1
metadata:
name: nginx-configuration
namespace: ingress-nginx
labels:
app: ingress-nginx
---

kind: ConfigMap
apiVersion: v1
metadata:
name: tcp-services
namespace: ingress-nginx
---

kind: ConfigMap
apiVersion: v1
metadata:
name: udp-services
namespace: ingress-nginx
---

apiVersion: v1
kind: ServiceAccount
metadata:
name: nginx-ingress-serviceaccount
namespace: ingress-nginx

---

apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRole
metadata:
name: nginx-ingress-clusterrole
rules:
- apiGroups:
- ""
resources:

- configmaps
- endpoints
- nodes
- pods
- secrets
verbs:

- list
- watch
- apiGroups:
- ""
resources:

- nodes
verbs:

- get
- apiGroups:
- ""
resources:

- services
verbs:

- get
- list
- watch
- apiGroups:
- "extensions"
resources:

- ingresses
verbs:

- get
- list
- watch
- apiGroups:
- ""
resources:

- events
verbs:

- create
- patch
- apiGroups:
- "extensions"
resources:

- ingresses/status
verbs:

- update

---

apiVersion: rbac.authorization.k8s.io/v1beta1
kind: Role
metadata:
name: nginx-ingress-role
namespace: ingress-nginx
rules:
- apiGroups:
- ""
resources:

- configmaps
- pods
- secrets
- namespaces
verbs:

- get
- apiGroups:
- ""
resources:

- configmaps
resourceNames:

# Defaults to "<election-id>-<ingress-class>"
# Here: "<ingress-controller-leader>-<nginx>"
# This has to be adapted if you change either parameter
# when launching the nginx-ingress-controller.
- "ingress-controller-leader-nginx"
verbs:

- get
- update
- apiGroups:
- ""
resources:

- configmaps
verbs:

- create
- apiGroups:
- ""
resources:

- endpoints
verbs:

- get

---

apiVersion: rbac.authorization.k8s.io/v1beta1
kind: RoleBinding
metadata:
name: nginx-ingress-role-nisa-binding
namespace: ingress-nginx
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: nginx-ingress-role
subjects:
- kind: ServiceAccount
name: nginx-ingress-serviceaccount

namespace: ingress-nginx

---

apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: nginx-ingress-clusterrole-nisa-binding
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: nginx-ingress-clusterrole
subjects:
- kind: ServiceAccount
name: nginx-ingress-serviceaccount

namespace: ingress-nginx
---

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nginx-ingress-controller
namespace: ingress-nginx
spec:
replicas: 1
selector:
matchLabels:
app: ingress-nginx
template:
metadata:
labels:
app: ingress-nginx
annotations:
prometheus.io/port: '10254'
prometheus.io/scrape: 'true'
spec:
nodeSelector:
kubernetes.io/app: nginx-ingress
serviceAccountName: nginx-ingress-serviceaccount
containers:
- name: nginx-ingress-controller
image: 192.168.19.111/gc/nginx-ingress-controller:0.17.1

args:
- /nginx-ingress-controller
- --default-backend-service=$(POD_NAMESPACE)/default-http-backend
- --configmap=$(POD_NAMESPACE)/nginx-configuration
- --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services
- --udp-services-configmap=$(POD_NAMESPACE)/udp-services
- --publish-service=$(POD_NAMESPACE)/ingress-nginx
- --annotations-prefix=nginx.ingress.kubernetes.io
nodeSelector:

role= "nginx-ingress"
securityContext:
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: 1
readinessProbe:
failureThreshold: 3
httpGet:
path: /healthz
port: 10254
scheme: HTTP
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 1

部署 ingress-nginx.svc.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
apiVersion: v1
kind: Service
metadata:
name: ingress-nginx
namespace: ingress-nginx
spec:
externalIPs:
- 192.168.7.93
ports:
- name: http
port: 80
targetPort: 80
protocol: TCP
- name: https
port: 443
targetPort: 443
protocol: TCP
selector:
app: ingress-nginx

可以看到ExternalIP的Service也是通过kube-proxy对外暴露的。192.168.7.93是nodeip。 可以通过反向代理HAproxy将边缘路由器或全局统一接入层的负载均衡器将到达公网ip的外网流量转发到内网ip上,外部通过域名访问集群中将会以ingress暴露的所有服务
crt
crt
crt
也可以采用 hostNetwork: true 暴露ingress服务端口表示容器使用和宿主机一样的网络
... spec: nodeSelector: kubernetes.io/app: nginx-ingress hostNetwork: true serviceAccountName: nginx-ingress-serviceaccount containers ...
crt