接上次的繼續認證版的k8s搭建。
kubectl
準備證書
mkdir -p /etc/kubernetes/ca/admin
cp ~/kubernetes-starter/target/ca/admin/admin-csr.json /etc/kubernetes/ca/admin/
cd /etc/kubernetes/ca/admin/
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
ls
admin.csr admin-csr.json admin-key.pem admin.pem複製代碼
8.2 配置kubectl
kubectl config set-cluster kubernetes \
--certificate-authority=/etc/kubernetes/ca/ca.pem \
--embed-certs=true \
--server=https://192.168.68.101:6443
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
kubectl config set-context kubernetes \
--cluster=kubernetes --user=admin
kubectl config use-context kubernetes
cat ~/.kube/config複製代碼
kubectl get componentstatus複製代碼
calico-node(主節點生成證書,102,103經過scp拷貝過去)
準備證書
-
calico/node 這個docker 容器運行時訪問 etcd 使用證書
-
cni 配置文件中,cni 插件須要訪問 etcd 使用證書
-
calicoctl 操做集羣網絡時訪問 etcd 使用證書
-
calico/kube-controllers 同步集羣網絡策略時訪問 etcd 使用證書
mkdir -p /etc/kubernetes/ca/calico
cp ~/kubernetes-starter/target/ca/calico/calico-csr.json /etc/kubernetes/ca/calico/
cd /etc/kubernetes/ca/calico/
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
ls複製代碼
拷貝主節點證書calico
因爲calico服務是全部節點都須要啓動的,須要把這幾個文件拷貝到每臺服務器上 ** 經過主節點拷貝到102,103兩臺機器上
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/複製代碼
肯定下主節點的/etc/kubernetes/ca/ 和 102,103內的目錄一致。
cp ~/kubernetes-starter/target/all-node/kube-calico.service /lib/systemd/system/
systemctl daemon-reload
service kube-calico start
calicoctl node status複製代碼
kubelet
老鐵這裏讓kubelet使用引導token的方式認證,因此認證方式跟以前的組件不一樣,它的證書不是手動生成,而是由工做節點TLS BootStrap 向api-server請求,由主節點的controller-manager 自動簽發。
建立角色綁定(主節點)
引導token的方式要求客戶端向api-server發起請求時告訴他你的用戶名和token,而且這個用戶是具備一個特定的角色:system:node-bootstrapper,因此須要先將 bootstrap token 文件中的 kubelet-bootstrap 用戶賦予這個特定角色,而後 kubelet 纔有權限發起建立認證請求。 在主節點執行下面命令
kubectl -n kube-system get clusterrole
cat /etc/kubernetes/ca/kubernetes/token.csv
kubectl create clusterrolebinding kubelet-bootstrap \
--clusterrole=system:node-bootstrapper --user=kubelet-bootstrap複製代碼
建立bootstrap.kubeconfig(102,103工做節點)
這個配置是用來完成bootstrap token認證的,保存了像用戶,token等重要的認證信息,這個文件能夠藉助kubectl命令生成:(也能夠本身寫配置)
很重要。 0b1bd95b94caa5534d1d4a7318d51b0e 上邊有說明這個咋來的
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
kubectl config set-credentials kubelet-bootstrap \
--token=0b1bd95b94caa5534d1d4a7318d51b0e\
--kubeconfig=bootstrap.kubeconfig
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
mv bootstrap.kubeconfig /etc/kubernetes/複製代碼
準備cni配置(102,103工做節點)
cp ~/kubernetes-starter/target/worker-node/10-calico.conf /etc/cni/net.d/複製代碼
kubelet服務
cp ~/kubernetes-starter/target/worker-node/kubelet.service /lib/systemd/system/
systemctl daemon-reload
service kubelet start複製代碼
kubectl get csr
kubectl get csr|grep 'Pending' | awk '{print $1}'| xargs kubectl certificate approve
journalctl -f -u kubelet複製代碼
加入到主節點中。102
103請求加入,102已經加入
kube-proxy(子節點102,103)
準備證書
mkdir -p /etc/kubernetes/ca/kube-proxy
cp ~/kubernetes-starter/target/ca/kube-proxy/kube-proxy-csr.json /etc/kubernetes/ca/kube-proxy/
cd /etc/kubernetes/ca/kube-proxy/
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
ls複製代碼
生成kube-proxy.kubeconfig配置
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
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
kubectl config set-context default \
--cluster=kubernetes \
--user=kube-proxy \
--kubeconfig=kube-proxy.kubeconfig
kubectl config use-context default --kubeconfig=kube-proxy.kubeconfig
mv kube-proxy.kubeconfig /etc/kubernetes/kube-proxy.kubeconfig複製代碼
kube-proxy服務
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
service kube-proxy start
journalctl -f -u kube-proxy複製代碼
12. kube-dns
kube-dns有些特別,由於它自己是運行在kubernetes集羣中,以kubernetes應用的形式運行。因此它的認證受權方式跟以前的組件都不同。它須要用到service account認證和RBAC受權。 service account認證: 每一個service account都會自動生成本身的secret,用於包含一個ca,token和secret,用於跟api-server認證 RBAC受權: 權限、角色和角色綁定都是kubernetes自動建立好的。老鐵只須要建立一個叫作kube-dns的 ServiceAccount便可,官方現有的配置已經把它包含進去了。
準備配置文件
在官方的基礎上添加的變量,生成適合老鐵咱們集羣的配置。直接copy就能夠啦
cd ~/kubernetes-starter複製代碼
新的配置沒有設定api-server。不訪問api-server,它是怎麼知道每一個服務的cluster ip和pod的endpoints的呢?這就是由於kubernetes在啓動每一個服務service的時候會以環境變量的方式把全部服務的ip,端口等信息注入進來。
建立kube-dns(主節點101)
kubectl create -f ~/kubernetes-starter/target/services/kube-dns.yaml
kubectl -n kube-system get pods複製代碼
PS:終於,安全版的kubernetes集羣部署完成了。 涉及到的細節也很是多,就這都對了兩篇博文了,若是每一個配置都詳細解釋估計得寫本書了。從入門的角度瞭解認證和受權。 下面老鐵們使用新集羣先溫習一下以前學習過的命令,而後再認識一些新的命令,新的參數,新的功能。