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格式
# 每个Ingress都需要配置rules,仅支持http规则,示例表示请求/testpath时转发到服务test的80端口apiVersion: extensions/v1beta1kind: Ingressmetadata:name: test-ingressspec:rules:- http:paths:- path: /testpathbackend:serviceName: testservicePort: 80
3,Ingress类型
单服务Ingress
# 即该Ingress仅指定一个没有任何规则的后端服务,所有请求都转发到后端apiVersion: extensions/v1beta1kind: Ingressmetadata:name: test-ingressspec:backend:serviceName: testsvcservicePort: 80
多服务的Ingress
# 根据请求路径的不同转发到不同的后端服务上apiVersion: extensions/v1beta1kind: Ingressmetadata:name: testspec:rules:- host: foo.bar.comhttp:paths:- path: /foobackend:serviceName: s1servicePort: 80- path: /barbackend:serviceName: s2servicePort: 80
$ kubectl get ingNAME RULE BACKEND ADDRESStest -foo.bar.com/foo s1:80/bar s2:80
虚拟主机Ingress
# 根据名字的不同转发到不同的后端服务上,而他们共用同一个的IP地址apiVersion: extensions/v1beta1kind: Ingressmetadata:name: testspec:rules:- host: foo.bar.comhttp:paths:- backend:serviceName: s1servicePort: 80- host: bar.foo.comhttp:paths:- backend:serviceName: s2servicePort: 80- host:http:paths:- backend:serviceName: s3servicePort: 80
注意:没有定义规则的后端服务,可以用来方便的处理404页面
TLS Ingress
TLS Ingress通过Secret获取TLS私钥和证书(名为tls.crt和tls.key),来执行TLS终止。如果Ingress中的TLS配置部分指定了不同的主机,则它们将根据通过SNI TLS扩展指定的主机名(假如Ingress controller支持SNI)在多个相同端口上进行复用
# 定义一个包含tls.crt和tls.key的secretapiVersion: v1data:tls.crt: base64 encoded certtls.key: base64 encoded keykind: Secretmetadata:name: testsecretnamespace: defaulttype: Opaque
# Ingress中引用secretapiVersion: extensions/v1beta1kind: Ingressmetadata:name: no-rules-mapspec:tls:- secretName: testsecretbackend:serviceName: s1servicePort: 80
4,更新Ingress
# 可以通过kubectl edit ing name的方法来更新ingress:$ kubectl get ingNAME RULE BACKEND ADDRESStest - 178.91.123.132foo.bar.com/foo s1:80# 修改ingress$ kubectl edit ing test# 更新pod$ kubectl -n ingress get pod$ kubectl -n ingress delete pod <pod_name>
