Kubernetes(下面簡(jiǎn)稱K8s)一直在持續(xù)的開(kāi)發(fā)中,更新非常快胳徽,網(wǎng)上有很多信息雖然有翔實(shí)的安裝步驟,但是很快就變得陳舊和不合時(shí)宜烙心,因此強(qiáng)烈建議從官網(wǎng)入口膜廊,網(wǎng)上的文章只把它當(dāng)成做一個(gè)參考乏沸。
本文也有可能很快過(guò)時(shí)淫茵,因此我盡量說(shuō)明安裝的思路和參考文章的引用來(lái)源,以提供授人以漁的方法蹬跃。如果有過(guò)時(shí)的地方匙瘪,也請(qǐng)?jiān)谖恼孪旅嫣砑釉u(píng)論,我看到會(huì)盡快進(jìn)行更新蝶缀。
先說(shuō)明一下當(dāng)前的設(shè)備環(huán)境:
三臺(tái)安裝Ubuntu16.04 amd64虛機(jī)丹喻,一臺(tái)master node,兩臺(tái)worker nodes翁都。K8s的版本為V1.13.1
整個(gè)環(huán)境放在一臺(tái)透明代理的路由器后面碍论,因此無(wú)需設(shè)置加速器(該路由器的DIY方法,見(jiàn)我的博客文章 DIY: 基于OpenWRT和小米路由器的透明代理 以及姊妹篇 DIY: 基于OpenWRT和小米路由器的透明代理(SSR))
root@ha40:kubectl# kubectl get nodes
NAME STATUS ROLES AGE VERSION
ha40 Ready master 8d v1.13.1
ha41 Ready <none> 8d v1.13.1
ha42 Ready <none> 8d v1.13.1
官網(wǎng)安裝Web UI(Dashboard)的入口為 https://kubernetes.io/docs/tasks/access-application-cluster/web-ui-dashboard/柄慰,安裝方法非常簡(jiǎn)單鳍悠,只有兩個(gè)步驟:
- 安裝
kubectl create -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml
- 啟動(dòng)代理
kubectl proxy
然后可以通過(guò)下面的URL訪問(wèn) dashboard http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/
這種方法確實(shí)簡(jiǎn)單有效,但是在大多數(shù)環(huán)境中會(huì)存在一個(gè)很大的問(wèn)題坐搔。那就是我們?cè)诎惭bk8s服務(wù)器時(shí)藏研,基本都選擇Ubuntu的server版本,而不是Ubuntu的desktop版本概行。Server版本沒(méi)有圖形桌面蠢挡,無(wú)法使用瀏覽器。因此我們需要一個(gè)從外部訪問(wèn)k8s cluster的dashboard方法凳忙。
除了上面k8s官網(wǎng)推薦的kubectl proxy方法业踏,Dashboard的官網(wǎng) https://github.com/kubernetes/dashboard/wiki/Accessing-Dashboard---1.7.X-and-above 還提到了其他三種方法 :
1: NodePort,這種方法只推薦使用在一個(gè)node節(jié)點(diǎn)的方案涧卵,在大多數(shù)的環(huán)境都需要多個(gè)node節(jié)點(diǎn)堡称,因此這種方法沒(méi)有什么實(shí)用價(jià)值,不建議使用艺演。
2: API Server却紧,這個(gè)是本文的推薦方法桐臊,在下文詳細(xì)列出。
3: Ingress晓殊,這個(gè)方法我沒(méi)有試過(guò)断凶,后續(xù)再更新。
API Server方法:
安裝完成Dashboard后巫俺,就可以訪問(wèn) https://<master-ip>:<apiserver-port>/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/ 就可以了认烁。但是瀏覽器會(huì)提示下面的錯(cuò)誤:
{
"kind": "Status",
"apiVersion": "v1",
"metadata": {
},
"status": "Failure",
"message": "services \"https:kubernetes-dashboard:\" is forbidden: User \"system:anonymous\" cannot get services/proxy in the namespace \"kube-system\"",
"reason": "Forbidden",
"details": {
"name": "https:kubernetes-dashboard:",
"kind": "services"
},
"code": 403
}
這個(gè)錯(cuò)誤的原因是k8s基于安全性的考慮,瀏覽器必須要安裝一個(gè)根證書介汹,防止中間人攻擊(k8s官網(wǎng)的說(shuō)明在此 https://kubernetes.io/docs/tasks/administer-cluster/access-cluster-api/)
下面是一系列和證書相關(guān)的操作:(參考Jose的博客 http://www.joseluisgomez.com/containers/kubernetes-dashboard/)
a. 生成crt文件
grep 'client-certificate-data' /etc/kubernetes/admin.conf | head -n 1 | awk '{print $2}' | base64 -d >> kubecfg.crt
b. 生成key文件
grep 'client-key-data' /etc/kubernetes/admin.conf | head -n 1 | awk '{print $2}' | base64 -d >> kubecfg.key
c. 生成p12證書文件(證書的生成和導(dǎo)入需要一個(gè)密碼)
openssl pkcs12 -export -clcerts -inkey kubecfg.key -in kubecfg.crt -out kubecfg.p12 -name "kubernetes-client"
d. 將該證書文件導(dǎo)入到chrome瀏覽器中(這里就不細(xì)講了却嗡,不清楚的同學(xué)可以用搜索引擎查一下)
再次訪問(wèn)https://<master-ip>:<apiserver-port>/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/,瀏覽器顯示為:
這是網(wǎng)站提示你需要認(rèn)證(否則任何人都能直接訪問(wèn)了)嘹承,有兩種方式可以認(rèn)證窗价,我用的是Token方式:
Token的方法,可以參考Dashboard官網(wǎng)的做法叹卷,https://github.com/kubernetes/dashboard/wiki/Creating-sample-user 只需要三個(gè)命令即可:
a. Create Service Account 創(chuàng)建一個(gè)服務(wù)帳號(hào)
cat <<EOF | kubectl create -f -
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kube-system
EOF
b. Create ClusterRoleBinding 創(chuàng)建ClusterRoleBinding
cat <<EOF | kubectl create -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kube-system
EOF
c. Bearer Token
kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')
將生成的token填入撼港,即可進(jìn)入dashboard的主頁(yè)面
大功告成!