当前位置:   article > 正文

K8s之Ingress-nginx原理及配置_k8s中ingress nginx加参数

k8s中ingress nginx加参数

前言

Kubernetes中,服务和Pod的IP地址仅可以在集群网络内部使用,对于集群外的应用是不可见的。为了使外部的应用能够访问集群内的服务,在Kubernetes中目前提供了以下几种方案:

  1. * NodePort
  2. * LoadBalancer
  3. * Ingress

在之前的博文中介绍过NodePort,简单来说,就是通过service这种资源对象,为后端pod提供一个统一的访问接口,然后将service的统一访问接口映射到群集节点上,最终实现client通过映射到群集节点上的端口访问到后端pod提供的服务。

但是,这种方式有一个弊端,就是当新生成一个pod服务就需要创建对应的service将其映射到节点端口,当运行的pod过多时,我们节点暴露给client端的端口也会随之增加,这样我们整个k8s群集的危险系数就会增加,因为我们在搭建群集之处,官方明确指出,必须关闭firewalld防火墙及清空iptables规则,现在我们又暴露了那么多端口给client,安全系数可想而知。

一、Ingress-nginx介绍

1、Ingress-nginx组成

  1. * ingress-nginx-controller:根据用户编写的ingress规则(创建的ingress的yaml文件),
  2. 动态的去更改nginx服务的配置文件,并且reload重载使其生效(是自动化的,通过lua脚本来实现);
  3. * ingress资源对象:将Nginx的配置抽象成一个Ingress对象,每添加一个新的Service资
  4. 源对象只需写一个新的Ingress规则的yaml文件即可(或修改已存在的ingress规则的yaml文件)

2、Ingress-nginx可以解决什么问题?

  1. 1)动态配置服务
  2.   如果按照传统方式, 当新增加一个服务时, 我们可能需要在流量入口加一个反向代理指
  3. 向我们新的k8s服务. 而如果用了Ingress-nginx, 只需要配置好这个服务, 当服务启动
  4. 时, 会自动注册到Ingress的中, 不需要而外的操作。
  5. 2)减少不必要的端口映射
  6.   配置过k8s的都清楚, 第一步是要关闭防火墙的, 主要原因是k8s的很多服务会
  7. 以NodePort方式映射出去, 这样就相当于给宿主机打了很多孔, 既不安全也不优雅.
  8. 而Ingress可以避免这个问题, 除了Ingress自身服务可能需要映射出去, 其他服务都不要
  9. 用NodePort方式

3、Ingress-nginx工作原理

  1. 1)ingress controller通过和kubernetes api交互,动态的去感知集群中ingress规则变化,
  2. 2)然后读取它,按照自定义的规则,规则就是写明了哪个域名对应哪个service,生成一段nginx配置,
  3. 3)再写到nginx-ingress-controller的pod里,这个Ingress controller的pod里运行着一个Nginx服务,控制器会把生成的nginx配置写入/etc/nginx.conf文件中,
  4. 4)然后reload一下使配置生效。以此达到域名分别配置和动态更新的问题。

二、配置Ingress-nginx

1、搭建registry私有仓库
搭建私有仓库的目的,仅仅是为了更快的获取镜像,如果网络稳定,也可跳过此步骤!

  1. //运行registry私有仓库
  2. [root@master ~]# docker run -tid --name registry -p 5000:5000 --restart always registry
  3. [root@master ~]# vim /usr/lib/systemd/system/docker.service
  4. ExecStart=/usr/bin/dockerd --insecure-registry 192.168.45.129:5000
  5. //修改完保存退出即可
  6. //将修改后的文件发送到k8s群集中的其他节点
  7. [root@master ~]# scp /usr/lib/systemd/system/docker.service root@node01:/usr/lib/systemd/system/
  8. docker.service 100% 1628 1.6KB/s 00:00
  9. [root@master ~]# scp /usr/lib/systemd/system/docker.service root@node02:/usr/lib/systemd/system/
  10. docker.service 100% 1628 1.6KB/s 00:00
  11. [root@master ~]# systemctl daemon-reload
  12. [root@master ~]# systemctl restart docker.service //重启docker服务
  13. [root@master ~]# docker pull httpd //下载相应所需的镜像
  14. [root@master ~]# docker pull tomcat:8.5.45
  15. [root@master ~]# docker tag httpd:latest 192.168.45.129:5000/httpd:v1
  16. [root@master ~]# docker tag tomcat:8.5.45 192.168.45.129:5000/tomcat:v1
  17. [root@master ~]# docker push 192.168.45.129:5000/httpd:v1
  18. [root@master ~]# docker push 192.168.45.129:5000/tomcat:v1
  19. //将下载好的镜像,上传到私有仓库

