前言html
原本打算經過 traefik 來實現 kubernetes dashborad 的服務訪問,但是在配置過程當中始終報錯。最後無奈只能經過nodeport來實現kubernetes dashborad的服務暴露。可是這並不表明着traefik沒有用,相反因爲traefik可以動態的更新kubernetes中的Pod service(咱們能夠理解爲自動發現這些後端服務的配置變動,並從新加載服務的配置)而深受用戶歡迎。node
1、traefik 簡介linux
1.1 簡單認識 traefik代理nginx
Træfɪk 是一個爲了讓部署微服務更加便捷而誕生的現代HTTP反向代理、負載均衡工具。 它支持多種後臺 (Docker, Swarm, Kubernetes, Marathon, Mesos, Consul, Etcd, Zookeeper, BoltDB, Rest API, file…) 來自動化、動態的應用它的配置文件設置。ingress方案須要使用下列的組件:git
一、反向代理負載均衡器github
負責加載 ingress control 、ingress生成的配置,並實現reload功能。
二、ingress controlweb
ingress Controller 實質上是個監視器,Ingress Controller 經過不斷地跟 kubernetes API 打交道,實時的獲取後端 service、pod 的變化,好比新增和減小 pod,service 增長與減小等;當獲得這些變化信息後,Ingress Controller 再結合下文的 Ingress 生成配置,而後更新反向代理負載均衡器,並刷新其配置,達到服務發現的做用。
三、ingress後端
ingress,就相似於互聯網應用的負載均衡器(好比Apache/nginx之類的),是kubernetes集羣外訪問集羣的入口,將用戶的URL請求轉發到不一樣的service上。其中還包括規則定義,即URL的路由信息,路由信息得的刷新由Ingress controller來提供。api
參考連接:安全
http://docs.traefik.cn/basics
https://rootsongjc.gitbooks.io/kubernetes-handbook/content/practice/traefik-ingress-installation.html
1.2 部署 Træfɪk
由於我這裏是做爲kubernetes服務的暴露,所以你得有一個kubernetes集羣。若是你沒有,能夠經過kubeadm/kops等方式快速部署一個kubernetes集羣,具體使用那一種方式安裝你的kubernetes集羣,徹底取決於你的愛好。
經過打標籤的方式來實現 traefik 到固定主機運行;
$ kubectl label nodes k8sn01 edgenode=traefik-proxy $ kubectl label nodes k8sn02 edgenode=traefik-proxy $ kubectl label nodes k8sn03 edgenode=traefik-proxy
下載部署 Traefik 須要的文件
$ wget https://raw.githubusercontent.com/containous/traefik/master/examples/k8s/traefik-ds.yaml $ wget https://raw.githubusercontent.com/containous/traefik/master/examples/k8s/traefik-rbac.yaml $ wget https://raw.githubusercontent.com/containous/traefik/master/examples/k8s/ui.yaml
對相關文件內容進行更改
$ grep -A 1 -B 3 "nodeSelector" traefik-ds.yaml spec: serviceAccountName: traefik-ingress-controller terminationGracePeriodSeconds: 60 nodeSelector: edgenode: traefik-proxy
提示:紅色部分的功能是實現將 Traefik 部署到標籤爲 "edgenode: traefik-proxy" 主機上;
$ grep -A 6 -B 2 "host" ui.yaml spec: rules: - host: traefik-ui.test01.com http: paths: - path: / backend: serviceName: traefik-web-ui servicePort: web
提示:根據本身環境的實際狀況,將 "host" 字段改成本身的;
$ kubectl apply -f .
查看pod運行狀況
$ kubectl get pod -n kube-system -o wide NAME READY STATUS RESTARTS AGE IP NODE calico-kube-controllers-6696b647f7-4r5rr 1/1 Running 0 2d 172.17.80.30 k8sn02 calico-node-bd6dp 2/2 Running 0 2d 172.17.80.26 k8sm01 calico-node-bmr66 2/2 Running 0 2d 172.17.80.29 k8sn01 calico-node-fn6cc 2/2 Running 0 2d 172.17.80.30 k8sn02 calico-node-pp5fg 2/2 Running 0 2d 172.17.80.28 k8sm03 calico-node-swj8h 2/2 Running 0 2d 172.17.80.31 k8sn03 calico-node-tkbgj 2/2 Running 0 2d 172.17.80.27 k8sm02 coredns-6969b598c-kbt4r 1/1 Running 0 2d 192.168.10.130 k8sm02 coredns-6969b598c-kc874 1/1 Running 0 2d 192.168.71.1 k8sn03 heapster-5949d7bb8f-jlgtm 1/1 Running 0 1h 192.168.63.3 k8sm01 kubernetes-dashboard-74f855c8c6-js6zz 1/1 Running 0 5h 192.168.63.2 k8sm01 traefik-ingress-controller-28mnz 1/1 Running 0 2d 192.168.17.129 k8sn02 traefik-ingress-controller-nhsrk 1/1 Running 0 2d 192.168.163.129 k8sn01 traefik-ingress-controller-qbp7s 1/1 Running 0 2d 192.168.71.2 k8sn03
Traefik 部署就完成了,咱們能夠經過訪問k8sn01/k8sn02/k8sn03任意一臺主機,加8080端口就能夠訪問到Traefik的管理界面,能夠經過剛剛在ui.yaml文件中的主機名進行訪問。可是須要將這個域名解析到對應的IP或者寫入到hosts文件,效果以下所示;
2、kubernetes dashborad 部署
將下載的 kubernetes-server-linux-amd64.tar.gz 解壓後,再解壓其中的 kubernetes-src.tar.gz 文件。dashboard 對應的目錄是:cluster/addons/dashboard。
$ cd /usr/src/kubernetes/cluster/addons/dashboard/ $ ll total 32 -rw-rw-r-- 1 root root 264 Mar 21 03:21 dashboard-configmap.yaml -rw-rw-r-- 1 root root 1710 Mar 21 03:21 dashboard-controller.yaml -rw-rw-r-- 1 root root 1353 Mar 21 03:21 dashboard-rbac.yaml -rw-rw-r-- 1 root root 551 Mar 21 03:21 dashboard-secret.yaml -rw-rw-r-- 1 root root 322 Mar 21 03:21 dashboard-service.yaml -rw-rw-r-- 1 root root 242 Mar 21 03:21 MAINTAINERS.md -rw-rw-r-- 1 root root 72 Mar 21 03:21 OWNERS -rw-rw-r-- 1 root root 400 Mar 21 03:21 README.md
這裏須要將 dashboard-service.yaml 更改成以下內容:
$ cat dashboard-service.yaml apiVersion: v1 kind: Service metadata: name: kubernetes-dashboard namespace: kube-system labels: k8s-app: kubernetes-dashboard kubernetes.io/cluster-service: "true" addonmanager.kubernetes.io/mode: Reconcile spec: type: NodePort selector: k8s-app: kubernetes-dashboard ports: - port: 443 targetPort: 8443 nodePort: 30000 protocol: TCP
執行下面的命令,進行 Pod 部署
$ kubectl apply -f .
查看分配的NodePort
$ kubectl get deployment kubernetes-dashboard -n kube-system NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE kubernetes-dashboard 1 1 1 1 5h $ kubectl --namespace kube-system get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE kubernetes-dashboard-74f855c8c6-js6zz 1/1 Running 0 5h 192.168.63.2 k8sm01.ops.bj2.yongche.com traefik-ingress-controller-28mnz 1/1 Running 0 2d 192.168.17.129 k8sn02.ops.bj2.yongche.com traefik-ingress-controller-nhsrk 1/1 Running 0 2d 192.168.163.129 k8sn01.ops.bj2.yongche.com traefik-ingress-controller-qbp7s 1/1 Running 0 2d 192.168.71.2 k8sn03.ops.bj2.yongche.com $ kubectl get services kubernetes-dashboard -n kube-system NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes-dashboard NodePort 10.254.128.86 <none> 443:30000/TCP 5h
2.2 建立登陸 Dashboard 的 token 和 kubeconfig 配置文件
爲了集羣安全,從 1.7 開始,dashboard 只容許經過 https 訪問,若是使用 kube proxy 則必須監聽 localhost 或 127.0.0.1,對於 NodePort 沒有這個限制,可是僅建議在開發環境中使用。
默認狀況下部署成功後能夠直接訪問 https://NODE_IP:30000 訪問,可是想要登陸進去查看的話須要使用 kubeconfig 或者 access token 的方式。下面就已這兩種訪問進行訪問:
建立 access token
kubectl create sa dashboard-admin -n kube-system kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin ADMIN_SECRET=$(kubectl get secrets -n kube-system | grep dashboard-admin | awk '{print $1}') DASHBOARD_LOGIN_TOKEN=$(kubectl describe secret -n kube-system ${ADMIN_SECRET} | grep -E '^token' | awk '{print $2}') echo ${DASHBOARD_LOGIN_TOKEN}
使用輸出的 token 進行登陸 dashboard 便可訪問;
建立 kubeconfig 配置文件
...之後再說...