『高階篇』docker之kubernetes搭建叢集新增認證授權(上)(38)
kubernetes最複雜的就是認證和授權,這次從頭搭建另外一套3個虛機的kubernetes,還是通過vagrant來進行搭建,具體vagrant的配置資訊檢視原始碼:https://github.com/limingios/msA-docker k8s分支
預先環境準備
-
虛擬機器介紹和安裝
>3臺虛擬機器還是通過vagrant來生成對應的虛擬機器。vagrant已經安裝了 對應的docker。
系統型別 | IP地址 | 節點角色 | CPU | Memory | Hostname |
---|---|---|---|---|---|
Centos7 | 192.168.68.101 | master | 2 | 4G | server01 |
Centos7 | 192.168.68.102 | worker | 1 | 2G | server02 |
Centos7 | 192.168.68.103 | worker | 1 | 2G | server03 |
- 三臺機器mac開通遠端登入root使用者下
#設定 PasswordAuthentication yes vi /etc/ssh/sshd_config sudo systemctl restart sshd
- 三臺機器接受所有ip的資料包轉發
vi /lib/systemd/system/docker.service #找到ExecStart=xxx,在這行上面加入一行,內容如下:(k8s的網路需要) ExecStartPost=/sbin/iptables -I FORWARD -s 0.0.0.0/0 -j ACCEPT
- 三臺機器啟動服務
systemctl daemon-reload service docker restart
系統設定(所有節點)
關閉、禁用防火牆(讓所有機器之間都可以通過任意埠建立連線)
systemctl stop firewalld systemctl disable firewalld #檢視狀態 systemctl status firewalld
####設定系統引數 – 允許路由轉發,不對bridge的資料進行處理
#寫入配置檔案 cat <<EOF > /etc/sysctl.d/k8s.conf net.ipv4.ip_forward = 1 net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF #生效配置檔案 sysctl -p /etc/sysctl.d/k8s.conf
配置host檔案
#配置host,使每個Node都可以通過名字解析到ip地址 vi /etc/hosts #加入如下片段(ip地址和servername替換成自己的) 192.168.68.101 server01 192.168.68.102 server02 192.168.68.103 server03
準備二進位制檔案(所有節點)
kubernetes的安裝有幾種方式,不管是kube-admin還是社群貢獻的部署方案都離不開這幾種方式:
– 使用現成的二進位制檔案
直接從官方或其他第三方下載,就是kubernetes各個元件的可執行檔案。拿來就可以直接運行了。不管是centos,ubuntu還是其他的linux發行版本,只要gcc編譯環境沒有太大的區別就可以直接執行的。使用較新的系統一般不會有什麼跨平臺的問題。
- 使用原始碼編譯安裝
編譯結果也是各個元件的二進位制檔案,所以如果能直接下載到需要的二進位制檔案基本沒有什麼編譯的必要性了。
- 使用映象的方式執行
同樣一個功能使用二進位制檔案提供的服務,也可以選擇使用映象的方式。就像nginx,像mysql,我們可以使用安裝版,搞一個可執行檔案執行起來,也可以使用它們的映象執行起來,提供同樣的服務。kubernetes也是一樣的道理,二進位制檔案提供的服務映象也一樣可以提供。
從上面的三種方式中其實使用映象是比較優雅的方案,容器的好處自然不用多說。但從初學者的角度來說容器的方案會顯得有些複雜,不那麼純粹,會有很多容器的配置檔案以及關於類似二進位制檔案提供的服務如何在容器中提供的問題,容易跑偏。
所以我們這裡使用二進位制的方式來部署。二進位制檔案已經這裡備好,大家可以打包下載,把下載好的檔案放到每個節點上,放在哪個目錄隨你喜歡, 放好後最好設定一下環境變數$PATH ,方便後面可以直接使用命令。(科學上網的老鐵也可以自己去官網找找)
####[下載地址(kubernetes 1.9.0版本)] (https://pan.baidu.com/s/1bMnqWY)
-
將下載的k8s上傳到linux伺服器上
>密碼都是vagrant
yum -y install lrzsz #選中檔案上傳就可以了,這次是在windows環境,上次基礎搭建是在mac上 rz
-
解壓k8s,改名
>解壓後,改名成bin就是為了不在配置環境變數
tar -xvf kubernetes-bins.tar.gz mv ~/kubernetes-bins/ bin
準備配置檔案(所有節點)
上一步我們下載了kubernetes各個元件的二進位制檔案,這些可執行檔案的執行也是需要新增很多引數的,包括有的還會依賴一些配置檔案。現在我們就把執行它們需要的引數和配置檔案都準備好。
下載配置檔案
#安裝git yum -y install git #到home目錄下載專案 git clone https://github.com/limingios/kubernetes-starter.git #看看git內容 cd ~/kubernetes-starter && ll
檔案說明
- gen-config.sh
shell指令碼,用來根據每個老鐵自己的叢集環境(ip,hostname等),根據下面的模板,生成適合大家各自環境的配置檔案。生成的檔案會放到target資料夾下。
- kubernetes-simple
簡易版kubernetes配置模板(剝離了認證授權)。
適合剛接觸kubernetes的老鐵,首先會讓大家在和kubernetes初次見面不會印象太差(太複雜啦
),再有就是讓大家更容易抓住kubernetes的核心部分,把注意力集中到核心元件及元件的聯絡,從整體上把握kubernetes的執行機制。 - kubernetes-with-ca
在simple基礎上增加認證授權部分。大家可以自行對比生成的配置檔案,看看跟simple版的差異,更容易理解認證授權的(認證授權也是kubernetes學習曲線較高的重要原因)
- service-config
這個先不用關注,它是我們曾經開發的那些微服務配置。
等我們熟悉了kubernetes後,實踐用的,通過這些配置,把我們的微服務都執行到kubernetes叢集中。
3臺機器生成配置
這裡會根據大家各自的環境生成kubernetes部署過程需要的配置檔案。
在每個節點上都生成一遍,把所有配置都生成好,後面會根據節點型別去使用相關的配置。
#cd到之前下載的git程式碼目錄 cd ~/kubernetes-starter #編輯屬性配置(根據檔案註釋中的說明填寫好每個key-value) vi config.properties #生成配置檔案,確保執行過程沒有異常資訊
生成配置(所有節點)
跟基礎環境搭建一樣,我們需要生成kubernetes-with-ca的所有相關配置檔案
#生成配置 ./gen-config.sh with-ca
PS:這個截圖master_ip應該是192.168.68.101
安裝cfssl(所有節點)
cfssl是非常好用的CA工具,我們用它來生成證書和祕鑰檔案
安裝過程比較簡單,
#下載 wgethttps://pkg.cfssl.org/R1.2/cfssl_linux-amd64 \ https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 #修改為可執行許可權 chmod +x cfssl_linux-amd64 cfssljson_linux-amd64 #移動到bin目錄 mv cfssl_linux-amd64 /usr/local/bin/cfssl mv cfssljson_linux-amd64 /usr/local/bin/cfssljson #驗證 cfssl version
生成根證書(主節點)
根證書是證書信任鏈的根,各個元件通訊的前提是有一份大家都信任的證書(根證書),每個人使用的證書都是由這個根證書籤發的。
#所有證書相關的東西都放在這 mkdir -p /etc/kubernetes/ca #準備生成證書的配置檔案 cp ~/kubernetes-starter/target/ca/ca-config.json /etc/kubernetes/ca cp ~/kubernetes-starter/target/ca/ca-csr.json /etc/kubernetes/ca #生成證書和祕鑰 cd /etc/kubernetes/ca cfssl gencert -initca ca-csr.json | cfssljson -bare ca #生成完成後會有以下檔案(我們最終想要的就是ca-key.pem和ca.pem,一個祕鑰,一個證書) ls
改造etcd(主節點)
準備證書
etcd節點需要提供給其他服務訪問,就要驗證其他服務的身份,所以需要一個標識自己監聽服務的server證書,當有多個etcd節點的時候也需要client證書與etcd叢集其他節點互動,當然也可以client和server使用同一個證書因為它們本質上沒有區別。
#etcd證書放在這 mkdir -p /etc/kubernetes/ca/etcd #準備etcd證書配置 cp ~/kubernetes-starter/target/ca/etcd/etcd-csr.json /etc/kubernetes/ca/etcd/ cd /etc/kubernetes/ca/etcd/ #使用根證書(ca.pem)簽發etcd證書 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 etcd-csr.json | cfssljson -bare etcd #跟之前類似生成三個檔案etcd.csr是個中間證書請求檔案,我們最終要的是etcd-key.pem和etcd.pem ls
更新etcd服務:
cp ~/kubernetes-starter/target/master-node/etcd.service /lib/systemd/system/ mkdir -p /var/lib/etcd systemctl enable etcd.service systemctl daemon-reload service etcd start #驗證etcd服務(endpoints自行替換) ETCDCTL_API=3 etcdctl \ --endpoints=https://192.168.68.101:2379\ --cacert=/etc/kubernetes/ca/ca.pem \ --cert=/etc/kubernetes/ca/etcd/etcd.pem \ --key=/etc/kubernetes/ca/etcd/etcd-key.pem \ endpoint health
api-server(主節點)
準備證書
#api-server證書放在這,api-server是核心,資料夾叫kubernetes吧,如果想叫apiserver也可以,不過相關的地方都需要修改哦 mkdir -p /etc/kubernetes/ca/kubernetes #準備apiserver證書配置 cp ~/kubernetes-starter/target/ca/kubernetes/kubernetes-csr.json /etc/kubernetes/ca/kubernetes/ cd /etc/kubernetes/ca/kubernetes/ #使用根證書(ca.pem)簽發kubernetes證書 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 kubernetes-csr.json | cfssljson -bare kubernetes #跟之前類似生成三個檔案kubernetes.csr是個中間證書請求檔案,我們最終要的是kubernetes-key.pem和kubernetes.pem ll
api-server服務
生成token認證檔案
#生成隨機token head -c 16 /dev/urandom | od -An -t x | tr -d ' ' 0b1bd95b94caa5534d1d4a7318d51b0e #按照固定格式寫入token.csv,注意替換token內容 echo "0b1bd95b94caa5534d1d4a7318d51b0e,kubelet-bootstrap,10001,\"system:kubelet-bootstrap\"" > /etc/kubernetes/ca/kubernetes/token.csv
更新api-server服務
cp ~/kubernetes-starter/target/master-node/kube-apiserver.service /lib/systemd/system/ systemctl daemon-reload service kube-apiserver start #檢查日誌 journalctl -f -u kube-apiserver cat /lib/systemd/system/kube-apiserver.service
controller-manager
controller-manager一般與api-server在同一臺機器上,所以可以使用非安全埠與api-server通訊,不需要生成證書和私鑰。
controller-manager服務
更新controller-manager服務
cd ~/kubernetes-starter/ cp ~/kubernetes-starter/target/master-node/kube-controller-manager.service /lib/systemd/system/ systemctl daemon-reload service kube-controller-manager start #檢查日誌 journalctl -f -u kube-controller-manager cat /lib/systemd/system/kube-controller-manager.service
scheduler
scheduler一般與apiserver在同一臺機器上,所以可以使用非安全埠與apiserver通訊。不需要生成證書和私鑰。
scheduler服務
檢視diff
比較會發現兩個檔案並沒有區別,不需要改造
cd ~/kubernetes-starter/ cp ~/kubernetes-starter/target/master-node/kube-scheduler.service /lib/systemd/system/ systemctl enable kube-scheduler.service
啟動服務
service kube-scheduler start #檢查日誌 journalctl -f -u kube-scheduler cat /lib/systemd/system/kube-scheduler.service
PS:下次開始kubectl,calico,cni,kube-proxy,kube-dns的認證,授權。
ofollow,noindex" target="_blank" href="http://zhanzhang.baidu.com/sitesubmit/index?sitename=https://idig8.com/2018/11/15/gaojipiandockerzhikubernetesdajianjiquntianjiarenzhengshouquanshang38/">百度未收錄
>>原創文章,歡迎轉載。轉載請註明:轉載自IT人故事會,謝謝!
>>原文連結地址:上一篇:已是最新文章