您好,登錄后才能下訂單哦!
原創(chuàng)文章,歡迎轉(zhuǎn)載。轉(zhuǎn)載請(qǐng)注明:轉(zhuǎn)載自IT人故事會(huì),謝謝!
原文鏈接地址:『高級(jí)篇』docker之kubernetes搭建集群添加認(rèn)證授權(quán)(下)(39)接上次的繼續(xù)認(rèn)證版的k8s搭建。
#kubectl證書(shū)放在這,由于kubectl相當(dāng)于系統(tǒng)管理員,老鐵使用admin命名
mkdir -p /etc/kubernetes/ca/admin
#準(zhǔn)備admin證書(shū)配置 - kubectl只需客戶端證書(shū),因此證書(shū)請(qǐng)求中 hosts 字段可以為空
cp ~/kubernetes-starter/target/ca/admin/admin-csr.json /etc/kubernetes/ca/admin/
cd /etc/kubernetes/ca/admin/
#使用根證書(shū)(ca.pem)簽發(fā)admin證書(shū)
cfssl gencert \
-ca=/etc/kubernetes/ca/ca.pem \
-ca-key=/etc/kubernetes/ca/ca-key.pem \
-config=/etc/kubernetes/ca/ca-config.json \
-profile=kubernetes admin-csr.json | cfssljson -bare admin
#老鐵最終要的是admin-key.pem和admin.pem
ls
admin.csr admin-csr.json admin-key.pem admin.pem
#指定apiserver的地址和證書(shū)位置(ip自行修改)
kubectl config set-cluster kubernetes \
--certificate-authority=/etc/kubernetes/ca/ca.pem \
--embed-certs=true \
--server=https://192.168.68.101:6443
#設(shè)置客戶端認(rèn)證參數(shù),指定admin證書(shū)和秘鑰
kubectl config set-credentials admin \
--client-certificate=/etc/kubernetes/ca/admin/admin.pem \
--embed-certs=true \
--client-key=/etc/kubernetes/ca/admin/admin-key.pem
#關(guān)聯(lián)用戶和集群
kubectl config set-context kubernetes \
--cluster=kubernetes --user=admin
#設(shè)置當(dāng)前上下文
kubectl config use-context kubernetes
#設(shè)置結(jié)果就是一個(gè)配置文件,可以看看內(nèi)容
cat ~/.kube/config
驗(yàn)證master節(jié)點(diǎn)
#可以使用剛配置好的kubectl查看一下組件狀態(tài)
kubectl get componentstatus
后續(xù)可以看到calico證書(shū)用在四個(gè)地方:
#calico證書(shū)放在這
mkdir -p /etc/kubernetes/ca/calico
#準(zhǔn)備calico證書(shū)配置 - calico只需客戶端證書(shū),因此證書(shū)請(qǐng)求中 hosts 字段可以為空
cp ~/kubernetes-starter/target/ca/calico/calico-csr.json /etc/kubernetes/ca/calico/
cd /etc/kubernetes/ca/calico/
#使用根證書(shū)(ca.pem)簽發(fā)calico證書(shū)
cfssl gencert \
-ca=/etc/kubernetes/ca/ca.pem \
-ca-key=/etc/kubernetes/ca/ca-key.pem \
-config=/etc/kubernetes/ca/ca-config.json \
-profile=kubernetes calico-csr.json | cfssljson -bare calico
#老鐵最終要的是calico-key.pem和calico.pem
ls
由于calico服務(wù)是所有節(jié)點(diǎn)都需要啟動(dòng)的,需要把這幾個(gè)文件拷貝到每臺(tái)服務(wù)器上
** 通過(guò)主節(jié)點(diǎn)拷貝到102,103兩臺(tái)機(jī)器上
#root的密碼都是vagrant
scp -r /etc/kubernetes/ca/ root@192.168.68.102:/etc/kubernetes/ca/
scp -r /etc/kubernetes/ca/ root@192.168.68.103:/etc/kubernetes/ca/
確定下主節(jié)點(diǎn)的/etc/kubernetes/ca/ 和 102,103內(nèi)的目錄一致。
更新calico服務(wù)
cp ~/kubernetes-starter/target/all-node/kube-calico.service /lib/systemd/system/
systemctl daemon-reload
service kube-calico start
#驗(yàn)證calico(能看到其他節(jié)點(diǎn)的列表就對(duì)啦)
calicoctl node status
老鐵這里讓kubelet使用引導(dǎo)token的方式認(rèn)證,所以認(rèn)證方式跟之前的組件不同,它的證書(shū)不是手動(dòng)生成,而是由工作節(jié)點(diǎn)TLS BootStrap 向api-server請(qǐng)求,由主節(jié)點(diǎn)的controller-manager 自動(dòng)簽發(fā)。
引導(dǎo)token的方式要求客戶端向api-server發(fā)起請(qǐng)求時(shí)告訴他你的用戶名和token,并且這個(gè)用戶是具有一個(gè)特定的角色:system:node-bootstrapper,所以需要先將 bootstrap token 文件中的 kubelet-bootstrap 用戶賦予這個(gè)特定角色,然后 kubelet 才有權(quán)限發(fā)起創(chuàng)建認(rèn)證請(qǐng)求。
在主節(jié)點(diǎn)執(zhí)行下面命令
#可以通過(guò)下面命令查詢clusterrole列表
kubectl -n kube-system get clusterrole
#可以回顧一下token文件的內(nèi)容
cat /etc/kubernetes/ca/kubernetes/token.csv
#創(chuàng)建角色綁定(將用戶kubelet-bootstrap與角色system:node-bootstrapper綁定)
kubectl create clusterrolebinding kubelet-bootstrap \
--clusterrole=system:node-bootstrapper --user=kubelet-bootstrap
這個(gè)配置是用來(lái)完成bootstrap token認(rèn)證的,保存了像用戶,token等重要的認(rèn)證信息,這個(gè)文件可以借助kubectl命令生成:(也可以自己寫(xiě)配置)
很重要。
0b1bd95b94caa5534d1d4a7318d51b0e
上邊有說(shuō)明這個(gè)咋來(lái)的
#設(shè)置集群參數(shù)(注意替換ip)
kubectl config set-cluster kubernetes \
--certificate-authority=/etc/kubernetes/ca/ca.pem \
--embed-certs=true \
--server=https://192.168.68.101:6443 \
--kubeconfig=bootstrap.kubeconfig
#設(shè)置客戶端認(rèn)證參數(shù)(注意替換token)
kubectl config set-credentials kubelet-bootstrap \
--token=0b1bd95b94caa5534d1d4a7318d51b0e\
--kubeconfig=bootstrap.kubeconfig
#設(shè)置上下文
kubectl config set-context default \
--cluster=kubernetes \
--user=kubelet-bootstrap \
--kubeconfig=bootstrap.kubeconfig
#選擇上下文
kubectl config use-context default --kubeconfig=bootstrap.kubeconfig
mkdir -p /var/lib/kubelet
mkdir -p /etc/kubernetes
mkdir -p /etc/cni/net.d
#將剛生成的文件移動(dòng)到合適的位置
mv bootstrap.kubeconfig /etc/kubernetes/
copy配置
cp ~/kubernetes-starter/target/worker-node/10-calico.conf /etc/cni/net.d/
更新服務(wù)
cp ~/kubernetes-starter/target/worker-node/kubelet.service /lib/systemd/system/
systemctl daemon-reload
service kubelet start
** 登錄101主節(jié)點(diǎn)輸入命令查看狀態(tài)
kubectl get csr
#啟動(dòng)kubelet之后到master節(jié)點(diǎn)允許worker加入(批準(zhǔn)worker的tls證書(shū)請(qǐng)求)
#--------*在主節(jié)點(diǎn)執(zhí)行*---------
kubectl get csr|grep 'Pending' | awk '{print $1}'| xargs kubectl certificate approve
#-----------------------------
#檢查日志
journalctl -f -u kubelet
加入到主節(jié)點(diǎn)中。102
103請(qǐng)求加入,102已經(jīng)加入
#proxy證書(shū)放在這
mkdir -p /etc/kubernetes/ca/kube-proxy
#準(zhǔn)備proxy證書(shū)配置 - proxy只需客戶端證書(shū),因此證書(shū)請(qǐng)求中 hosts 字段可以為空。
#CN 指定該證書(shū)的 User 為 system:kube-proxy,預(yù)定義的 ClusterRoleBinding system:node-proxy 將User system:kube-proxy 與 Role system:node-proxier 綁定,授予了調(diào)用 kube-api-server proxy的相關(guān) API 的權(quán)限
cp ~/kubernetes-starter/target/ca/kube-proxy/kube-proxy-csr.json /etc/kubernetes/ca/kube-proxy/
cd /etc/kubernetes/ca/kube-proxy/
#使用根證書(shū)(ca.pem)簽發(fā)calico證書(shū)
cfssl gencert \
-ca=/etc/kubernetes/ca/ca.pem \
-ca-key=/etc/kubernetes/ca/ca-key.pem \
-config=/etc/kubernetes/ca/ca-config.json \
-profile=kubernetes kube-proxy-csr.json | cfssljson -bare kube-proxy
#老鐵最終要的是kube-proxy-key.pem和kube-proxy.pem
ls
#設(shè)置集群參數(shù)(注意替換ip)
kubectl config set-cluster kubernetes \
--certificate-authority=/etc/kubernetes/ca/ca.pem \
--embed-certs=true \
--server=https://192.168.68.101:6443 \
--kubeconfig=kube-proxy.kubeconfig
#置客戶端認(rèn)證參數(shù)
kubectl config set-credentials kube-proxy \
--client-certificate=/etc/kubernetes/ca/kube-proxy/kube-proxy.pem \
--client-key=/etc/kubernetes/ca/kube-proxy/kube-proxy-key.pem \
--embed-certs=true \
--kubeconfig=kube-proxy.kubeconfig
#設(shè)置上下文參數(shù)
kubectl config set-context default \
--cluster=kubernetes \
--user=kube-proxy \
--kubeconfig=kube-proxy.kubeconfig
#選擇上下文
kubectl config use-context default --kubeconfig=kube-proxy.kubeconfig
#移動(dòng)到合適位置
mv kube-proxy.kubeconfig /etc/kubernetes/kube-proxy.kubeconfig
啟動(dòng)服務(wù)
mkdir -p /var/lib/kube-proxy
cp ~/kubernetes-starter/target/worker-node/kube-proxy.service /lib/systemd/system/
systemctl daemon-reload
#安裝依賴軟件
yum -y install conntrack
#啟動(dòng)服務(wù)
service kube-proxy start
#查看日志
journalctl -f -u kube-proxy
kube-dns有些特別,因?yàn)樗旧硎沁\(yùn)行在kubernetes集群中,以kubernetes應(yīng)用的形式運(yùn)行。所以它的認(rèn)證授權(quán)方式跟之前的組件都不一樣。它需要用到service account認(rèn)證和RBAC授權(quán)。
service account認(rèn)證:
每個(gè)service account都會(huì)自動(dòng)生成自己的secret,用于包含一個(gè)ca,token和secret,用于跟api-server認(rèn)證
RBAC授權(quán):
權(quán)限、角色和角色綁定都是kubernetes自動(dòng)創(chuàng)建好的。老鐵只需要?jiǎng)?chuàng)建一個(gè)叫做kube-dns的 ServiceAccount即可,官方現(xiàn)有的配置已經(jīng)把它包含進(jìn)去了。
在官方的基礎(chǔ)上添加的變量,生成適合老鐵我們集群的配置。直接copy就可以啦
cd ~/kubernetes-starter
新的配置沒(méi)有設(shè)定api-server。不訪問(wèn)api-server,它是怎么知道每個(gè)服務(wù)的cluster ip和pod的endpoints的呢?這就是因?yàn)閗ubernetes在啟動(dòng)每個(gè)服務(wù)service的時(shí)候會(huì)以環(huán)境變量的方式把所有服務(wù)的ip,端口等信息注入進(jìn)來(lái)。
kubectl create -f ~/kubernetes-starter/target/services/kube-dns.yaml
#看看啟動(dòng)是否成功
kubectl -n kube-system get pods
PS:終于,安全版的kubernetes集群部署完成了。 涉及到的細(xì)節(jié)也非常多,就這都對(duì)了兩篇博文了,如果每個(gè)配置都詳細(xì)解釋估計(jì)得寫(xiě)本書(shū)了。從入門(mén)的角度了解認(rèn)證和授權(quán)。
下面老鐵們使用新集群先溫習(xí)一下之前學(xué)習(xí)過(guò)的命令,然后再認(rèn)識(shí)一些新的命令,新的參數(shù),新的功能。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。