2、创建namespace(也可跳过,使用默认的default名称空间也可以,但需要删除下面所有yaml文件中关于自定义的名称空间的配置字段)

  1. [root@master ~]# kubectl create ns test-ns //创建名称空间test-ns
  2. [root@master ~]# kubectl get ns //确认创建成功

3、创建Deployment、Service资源对象
1)创建httpd服务及其service与之关联

  1. [root@master test]# vim httpd.yaml //编写基于httpd服务的资源对象
  2. kind: Deployment
  3. apiVersion: apps/v1
  4. metadata:
  5. name: web01
  6. namespace: test-ns
  7. spec:
  8. replicas: 3
  9. selector:
  10. matchLabels:
  11. app: httpd01
  12. template:
  13. metadata:
  14. labels:
  15. app: httpd01
  16. spec:
  17. containers:
  18. - name: httpd
  19. image: httpd:latest
  20. ---
  21. apiVersion: v1
  22. kind: Service
  23. metadata:
  24. name: httpd-svc
  25. namespace: test-ns
  26. spec:
  27. selector:
  28. app: httpd01
  29. ports:
  30. - protocol: TCP
  31. port: 80
  32. targetPort: 80
  33. //创建service资源对象与Deployment资源使用标签的方式进行关联
  34. [root@master test]# kubectl apply -f httpd.yaml //执行yaml文件

2)创建tomcat服务及其service

  1. [root@master test]# vim tomcat.yaml //编写yaml文件如下
  2. kind: Deployment
  3. apiVersion: apps/v1
  4. metadata:
  5. name: web02
  6. namespace: test-ns
  7. spec:
  8. replicas: 3
  9. selector:
  10. matchLabels:
  11. app: tomcat01
  12. template:
  13. metadata:
  14. labels:
  15. app: tomcat01
  16. spec:
  17. containers:
  18. - name: tomcat
  19. image: tomcat:8.5.45
  20. ---
  21. apiVersion: v1
  22. kind: Service
  23. metadata:
  24. name: tomcat-svc
  25. namespace: test-ns
  26. spec:
  27. selector:
  28. app: tomcat01
  29. ports:
  30. - protocol: TCP
  31. port: 8080
  32. targetPort: 8080
  33. [root@master test]# kubectl apply -f tomcat.yaml //执行yaml文件

3)确保以上资源对象成功创建

  1. [root@master ~]# kubectl get pod -n test-ns //确定pod是正常运行状态
  2. NAME READY STATUS RESTARTS AGE
  3. web01-85674fbdd7-7h6cc 1/1 Running 0 9m3s
  4. web01-85674fbdd7-9l2zm 1/1 Running 0 9m3s
  5. web01-85674fbdd7-p9hfx 1/1 Running 0 9m3s
  6. web02-7f8f755bc7-4qk9b 1/1 Running 0 7m22s
  7. web02-7f8f755bc7-qhbnm 1/1 Running 0 7m22s
  8. web02-7f8f755bc7-zr56g 1/1 Running 0 7m22s
  9. [root@master ~]# kubectl get svc -n test-ns //确认SVC创建成功
  10. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  11. httpd-svc ClusterIP 10.102.57.12 <none> 80/TCP 10m
  12. tomcat-svc ClusterIP 10.110.25.145 <none> 8080/TCP 8m23s
  13. [root@master ~]# curl -I 10.102.57.12:80 //访问httpd
  14. HTTP/1.1 200 OK
  15. Date: Sun, 23 Aug 2020 07:02:06 GMT
  16. Server: Apache/2.4.46 (Unix)
  17. Last-Modified: Mon, 11 Jun 2007 18:53:14 GMT
  18. ETag: "2d-432a5e4a73a80"
  19. Accept-Ranges: bytes
  20. Content-Length: 45
  21. Content-Type: text/html
  22. [root@master ~]# curl -I 10.110.25.145:8080 //访问tomcat
  23. HTTP/1.1 200
  24. Content-Type: text/html;charset=UTF-8
  25. Transfer-Encoding: chunked
  26. Date: Sun, 23 Aug 2020 09:08:18 GMT
  27. //OK,以上表示内部访问是没有问题的
  28. //如果在上述访问测试中,没有访问到相应的pod,建议使用“kubectl describe svc”命令,
  29. 查看相应的service中的Endpoints列中有没有关联后端pod。

