date: 2020-07-20title: k8s之ingress controller #标题
tags: ingress #标签
categories: k8s # 分类

记录下k8s中暴露服务的方式——ingress controller。
前言: ingress只是k8s中的一种配置信息,而ingress controller才是监听 80/443端口,并根据ingress配置的路由信息执行http路由转发的组件。

ingress controller有多种实现的方式,比较常用的有 Traefic 、 Nginx Ingress Controller for Kubernetes 等。这里使用 Nginx Ingress Controller for Kubernetes来进行实现。

创建nginx及tomcat应用

nginx服务的yaml文件如下:

  1. $ cat nginx-deployment.yaml
  2. apiVersion: apps/v1
  3. kind: Deployment
  4. metadata:
  5. name: nginx-deployment
  6. labels:
  7. app: nginx
  8. spec:
  9. replicas: 1
  10. selector:
  11. matchLabels:
  12. app: nginx
  13. template:
  14. metadata:
  15. labels:
  16. app: nginx
  17. spec:
  18. containers:
  19. - name: nginx
  20. image: nginx:latest
  21. imagePullPolicy: IfNotPresent
  22. ---
  23. apiVersion: v1
  24. kind: Service
  25. metadata:
  26. name: nginx-service
  27. labels:
  28. app: nginx
  29. spec:
  30. selector:
  31. app: nginx
  32. ports:
  33. - name: nginx-port
  34. protocol: TCP
  35. port: 80
  36. nodePort: 32600
  37. targetPort: 80
  38. type: NodePort
  39. $ kubectl apply -f nginx-deployment.yaml # 执行yaml文件

访问service:

k8s之ingress controller - 图1

tomcat服务的yaml文件如下:

  1. cat tomcat-deployment.yaml
  2. apiVersion: apps/v1
  3. kind: Deployment
  4. metadata:
  5. name: tomcat-deployment
  6. labels:
  7. app: tomcat
  8. spec:
  9. replicas: 1
  10. selector:
  11. matchLabels:
  12. app: tomcat
  13. template:
  14. metadata:
  15. labels:
  16. app: tomcat
  17. spec:
  18. containers:
  19. - name: tomcat
  20. image: tomcat:latest
  21. imagePullPolicy: IfNotPresent
  22. ---
  23. apiVersion: v1
  24. kind: Service
  25. metadata:
  26. name: tomcat-service
  27. labels:
  28. app: tomcat
  29. spec:
  30. selector:
  31. app: tomcat
  32. ports:
  33. - name: tomcat-port
  34. protocol: TCP
  35. port: 8080
  36. nodePort: 32601
  37. targetPort: 8080
  38. type: NodePort
  39. $ kubectl apply -f tomcat-deployment.yaml # 执行此yaml文件

访问service:

k8s之ingress controller - 图2

