Ingress 工作原理
ingress controller通过和kubernetes api交互,动态的去感知集群中ingress规则变化,2.然后读取它,按照自定义的规则,规则就是写明了哪个域名对应哪个service,生成一段nginx配置,3.再写到nginx-ingress-control的pod里,这个Ingress controller的pod里运行着一个Nginx服务,控制器会把生成的nginx配置写入/etc/nginx.conf文件中,4.然后reload一下使配置生效。以此达到域名分配置和动态更新的问题。
Ingress 这个东西是 1.2 后才出现的,通过 Ingress 用户可以实现使用 nginx 等开源的反向代理负载均衡器实现对外暴露服务,以下详细说一下 Ingress,毕竟 traefik 用的就是 Ingress
1.使用 Ingress 时一般会有三个组件:
反向代理负载均衡器
Ingress Controller
Ingress
1.1、反向代理负载均衡器(安装traefik服务)
反向代理负载均衡器很简单,说白了就是 nginx、apache 、traefik什么的;在集群中反向代理负载均衡器可以自由部署,可以使用 Replication Controller、Deployment、DaemonSet 等等,不过个人喜欢以 DaemonSet 的方式部署,感觉比较方便
1.2、Ingress Controller
Ingress Controller 实质上可以理解为是个监视器,Ingress Controller 通过不断地跟 kubernetes API 打交道,实时的感知后端 service、pod 等变化,比如新增和减少 pod,service 增加与减少等;当得到这些变化信息后,Ingress Controller 再结合下文的 Ingress 生成配置,然后更新反向代理负载均衡器,并刷新其配置,达到服务发现的作用
1.3、Ingress
Ingress 简单理解就是个规则定义;比如说某个域名对应某个 service,即当某个域名的请求进来时转发给某个 service;这个规则将与 Ingress Controller 结合,然后 Ingress Controller 将其动态写入到负载均衡器配置中,从而实现整体的服务发现和负载均衡
2.安装traefik
$ gitclonehttps://github.com/containous/traefik.git
$ git checkout v1.7 #切换到v1.7分支
$ cd traefik/examples/k8s
traefik/examples/k8s/这个目录下就是示例 Traefik 启动所需要的 yaml 文件,Traefik 提供了适配各个类型服务编排的部署方式,kubernetes 启动方式支持 Deployment 和 DaemonSet(会在每个节点都部署服务https://www.kubernetes.org.cn/daemonset),二选一都可以。
$ kubectl create -f traefik/examples/k8s/traefik-rbac.yaml
clusterrole "traefik-ingress-controller" created
clusterrolebinding "traefik-ingress-controller" created
$ kubectl create -f traefik/examples/k8s/traefik-deployment.yaml
serviceaccount "traefik-ingress-controller" created
deployment "traefik-ingress-controller" created
service "traefik-ingress-service" created
$ kubectl get pods --all -namespaces -o wide
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE
kube-system traefik-ingress-controller-46b75 1/1 Running 2 101d 172.20.166.107 172.16.5.205
好了,此时 Traefik 已经启动成功了,它同时启动了 80 和 8080 端口,80 对应的服务端口,8080 对应的 UI 端口,我们可以通过查看服务暴漏端口号浏览器访问下了提供的 UI 界面。
root@blk:~# kubectl get service -n kube-system
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kube-dns ClusterIP 10.68.0.2 53/UDP,53/TCP 22d
metrics-server NodePort 10.68.2.105 443:30443/TCP 20d
traefik-ingress-service NodePort 10.68.60.37 80:36774/TCP,8080:35935/TCP 64m
traefik-web-ui ClusterIP 10.68.139.169 80/TCP 57m
当你真正要访问该traefik-ui.com时,你还需要将这个域名绑定到它对应的IP地址,也就是
hostPort所在的主机的IP。配置好hosts文件后,访问traefik-ui.com。OK 1. 可以看到Ingress中,当访问traefik-ui.com这个域名时,对应会访问到名为traefik-web-ui的 Service的80端口中。而Service的80端口对应后端的traefik web UI的8080端口。到此为止,一个
完整的Ingress就部署完成了,它的访问流程是这样的:
集群外部访问traefik-ui.com-->请求会到达traefik所在的主机的IP:hostPort上,也就是IP:80-->
由于Ingress规则此时被转换成traefik中的反向代理配置,根据Ingress规则会被转发往traefik-web-ui
这个Service:80上-->Service转发到后端标签为 traefik-ingress-lb的pod的8080端口中,实际上又
回到了traefik,不过是8080端口。
简单来说:请求域名---->traefik:80---->Ingress(只是Ingerss规则,实际还是由traefik完成) ---->后端Service:80---->traefik:8080 2\. 部署其他后端服务时也是一样,把上面的后端Service和应用换成相应的就行了。比如部署一个 tomcat,那么需要再部署3个K8s资源,分别是tomcat-deployment.yaml、tomcat-service.yaml、 tomcat-Ingress.yaml,你请求的域名为Ingress中的host配置的域名,你请求流程为:
请求域名---->traefik:80---->Ingress(只是Ingerss规则,实际还是由traefik完成)----> tomcat-Service---->tomcat-deployment中的Pod。
3. 上面是通过hostPort暴露traefik,可以直接访问80端口,如果需要在多台node上部署,可以通
过给相应的node 设置lable,然后部署时指定nodeSelector。
我们同样可以通过Service的NodePort暴露traefik,需要在traefik前再加一个Service,默认 NodePort端口范围为30000-32767,如果想直接暴露80端口,需要修改apiserver的启动参数配置, tomcat采用该方式的请求流程为:
请求---->traefik-service的Nodeport---->traefik---->Ingress(只是Ingerss规则,实际还是由 traefik 完成)---->tomcat-Service---->tomcat-deployment中的Pod。
注意:只要能正常访问到 ingress服务会根据配置的serviceName/servicePort访问到对应服务
4.部署自定义 Ingress(官方示例,实际情况需要自己改)
kubectl apply -f cheese-deployments.yaml
kubectl apply -f cheese-services.yaml
kubectl apply -f cheese-ingress.yaml
5.访问方式
在liunx 下用curl命令
curl -H "Host:peer0.org1.example.com" 172.16.5.205:37692/v1/consortium-chain/aaa (37692为traefik-ingress-service第一个port)
或者
curl peer0.org1.example.com:37692/v1/consortium-chain/aaa(需要设置一下peer0.org1.example.com的hosts,为代理服务所在node ip)
注意:域名是设置在 发送请求所在的node,若我们服务(此服务去请求设置的域名)跑在200节点,即在200节点hosts设置,
例如:172.16.5.205 peer0.org1,其中172.16.5.205为traefik服务所在节点(traefik以deployment启动,若以daemonset启动就任意node ip)
参考:
https://blog.51cto.com/13645243/2118455
https://blog.csdn.net/java_zyq/article/details/82496842
https://blog.csdn.net/hxpjava1/article/details/79459489
https://blog.csdn.net/hxpjava1/article/details/79375452
https://www.kubernetes.org.cn/4408.html