4、创建Ingress-nginx资源对象

下载mandatory.yaml文件,如果下载不到复制以下文件

  1. apiVersion: v1
  2. kind: Namespace
  3. metadata:
  4. name: ingress-nginx
  5. labels:
  6. app.kubernetes.io/name: ingress-nginx
  7. app.kubernetes.io/part-of: ingress-nginx
  8. ---
  9. kind: ConfigMap
  10. apiVersion: v1
  11. metadata:
  12. name: nginx-configuration
  13. namespace: ingress-nginx
  14. labels:
  15. app.kubernetes.io/name: ingress-nginx
  16. app.kubernetes.io/part-of: ingress-nginx
  17. ---
  18. kind: ConfigMap
  19. apiVersion: v1
  20. metadata:
  21. name: tcp-services
  22. namespace: ingress-nginx
  23. labels:
  24. app.kubernetes.io/name: ingress-nginx
  25. app.kubernetes.io/part-of: ingress-nginx
  26. ---
  27. kind: ConfigMap
  28. apiVersion: v1
  29. metadata:
  30. name: udp-services
  31. namespace: ingress-nginx
  32. labels:
  33. app.kubernetes.io/name: ingress-nginx
  34. app.kubernetes.io/part-of: ingress-nginx
  35. ---
  36. apiVersion: v1
  37. kind: ServiceAccount
  38. metadata:
  39. name: nginx-ingress-serviceaccount
  40. namespace: ingress-nginx
  41. labels:
  42. app.kubernetes.io/name: ingress-nginx
  43. app.kubernetes.io/part-of: ingress-nginx
  44. ---
  45. apiVersion: rbac.authorization.k8s.io/v1beta1
  46. kind: ClusterRole
  47. metadata:
  48. name: nginx-ingress-clusterrole
  49. labels:
  50. app.kubernetes.io/name: ingress-nginx
  51. app.kubernetes.io/part-of: ingress-nginx
  52. rules:
  53. - apiGroups:
  54. - ""
  55. resources:
  56. - configmaps
  57. - endpoints
  58. - nodes
  59. - pods
  60. - secrets
  61. verbs:
  62. - list
  63. - watch
  64. - apiGroups:
  65. - ""
  66. resources:
  67. - nodes
  68. verbs:
  69. - get
  70. - apiGroups:
  71. - ""
  72. resources:
  73. - services
  74. verbs:
  75. - get
  76. - list
  77. - watch
  78. - apiGroups:
  79. - ""
  80. resources:
  81. - events
  82. verbs:
  83. - create
  84. - patch
  85. - apiGroups:
  86. - "extensions"
  87. - "networking.k8s.io"
  88. resources:
  89. - ingresses
  90. verbs:
  91. - get
  92. - list
  93. - watch
  94. - apiGroups:
  95. - "extensions"
  96. - "networking.k8s.io"
  97. resources:
  98. - ingresses/status
  99. verbs:
  100. - update
  101. ---
  102. apiVersion: rbac.authorization.k8s.io/v1beta1
  103. kind: Role
  104. metadata:
  105. name: nginx-ingress-role
  106. namespace: ingress-nginx
  107. labels:
  108. app.kubernetes.io/name: ingress-nginx
  109. app.kubernetes.io/part-of: ingress-nginx
  110. rules:
  111. - apiGroups:
  112. - ""
  113. resources:
  114. - configmaps
  115. - pods
  116. - secrets
  117. - namespaces
  118. verbs:
  119. - get
  120. - apiGroups:
  121. - ""
  122. resources:
  123. - configmaps
  124. resourceNames:
  125. # Defaults to "<election-id>-<ingress-class>"
  126. # Here: "<ingress-controller-leader>-<nginx>"
  127. # This has to be adapted if you change either parameter
  128. # when launching the nginx-ingress-controller.
  129. - "ingress-controller-leader-nginx"
  130. verbs:
  131. - get
  132. - update
  133. - apiGroups:
  134. - ""
  135. resources:
  136. - configmaps
  137. verbs:
  138. - create
  139. - apiGroups:
  140. - ""
  141. resources:
  142. - endpoints
  143. verbs:
  144. - get
  145. ---
  146. apiVersion: rbac.authorization.k8s.io/v1beta1
  147. kind: RoleBinding
  148. metadata:
  149. name: nginx-ingress-role-nisa-binding
  150. namespace: ingress-nginx
  151. labels:
  152. app.kubernetes.io/name: ingress-nginx
  153. app.kubernetes.io/part-of: ingress-nginx
  154. roleRef:
  155. apiGroup: rbac.authorization.k8s.io
  156. kind: Role
  157. name: nginx-ingress-role
  158. subjects:
  159. - kind: ServiceAccount
  160. name: nginx-ingress-serviceaccount
  161. namespace: ingress-nginx
  162. ---
  163. apiVersion: rbac.authorization.k8s.io/v1beta1
  164. kind: ClusterRoleBinding
  165. metadata:
  166. name: nginx-ingress-clusterrole-nisa-binding
  167. labels:
  168. app.kubernetes.io/name: ingress-nginx
  169. app.kubernetes.io/part-of: ingress-nginx
  170. roleRef:
  171. apiGroup: rbac.authorization.k8s.io
  172. kind: ClusterRole
  173. name: nginx-ingress-clusterrole
  174. subjects:
  175. - kind: ServiceAccount
  176. name: nginx-ingress-serviceaccount
  177. namespace: ingress-nginx
  178. ---
  179. apiVersion: apps/v1
  180. kind: Deployment
  181. metadata:
  182. name: nginx-ingress-controller
  183. namespace: ingress-nginx
  184. labels:
  185. app.kubernetes.io/name: ingress-nginx
  186. app.kubernetes.io/part-of: ingress-nginx
  187. spec:
  188. replicas: 1
  189. selector:
  190. matchLabels:
  191. app.kubernetes.io/name: ingress-nginx
  192. app.kubernetes.io/part-of: ingress-nginx
  193. template:
  194. metadata:
  195. labels:
  196. app.kubernetes.io/name: ingress-nginx
  197. app.kubernetes.io/part-of: ingress-nginx
  198. annotations:
  199. prometheus.io/port: "10254"
  200. prometheus.io/scrape: "true"
  201. spec:
  202. # wait up to five minutes for the drain of connections
  203. hostNetwork: true
  204. terminationGracePeriodSeconds: 300
  205. serviceAccountName: nginx-ingress-serviceaccount
  206. nodeSelector:
  207. Ingress: nginx
  208. containers:
  209. - name: nginx-ingress-controller
  210. image: registry.aliyuncs.com/google_containers/nginx-ingress-controller:0.29.0
  211. args:
  212. - /nginx-ingress-controller
  213. - --configmap=$(POD_NAMESPACE)/nginx-configuration
  214. - --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services
  215. - --udp-services-configmap=$(POD_NAMESPACE)/udp-services
  216. - --publish-service=$(POD_NAMESPACE)/ingress-nginx
  217. - --annotations-prefix=nginx.ingress.kubernetes.io
  218. securityContext:
  219. allowPrivilegeEscalation: true
  220. capabilities:
  221. drop:
  222. - ALL
  223. add:
  224. - NET_BIND_SERVICE
  225. # www-data -> 101
  226. runAsUser: 101
  227. env:
  228. - name: POD_NAME
  229. valueFrom:
  230. fieldRef:
  231. fieldPath: metadata.name
  232. - name: POD_NAMESPACE
  233. valueFrom:
  234. fieldRef:
  235. fieldPath: metadata.namespace
  236. ports:
  237. - name: http
  238. containerPort: 80
  239. protocol: TCP
  240. - name: https
  241. containerPort: 443
  242. protocol: TCP
  243. livenessProbe:
  244. failureThreshold: 3
  245. httpGet:
  246. path: /healthz
  247. port: 10254
  248. scheme: HTTP
  249. initialDelaySeconds: 10
  250. periodSeconds: 10
  251. successThreshold: 1
  252. timeoutSeconds: 10
  253. readinessProbe:
  254. failureThreshold: 3
  255. httpGet:
  256. path: /healthz
  257. port: 10254
  258. scheme: HTTP
  259. periodSeconds: 10
  260. successThreshold: 1
  261. timeoutSeconds: 10
  262. lifecycle:
  263. preStop:
  264. exec:
  265. command:
  266. - /wait-shutdown
  267. ---
  268. apiVersion: v1
  269. kind: LimitRange
  270. metadata:
  271. name: ingress-nginx
  272. namespace: ingress-nginx
  273. labels:
  274. app.kubernetes.io/name: ingress-nginx
  275. app.kubernetes.io/part-of: ingress-nginx
  276. spec:
  277. limits:
  278. - min:
  279. memory: 90Mi
  280. cpu: 100m
  281. type: Container
  1. [root@master ~]# vim mandatory.yaml
  2. //对下载的yaml文件进行简单的修改
  3. spec: //定位到212行,也就是该行
  4. hostNetwork: true //添加该行,表示使用主机网络
  5. # wait up to five minutes for the drain of connections
  6. terminationGracePeriodSeconds: 300
  7. serviceAccountName: nginx-ingress-serviceaccount
  8. nodeSelector:
  9. Ingress: nginx //设置节点的标签选择器,指定在哪台节点上运行
  10. containers:
  11. - name: nginx-ingress-controller
  12. image: registry.aliyuncs.com/google_containers/nginx-ingress-controller:0.29.0
  13. [root@master ~]# kubectl label nodes k8s-node01 Ingress=nginx
  14. #对node01节点打相应的标签,以便指定Ingress-nginx运行在node01
  15. [root@master ~]# kubectl get nodes k8s-node01 --show-labels
  16. //查看node01的标签是否存在
  17. [root@master ~]# kubectl apply -f mandatory.yaml

