ingress安装配置

Traefik

Traefik 是一款开源的反向代理与负载均衡工具。它最大的优势是可以与常见的微服务系统直接整合,能够实现自动化动态配置。目前支持 Docker、Swarm、Mesos/Marathon、 Mesos、Kubernetes、Consul、Etcd、Zookeeper、BoltDB、Rest API 等等后端模型。 traefiknode

要使用 traefik,咱们一样须要部署 traefik 的 Pod,因为咱们演示的集群中只有 master 节点有外网网卡,因此咱们这里只有 master 这一个边缘节点,咱们将 traefik 部署到该节点上便可。nginx

首先,为安全起见咱们这里使用 RBAC 安全认证方式:(rbac.yaml):web

--- apiVersion: v1 kind: ServiceAccount metadata: name: traefik-ingress-controller namespace: kube-system --- kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1beta1 metadata: name: traefik-ingress-controller rules: - apiGroups: - "" resources: - services - endpoints - secrets verbs: - get - list - watch - apiGroups: - extensions resources: - ingresses verbs: - get - list - watch --- kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1beta1 metadata: name: traefik-ingress-controller roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: traefik-ingress-controller subjects: - kind: ServiceAccount name: traefik-ingress-controller namespace: kube-system 

直接在集群中建立便可:shell

$ 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)后端

--- kind: Deployment apiVersion: extensions/v1beta1 metadata: name: traefik-ingress-controller namespace: kube-system labels: k8s-app: traefik-ingress-lb spec: replicas: 1 selector: matchLabels: k8s-app: traefik-ingress-lb template: metadata: labels: k8s-app: traefik-ingress-lb name: traefik-ingress-lb spec: serviceAccountName: traefik-ingress-controller terminationGracePeriodSeconds: 60 tolerations: - operator: "Exists" nodeSelector: kubernetes.io/hostname: master containers: - image: traefik name: traefik-ingress-lb ports: - name: http containerPort: 80 - name: admin containerPort: 8080 args: - --api - --kubernetes - --logLevel=INFO --- kind: Service apiVersion: v1 metadata: name: traefik-ingress-service namespace: kube-system spec: selector: k8s-app: traefik-ingress-lb ports: - protocol: TCP port: 80 name: web - protocol: TCP port: 8080 name: admin type: NodePort 

直接建立上面的资源对象便可:api

$ kubectl create -f traefik.yaml
deployment.extensions "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 的调度策略,在后面的课程中会为你们讲解。app

traefik 还提供了一个 web ui 工具,就是上面的 8080 端口对应的服务,为了可以访问到该服务,咱们这里将服务设置成的 NodePort:负载均衡

$ kubectl get pods -n kube-system -l k8s-app=traefik-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 了: traefik dashboard

Ingress 对象

如今咱们是经过 NodePort 来访问 traefik 的 Dashboard 的,那怎样经过 ingress 来访问呢? 首先,须要建立一个 ingress 对象:(ingress.yaml)

apiVersion: extensions/v1beta1 kind: Ingress metadata: name: traefik-web-ui namespace: kube-system annotations: kubernetes.io/ingress.class: traefik spec: rules: - host: traefik.haimaxy.com http: paths: - backend: serviceName: traefik-ingress-service servicePort: 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 traefik dashboard 加上端口后咱们发现能够访问到 dashboard 了,并且在 dashboard 当中多了一条记录,正是上面咱们建立的 ingress 对象的数据,咱们还能够切换到 HEALTH 界面中,能够查看当前 traefik 代理的服务的总体的健康状态 traefik health

  • 第三步,上面咱们能够经过自定义域名加上端口能够访问咱们的服务了,可是咱们平时服务别人的服务是否是都是直接用的域名啊,http 或者 https 的,几乎不多有在域名后面加上端口访问的吧?为何?太麻烦啊,端口也记不住,要解决这个问题,怎么办,咱们只须要把咱们上面的 traefik 的核心应用的端口隐射到 master 节点上的 80 端口,是否是就能够了,由于 http 默认就是访问 80 端口,可是咱们在 Service 里面是添加的一个 NodePort 类型的服务,没办法映射 80 端口,怎么办?这里就能够直接在 Pod 中指定一个 hostPort 便可,更改上面的 traefik.yaml 文件中的容器端口:

containers: - image: traefik name: traefik-ingress-lb ports: - name: http containerPort: 80 hostPort: 80 - name: admin containerPort: 8080 

添加之后hostPort: 80,而后更新应用:

$ kubectl apply -f traefik.yaml

更新完成后,这个时候咱们在浏览器中直接使用域名方法测试下: traefik dashboard

  • 第四步,正常来讲,咱们若是有本身的域名,咱们能够将咱们的域名添加一条 DNS 记录,解析到 master 的外网 IP 上面,这样任何人均可以经过域名来访问个人暴露的服务了。

若是你有多个边缘节点的话,能够在每一个边缘节点上部署一个 ingress-controller 服务,而后在边缘节点前面挂一个负载均衡器,好比 nginx,将全部的边缘节点均做为这个负载均衡器的后端,这样就能够实现 ingress-controller 的高可用和负载均衡了。