接上次的繼續認證版的k8s搭建。
kubectl
準備證書
#kubectl證書放在這,由於kubectl相當於系統管理員,老鐵使用admin命名 mkdir -p /etc/kubernetes/ca/admin #準備admin證書配置 - kubectl只需客戶端證書,因此證書請求中 hosts 字段可以爲空 cp ~/kubernetes-starter/target/ca/admin/admin-csr.json /etc/kubernetes/ca/admin/ cd /etc/kubernetes/ca/admin/ #使用根證書(ca.pem)簽發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 #老鐵最終要的是admin-key.pem和admin.pem ls admin.csr admin-csr.json admin-key.pem admin.pem
8.2 配置kubectl
#指定apiserver的地址和證書位置(ip自行修改) kubectl config set-cluster kubernetes \ --certificate-authority=/etc/kubernetes/ca/ca.pem \ --embed-certs=true \ --server=https://192.168.68.101:6443 #設置客戶端認證參數,指定admin證書和祕鑰 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
驗證master節點
#可以使用剛配置好的kubectl查看一下組件狀態 kubectl get componentstatus
calico-node(主節點生成證書,102,103通過scp拷貝過去)
準備證書
後續可以看到calico證書用在四個地方:
- calico/node 這個docker 容器運行時訪問 etcd 使用證書
- cni 配置文件中,cni 插件需要訪問 etcd 使用證書
- calicoctl 操作集羣網絡時訪問 etcd 使用證書
- calico/kube-controllers 同步集羣網絡策略時訪問 etcd 使用證書
#calico證書放在這 mkdir -p /etc/kubernetes/ca/calico #準備calico證書配置 - calico只需客戶端證書,因此證書請求中 hosts 字段可以爲空 cp ~/kubernetes-starter/target/ca/calico/calico-csr.json /etc/kubernetes/ca/calico/ cd /etc/kubernetes/ca/calico/ #使用根證書(ca.pem)簽發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 #老鐵最終要的是calico-key.pem和calico.pem ls
拷貝主節點證書calico
由於calico服務是所有節點都需要啓動的,需要把這幾個文件拷貝到每臺服務器上 ** 通過主節點拷貝到102,103兩臺機器上
#root的密碼都是vagrant scp -r /etc/kubernetes/ca/ [email protected]:/etc/kubernetes/ca/ scp -r /etc/kubernetes/ca/ [email protected]:/etc/kubernetes/ca/
確定下主節點的/etc/kubernetes/ca/ 和 102,103內的目錄一致。
更新calico服務
cp ~/kubernetes-starter/target/all-node/kube-calico.service /lib/systemd/system/ systemctl daemon-reload service kube-calico start #驗證calico(能看到其他節點的列表就對啦) calicoctl node status
kubelet
老鐵這裏讓kubelet使用引導token的方式認證,所以認證方式跟之前的組件不同,它的證書不是手動生成,而是由工作節點TLS BootStrap 向api-server請求,由主節點的controller-manager 自動簽發。
創建角色綁定(主節點)
引導token的方式要求客戶端向api-server發起請求時告訴他你的用戶名和token,並且這個用戶是具有一個特定的角色:system:node-bootstrapper,所以需要先將 bootstrap token 文件中的 kubelet-bootstrap 用戶賦予這個特定角色,然後 kubelet 纔有權限發起創建認證請求。在主節點執行下面命令
#可以通過下面命令查詢clusterrole列表 kubectl -n kube-system get clusterrole #可以回顧一下token文件的內容 cat /etc/kubernetes/ca/kubernetes/token.csv #創建角色綁定(將用戶kubelet-bootstrap與角色system:node-bootstrapper綁定) kubectl create clusterrolebinding kubelet-bootstrap \ --clusterrole=system:node-bootstrapper --user=kubelet-bootstrap
創建bootstrap.kubeconfig(102,103工作節點)
這個配置是用來完成bootstrap token認證的,保存了像用戶,token等重要的認證信息,這個文件可以藉助kubectl命令生成:(也可以自己寫配置)
很重要。 0b1bd95b94caa5534d1d4a7318d51b0e 上邊有說明這個咋來的
#設置集羣參數(注意替換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 #設置客戶端認證參數(注意替換token) 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工作節點)
copy配置
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
** 登錄101主節點輸入命令查看狀態
kubectl get csr #啓動kubelet之後到master節點允許worker加入(批准worker的tls證書請求) #--------*在主節點執行*--------- kubectl get csr|grep 'Pending' | awk '{print $1}'| xargs kubectl certificate approve #----------------------------- #檢查日誌 journalctl -f -u kubelet
加入到主節點中。102
103請求加入,102已經加入
kube-proxy(子節點102,103)
準備證書
#proxy證書放在這 mkdir -p /etc/kubernetes/ca/kube-proxy #準備proxy證書配置 - proxy只需客戶端證書,因此證書請求中 hosts 字段可以爲空。 #CN 指定該證書的 User 爲 system:kube-proxy,預定義的 ClusterRoleBinding system:node-proxy 將User system:kube-proxy 與 Role system:node-proxier 綁定,授予了調用 kube-api-server proxy的相關 API 的權限 cp ~/kubernetes-starter/target/ca/kube-proxy/kube-proxy-csr.json /etc/kubernetes/ca/kube-proxy/ cd /etc/kubernetes/ca/kube-proxy/ #使用根證書(ca.pem)簽發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 kube-proxy-csr.json | cfssljson -bare kube-proxy #老鐵最終要的是kube-proxy-key.pem和kube-proxy.pem ls
生成kube-proxy.kubeconfig配置
#設置集羣參數(注意替換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 #置客戶端認證參數 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集羣部署完成了。 涉及到的細節也非常多,就這都對了兩篇博文了,如果每個配置都詳細解釋估計得寫本書了。從入門的角度瞭解認證和授權。 下面老鐵們使用新集羣先溫習一下之前學習過的命令,然後再認識一些新的命令,新的參數,新的功能。