文章目录
- 1、安装 Ingress 控制器
- 2、Ingress 扇出
- 3、基于名称的虚拟托管
- 4、Ingress TLS
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