附图如下:


5、定义Ingress规则(编写ingress的yaml文件)

  1. [root@master~]# vim ingress.yaml //编写yaml文件如下
  2. apiVersion: extensions/v1beta1
  3. kind: Ingress
  4. metadata:
  5. name: test-ingress
  6. namespace: test-ns
  7. annotations:
  8. nginx.ingress.kubernetes.io/rewrite-target: /
  9. spec:
  10. rules:
  11. - host: www.test01.com
  12. http:
  13. paths:
  14. - path: /
  15. backend:
  16. serviceName: httpd-svc
  17. servicePort: 80
  18. - path: /tomcat
  19. backend:
  20. serviceName: tomcat-svc
  21. servicePort: 8080
  22. [root@master~]# kubectl apply -f ingress.yaml //执行ingress规则的yaml文件
  23. [root@master~]# kubectl get ingresses -n test-ns //查看ingresses规则资源对象
  24. NAME HOSTS ADDRESS PORTS AGE
  25. test-ingress www.test01.com 80 28s

注:其实,至此已经实现了我们想要的功能,现在就可以通过www.test01.com 来访问到我们后端httpd容器提供的服务,通过www.test01.com/tomcat 来访问我们后端tomcat提供的服务,当然,前提是自行配置DNS解析,或者直接修改client的hosts文件。访问页面如下(注意:一定要自己解决域名解析的问题,若不知道域名对应的是哪个IP,请跳过这两个图,看下面的文字解释):

