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 的高可用和負載均衡了。

相關文章
相關標籤/搜索