一、 ingress 原理
1、数据流向
ingress为七层负载均衡,理解为nginx。源于官网的数据流向图,客户端访问进入ingress,ingress根据域名进行解析 ,随后找到关联的service服务获取pod信息,直接代理至pod节点
2、ingress 模式 hostnetwork nodeport
hostnetwork模式:
每个节点都创建一个ingress-controller的容器,容器的网络模式设为hostNetwork。访问请求通过80/443端口将直接进入到pod-nginx中。而后nginx根据ingress规则再将流量转发到对应的web应用容器中。
nodeport模式 :
访问流量先通过nodeport进入到node节点,经iptables (svc) 转发至ingress-controller容器,再根据rule转发至后端各业务的容器中。
二、部署
1、hostnetwork模式
1) 下载yaml文件
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/mandatory.yaml
2) 修改镜像
cp mandatory.yaml mandatory.yaml_back
quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.30.0
改为,registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:0.30.0
3) 先把镜像拉取下来
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:0.30.0
3) 修改为hostnetwork模式
vim mandatory
4) 部署
kubectl apply -f mandatory.yaml
5) ingress-nginx pod 随机分配检验
ingress-nginx pod 随机被调配到node节点,新加nod02节点,再重新部署
kubectl apply -f mandatory.yaml
6) 修改为daemon-set模式
ingress-controller pod 在所有节点都有部署
7) 使用标签分组部署ingress-controller
找一组专用于ingress入口的node节点做为流量入口,使用10.0.0.104做为流量入口。对于亲和性的配置需要k8s v1.10+
1>nod02做为ingress 专用节点,打标签
kubectl get nodes --show-labels
kubectl label nodes nod02 httpin=ingressfor
kubectl label nodes nod02 httpin=podforingress --overwrite
2>daemon-set,亲和性配置
根据 nodeselector配置亲和性,node节点配置设置limit上限
3>apply
kubectl apply -f mandatory.yaml
pod被调度到nod02节点。(如果使用label 的 key value配置,配置错误不会报错并且配置不会生效,命名空间看不到任何pod)
2、nodeport 模式部署
nodeport 可以使用deploy部署或者helm部署,此处使用helm部署
1) 添加helm依赖
helm repo add nginx-stable https://helm.nginx.com/stable
helm repo list
helm search repo nginx-ingress
2)将依赖拉到本地,修改nodeport
helm pull nginx-stable/nginx-ingress
tar xf nginx-ingress-0.8.1.tgz
vim ./nginx-inress/values.yaml
3) 安装
kubectl create namespace ingress-nginx
helm install ingress-nginx ./nginx-ingress -n ingress-nginx
[root@k8s01 ingress]# helm install ingress-nginx ./nginx-ingress -n ingress-nginx
Error: cannot re-use a name that is still in use
[root@k8s01 ingress]# helm uninstall ingress-nginx -n ingress-nginx
release "ingress-nginx" uninstalled
kubectl get pods -o wide -n ingress-nginx
kubectl get svc -n ingress-nginx
三、结构
ingress入口分组节点用于流量入口,外部必然是负载均衡。现在大部分是云环境,服务暴露大部分通过4层7层SLB,deployment部署通过加载annotation,loadbalance-id 实现对4层或者7层关联。或者直接使用ingress来实现7层负载。不论什么环境考虑不外乎两点,高并发大流量必然带来的是高可用性以及横向扩展能力的需求。