解决域名解析的问题如下:

  1. [root@master ~]# kubectl get pod -n ingress-nginx -o wide
  2. NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
  3. nginx-ingress-controller-86cdd68cf-hndtw 1/1 Running 0 89m 192.168.45.141 node01 <none> <none>


  • 在上面的访问测试中,虽然访问到了对应的服务,但是有一个弊端,就是在做DNS解析的时候,只能指定Ingress-nginx容器所在的节点IP。而指定k8s集群内部的其他节点IP(包括master)都是不可以访问到的,如果这个节点一旦宕机,Ingress-nginx容器被转移到其他节点上运行(不考虑节点标签的问题,其实保持Ingress-nginx的yaml文件中默认的标签的话,那么每个节点都是有那个标签的)。随之还要我们手动去更改DNS解析的IP(要更改为Ingress-nginx容器所在节点的IP,通过命令“kubectl get pod -n ingress-nginx -o wide”可以查看到其所在节点),很是麻烦。

  • 有没有更简单的一种方法呢?答案是肯定的,就是我们为Ingress-nginx规则再创建一个类型为nodePort的Service,这样,在配置DNS解析时,就可以使用www.test01.com 绑定所有node节点,包括master节点的IP了,很是灵活。

6、为Ingress规则创建一个Service
 

  1. [root@master ~]# vim service-nodeport.yaml
  2. apiVersion: v1
  3. kind: Service
  4. metadata:
  5. name: ingress-nginx
  6. namespace: ingress-nginx
  7. labels:
  8. app.kubernetes.io/name: ingress-nginx
  9. app.kubernetes.io/part-of: ingress-nginx
  10. spec:
  11. type: NodePort
  12. ports:
  13. - name: http
  14. port: 80
  15. targetPort: 80
  16. protocol: TCP
  17. - name: https
  18. port: 443
  19. targetPort: 443
  20. protocol: TCP
  21. selector:
  22. app.kubernetes.io/name: ingress-nginx
  23. app.kubernetes.io/part-of: ingress-nginx
  24. //编辑完,保存退出即可
  25. [root@master ~]# kubectl apply -f service-nodeport.yaml //执行yaml文件
  26. [root@master ~]# kubectl get svc -n ingress-nginx //查看运行的service
  27. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  28. ingress-nginx NodePort 10.108.48.248 <none> 80:32529/TCP,443:30534/TCP 11s
  29. //可以看到service分别将80443端口映射到了节点的3252930543端口(随机映射的,也可以修改yaml文件指定端口)

