k8s单节点部署(master ,node部分)
文章目錄
- 1 部署master 組件
- 1.1 master01 上創(chuàng)建kubernetes 工作目錄,創(chuàng)建ca證書(shū),相關(guān)組件證書(shū),私鑰目錄
- 1.1.1 將master.zip, k8s-cert.sh 包上傳到 /opt/k8s目錄中
- 1.1.2 創(chuàng)建kubernetes工作目錄,生成證書(shū)
- 1.2 復(fù)制master組件的關(guān)鍵命令文件到kubernetes工作目錄的bin子目錄中
- 1.3 創(chuàng)建bootstrap token 認(rèn)證文件
- 1.4開(kāi)啟apiserver服務(wù)
- 1.4.1 開(kāi)啟apiserver服務(wù)
- 1.4.2 檢查進(jìn)程是否成功開(kāi)啟
- 1.4.3 查看6443和8080端口
- 1.4.4 查看版本信息
- 1.5 啟動(dòng)scheduler 和 controller-manager 服務(wù)
- 1.6 將kubectl 和管理員權(quán)限綁定
- 1.7 查看master節(jié)點(diǎn)狀態(tài)
- 2 部署worker node組件
- 2.1 將master01 上的kubelet ,kube-proxy 拷貝到node 節(jié)點(diǎn)
- 2.2 將node.zip包上傳到 node01的/opt目錄中
- 2.3 mater01上 生成kublet配置文件
- 2.4 在master01 上,將剛剛生成的kublet配置文件拷貝到node節(jié)點(diǎn),并進(jìn)行RBAC授權(quán)
- 2.5 在master01上查看角色和已授權(quán)角色
- 2.6 在node01 上使用kubelet.sh 腳本啟動(dòng)kubelet
- 2.7 mater01 節(jié)點(diǎn)上通過(guò)kubelet的csr 請(qǐng)求
- 2.8 node01 節(jié)點(diǎn)上配置kube-proxy
- 2.9 部署node 02
- 2.9.1 在node01 節(jié)點(diǎn)上將kubelet.sh ,proxy.sh文件拷貝到node02 節(jié)點(diǎn)
- 2.9.2 在node02 上使用kubelet.sh 啟動(dòng)kubelet服務(wù)
- 2.9.3 在master01上通過(guò)csr請(qǐng)求
- 2.9.4 查看集群中節(jié)點(diǎn)的狀態(tài)
- 2.9.5 在node02上加載ipvs模塊
- 2.9.6 使用proxy.sh 啟動(dòng)proxy服務(wù)
- 3 測(cè)試
- 3.1 創(chuàng)建資源
- 3.2 查看pod狀態(tài)
- 3.3 查看pod的詳細(xì)狀態(tài)
1 部署master 組件
1.1 master01 上創(chuàng)建kubernetes 工作目錄,創(chuàng)建ca證書(shū),相關(guān)組件證書(shū),私鑰目錄
1.1.1 將master.zip, k8s-cert.sh 包上傳到 /opt/k8s目錄中
#將 master.zip, k8s-cert.sh 包上傳到 /opt/k8s目錄中 [root@master01 ~]# cd /opt/k8s/ [root@master01 k8s]# ls master.zip master.zip [root@master01 k8s]# unzip master.zip Archive: master.zipinflating: apiserver.sh inflating: controller-manager.sh inflating: scheduler.sh [root@master01 k8s]# chmod +x *.sh [root@master01 k8s]# vim k8s-cert.sh #!/bin/bash #配置證書(shū)生成策略,讓 CA 軟件知道頒發(fā)有什么功能的證書(shū),生成用來(lái)簽發(fā)其他組件證書(shū)的根證書(shū) cat > ca-config.json <<EOF {"signing": {"default": {"expiry": "87600h"},"profiles": {"kubernetes": {"expiry": "87600h","usages": ["signing","key encipherment","server auth","client auth"]}}} } EOF#生成CA證書(shū)和私鑰(根證書(shū)和私鑰) cat > ca-csr.json <<EOF {"CN": "kubernetes","key": {"algo": "rsa","size": 2048},"names": [{"C": "CN","L": "Beijing","ST": "Beijing","O": "k8s","OU": "System"}] } EOFcfssl gencert -initca ca-csr.json | cfssljson -bare ca -#----------------------- #生成 apiserver 的證書(shū)和私鑰(apiserver和其它k8s組件通信使用) #hosts中將所有可能作為 apiserver 的 ip 添加進(jìn)去,后面 keepalived 使用的 VIP 也要加入 cat > apiserver-csr.json <<EOF {"CN": "kubernetes","hosts": ["10.0.0.1","127.0.0.1","192.168.23.103", "192.168.23.10","192.168.23.18", "192.168.23.11", "192.168.23.12", "kubernetes","kubernetes.default","kubernetes.default.svc","kubernetes.default.svc.cluster","kubernetes.default.svc.cluster.local"],"key": {"algo": "rsa","size": 2048},"names": [{"C": "CN","L": "BeiJing","ST": "BeiJing","O": "k8s","OU": "System"}] } EOFcfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes apiserver-csr.json | cfssljson -bare apiserver#----------------------- #生成 kubectl 的證書(shū)和私鑰,具有admin權(quán)限 cat > admin-csr.json <<EOF {"CN": "admin","hosts": [],"key": {"algo": "rsa","size": 2048},"names": [{"C": "CN","L": "BeiJing","ST": "BeiJing","O": "system:masters","OU": "System"}] } EOFcfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes admin-csr.json | cfssljson -bare admin#----------------------- #生成 kube-proxy 的證書(shū)和私鑰 cat > kube-proxy-csr.json <<EOF {"CN": "system:kube-proxy","hosts": [],"key": {"algo": "rsa","size": 2048},"names": [{"C": "CN","L": "BeiJing","ST": "BeiJing","O": "k8s","OU": "System"}] } EOFcfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kube-proxy-csr.json | cfssljson -bare kube-proxy1.1.2 創(chuàng)建kubernetes工作目錄,生成證書(shū)
#創(chuàng)建kubernetes工作目錄 [root@master01 k8s]# mkdir -p /opt/kubernetes/{cfg,bin,ssl}#創(chuàng)建用于生成CA證書(shū),相關(guān)組件的證書(shū)和私鑰的目錄 [root@master01 k8s]# mkdir /opt/k8s/k8s-cert [root@master01 k8s]# mv /opt/k8s/k8s-cert.sh /opt/k8s/k8s-cert/ [root@master01 k8s]# cd !$ cd /opt/k8s/k8s-cert/ [root@master01 k8s-cert]# pwd /opt/k8s/k8s-cert #生成CA證書(shū),相關(guān)組件的證書(shū)和私鑰 [root@master01 k8s-cert]# ./k8s-cert.sh [root@master01 k8s-cert]# ls *pem admin-key.pem admin.pem apiserver-key.pem apiserver.pem ca-key.pem ca.pem kube-proxy-key.pem kube-proxy.pem#復(fù)制ca證書(shū),apiserver相關(guān)證書(shū)和私鑰到kubernetes工作目錄的ssl子目錄中 [root@master01 k8s-cert]# cp ca*pem apiserver*pem /opt/kubernetes/ssl/默認(rèn)情況下,k8s有兩個(gè)端口 8080端口和 6443端口。master組件可以用這兩個(gè)端口通信。使用證書(shū)加密通信,就使用 6443端口。
因?yàn)閙aster的組件(controller manage 和scheduler 和 api-server)都在一個(gè)服務(wù)器上,ontroller-manager 和kube-scheduler 設(shè)置為只調(diào)用當(dāng)前機(jī)器的apiserver,使用127.0.0.1:8080通信。因此不需要簽發(fā)證書(shū)
1.2 復(fù)制master組件的關(guān)鍵命令文件到kubernetes工作目錄的bin子目錄中
#上傳kubernetes-server-linux-amd64.tar.gz到/opt/k8s/目錄中 [root@master01 k8s-cert]# cd /opt/k8s/ [root@master01 k8s]# ls kubernetes-server-linux-amd64.tar.gz kubernetes-server-linux-amd64.tar.gz[root@master01 k8s]# tar xf kubernetes-server-linux-amd64.tar.gz #復(fù)制master組件的關(guān)鍵命令文件到kubernetes工作目錄的bin子目錄中 [root@master01 bin]# cp kube-apiserver kubectl kube-controller-manager kube-scheduler /opt/kubernetes/bin/[root@master01 bin]# ln -s /opt/kubernetes/bin/* /usr/local/bin/1.3 創(chuàng)建bootstrap token 認(rèn)證文件
創(chuàng)建bootstrap token認(rèn)證文件,apiserver 啟動(dòng)時(shí)會(huì)調(diào)用,然后就相當(dāng)于在集群內(nèi)創(chuàng)建了一個(gè)這個(gè)用戶,接下來(lái)可以用RBAC給他授權(quán)。
[root@master01 bin]# cd /opt/k8s/ [root@master01 k8s]# vim token.sh #!/bin/bash #獲取隨機(jī)數(shù)的前16個(gè)字節(jié)內(nèi)容,以16進(jìn)制格式輸出,并刪除其中的空格 BOOTSTRAP_TOKEN=$(head -c 16 /dev/urandom | od -An -t x | tr -d ' ') #生成token.csv文件,安裝Token序列號(hào),用戶名,UID,用戶組 的格式生成 cat > /opt/kubernetes/cfg/token.csv << EOF ${BOOTSTRAP_TOKEN},kubelet-bootstrap,10001,"system:kubelet-bootstrap" EOF[root@master01 k8s]# chmod +x token.sh [root@master01 k8s]# ./token.sh1.4開(kāi)啟apiserver服務(wù)
1.4.1 開(kāi)啟apiserver服務(wù)
[root@master01 k8s]# cd /opt/k8s/#$1為master的ip, https://..... 為etcd集群的位置 [root@master01 k8s]# ./apiserver.sh 192.168.23.103 \ https://192.168.23.103:2379,https://192.168.23.104:2379,http://192.168.23.105:23791.4.2 檢查進(jìn)程是否成功開(kāi)啟
[root@master01 k8s]# ps aux | grep kube-apiserver1.4.3 查看6443和8080端口
- k8s通過(guò)kube-server這個(gè)進(jìn)程提供服務(wù),該進(jìn)程運(yùn)行在單個(gè)master節(jié)點(diǎn)上。默認(rèn)有6443和8080
- 安全端口6443用于接收https請(qǐng)求,用于基于Token文件或客戶端證書(shū)認(rèn)證
- 本地端口8080用于接收http請(qǐng)求,非認(rèn)證或者授權(quán)的http請(qǐng)求通過(guò)該端口訪問(wèn)API Server
1.4.4 查看版本信息
必須保證apiserver啟動(dòng)正常,不然無(wú)法查詢到server的版本信息
[root@master01 k8s]# kubectl version1.5 啟動(dòng)scheduler 和 controller-manager 服務(wù)
#啟動(dòng)scheduler 服務(wù) [root@master01 k8s]# cd /opt/k8s/ [root@master01 k8s]#vim scheduler.sh #!/bin/bash #創(chuàng)建 kube-scheduler 啟動(dòng)參數(shù)配置文件 MASTER_ADDRESS=$1cat >/opt/kubernetes/cfg/kube-scheduler <<EOF KUBE_SCHEDULER_OPTS="--logtostderr=true \\ --v=4 \\ --master=${MASTER_ADDRESS}:8080 \\ --leader-elect=true" EOF#--master:監(jiān)聽(tīng) apiserver 的地址和8080端口 #--leader-elect=true:啟動(dòng) leader 選舉 #k8s中Controller-Manager和Scheduler的選主邏輯:k8s中的etcd是整個(gè)集群所有狀態(tài)信息的存儲(chǔ),涉及數(shù)據(jù)的讀寫(xiě)和多個(gè)etcd之間數(shù)據(jù)的同步,對(duì)數(shù)據(jù)的一致性要求嚴(yán)格,所以使用較復(fù)雜的 raft 算法來(lái)選擇用于提交數(shù)據(jù)的主節(jié)點(diǎn)。而 apiserver 作為集群入口,本身是無(wú)狀態(tài)的web服務(wù)器,多個(gè) apiserver 服務(wù)之間直接負(fù)載請(qǐng)求并不需要做選主。Controller-Manager 和 Scheduler 作為任務(wù)類型的組件,比如 controller-manager 內(nèi)置的 k8s 各種資源對(duì)象的控制器實(shí)時(shí)的 watch apiserver 獲取對(duì)象最新的變化事件做期望狀態(tài)和實(shí)際狀態(tài)調(diào)整,調(diào)度器watch未綁定節(jié)點(diǎn)的pod做節(jié)點(diǎn)選擇,顯然多個(gè)這些任務(wù)同時(shí)工作是完全沒(méi)有必要的,所以 controller-manager 和 scheduler 也是需要選主的,但是選主邏輯和 etcd 不一樣的,這里只需要保證從多個(gè) controller-manager 和 scheduler 之間選出一個(gè) leader 進(jìn)入工作狀態(tài)即可,而無(wú)需考慮它們之間的數(shù)據(jù)一致和同步。#創(chuàng)建 kube-scheduler.service 服務(wù)管理文件 cat >/usr/lib/systemd/system/kube-scheduler.service <<EOF [Unit] Description=Kubernetes Scheduler Documentation=https://github.com/kubernetes/kubernetes[Service] EnvironmentFile=-/opt/kubernetes/cfg/kube-scheduler ExecStart=/opt/kubernetes/bin/kube-scheduler \$KUBE_SCHEDULER_OPTS Restart=on-failure[Install] WantedBy=multi-user.target EOFsystemctl daemon-reload systemctl enable kube-scheduler systemctl restart kube-scheduler [root@master01 k8s]# ./scheduler.sh 127.0.0.1 [root@master01 k8s]# ps aux | grep kube-scheduler [root@master01 k8s]# vim controller-manager.sh #!/bin/bash #創(chuàng)建 kube-controller-manager 啟動(dòng)參數(shù)配置文件 MASTER_ADDRESS=$1cat >/opt/kubernetes/cfg/kube-controller-manager <<EOF KUBE_CONTROLLER_MANAGER_OPTS="--logtostderr=true \\ --v=4 \\ --master=${MASTER_ADDRESS}:8080 \\ --leader-elect=true \\ --address=127.0.0.1 \\ --service-cluster-ip-range=10.0.0.0/24 \\ --cluster-name=kubernetes \\ --cluster-signing-cert-file=/opt/kubernetes/ssl/ca.pem \\ --cluster-signing-key-file=/opt/kubernetes/ssl/ca-key.pem \\ --root-ca-file=/opt/kubernetes/ssl/ca.pem \\ --service-account-private-key-file=/opt/kubernetes/ssl/ca-key.pem \\ --experimental-cluster-signing-duration=87600h0m0s" EOF#--cluster-name=kubernetes:集群名稱,與CA證書(shū)里的CN匹配 #--cluster-signing-cert-file:指定簽名的CA機(jī)構(gòu)根證書(shū),用來(lái)簽名為 TLS BootStrapping 創(chuàng)建的證書(shū)和私鑰 #--root-ca-file:指定根CA證書(shū)文件路徑,用來(lái)對(duì) kube-apiserver 證書(shū)進(jìn)行校驗(yàn),指定該參數(shù)后,才會(huì)在 Pod 容器的 ServiceAccount 中放置該 CA 證書(shū)文件 #--experimental-cluster-signing-duration:設(shè)置為 TLS BootStrapping 簽署的證書(shū)有效時(shí)間為10年,默認(rèn)為1年#創(chuàng)建 kube-controller-manager.service 服務(wù)管理文件 cat >/usr/lib/systemd/system/kube-controller-manager.service <<EOF [Unit] Description=Kubernetes Controller Manager Documentation=https://github.com/kubernetes/kubernetes[Service] EnvironmentFile=-/opt/kubernetes/cfg/kube-controller-manager ExecStart=/opt/kubernetes/bin/kube-controller-manager \$KUBE_CONTROLLER_MANAGER_OPTS Restart=on-failure[Install] WantedBy=multi-user.target EOFsystemctl daemon-reload systemctl enable kube-controller-manager systemctl restart kube-controller-manager #啟動(dòng)controller-manager [root@master01 k8s]# ./controller-manager.sh 127.0.0.1 [root@master01 k8s]# ps aux | grep controller[root@master01 k8s]# systemctl status kube-scheduler.service [root@master01 k8s]# systemctl status kube-controller-manager.service1.6 將kubectl 和管理員權(quán)限綁定
[root@master01 k8s]# chmod +x admin.sh [root@master01 k8s]# ./admin.sh [root@master01 k8s]# vim admin.sh #!/bin/bash mkdir /root/.kube KUBE_CONFIG="/root/.kube/config" KUBE_APISERVER="https://192.168.23.103:6443" cd /opt/k8s/k8s-cert/ kubectl config set-cluster kubernetes \--certificate-authority=/opt/kubernetes/ssl/ca.pem \--embed-certs=true \--server=${KUBE_APISERVER} \--kubeconfig=${KUBE_CONFIG} kubectl config set-credentials cluster-admin \--client-certificate=./admin.pem \--client-key=./admin-key.pem \--embed-certs=true \--kubeconfig=${KUBE_CONFIG} kubectl config set-context default \--cluster=kubernetes \--user=cluster-admin \--kubeconfig=${KUBE_CONFIG} kubectl config use-context default --kubeconfig=${KUBE_CONFIG}1.7 查看master節(jié)點(diǎn)狀態(tài)
root@master01 k8s]# kubectl get csNAME STATUS MESSAGE ERROR scheduler Healthy ok etcd-2 Healthy {"health":"true"} etcd-1 Healthy {"health":"true"} etcd-0 Healthy {"health":"true"} controller-manager Healthy ok2 部署worker node組件
2.1 將master01 上的kubelet ,kube-proxy 拷貝到node 節(jié)點(diǎn)
[root@master01 kubernetes]# cd /opt/k8s/kubernetes/server/bin/ [root@master01 bin]# scp kubelet kube-proxy 192.168.23.104:/opt/kubernetes/bin [root@master01 bin]# scp kubelet kube-proxy 192.168.23.105:/opt/kubernetes/bin2.2 將node.zip包上傳到 node01的/opt目錄中
[root@node01 opt]# cd /opt/ [root@node01 opt]# ls node.zip node.zip [root@node01 opt]# unzip node.zip Archive: node.zipinflating: proxy.sh inflating: kubelet.sh2.3 mater01上 生成kublet配置文件
#創(chuàng)建用于生成kubelet的配置文件目錄 [root@master01 bin]# mkdir /opt/k8s/kubeconfig#上傳kubeconfig.sh 文件到 /opt/k8s/kubeconfig目錄 [root@master01 bin]# cd /opt/k8s/kubeconfig/ [root@master01 kubeconfig]# ls kubeconfig.sh kubeconfig.sh[root@master01 kubeconfig]#vim kubeconfig.sh #!/bin/bash #example: kubeconfig 192.168.80.10 /opt/k8s/k8s-cert/ #創(chuàng)建bootstrap.kubeconfig文件 #該文件中內(nèi)置了 token.csv 中用戶的 Token,以及 apiserver CA 證書(shū);kubelet 首次啟動(dòng)會(huì)加載此文件,使用 apiserver CA 證書(shū)建立與 apiserver 的 TLS 通訊,使用其中的用戶 Token 作為身份標(biāo)識(shí)向 apiserver 發(fā)起 CSR 請(qǐng)求BOOTSTRAP_TOKEN=$(awk -F ',' '{print $1}' /opt/kubernetes/cfg/token.csv) APISERVER=$1 SSL_DIR=$2export KUBE_APISERVER="https://$APISERVER:6443"# 設(shè)置集群參數(shù) kubectl config set-cluster kubernetes \--certificate-authority=$SSL_DIR/ca.pem \--embed-certs=true \--server=${KUBE_APISERVER} \--kubeconfig=bootstrap.kubeconfig #--embed-certs=true:表示將ca.pem證書(shū)寫(xiě)入到生成的bootstrap.kubeconfig文件中# 設(shè)置客戶端認(rèn)證參數(shù),kubelet 使用 bootstrap token 認(rèn)證 kubectl config set-credentials kubelet-bootstrap \--token=${BOOTSTRAP_TOKEN} \--kubeconfig=bootstrap.kubeconfig# 設(shè)置上下文參數(shù) kubectl config set-context default \--cluster=kubernetes \--user=kubelet-bootstrap \--kubeconfig=bootstrap.kubeconfig# 使用上下文參數(shù)生成 bootstrap.kubeconfig 文件 kubectl config use-context default --kubeconfig=bootstrap.kubeconfig#----------------------#創(chuàng)建kube-proxy.kubeconfig文件 # 設(shè)置集群參數(shù) kubectl config set-cluster kubernetes \--certificate-authority=$SSL_DIR/ca.pem \--embed-certs=true \--server=${KUBE_APISERVER} \--kubeconfig=kube-proxy.kubeconfig# 設(shè)置客戶端認(rèn)證參數(shù),kube-proxy 使用 TLS 證書(shū)認(rèn)證 kubectl config set-credentials kube-proxy \--client-certificate=$SSL_DIR/kube-proxy.pem \--client-key=$SSL_DIR/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# 使用上下文參數(shù)生成 kube-proxy.kubeconfig 文件 kubectl config use-context default --kubeconfig=kube-proxy.kubeconfig [root@master01 kubeconfig]# chmod +x kubeconfig.sh#生成kubelet配置文件 [root@master01 kubeconfig]# ./kubeconfig.sh 192.168.23.103 /opt/k8s/k8s-cert/ [root@master01 kubeconfig]# ls bootstrap.kubeconfig kubeconfig.sh kube-proxy.kubeconfigkubeconfig.sh文件包含集群參數(shù)(CA證書(shū)、API Server地址) ,客戶端參數(shù)(上面生成的證書(shū)和私鑰),集群context上下文參數(shù)(集群名稱、用戶名) 。
Kubenetes組件(如kubelet, kube-proxy)通過(guò)啟動(dòng)時(shí)指定不同的kubeconfig文件可以切換到不同的集群,連接到apiserver
2.4 在master01 上,將剛剛生成的kublet配置文件拷貝到node節(jié)點(diǎn),并進(jìn)行RBAC授權(quán)
#將bootstrap.kubeconfig kube-proxy.kubeconfig文件拷貝到node節(jié)點(diǎn) [root@master01 kubeconfig]# scp bootstrap.kubeconfig kube-proxy.kubeconfig 192.168.23.104:/opt/kubernetes/cfg/ [root@master01 kubeconfig]# scp bootstrap.kubeconfig kube-proxy.kubeconfig 192.168.23.105:/opt/kubernetes/cfg/#RBAC授權(quán),將預(yù)設(shè)用戶kubelet-bootstrap與內(nèi)置的clusterRole system:node-bootstrapper 綁定在一起,使其能夠發(fā)起CSR請(qǐng)求 #kublet 第一次發(fā)起csr請(qǐng)求,想要請(qǐng)求證書(shū),首先需要獲得授權(quán) [root@master01 kubeconfig]# kubectl create clusterrolebinding kubelet-bootstrap --clusterrole=system:node-bootstrapper --user=kubelet-bootstrapkubelet采用TLS Bootstrapping機(jī)制, 自動(dòng)完成到kube-apiserver的注冊(cè),在node節(jié)點(diǎn)量較大或者后期自動(dòng)擴(kuò)容時(shí)非常有用。Master apiserver啟用TLs認(rèn)證后, node節(jié)點(diǎn)kubelet組件想要加入集群,必須使用cA簽發(fā)的有效證書(shū)才能與apiserver通信,當(dāng)node節(jié)點(diǎn)很多時(shí),簽署證書(shū)是一件很繁瑣的事情。因此Kubernetes引入了TLs bootstraping機(jī)制來(lái)自動(dòng)頒發(fā)客戶端證書(shū), kubelet會(huì)以一個(gè)低權(quán)限用戶自動(dòng)向apiserver申請(qǐng)證書(shū), kubelet的證書(shū)由apiserver動(dòng)態(tài)簽署。
kubelet首次啟動(dòng)通過(guò)加載bootstrap.kubeconfig中的用戶Token和apiserver CA證書(shū)發(fā)起首次CSR請(qǐng)求,這個(gè)Token被預(yù)先內(nèi)置在apiserver節(jié)點(diǎn)的token.csv中,其身份為kubelet-bootstrap用戶和system: kubelet-bootstrap用戶組;想要首次CSR
請(qǐng)求能成功(即不會(huì)被apiserver 401拒絕) ,則需要先創(chuàng)建一個(gè)clusterRoleBinding,將kubelet-bootstrap用戶和
system: node-bootstrapper內(nèi)置clusterRole綁定(通過(guò)kubectl get clusterroles可查詢) ,使其能夠發(fā)起CSR認(rèn)證請(qǐng)求
TLs bootstrapping時(shí)的證書(shū)實(shí)際是由kube-controller-manager組件來(lái)簽署的,也就是說(shuō)證書(shū)有效期是kube-controller-manager
組件控制的; kube-controller-manager組件提供了一個(gè)–experimental-cluster-signing-duration參數(shù)來(lái)設(shè)置簽署的證書(shū)有效時(shí)間;默認(rèn)為8760h0mos,將其改為87600h0mos,即10年后再進(jìn)行TLs bootstrapping簽署證書(shū)即可
也就是說(shuō)kubelet首次訪問(wèn)API Server時(shí),是使用token做認(rèn)證,通過(guò)后, controller Manager公為kubelet生成一個(gè)證書(shū),以后的訪問(wèn)都是用證書(shū)做認(rèn)證了
2.5 在master01上查看角色和已授權(quán)角色
#查看角色 [root@master01 kubeconfig]# kubectl get clusterroles | grep system:node-bootstrapper system:node-bootstrapper 80m #查看已授權(quán)角色 [root@master01 kubeconfig]# kubectl get clusterrolebinding2.6 在node01 上使用kubelet.sh 腳本啟動(dòng)kubelet
[root@node01 opt]# cd /opt/ [root@node01 opt]# ls kubelet.sh kubelet.sh [root@node01 opt]# vim kubelet.sh #!/bin/bashNODE_ADDRESS=$1 DNS_SERVER_IP=${2:-"10.0.0.2"}#創(chuàng)建 kubelet 啟動(dòng)參數(shù)配置文件 cat >/opt/kubernetes/cfg/kubelet <<EOF KUBELET_OPTS="--logtostderr=true \\ --v=4 \\ --hostname-override=${NODE_ADDRESS} \\ --kubeconfig=/opt/kubernetes/cfg/kubelet.kubeconfig \\ --bootstrap-kubeconfig=/opt/kubernetes/cfg/bootstrap.kubeconfig \\ --config=/opt/kubernetes/cfg/kubelet.config \\ --cert-dir=/opt/kubernetes/ssl \\ --pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google-containers/pause-amd64:3.0" EOF#--hostname-override:指定kubelet節(jié)點(diǎn)在集群中顯示的主機(jī)名或IP地址,默認(rèn)使用主機(jī)hostname;kube-proxy和kubelet的此項(xiàng)參數(shù)設(shè)置必須完全一致 #--kubeconfig:指定kubelet.kubeconfig文件位置,用于如何連接到apiserver,里面含有kubelet證書(shū),master授權(quán)完成后會(huì)在node節(jié)點(diǎn)上生成 kubelet.kubeconfig 文件 #--bootstrap-kubeconfig:指定連接 apiserver 的 bootstrap.kubeconfig 文件 #--config:指定kubelet配置文件的路徑,啟動(dòng)kubelet時(shí)將從此文件加載其配置 #--cert-dir:指定master頒發(fā)的客戶端證書(shū)和密鑰保存位置 #--pod-infra-container-image:指定Pod基礎(chǔ)容器(Pause容器)的鏡像。Pod啟動(dòng)的時(shí)候都會(huì)啟動(dòng)一個(gè)這樣的容器,每個(gè)pod之間相互通信需要Pause的支持,啟動(dòng)Pause需要Pause基礎(chǔ)鏡像#---------------------- #創(chuàng)建kubelet配置文件(該文件實(shí)際上就是一個(gè)yml文件,語(yǔ)法非常嚴(yán)格,不能出現(xiàn)tab鍵,冒號(hào)后面必須要有空格,每行結(jié)尾也不能有空格) cat >/opt/kubernetes/cfg/kubelet.config <<EOF kind: KubeletConfiguration apiVersion: kubelet.config.k8s.io/v1beta1 address: ${NODE_ADDRESS} port: 10250 readOnlyPort: 10255 cgroupDriver: cgroupfs clusterDNS: - ${DNS_SERVER_IP} clusterDomain: cluster.local. failSwapOn: false authentication:anonymous:enabled: true EOF#PS:當(dāng)命令行參數(shù)與此配置文件(kubelet.config)有相同的值時(shí),就會(huì)覆蓋配置文件中的該值。#---------------------- #創(chuàng)建 kubelet.service 服務(wù)管理文件 cat >/usr/lib/systemd/system/kubelet.service <<EOF [Unit] Description=Kubernetes Kubelet After=docker.service Requires=docker.service[Service] EnvironmentFile=/opt/kubernetes/cfg/kubelet ExecStart=/opt/kubernetes/bin/kubelet \$KUBELET_OPTS Restart=on-failure KillMode=process[Install] WantedBy=multi-user.target EOFsystemctl daemon-reload systemctl enable kubelet systemctl restart kubelet [root@node01 opt]# chmod +x kubelet.sh #使用腳本啟動(dòng)kubelet服務(wù) oot@node01 opt]# ./kubelet.sh 192.168.23.104 [root@node01 opt]# ps aux | grep kubelet#此時(shí)還沒(méi)有生成證書(shū) [root@node01 opt]# ls /opt/kubernetes/ssl/ kubelet-client.key.tmp kubelet.crt kubelet.key2.7 mater01 節(jié)點(diǎn)上通過(guò)kubelet的csr 請(qǐng)求
#檢查到node01 節(jié)點(diǎn)的kubelet發(fā)起的CSR請(qǐng)求,Pending表示等待集群給該節(jié)點(diǎn)簽發(fā)證書(shū) [root@master01 opt]# kubectl get csr NAME AGE REQUESTOR CONDITION node-csr-0uON9h27bA3I03O59M3wUUuFMn9VyEAKxsXV93ftsoA 3m25s kubelet-bootstrap Pending#通過(guò)csr請(qǐng)求狀態(tài) [root@master01 opt]# kubectl certificate approve node-csr-0uON9h27bA3I03O59M3wUUuFMn9VyEAKxsXV93ftsoA#再次查看csr請(qǐng)求狀態(tài) [root@master01 opt]# kubectl get csr NAME AGE REQUESTOR CONDITION node-csr-0uON9h27bA3I03O59M3wUUuFMn9VyEAKxsXV93ftsoA 6m15s kubelet-bootstrap Approved,Issued#查看集群節(jié)點(diǎn)狀態(tài)。 root@master01 opt]# kubectl get nodes NAME STATUS ROLES AGE VERSION 192.168.23.104 Ready <none> 14m v1.12.32.8 node01 節(jié)點(diǎn)上配置kube-proxy
[root@node01 opt]# ls /opt/kubernetes/cfg/kubelet.kubeconfig /opt/kubernetes/cfg/kubelet.kubeconfig [root@node01 opt]# ls /opt/kubernetes/ssl/ kubelet-client-2021-10-28-16-53-41.pem kubelet-client-current.pem kubelet.crt kubelet.key #加載ip_vs 模塊 [root@node01 opt]# for i in $(ls /usr/lib/modules/$(uname -r)/kernel/net/netfilter/ipvs|grep -o "^[^.]*");\ do echo $i; /sbin/modinfo -F filename $i >/dev/null 2>&1 && /sbin/modprobe $i;done [root@node01 opt]# cd /opt/ [root@node01 opt]# ls proxy.sh proxy.sh[root@node01 opt]# vim proxy.sh #!/bin/bashNODE_ADDRESS=$1#創(chuàng)建 kube-proxy 啟動(dòng)參數(shù)配置文件 cat >/opt/kubernetes/cfg/kube-proxy <<EOF KUBE_PROXY_OPTS="--logtostderr=true \\ --v=4 \\ --hostname-override=${NODE_ADDRESS} \\ --cluster-cidr=172.17.0.0/16 \\ --proxy-mode=ipvs \\ --kubeconfig=/opt/kubernetes/cfg/kube-proxy.kubeconfig" EOF#--hostnameOverride: 參數(shù)值必須與 kubelet 的值一致,否則 kube-proxy 啟動(dòng)后會(huì)找不到該 Node,從而不會(huì)創(chuàng)建任何 ipvs 規(guī)則 #--cluster-cidr:指定 Pod 網(wǎng)絡(luò)使用的聚合網(wǎng)段,Pod 使用的網(wǎng)段和 apiserver 中指定的 service 的 cluster ip 網(wǎng)段不是同一個(gè)網(wǎng)段。 kube-proxy 根據(jù) --cluster-cidr 判斷集群內(nèi)部和外部流量,指定 --cluster-cidr 選項(xiàng)后 kube-proxy 才會(huì)對(duì)訪問(wèn) Service IP 的請(qǐng)求做 SNAT,即來(lái)自非 Pod 網(wǎng)絡(luò)的流量被當(dāng)成外部流量,訪問(wèn) Service 時(shí)需要做 SNAT。 #--proxy-mode:指定流量調(diào)度模式為 ipvs 模式 #--kubeconfig: 指定連接 apiserver 的 kubeconfig 文件 #---------------------- #創(chuàng)建 kube-proxy.service 服務(wù)管理文件 cat >/usr/lib/systemd/system/kube-proxy.service <<EOF [Unit] Description=Kubernetes Proxy After=network.target[Service] EnvironmentFile=-/opt/kubernetes/cfg/kube-proxy ExecStart=/opt/kubernetes/bin/kube-proxy \$KUBE_PROXY_OPTS Restart=on-failure[Install] WantedBy=multi-user.target EOFsystemctl daemon-reload systemctl enable kube-proxy systemctl restart kube-proxy [root@node01 opt]# chmod +x proxy.sh #使用proxy.sh 腳本啟動(dòng)proxy服務(wù)[root@node01 opt]# ./proxy.sh 192.168.23.104 [root@node01 opt]# systemctl status kube-proxy.service2.9 部署node 02
2.9.1 在node01 節(jié)點(diǎn)上將kubelet.sh ,proxy.sh文件拷貝到node02 節(jié)點(diǎn)
[root@node01 opt]# cd /opt/ [root@node01 opt]# scp kubelet.sh proxy.sh 192.168.23.105:/opt/2.9.2 在node02 上使用kubelet.sh 啟動(dòng)kubelet服務(wù)
[root@node02 opt]# cd /opt/ [root@node02 opt]# chmod +x kubelet.sh [root@node02 opt]# ./kubelet.sh 192.168.23.1052.9.3 在master01上通過(guò)csr請(qǐng)求
#查看請(qǐng)求 [root@master01 kubeconfig]# kubectl get csr NAME AGE REQUESTOR CONDITION node-csr-0uON9h27bA3I03O59M3wUUuFMn9VyEAKxsXV93ftsoA 35m kubelet-bootstrap Approved,Issued node-csr-pN1MUK5bEta9052ytVLFHASMiLxWoQ4CPeaD3b32kS8 74s kubelet-bootstrap Pending#通過(guò)請(qǐng)求 [root@master01 kubeconfig]# kubectl certificate approve node-csr-pN1MUK5bEta9052ytVLFHASMiLxWoQ4CPeaD3b32kS8 certificatesigningrequest.certificates.k8s.io/node-csr-pN1MUK5bEta9052ytVLFHASMiLxWoQ4CPeaD3b32kS8 approved#再次查看你,狀態(tài)為已通過(guò) [root@master01 kubeconfig]# kubectl get csr NAME AGE REQUESTOR CONDITION node-csr-0uON9h27bA3I03O59M3wUUuFMn9VyEAKxsXV93ftsoA 36m kubelet-bootstrap Approved,Issued node-csr-pN1MUK5bEta9052ytVLFHASMiLxWoQ4CPeaD3b32kS8 103s kubelet-bootstrap Approved,Issued2.9.4 查看集群中節(jié)點(diǎn)的狀態(tài)
[root@master01 kubeconfig]# kubectl get nodesNAME STATUS ROLES AGE VERSION192.168.23.104 Ready <none> 32m v1.12.3192.168.23.105 Ready <none> 2m28s v1.12.32.9.5 在node02上加載ipvs模塊
[root@node02 opt]# for i in $(ls /usr/lib/modules/$(uname -r)/kernel/net/netfilter/ipvs|grep -o "^[^.]*");\ do echo $i; /sbin/modinfo -F filename $i >/dev/null 2>&1 && /sbin/modprobe $i;don2.9.6 使用proxy.sh 啟動(dòng)proxy服務(wù)
[root@node02 opt]# cd /opt/ [root@node02 opt]# chmod +x proxy.sh [root@node02 opt]# ./proxy.sh 192.168.23.105 Created symlink from /etc/systemd/system/multi-user.target.wants/kube-proxy.service to /usr/lib/systemd/system/kube-proxy.service. [root@node02 opt]# systemctl status kube-proxy.service3 測(cè)試
3.1 創(chuàng)建資源
#創(chuàng)建deployment資源,名為nginx-test. 使用鏡像 nginx:1.14 [root@master01 opt]# kubectl create deployment nginx-test --image=nginx:1.143.2 查看pod狀態(tài)
[root@master01 opt]# kubectl get pod NAME READY STATUS RESTARTS AGE nginx-test-7dc4f9dcc9-9pxdf 1/1 Running 0 3m30s3.3 查看pod的詳細(xì)狀態(tài)
[root@master01 opt]# kubectl describe pod nginx-test [root@master01 opt]# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE nginx-test-7dc4f9dcc9-9pxdf 1/1 Running 0 11m 172.17.4.2 192.168.23.104 <none> ne>總結(jié)
以上是生活随笔為你收集整理的k8s单节点部署(master ,node部分)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: kubernetes(k8s)架构和组件
- 下一篇: kubernetes (k8s)的二进制