创建ingress-controller

  1. $ cat nginx-ingress.yaml # 文件内容如下
  2. # 如果打算用于生产环境,请参考 https://github.com/nginxinc/kubernetes-ingress/blob/v1.5.5/docs/installation.md 并根据自己的情况做进一步定制
  3. apiVersion: v1
  4. kind: Namespace
  5. metadata:
  6. name: nginx-ingress
  7. ---
  8. apiVersion: v1
  9. kind: ServiceAccount
  10. metadata:
  11. name: nginx-ingress
  12. namespace: nginx-ingress
  13. ---
  14. apiVersion: v1
  15. kind: Secret
  16. metadata:
  17. name: default-server-secret
  18. namespace: nginx-ingress
  19. type: Opaque
  20. data:
  21. tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUN2akNDQWFZQ0NRREFPRjl0THNhWFhEQU5CZ2txaGtpRzl3MEJBUXNGQURBaE1SOHdIUVlEVlFRRERCWk8KUjBsT1dFbHVaM0psYzNORGIyNTBjbTlzYkdWeU1CNFhEVEU0TURreE1qRTRNRE16TlZvWERUSXpNRGt4TVRFNApNRE16TlZvd0lURWZNQjBHQTFVRUF3d1dUa2RKVGxoSmJtZHlaWE56UTI5dWRISnZiR3hsY2pDQ0FTSXdEUVlKCktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQUwvN2hIUEtFWGRMdjNyaUM3QlBrMTNpWkt5eTlyQ08KR2xZUXYyK2EzUDF0azIrS3YwVGF5aGRCbDRrcnNUcTZzZm8vWUk1Y2Vhbkw4WGM3U1pyQkVRYm9EN2REbWs1Qgo4eDZLS2xHWU5IWlg0Rm5UZ0VPaStlM2ptTFFxRlBSY1kzVnNPazFFeUZBL0JnWlJVbkNHZUtGeERSN0tQdGhyCmtqSXVuektURXUyaDU4Tlp0S21ScUJHdDEwcTNRYzhZT3ExM2FnbmovUWRjc0ZYYTJnMjB1K1lYZDdoZ3krZksKWk4vVUkxQUQ0YzZyM1lma1ZWUmVHd1lxQVp1WXN2V0RKbW1GNWRwdEMzN011cDBPRUxVTExSakZJOTZXNXIwSAo1TmdPc25NWFJNV1hYVlpiNWRxT3R0SmRtS3FhZ25TZ1JQQVpQN2MwQjFQU2FqYzZjNGZRVXpNQ0F3RUFBVEFOCkJna3Foa2lHOXcwQkFRc0ZBQU9DQVFFQWpLb2tRdGRPcEsrTzhibWVPc3lySmdJSXJycVFVY2ZOUitjb0hZVUoKdGhrYnhITFMzR3VBTWI5dm15VExPY2xxeC9aYzJPblEwMEJCLzlTb0swcitFZ1U2UlVrRWtWcitTTFA3NTdUWgozZWI4dmdPdEduMS9ienM3bzNBaS9kclkrcUI5Q2k1S3lPc3FHTG1US2xFaUtOYkcyR1ZyTWxjS0ZYQU80YTY3Cklnc1hzYktNbTQwV1U3cG9mcGltU1ZmaXFSdkV5YmN3N0NYODF6cFErUyt1eHRYK2VBZ3V0NHh3VlI5d2IyVXYKelhuZk9HbWhWNThDd1dIQnNKa0kxNXhaa2VUWXdSN0diaEFMSkZUUkk3dkhvQXprTWIzbjAxQjQyWjNrN3RXNQpJUDFmTlpIOFUvOWxiUHNoT21FRFZkdjF5ZytVRVJxbStGSis2R0oxeFJGcGZnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=
  22. tls.key: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFcEFJQkFBS0NBUUVBdi91RWM4b1JkMHUvZXVJTHNFK1RYZUprckxMMnNJNGFWaEMvYjVyYy9XMlRiNHEvClJOcktGMEdYaVN1eE9ycXgrajlnamx4NXFjdnhkenRKbXNFUkJ1Z1B0ME9hVGtIekhvb3FVWmcwZGxmZ1dkT0EKUTZMNTdlT1l0Q29VOUZ4amRXdzZUVVRJVUQ4R0JsRlNjSVo0b1hFTkhzbysyR3VTTWk2Zk1wTVM3YUhudzFtMApxWkdvRWEzWFNyZEJ6eGc2clhkcUNlUDlCMXl3VmRyYURiUzc1aGQzdUdETDU4cGszOVFqVUFQaHpxdmRoK1JWClZGNGJCaW9CbTVpeTlZTW1hWVhsMm0wTGZzeTZuUTRRdFFzdEdNVWozcGJtdlFmazJBNnljeGRFeFpkZFZsdmwKMm82MjBsMllxcHFDZEtCRThCay90elFIVTlKcU56cHpoOUJUTXdJREFRQUJBb0lCQVFDZklHbXowOHhRVmorNwpLZnZJUXQwQ0YzR2MxNld6eDhVNml4MHg4Mm15d1kxUUNlL3BzWE9LZlRxT1h1SENyUlp5TnUvZ2IvUUQ4bUFOCmxOMjRZTWl0TWRJODg5TEZoTkp3QU5OODJDeTczckM5bzVvUDlkazAvYzRIbjAzSkVYNzZ5QjgzQm9rR1FvYksKMjhMNk0rdHUzUmFqNjd6Vmc2d2szaEhrU0pXSzBwV1YrSjdrUkRWYmhDYUZhNk5nMUZNRWxhTlozVDhhUUtyQgpDUDNDeEFTdjYxWTk5TEI4KzNXWVFIK3NYaTVGM01pYVNBZ1BkQUk3WEh1dXFET1lvMU5PL0JoSGt1aVg2QnRtCnorNTZud2pZMy8yUytSRmNBc3JMTnIwMDJZZi9oY0IraVlDNzVWYmcydVd6WTY3TWdOTGQ5VW9RU3BDRkYrVm4KM0cyUnhybnhBb0dCQU40U3M0ZVlPU2huMVpQQjdhTUZsY0k2RHR2S2ErTGZTTXFyY2pOZjJlSEpZNnhubmxKdgpGenpGL2RiVWVTbWxSekR0WkdlcXZXaHFISy9iTjIyeWJhOU1WMDlRQ0JFTk5jNmtWajJTVHpUWkJVbEx4QzYrCk93Z0wyZHhKendWelU0VC84ajdHalRUN05BZVpFS2FvRHFyRG5BYWkyaW5oZU1JVWZHRXFGKzJyQW9HQkFOMVAKK0tZL0lsS3RWRzRKSklQNzBjUis3RmpyeXJpY05iWCtQVzUvOXFHaWxnY2grZ3l4b25BWlBpd2NpeDN3QVpGdwpaZC96ZFB2aTBkWEppc1BSZjRMazg5b2pCUmpiRmRmc2l5UmJYbyt3TFU4NUhRU2NGMnN5aUFPaTVBRHdVU0FkCm45YWFweUNweEFkREtERHdObit3ZFhtaTZ0OHRpSFRkK3RoVDhkaVpBb0dCQUt6Wis1bG9OOTBtYlF4VVh5YUwKMjFSUm9tMGJjcndsTmVCaWNFSmlzaEhYa2xpSVVxZ3hSZklNM2hhUVRUcklKZENFaHFsV01aV0xPb2I2NTNyZgo3aFlMSXM1ZUtka3o0aFRVdnpldm9TMHVXcm9CV2xOVHlGanIrSWhKZnZUc0hpOGdsU3FkbXgySkJhZUFVWUNXCndNdlQ4NmNLclNyNkQrZG8wS05FZzFsL0FvR0FlMkFVdHVFbFNqLzBmRzgrV3hHc1RFV1JqclRNUzRSUjhRWXQKeXdjdFA4aDZxTGxKUTRCWGxQU05rMXZLTmtOUkxIb2pZT2pCQTViYjhibXNVU1BlV09NNENoaFJ4QnlHbmR2eAphYkJDRkFwY0IvbEg4d1R0alVZYlN5T294ZGt5OEp0ek90ajJhS0FiZHd6NlArWDZDODhjZmxYVFo5MWpYL3RMCjF3TmRKS2tDZ1lCbyt0UzB5TzJ2SWFmK2UwSkN5TGhzVDQ5cTN3Zis2QWVqWGx2WDJ1VnRYejN5QTZnbXo5aCsKcDNlK2JMRUxwb3B0WFhNdUFRR0xhUkcrYlNNcjR5dERYbE5ZSndUeThXczNKY3dlSTdqZVp2b0ZpbmNvVlVIMwphdmxoTUVCRGYxSjltSDB5cDBwWUNaS2ROdHNvZEZtQktzVEtQMjJhTmtsVVhCS3gyZzR6cFE9PQotLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQo=
  23. ---
  24. kind: ConfigMap
  25. apiVersion: v1
  26. metadata:
  27. name: nginx-config
  28. namespace: nginx-ingress
  29. data:
  30. server-names-hash-bucket-size: "1024"
  31. ---
  32. kind: ClusterRole
  33. apiVersion: rbac.authorization.k8s.io/v1beta1
  34. metadata:
  35. name: nginx-ingress
  36. rules:
  37. - apiGroups:
  38. - ""
  39. resources:
  40. - services
  41. - endpoints
  42. verbs:
  43. - get
  44. - list
  45. - watch
  46. - apiGroups:
  47. - ""
  48. resources:
  49. - secrets
  50. verbs:
  51. - get
  52. - list
  53. - watch
  54. - apiGroups:
  55. - ""
  56. resources:
  57. - configmaps
  58. verbs:
  59. - get
  60. - list
  61. - watch
  62. - update
  63. - create
  64. - apiGroups:
  65. - ""
  66. resources:
  67. - pods
  68. verbs:
  69. - list
  70. - apiGroups:
  71. - ""
  72. resources:
  73. - events
  74. verbs:
  75. - create
  76. - patch
  77. - apiGroups:
  78. - extensions
  79. resources:
  80. - ingresses
  81. verbs:
  82. - list
  83. - watch
  84. - get
  85. - apiGroups:
  86. - "extensions"
  87. resources:
  88. - ingresses/status
  89. verbs:
  90. - update
  91. - apiGroups:
  92. - k8s.nginx.org
  93. resources:
  94. - virtualservers
  95. - virtualserverroutes
  96. verbs:
  97. - list
  98. - watch
  99. - get
  100. ---
  101. kind: ClusterRoleBinding
  102. apiVersion: rbac.authorization.k8s.io/v1beta1
  103. metadata:
  104. name: nginx-ingress
  105. subjects:
  106. - kind: ServiceAccount
  107. name: nginx-ingress
  108. namespace: nginx-ingress
  109. roleRef:
  110. kind: ClusterRole
  111. name: nginx-ingress
  112. apiGroup: rbac.authorization.k8s.io
  113. ---
  114. apiVersion: apps/v1
  115. kind: DaemonSet
  116. metadata:
  117. name: nginx-ingress
  118. namespace: nginx-ingress
  119. annotations:
  120. prometheus.io/scrape: "true"
  121. prometheus.io/port: "9113"
  122. spec:
  123. selector:
  124. matchLabels:
  125. app: nginx-ingress
  126. template:
  127. metadata:
  128. labels:
  129. app: nginx-ingress
  130. spec:
  131. serviceAccountName: nginx-ingress
  132. containers:
  133. - image: nginx/nginx-ingress:1.5.3
  134. imagePullPolicy: IfNotPresent
  135. name: nginx-ingress
  136. ports:
  137. - name: http
  138. containerPort: 80
  139. hostPort: 80
  140. - name: https
  141. containerPort: 443
  142. hostPort: 443
  143. - name: prometheus
  144. containerPort: 9113
  145. env:
  146. - name: POD_NAMESPACE
  147. valueFrom:
  148. fieldRef:
  149. fieldPath: metadata.namespace
  150. - name: POD_NAME
  151. valueFrom:
  152. fieldRef:
  153. fieldPath: metadata.name
  154. args:
  155. - -nginx-configmaps=$(POD_NAMESPACE)/nginx-config
  156. - -default-server-tls-secret=$(POD_NAMESPACE)/default-server-secret
  157. #- -v=3 # Enables extensive logging. Useful for troubleshooting.
  158. #- -report-ingress-status
  159. #- -external-service=nginx-ingress
  160. #- -enable-leader-election
  161. - -enable-prometheus-metrics
  162. #- -enable-custom-resources
  163. $ kubectl apply -f nginx-ingress.yaml

