咸阳免费做网站,邢台网站制作哪里做,安居客看房网,视觉设计评价标准的要素Ingress其实就是从 kuberenets 集群外部访问集群的一个入口#xff0c;将外部的请求转发到集群内不同的 Service 上#xff0c;其实就相当于 nginx、haproxy 等负载均衡代理服务器#xff0c;有的同学可能觉得我们直接使用 nginx 就实现了#xff0c;但是只使用 nginx 这种…Ingress其实就是从 kuberenets 集群外部访问集群的一个入口将外部的请求转发到集群内不同的 Service 上其实就相当于 nginx、haproxy 等负载均衡代理服务器有的同学可能觉得我们直接使用 nginx 就实现了但是只使用 nginx 这种方式有很大缺陷每次有新服务加入的时候怎么改 Nginx 配置不可能让我们去手动更改或者滚动更新前端的 Nginx Pod 吧那我们再加上一个服务发现的工具比如 consul 如何貌似是可以对吧而且在之前单独使用 docker 的时候这种方式已经使用得很普遍了Ingress 实际上就是这样实现的只是服务发现的功能自己实现了不需要使用第三方的服务了然后再加上一个域名规则定义路由信息的刷新需要一个靠 Ingress controller 来提供。
Ingress controller 可以理解为一个监听器通过不断地与 kube-apiserver 打交道实时的感知后端 service、pod 的变化当得到这些变化信息后Ingress controller 再结合 Ingress 的配置更新反向代理负载均衡器达到服务发现的作用。其实这点和服务发现工具 consul consul-template 非常类似。
现在可以供大家使用的 Ingress controller 有很多比如 traefik、nginx-controller、Kubernetes Ingress Controller for Kong、HAProxy Ingress controller当然你也可以自己实现一个 Ingress Controller现在普遍用得较多的是 traefik 和 nginx-controllertraefik 的性能较 nginx-controller 差但是配置使用要简单许多我们这里会以更简单的 traefik 为例给大家介绍 ingress 的使用。
Traefik
Traefik 是一款开源的反向代理与负载均衡工具。它最大的优点是能够与常见的微服务系统直接整合可以实现自动化动态配置。目前支持 Docker、Swarm、Mesos/Marathon、 Mesos、Kubernetes、Consul、Etcd、Zookeeper、BoltDB、Rest API 等等后端模型。
要使用 traefik我们同样需要部署 traefik 的 Pod由于我们演示的集群中只有 master 节点有外网网卡所以我们这里只有 master 这一个边缘节点我们将 traefik 部署到该节点上即可。
首先为安全起见我们这里使用 RBAC 安全认证方式(rbac.yaml)
---
apiVersion: v1
kind: ServiceAccount
metadata:name: traefik-ingress-controllernamespace: kube-system
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:name: traefik-ingress-controller
rules:- apiGroups:- resources:- services- endpoints- secretsverbs:- get- list- watch- apiGroups:- extensionsresources:- ingressesverbs:- get- list- watch
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:name: traefik-ingress-controller
roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: traefik-ingress-controller
subjects:
- kind: ServiceAccountname: traefik-ingress-controllernamespace: kube-system
直接在集群中创建即可
$ kubectl create -f rbac.yaml
serviceaccount traefik-ingress-controller created
clusterrole.rbac.authorization.k8s.io traefik-ingress-controller created
clusterrolebinding.rbac.authorization.k8s.io traefik-ingress-controller created
然后使用 Deployment 来管理 Pod直接使用官方的 traefik 镜像部署即可traefik.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:name: traefik-ingress-controllernamespace: kube-systemlabels:k8s-app: traefik-ingress-lb
spec:replicas: 1selector:matchLabels:k8s-app: traefik-ingress-lbtemplate:metadata:labels:k8s-app: traefik-ingress-lbname: traefik-ingress-lbspec:serviceAccountName: traefik-ingress-controllerterminationGracePeriodSeconds: 60tolerations:- operator: ExistsnodeSelector:kubernetes.io/hostname: mastercontainers:- image: traefik:v1.7.17name: traefik-ingress-lbports:- name: httpcontainerPort: 80- name: admincontainerPort: 8080args:- --api- --kubernetes- --logLevelINFO
---
kind: Service
apiVersion: v1
metadata:name: traefik-ingress-servicenamespace: kube-system
spec:selector:k8s-app: traefik-ingress-lbports:- protocol: TCPport: 80name: web- protocol: TCPport: 8080name: admintype: NodePort
直接创建上面的资源对象即可
$ kubectl create -f traefik.yaml
deployment.apps traefik-ingress-controller created
service traefik-ingress-service created
要注意上面 yaml 文件
tolerations:
- operator: Exists
nodeSelector:kubernetes.io/hostname: master
由于我们这里的特殊性只有 master 节点有外网访问权限所以我们使用nodeSelector标签将traefik的固定调度到master这个节点上那么上面的tolerations是干什么的呢这个是因为我们集群使用的 kubeadm 安装的master 节点默认是不能被普通应用调度的要被调度的话就需要添加这里的 tolerations 属性当然如果你的集群和我们的不太一样直接去掉这里的调度策略就行。 nodeSelector 和 tolerations 都属于 Pod 的调度策略在后面的课程中会为大家讲解。 traefik 还提供了一个 web ui 工具就是上面的 8080 端口对应的服务为了能够访问到该服务我们这里将服务设置成的 NodePort
$ kubectl get pods -n kube-system -l k8s-apptraefik-ingress-lb -o wide
NAME READY STATUS RESTARTS AGE IP NODE
traefik-ingress-controller-57c4f787d9-bfhnl 1/1 Running 0 8m 10.244.0.18 master
$ kubectl get svc -n kube-system
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
...
traefik-ingress-service NodePort 10.102.183.112 none 80:30539/TCP,8080:30486/TCP 8m
...
现在在浏览器中输入 master_node_ip:30486 就可以访问到 traefik 的 dashboard 了
Ingress 对象
现在我们是通过 NodePort 来访问 traefik 的 Dashboard 的那怎样通过 ingress 来访问呢 首先需要创建一个 ingress 对象(ingress.yaml)
apiVersion: extensions/v1beta1
kind: Ingress
metadata:name: traefik-web-uinamespace: kube-systemannotations:kubernetes.io/ingress.class: traefik
spec:rules:- host: traefik.haimaxy.comhttp:paths:- backend:serviceName: traefik-ingress-serviceservicePort: 8080
然后为 traefik dashboard 创建对应的 ingress 对象
$ kubectl create -f ingress.yaml
ingress.extensions traefik-web-ui created
要注意上面的 ingress 对象的规则特别是 rules 区域我们这里是要为 traefik 的 dashboard 建立一个 ingress 对象所以这里的 serviceName 对应的是上面我们创建的 traefik-ingress-service端口也要注意对应 8080 端口为了避免端口更改这里的 servicePort 的值也可以替换成上面定义的 port 的名字admin
创建完成后我们应该怎么来测试呢
第一步在本地的/etc/hosts里面添加上 traefik.haimaxy.com 与 master 节点外网 IP 的映射关系 第二步在浏览器中访问http://traefik.haimaxy.com我们会发现并没有得到我们期望的 dashboard 界面这是因为我们上面部署 traefik 的时候使用的是 NodePort 这种 Service 对象所以我们只能通过上面的 30539 端口访问到我们的目标对象http://traefik.haimaxy.com:30539加上端口后我们发现可以访问到 dashboard 了而且在 dashboard 当中多了一条记录正是上面我们创建的 ingress 对象的数据我们还可以切换到 HEALTH 界面中可以查看当前 traefik 代理的服务的整体的健康状态 第三步上面我们可以通过自定义域名加上端口可以访问我们的服务了但是我们平时服务别人的服务是不是都是直接用的域名啊http 或者 https 的几乎很少有在域名后面加上端口访问的吧为什么太麻烦啊端口也记不住要解决这个问题怎么办我们只需要把我们上面的 traefik 的核心应用的端口隐射到 master 节点上的 80 端口是不是就可以了因为 http 默认就是访问 80 端口但是我们在 Service 里面是添加的一个 NodePort 类型的服务没办法隐射 80 端口怎么办这里就可以直接在 Pod 中指定一个 hostPort 即可更改上面的 traefik.yaml 文件中的容器端口
containers:
- image: traefik
name: traefik-ingress-lb
ports:
- name: httpcontainerPort: 80hostPort: 80
- name: admincontainerPort: 8080
添加以后hostPort: 80然后更新应用
$ kubectl apply -f traefik.yaml
更新完成后这个时候我们在浏览器中直接使用域名方法测试下
第四步正常来说我们如果有自己的域名我们可以将我们的域名添加一条 DNS 记录解析到 master 的外网 IP 上面这样任何人都可以通过域名来访问我的暴露的服务了。如果你有多个边缘节点的话可以在每个边缘节点上部署一个 ingress-controller 服务然后在边缘节点前面挂一个负载均衡器比如 nginx将所有的边缘节点均作为这个负载均衡器的后端这样就可以实现 ingress-controller 的高可用和负载均衡了。