k8s学习笔记5-部署和应用ingress-nginx-controller-1.3.0
一.介绍和原理
A.Ingress 是什么
Ingress 公开从集群外部到集群内服务的 HTTP 和 HTTPS 路由。 流量路由由 Ingress 资源上定义的规则控制。
下面是一个将所有流量都发送到同一 Service 的简单 Ingress 示例:
B.Ingress的组成
1.ingress:
ingress是一个API对象,通过yaml文件来配置,ingress对象的作用是定义请求如何转发到service的规则,可以理解为配置模板。
ingress通过http或https暴露集群内部service,给service提供外部URI、负载均衡、SSL/TLS能力以及基于域名的反向代理。ingress要依靠ingress-controiler来具体实现以上功能。
2.ingress-controller:
ingress-controller是具体实现反向代理及负载均衡的程序,对ingress定义的规则进行解析,根据配置的规则来实现请求转发。
ingress-controller并不是k8s自带的组件,实际上ingess-controller只是一个统称,用户可以选择不同的ingress-controller实现,目前,由k8s维护的ingress-controller只有google云的GCE与ingress-nginx两个,其他还有很多第三方维护的ingress-controller,具体可以参考官方文档。
但是不管哪一种ingress-controller,实现的机制都大同小异,只是在具体配置上有差异。
一般来说,ingress-controller的形式都是一个pod,里面跑着demon程序和反向代理程序。daemon负责不断监控集群的变化,根据ingress对象生成配置并应用新配置到反向代理,比如ingress-nginx就是动态生成nginx配置,动态更新upstreanm,并在需要的时候reload程序应用新配置。为了方便,后面的例子都以k8s官方维护的ingress-nginx为例。
3.Ingress的工作原理
1.ingress-controller通过和 kubernetes APIServer交互,动态的去感知集群中ingress规则变化;
2.然后读取它,按照自定义的规则,规则就是写明了哪个域名对应哪个service,生成一段nginx配置;
3.再写到nginx-ingress-controller的pod里,这个ingres-controller的pod里运行着一个Nginx服务,
控制器会把生成的nginx置写入/etc/nginx.conf文件中;
4.然后reload一下使配置生效。以此达到域名区分配置和动态更新的作用。
客户端一般会把请求发送到负载均衡器上由负载均衡器转发到ingress控制所在的node节点上目的减小Node节点的负载压力
ingress控制器会根据ingress资源对象的配置转发请求到对应的service
service会根据端点,把请求转发到关联的Pod
二.部署
A.下载部署文件和镜像
1.下载ingress-nginx的部署文件(如果出现无法下载此文件,请参考链接https://blog.csdn.net/weixin_43656190/article/details/117604612)
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.3.0/deploy/static/provider/cloud/deploy.yaml
备注:该文件在github上也可以下载,地址是:https://github.com/kubernetes/ingress-nginx/blob/main/deploy/static/provider/cloud/deploy.yaml
2.由于镜像问题,会导致yaml文件中的镜像无法下载,解决思路:先在docker hub上查找,下载下来之后,将其推送到私有的harbor镜像服务器上
需要下载如下两个镜像:
root@k8s-master1:~/ingress# cat deploy.yaml |grep imag
image: registry.k8s.io/ingress-nginx/controller:v1.3.0@sha256:d1707ca76d3b044ab8a28277a2466a02100ee9f58a86af1535a3edf9323ea1b5
imagePullPolicy: IfNotPresent
image: registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.1.1@sha256:64d8c73dca984af206adf9d6d7e46aa550362b1d7a01f3a0a91b20cc67868660
imagePullPolicy: IfNotPresent
image: registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.1.1@sha256:64d8c73dca984af206adf9d6d7e46aa550362b1d7a01f3a0a91b20cc67868660
imagePullPolicy: IfNotPresent
在docker hub上搜索
root@k8s-master1:~/ingress# docker search ingress-nginx --no-trunc
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
willdockerhub/ingress-nginx-controller sync from k8s.gcr.io/ingress-nginx/controller 20
pollyduan/ingress-nginx-controller k8s.gcr.io/ingress-nginx/controller 9
liangjw/ingress-nginx-controller k8s.gcr.io/ingress-nginx/controller 7
wangshun1024/ingress-nginx-controller 3
dyrnq/ingress-nginx-controller k8s.gcr.io/ingress-nginx/controller 2
acicn/ingress-nginx-controller 2
wallarm/ingress-nginx 0
13916077927/ingress-nginx-controller sync from k8s.gcr.io/ingress-nginx/controller 0
rancher/ingress-nginx 0
v5cn/ingress-nginx-controller k8s.gcr.io/ingress-nginx/controller:v0.46.0 0
platform9/ingress-nginx 0
cangyin/ingress-nginx-controller 0
forging2012/ingress-nginx-controller 0
sundewang/ingress-nginx-controller 0
boy530/ingress-nginx-controller 0
blendlabs/ingress-nginx-catchall A blend branded nginx catchall. 0
cjk2atmb/ingress-nginx-controller 0
opsdockerimage/ingress-nginx-controller 0
acicn/ingress-nginx-kube-webhook-certgen 0
rudl/ingress-nginx Nginx ingress controller 0
opsdockerimage/ingress-nginx-nginx 0
lchdzh/ingress-nginx-controller 0
liy36/ingress-nginx-controller 0
opsdockerimage/ingress-nginx-e2e-test-runner 0
chainstack/ingress-nginx 0
root@k8s-master1:~/ingress# docker search kube-webhook-certgen --no-trun