创建ingress

  1. $ cat ingress-v1.yaml
  2. apiVersion: networking.k8s.io/v1beta1
  3. kind: Ingress
  4. metadata:
  5. name: my-ingress-for-nginx # Ingress 的名字,仅用于标识
  6. spec:
  7. rules: # Ingress 中定义 L7 路由规则
  8. - host: www.lvnginx.cn # 根据 virtual hostname 进行路由(请使用自己的域名)
  9. http:
  10. paths: # 按路径进行路由
  11. - path: /
  12. backend:
  13. serviceName: nginx-service # 指定后端的 Service 为之前创建的 nginx-service
  14. servicePort: 80
  15. - host: www.lvtomcat.cn # 根据 virtual hostname 进行路由(请使用自己的域名)
  16. http:
  17. paths: # 按路径进行路由
  18. - path: /
  19. backend:
  20. serviceName: tomcat-service # 指定后端的 Service 为之前创建的 nginx-service
  21. servicePort: 8080
  22. $ kubectl apply -f ingress-v1.yaml

域名访问测试

创建后自己做域名解析(需解析到work节点,不能解析到master节点,具体原因及解决办法参考我之前的博文: K8s之Ingress-nginx原理及配置),可以解析后,分别访问 www.lvtomcat.cn 和 www.lvnginx.cn,可以看到如下页面,则表示成功。

k8s之ingress controller - 图3

k8s之ingress controller - 图4