1,Ingress介绍

Ingress就是从kubernetes集群外访问集群的入口,将用户的URL请求转发到不同的service上。相当于nginx反向代理服务器,它包括的规则定义就是URL的路由信息;它的实现需要部署Ingress controller(比如 traefik ingress-nginx 等),Ingress controller通过apiserver监听ingress和service的变化,并根据规则配置负载均衡并提供访问入口,达到服务发现的作用。

  • 未配置ingress:集群外部 -> NodePort -> K8S Service
  • 配置ingress: 集群外部 -> Ingress -> K8S Service

注意:ingress 本身也需要部署Ingress controller时暴露NodePort让外部访问

2,Ingress格式

  1. # 每个Ingress都需要配置rules,仅支持http规则,示例表示请求/testpath时转发到服务test的80端口
  2. apiVersion: extensions/v1beta1
  3. kind: Ingress
  4. metadata:
  5. name: test-ingress
  6. spec:
  7. rules:
  8. - http:
  9. paths:
  10. - path: /testpath
  11. backend:
  12. serviceName: test
  13. servicePort: 80

3,Ingress类型

单服务Ingress

  1. # 即该Ingress仅指定一个没有任何规则的后端服务,所有请求都转发到后端
  2. apiVersion: extensions/v1beta1
  3. kind: Ingress
  4. metadata:
  5. name: test-ingress
  6. spec:
  7. backend:
  8. serviceName: testsvc
  9. servicePort: 80

多服务的Ingress

  1. # 根据请求路径的不同转发到不同的后端服务上
  2. apiVersion: extensions/v1beta1
  3. kind: Ingress
  4. metadata:
  5. name: test
  6. spec:
  7. rules:
  8. - host: foo.bar.com
  9. http:
  10. paths:
  11. - path: /foo
  12. backend:
  13. serviceName: s1
  14. servicePort: 80
  15. - path: /bar
  16. backend:
  17. serviceName: s2
  18. servicePort: 80
  1. $ kubectl get ing
  2. NAME RULE BACKEND ADDRESS
  3. test -
  4. foo.bar.com
  5. /foo s1:80
  6. /bar s2:80

虚拟主机Ingress

  1. # 根据名字的不同转发到不同的后端服务上,而他们共用同一个的IP地址
  2. apiVersion: extensions/v1beta1
  3. kind: Ingress
  4. metadata:
  5. name: test
  6. spec:
  7. rules:
  8. - host: foo.bar.com
  9. http:
  10. paths:
  11. - backend:
  12. serviceName: s1
  13. servicePort: 80
  14. - host: bar.foo.com
  15. http:
  16. paths:
  17. - backend:
  18. serviceName: s2
  19. servicePort: 80
  20. - host:
  21. http:
  22. paths:
  23. - backend:
  24. serviceName: s3
  25. servicePort: 80

注意:没有定义规则的后端服务,可以用来方便的处理404页面

TLS Ingress

TLS Ingress通过Secret获取TLS私钥和证书(名为tls.crt和tls.key),来执行TLS终止。如果Ingress中的TLS配置部分指定了不同的主机,则它们将根据通过SNI TLS扩展指定的主机名(假如Ingress controller支持SNI)在多个相同端口上进行复用

  1. # 定义一个包含tls.crt和tls.key的secret
  2. apiVersion: v1
  3. data:
  4. tls.crt: base64 encoded cert
  5. tls.key: base64 encoded key
  6. kind: Secret
  7. metadata:
  8. name: testsecret
  9. namespace: default
  10. type: Opaque
  1. # Ingress中引用secret
  2. apiVersion: extensions/v1beta1
  3. kind: Ingress
  4. metadata:
  5. name: no-rules-map
  6. spec:
  7. tls:
  8. - secretName: testsecret
  9. backend:
  10. serviceName: s1
  11. servicePort: 80

4,更新Ingress

  1. # 可以通过kubectl edit ing name的方法来更新ingress:
  2. $ kubectl get ing
  3. NAME RULE BACKEND ADDRESS
  4. test - 178.91.123.132
  5. foo.bar.com
  6. /foo s1:80
  7. # 修改ingress
  8. $ kubectl edit ing test
  9. # 更新pod
  10. $ kubectl -n ingress get pod
  11. $ kubectl -n ingress delete pod <pod_name>