k8s中部署traefik作为ingress

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
k8s中部署traefik作为ingress_第1张图片
image

当你真正要访问该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

你可能感兴趣的:(k8s中部署traefik作为ingress)