Ingress 是一组路由规则,公开从集群外部到集群内服务的 HTTP 和 HTTPS 路由。
Ingress 控制器是一组 pod,负责通过负载均衡器来解析 Ingress 路由规则,将请求转发到相应的服务。
1、安装 Ingress 控制器
安装 Igress 控制器,例如 Nginx ingress controller,这里以目前官网最新的 v1.5.1 版本为例,下载 deploy.yaml 配置文件(或直接拷贝到本地)。
修改配置文件
# 镜像地址修改为阿里云地址 # kind: Deployment image: registry.aliyuncs.com/google_containers/nginx-ingress-controller:v1.5.1 # kind: Job image: registry.aliyuncs.com/google_containers/kube-webhook-certgen:v20220916-gd32f8c343
设置默认 ingress controller
# 应用资源 kubectl apply -f deploy.yaml # 编辑 nginx ingress controller 的 ingressclass kubectl edit -n ingress-nginx ingressclasses.networking.k8s.io nginx # 在 annotations 字段下方添加注解,设置为默认控制器 annotations: ingressclass.kubernetes.io/is-default-class: "true"
查看 Ingress 控制器
kubectl exec -n ingress-nginx -it pod/ingress-nginx-controller-6867494779-2k7ff -- bash bash-5.1$ cat nginx.conf
2、Ingress 扇出
一个扇出(fanout)配置根据请求的 HTTP URI 将来自同一 IP 地址的流量路由到多个 Service。
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: nginx.ingress.kubernetes.io/rewrite-target: "/$1" name: fanout-ingress spec: rules: - host: www.nick.com http: # 路径列表 paths: # 路径 - path: /svc2/(.*)$ # 路径类型 pathType: Prefix # 指定后端 backend: service: name: mysvc2 port: number: 8082 - path: /svc3/(.*)$ pathType: Prefix backend: service: name: mysvc3 port: number: 8083
测试
kubectl apply -f fanout-ingress.yaml kubectl get -f fanout-ingress.yaml kubectl get -n ingress-nginx svc # 添加域名映射 sudo vim /etc/hosts 10.102.138.220 www.example.com curl http://www.nick.com/svc2/print/env curl http://www.nick.com/svc3/print/env
3、基于名称的虚拟托管
基于名称的虚拟主机支持将针对多个主机名的 HTTP 流量路由到同一 IP 地址上。
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: hostname-ingress spec: rules: - host: svc1.nick.com http: paths: - path: / pathType: Prefix backend: service: name: mysvc1 port: number: 8081 - host: svc2.nick.com http: paths: - path: / pathType: Prefix backend: service: name: mysvc2 port: number: 8082
测试
kubectl apply -f hostname-ingress.yaml kubectl get -f hostname-ingress.yaml kubectl describe -f hostname-ingress.yaml # 添加域名映射 sudo vim /etc/hosts 10.102.138.220 svc1.nick.com 10.102.138.220 svc2.nick.com # 访问测试 curl http://svc1.nick.com/print/env curl http://svc2.nick.com/print/env
4、Ingress TLS
自签证书
# 创建公钥和相对应的私钥 openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /tmp/fanouttls.key -out /tmp/fanouttls.crt -subj "/CN=https-www.nick.com/O=https-www.nick.com"
创建 secret
# 创建 secret kubectl create secret tls fanout-ingress-tls --cert=/tmp/fanouttls.crt --key=/tmp/fanouttls.key # 查看secret kubectl get secrets fanout-ingress-tls -o yaml
新建 Ingress
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: nginx.ingress.kubernetes.io/rewrite-target: "/$1" name: fanout-ingress spec: tls: - hosts: - https-www.nick.com secretName: fanout-ingress-tls rules: - host: https-www.nick.com http: paths: - path: /svc2/(.*)$ pathType: Prefix backend: service: name: mysvc2 port: number: 8082 - path: /svc3/(.*)$ pathType: Prefix backend: service: name: mysvc3 port: number: 8083
测试:
# 添加域名映射 sudo vim /etc/hosts # 访问 curl https://https-www.nick.com/svc2/print/env --cacert /tmp/fanouttls.crt curl https://https-www.nick.com/svc3/print/env --cacert /tmp/fanouttls.crt