文章目录
- 一、概念
- `1.1.NodePort存在的不足`
- `1.2.Ingress`
- 二、部署Ingress Controller(全局的负载均衡)
- `2.1.Ingress Contronler工作原理`
- `2.2.下载yaml文件`
- `2.3.下载镜像`
- `2.4.修改mandatory.yaml`
- 三、基于HTTP的Ingress规则
- `3.1.yaml文件`
- `3.2.访问域名`
- 四、基于HTTPS的Ingress规则
- `4.1.生成自签证书`
- `4.2.创建secret`
- `4.3.Ingress规则`
参考视频:https://ke.qq.com/user/index/index.html#/plan/cid=1709963&term_id=102815140
一、概念
1.1.NodePort存在的不足
一个端口只能关联一个服务,端口需提前规划
只支持4层负载均衡(NodeIP+Port)
1.2.Ingress
Ingress 公开了从集群外部到集群内服务的HTTP和HTTPS路由。流量路由由Ingress资源上定义的规则控制。
关联Service
通过Ingress Controller实现Pod的负载均衡
支持TCP/UDP 4层和HTTP 7层
二、部署Ingress Controller(全局的负载均衡)
2.1.Ingress Contronler工作原理
Ingress Contronler通过与 Kubernetes API 交互,动态感知集群中 Ingress 规则变化,然后读取它,根据Ingress规则生成一段 Nginx 配置,应用到管理的Nginx服务,然后热加载生效。
以此来达到Nginx负载均衡器配置及动态更新的问题。
数据包流程:客户端 ->Ingress Controller(nginx) ->ServiceName:Port ->分布在各节点Pod
2.2.下载yaml文件
地址:https://github.com/kubernetes/ingress-nginx/tree/nginx-0.30.0
2.3.下载镜像
docker pull siriuszg/nginx-ingress-controller:0.30.0
2.4.修改mandatory.yaml
使用宿主机网络,添加hostNetwork: true
镜像修改为上一步下载的镜像
kubectl apply -f mandatory.yaml
正常会监听宿主机的80和443端口
三、基于HTTP的Ingress规则
3.1.yaml文件
apiVersion networking.k8s.io/v1beta1
kind Ingress
metadata
name ingress
annotations
nginx.ingress.kubernetes.io/rewrite-target /
spec
rules
host foo.bar.com
http
paths
backend
serviceName web
servicePort80
解释
host: foo.bar.com #访问Ingress的域名
serviceName: web #管理服务名为web的Service
servicePort: 80 #Service监听的端口为80,通过kubectl get svc查看
kubectl apply -f ingress.yaml
kubectl get ing
3.2.访问域名
查看nginx-ingress-controller部署到哪个节点上
kubectl get pod -o wide -ningress-nginx
nginx-ingress-controller部署到了192.168.1.10节点上
由于foo.bar.com是临时起的,需要写域名解析到hosts文件
echo "192.168.1.10 foo.bar.com" >> /etc/hosts
curl foo.bar.com
四、基于HTTPS的Ingress规则
4.1.生成自签证书
openssl genrsa > cert.key
openssl req -new -x509 -key cert.key -subj "/CN=common" >cert.pe
4.2.创建secret
kubectl create secret tls foo-bar-com --cert=cert.pem --key=cert.key
kubectl get secrets
4.3.Ingress规则
apiVersion networking.k8s.io/v1beta1
kind Ingress
metadata
name tls-example-ingress
spec
tls
hosts
foo.bar.com
secretName foo-bar-com
rules
host foo.bar.com
http
paths
path /
backend
serviceName web
servicePort80
kubectl apply -f ingress-https.yaml