注:至此,这个www.test01.com 的域名即可和群集中任意节点的32529/30543端口进行绑定了。

测试如下(域名解析对应的IP可以是k8s群集内的任意节点IP):


至此,就实现了最初的需求!!

7、创建基于虚拟主机的Ingress规则
如果现在是另一种需求,我需要将www.test01.com 和www.test02.com 都对应上我后端的httpd容器提供的服务,那么此时应该怎么配置?

  1. [root@master test]# vim ingress.yaml #修改ingress规则的yaml文件如下
  2. apiVersion: extensions/v1beta1
  3. kind: Ingress
  4. metadata:
  5. name: test-ingress
  6. namespace: test-ns
  7. annotations:
  8. nginx.ingress.kubernetes.io/rewrite-target: /
  9. spec:
  10. rules:
  11. - host: www.test02.com //增加这一段host配置
  12. http:
  13. paths:
  14. - path: /
  15. backend:
  16. serviceName: httpd-svc //绑定和www.test01相同的service名字即可
  17. servicePort: 80
  18. - host: www.test01.com
  19. http:
  20. paths:
  21. - path: /
  22. backend:
  23. serviceName: httpd-svc
  24. servicePort: 80
  25. - path: /tomcat
  26. backend:
  27. serviceName: tomcat-svc
  28. servicePort: 8080
  29. //增加完上述的host字段保存退出即可
  30. [root@master test]# kubectl apply -f ingress.yaml //重新执行yaml文件

至此,即可实现访问www.test01.com 和www.test02.com 都可以访问到后端的httpd提供的页面(自行解决域名解析问题=域名解析配置client hosts文件即可),如下:


总结上述示例的pod是如何一步一步可以使client访问到的,总结如下:

后端pod===》service====》ingress规则====》写入Ingress-nginx-controller配置文件并自动重载使更改生效===》对Ingress-nginx创建service====》实现client无论通过哪个K8节点的IP+端口都可以访问到后端pod

三、配置HTTPS

