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/v1beta1
kind: Ingress
metadata:
name: test-ingress
spec:
rules:
- http:
paths:
- path: /testpath
backend:
serviceName: test
servicePort: 80
3,Ingress类型
单服务Ingress
# 即该Ingress仅指定一个没有任何规则的后端服务,所有请求都转发到后端
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: test-ingress
spec:
backend:
serviceName: testsvc
servicePort: 80
多服务的Ingress
# 根据请求路径的不同转发到不同的后端服务上
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: test
spec:
rules:
- host: foo.bar.com
http:
paths:
- path: /foo
backend:
serviceName: s1
servicePort: 80
- path: /bar
backend:
serviceName: s2
servicePort: 80
$ kubectl get ing
NAME RULE BACKEND ADDRESS
test -
foo.bar.com
/foo s1:80
/bar s2:80
虚拟主机Ingress
# 根据名字的不同转发到不同的后端服务上,而他们共用同一个的IP地址
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: test
spec:
rules:
- host: foo.bar.com
http:
paths:
- backend:
serviceName: s1
servicePort: 80
- host: bar.foo.com
http:
paths:
- backend:
serviceName: s2
servicePort: 80
- host:
http:
paths:
- backend:
serviceName: s3
servicePort: 80
注意:没有定义规则的后端服务,可以用来方便的处理404页面
TLS Ingress
TLS Ingress通过Secret获取TLS私钥和证书(名为tls.crt和tls.key),来执行TLS终止。如果Ingress中的TLS配置部分指定了不同的主机,则它们将根据通过SNI TLS扩展指定的主机名(假如Ingress controller支持SNI)在多个相同端口上进行复用
# 定义一个包含tls.crt和tls.key的secret
apiVersion: v1
data:
tls.crt: base64 encoded cert
tls.key: base64 encoded key
kind: Secret
metadata:
name: testsecret
namespace: default
type: Opaque
# Ingress中引用secret
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: no-rules-map
spec:
tls:
- secretName: testsecret
backend:
serviceName: s1
servicePort: 80
4,更新Ingress
# 可以通过kubectl edit ing name的方法来更新ingress:
$ kubectl get ing
NAME RULE BACKEND ADDRESS
test - 178.91.123.132
foo.bar.com
/foo s1:80
# 修改ingress
$ kubectl edit ing test
# 更新pod
$ kubectl -n ingress get pod
$ kubectl -n ingress delete pod <pod_name>