在上面的操作中,实现了使用ingress-nginx为后端所有pod提供一个统一的入口,那么,有一个非常严肃的问题需要考虑,就是如何为我们的pod配置CA证书来实现HTTPS访问?在pod中直接配置CA么?那需要进行多少重复性的操作?而且,pod是随时可能被kubelet杀死再创建的。当然这些问题有很多解决方法,比如直接将CA配置到镜像中,但是这样又需要很多个CA证书。

这里有更简便的一种方法,就拿上面的情况来说,后端有多个pod,pod与service进行关联,service又被ingress规则发现并动态写入到ingress-nginx-controller容器中,然后又为ingress-nginx-controller创建了一个Service映射到群集节点上的端口,来供client来访问。

在上面的一系列流程中,关键的点就在于ingress规则,我们只需要在ingress的yaml文件中,为域名配置CA证书即可,只要可以通过HTTPS访问到域名,至于这个域名是怎么关联到后端提供服务的pod,这就是属于k8s群集内部的通信了,即便是使用http来通信,也无伤大雅。

配置如下:
接下来的配置与上面的配置基本没什么关系,但是由于上面已经运行了Ingress-nginx-controller容器,所以这里就没有必要再运行了。只需要配置pod、service、ingress规则即可。

  1. //创建CA证书(测试环境,自己创建吧)
  2. [root@master https]# openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=nginxsvc/O=nginxsvc"
  3. //当前目录下会生成两个文件,如下:
  4. [root@master https]# ls #确定当前目录下有这两个文件
  5. tls.crt tls.key
  6. //将生成的CA证书存储到etcd
  7. [root@master https]# kubectl create secret tls tls-secret --key=tls.key --cert tls.crt
  8. //创建deploy、service、ingress资源对象
  9. [root@master https]# vim httpd03.yaml //编写yaml文件
  10. kind: Deployment
  11. apiVersion: apps/v1
  12. metadata:
  13. name: web03
  14. namespace: test-ns
  15. spec:
  16. replicas: 2
  17. selector:
  18. matchLabels:
  19. app: httpd03
  20. template:
  21. metadata:
  22. labels:
  23. app: httpd03
  24. spec:
  25. containers:
  26. - name: httpd3
  27. image: httpd:latest
  28. ---
  29. apiVersion: v1
  30. kind: Service
  31. metadata:
  32. name: httpd-svc3
  33. namespace: test-ns
  34. spec:
  35. selector:
  36. app: httpd03
  37. ports:
  38. - protocol: TCP
  39. port: 80
  40. targetPort: 80
  41. ---
  42. apiVersion: extensions/v1beta1
  43. kind: Ingress
  44. metadata:
  45. name: test-ingress3
  46. namespace: test-ns
  47. spec:
  48. tls:
  49. - hosts:
  50. - www.test03.com
  51. secretName: tls-secret
  52. rules:
  53. - host: www.test03.com
  54. http:
  55. paths:
  56. - path: /
  57. backend:
  58. serviceName: httpd-svc3
  59. servicePort: 80
  60. [root@master https]# kubectl apply -f httpd03.yaml //执行yaml文件

确认创建的资源对象是否正常运行:

  1. [root@master https]# kubectl get svc
  2. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  3. httpd-svc3 ClusterIP 10.96.4.68 <none> 80/TCP 9s
  4. kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 12d
  5. [root@master https]# kubectl get pod
  6. NAME READY STATUS RESTARTS AGE
  7. web03-b955f886b-gjbnr 1/1 Running 0 7m23s
  8. web03-b955f886b-w8cdn 1/1 Running 0 7m23s
  9. [root@master https]# kubectl describe ingresses. //查看ingress规则
  10. Name: test-ingress3
  11. Namespace: default
  12. Address:
  13. Default backend: default-http-backend:80 (<none>)
  14. TLS:
  15. tls-secret terminates www.test03.com
  16. Rules:
  17. Host Path Backends
  18. ---- ---- --------
  19. www.test03.com
  20. / httpd-svc3:80 (10.244.1.5:80,10.244.2.5:80)
  21. //确定关联到对应的service及后端的pod

注:使用https://www.test03.com 进行访问(自行解决域名解析问题)

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/40711?site
推荐阅读
相关标签
  

闽ICP备14008679号