一 K8S按裝部署方式:
① Minikube
Minikube是一個工具,可以在本地快速運行一個單節點微型K8S,僅用于學習、預覽K8S的一些特
性使用。
部署地址:https://kubernetes.io/docs/setup/minikube
② Kubeadmin
Kubeadmin也是一個工具,提供kubeadm init和kubeadm join,用于快速部署K8S集群,相對簡
單。
https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/
③ 二進制安裝部署
生產首選,從官方下載發行版的二進制包,手動部署每個組件和自簽TLS證書,組成K8S集群,新
手推薦。
https://github.com/kubernetes/kubernetes/releases
小結:
Kubeadm降低部署門檻,但屏蔽了很多細節,遇到問題很難排查。如果想更容易可控,推
薦使用二進制包部署Kubernetes集群,雖然手動部署麻煩點,期間可以學習很多工作原理,也利于
后期維護。
二 進制搭建 Kubernetes v1.20?
master01 | kube-apiserver kube-controller-manager kube-scheduler etcd | 192.168.11.6 | |
node01 | kubelet kube-proxy docker? | 192.168.11.11 | |
node02 | etc | 192.168.11.12 |
1 關閉防火墻 防護
systemctl stop firewalld
systemctl disable firewalld
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
清空默認過濾表、NAT 表和 Mangle 表中的所有規則,并刪除所有用戶自定義的鏈。iptables -F: 這個部分用于清空默認過濾表(filter table)中的所有規則。-F 選項表示清空規則。&&: 這是一個邏輯操作符,表示前一個命令成功執行后才會執行下一個命令。在這里,它將多個命令連接在一起,以確保只有在前一個命令成功執行后才會執行下一個命令。iptables -t nat -F: 這部分用于清空 NAT 表(nat table)中的所有規則。-t nat 選項表示指定操作 NAT 表,-F 選項表示清空規則。iptables -t mangle -F: 這部分用于清空 Mangle 表(mangle table)中的所有規則。-t mangle 選項表示指定操作 Mangle 表,-F 選項表示清空規則。iptables -X: 最后這部分用于刪除用戶自定義的鏈(chains)。通常,用戶可以創建自定義的鏈來管理特定類型的流量,這個命令將刪除所有這些用戶自定義的鏈。
?2 關閉swap
swapoff -a
sed -ri 's/.*swap.*/#&/' /etc/fstab
3 根據規劃設置主機名?
hostnamectl set-hostname master01
hostnamectl set-hostname node01
hostnamectl set-hostname node02
4 在master添加hosts
cat >> /etc/hosts << EOF
192.168.11.6 master01
192.168.11.11 node01
192.168.11.12 node02
EOF
5 調整內核參數
cat > /etc/sysctl.d/k8s.conf << EOF
#開啟網橋模式,可將網橋的流量傳遞給iptables鏈
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
#關閉ipv6協議
net.ipv6.conf.all.disable_ipv6=1
net.ipv4.ip_forward=1
EOFsysctl --system
6 時間同步?
yum install ntpdate -yntpdate time.windows.com
用于通過 NTP 協議(Network Time Protocol)從指定的時間服務器(在這種情況下是 time.windows.com)同步系統的時間
?
注:若某一臺無法啟動 多重復幾次?
三 部署 docker引擎?
1 所有 node 節點部署docker引擎
yum install -y yum-utils device-mapper-persistent-data lvm2yum-utils: 這是一個 YUM 的擴展工具集,提供了一些額外的功能和命令,用于包管理和系統維護。device-mapper-persistent-data: 這是一個軟件包,提供了設備映射器持久數據存儲的功能,通常用于與 LVM (Logical Volume Manager)一起使用。lvm2: 這是邏輯卷管理器(LVM)的軟件包,用于創建、管理邏輯卷、卷組和邏輯卷快照等。因此,這個命令的作用是安裝 yum-utils、device-mapper-persistent-data 和 lvm2 這三個軟件包,并且使用 -y 選項自動確認安裝過程,而不需要用戶手動確認。
2 將阿里云鏡像站點上的 Docker CE 軟件源配置添加到系統的 YUM 軟件源列表中?
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum-config-manager: 這是一個 YUM 工具,用于管理 YUM 軟件源的配置。--add-repo: 這是 yum-config-manager 的選項,表示要添加一個新的軟件源配置。https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo: 這是要添加的 Docker CE 軟件源的 URL,指向阿里云鏡像站點上的 Docker CE 軟件源配置文件。通過添加這個軟件源,系統就可以從該鏡像站點下載 Docker CE 軟件包。因此,這個命令的作用是將阿里云鏡像站點上的 Docker CE 軟件源配置添加到系統的 YUM 軟件源列表中,以便系統可以從該鏡像站點獲取 Docker CE 軟件包進行安裝。
3 安裝 Docker CE 相關的軟件包?
yum install -y docker-ce docker-ce-cli containerd.io
docker-ce: 這是 Docker CE(Docker Community Edition)的主要軟件包,包含了 Docker 引擎等核心組件。docker-ce-cli: 這是 Docker CE 的命令行界面工具軟件包,用于與 Docker 引擎進行交互和管理。containerd.io: 這是容器運行時(container runtime)軟件包,用于管理容器的生命周期,包括創建、運行和銷毀容器等操作。系統將會安裝 Docker CE 相關的軟件包,包括 Docker 引擎、命令行界面工具和容器運行時,使得系統可以開始使用 Docker 來構建、部署和管理容器化應用程序。systemctl start docker.service
systemctl enable docker.service
四 部署 etcd 集群
etcd是CoreOS團隊于2013年6月發起的開源項目,它的目標是構建一個高可用的分布式鍵值(key-value)數據庫。etcd內部采用raft協議作為一致性算法,etcd是go語言編寫的。
1 etcd 作為服務發現系統,有以下的特點:
簡單:安裝配置簡單,而且提供了HTTP API進行交互,使用也很簡單
安全:支持SSL證書驗證
快速:單實例支持每秒2k+讀操作
可靠:采用raft算法,實現分布式系統數據的可用性和一致性?
etcd 目前默認使用2379端口提供HTTP API服務, 2380端口和peer通信(這兩個端口已經被
IANA(互聯網數字分配機構)官方預留給etcd)。 即etcd默認使用2379端口對外為客戶端提供通訊,
使用端口2380來進行服務器間內部通訊。
etcd 在生產環境中一般推薦集群方式部署。由于etcd 的leader選舉機制,要求至少為3臺或以上的
奇數臺。
?2 準備簽發證書環境
CFSSL 是 CloudFlare 公司開源的一款 PKI/TLS 工具。 CFSSL 包含一個命令行工具和一個用于簽名、驗證和捆綁 TLS 證書的 HTTP API 服務。使用Go語言編寫。
CFSSL 使用配置文件生成證書,因此自簽之前,需要生成它識別的 json 格式的配置文件,CFSSL 提供了方便的命令行生成配置文件。CFSSL 用來為 etcd 提供 TLS 證書,它支持簽三種類型的證書:
1、client 證書,服務端連接客戶端時攜帶的證書,用于客戶端驗證服務端身份,如 kube-apiserver 訪問 etcd;
2、server 證書,客戶端連接服務端時攜帶的證書,用于服務端驗證客戶端身份,如 etcd 對外提供服務;
3、peer 證書,相互之間連接時使用的證書,如 etcd 節點之間進行驗證和通信。
這里全部都使用同一套證書認證。
3 在 master01 節點上操作
1) 準備cfssl證書生成工具
wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -O /usr/local/bin/cfssl
wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 -O /usr/local/bin/cfssljson
wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 -O /usr/local/bin/cfssl-certinfo
2) 添加權限?
chmod +x /usr/local/bin/cfssl*
--------------------------------------------------------
cfssl:證書簽發的工具命令
cfssljson:將 cfssl 生成的證書(json格式)變為文件承載式證書
cfssl-certinfo:驗證證書的信息
cfssl-certinfo -cert <證書名稱> #查看證書的信息
---------------------------------------------------------
?
4 生成etcd證書?
mkdir /opt/k8s
cd /opt/k8s/上傳 etcd-cert.sh 和 etcd.sh 到 /opt/k8s/ 目錄中
chmod +x etcd-cert.sh etcd.sh
vim etcd-cert.sh? ? ? 借用腳本切記IP地址?
創建用于生成CA證書、etcd 服務器證書以及私鑰的目錄?
mkdir /opt/k8s/etcd-cert
mv etcd-cert.sh etcd-cert/
cd /opt/k8s/etcd-cert/
./etcd-cert.sh #生成CA證書、etcd 服務器證書以及私鑰ls
ca-config.json ca-csr.json ca.pem server.csr server-key.pem
ca.csr ca-key.pem etcd-cert.sh server-csr.json server.pem
?5 上傳 etcd-v3.4.9-linux-amd64.tar.gz 到 /opt/k8s 目錄中,啟動etcd服務
https://github.com/etcd-io/etcd/releases/download/v3.4.9/etcd-v3.4.9-linux-amd64.tar.gzcd /opt/k8s/
tar zxvf etcd-v3.4.9-linux-amd64.tar.gz
ls etcd-v3.4.9-linux-amd64
Documentation etcd etcdctl README-etcdctl.md README.md READMEv2-etcdctl.md
------------------------------------------------------------------------------------------
etcd就是etcd 服務的啟動命令,后面可跟各種啟動參數
etcdctl主要為etcd 服務提供了命令行操作
------------------------------------------------------------------------------------------
6 創建用于存放 etcd 配置文件,命令文件,證書的目錄?
mkdir -p /opt/etcd/{cfg,bin,ssl}cd /opt/k8s/etcd-v3.4.9-linux-amd64/
mv etcd etcdctl /opt/etcd/bin/
cp /opt/k8s/etcd-cert/*.pem /opt/etcd/ssl/cd /opt/k8s/
./etcd.sh etcd01 192.168.11.6 etcd02=https://192.168.11.11:2380,etcd03=https://192.168.11.12:2380#進入卡住狀態等待其他節點加入,這里需要三臺etcd服務同時啟動,如果只啟動其中一臺后,服務會卡在那里,直到集群中所有etcd節點都已啟動,可忽略這個情況#可另外打開一個窗口查看etcd進程是否正常
ps -ef | grep etcd
再打開另一個端口 進行驗證?
7?把etcd相關證書文件、命令文件和服務管理文件全部拷貝到另外兩個etcd集群節點
scp -r /opt/etcd/ root@192.168.11.12:/opt/
scp -r /opt/etcd/ root@192.168.11.11:/opt/
scp /usr/lib/systemd/system/etcd.service root@192.168.11.11:/usr/lib/systemd/system/
scp /usr/lib/systemd/system/etcd.service root@192.168.11.12:/usr/lib/systemd/system/
?
8 在 node01 節點上操作
vim /opt/etcd/cfg/etcd#[Member]
ETCD_NAME="etcd02"
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="https://192.168.11.11:2380"
ETCD_LISTEN_CLIENT_URLS="https://192.168.11.11:2379"#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.11.11:2380"
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.11.11:2379"
ETCD_INITIAL_CLUSTER="etcd01=https://192.168.11.6:2380,etcd02=https://192.168.11.11:2380,etcd03=https://192.168.11.12:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
此時由于快照? 虛擬機
master01:192.168.11.5
node01:192.168.11.7
node02:192.168.11.14
在 node02 節點上操作
vim /opt/etcd/cfg/etcd
[Member]
ETCD_NAME="etcd03"
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="https://192.168.11.7:2380"
ETCD_LISTEN_CLIENT_URLS="https://192.168.11.7:2379"#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.11.7:2380"
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.11.7:2379"
ETCD_INITIAL_CLUSTER="etcd01=https://192.168.11.5:2380,etcd02=https://192.168.11.7:2380,etcd03=https://192.168.11.14:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
?再次查看master01節點的etcd服務的狀態
9 查看etcd集群成員列表?
ETCDCTL_API=3 /opt/etcd/bin/etcdctl --cacert=/opt/etcd/ssl/ca.pem --cert=/opt/etcd/ssl/server.pem --key=/opt/etcd/ssl/server-key.pem --endpoints="https://192.168.11.5:2379,https://192.168.11.7:2379,https://192.168.11.14:2379" endpoint health --write-out=table
ETCDCTL_API=3 /opt/etcd/bin/etcdctl --cacert=/opt/etcd/ssl/ca.pem --cert=/opt/etcd/ssl/server.pem --key=/opt/etcd/ssl/server-key.pem --endpoints="https://192.168.11.5:2379,https://192.168.11.7:2379,https://192.168.11.14:2379" endpoint status --write-out=table
?10 查看etcd集群成員列表
ETCDCTL_API=3 /opt/etcd/bin/etcdctl --cacert=/opt/etcd/ssl/ca.pem --cert=/opt/etcd/ssl/server.pem --key=/opt/etcd/ssl/server-key.pem --endpoints="https://192.168.11.4:2379,https://192.168.11.7:2379,https://192.168.11.14:2379" --write-out=table member list
五 master組件簽發證書?
在 master01 節點上操作
1 上傳 master.zip 和 k8s-cert.sh 到 /opt/k8s 目錄中,解壓 master.zip 壓縮包
cd /opt/k8s/unzip master.zipchmod +x *.sh
#!/bin/bash
mkdir /root/.kube
KUBE_CONFIG="/root/.kube/config"
KUBE_APISERVER="https://192.168.11.5: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}
?[root@master01 k8s]# vim admin.sh
[root@master01 k8s]# vim apiserver.sh??
#!/bin/bash
#example: apiserver.sh 192.168.80.10 https://192.168.80.10:2379,https://192.168.80.11:2379,https://192.168.80.12:2379
#創建 kube-apiserver 啟動參數配置文件
MASTER_ADDRESS=$1
ETCD_SERVERS=$2cat >/opt/kubernetes/cfg/kube-apiserver <<EOF
KUBE_APISERVER_OPTS="--logtostderr=false \\
--v=2 \\
--log-dir=/opt/kubernetes/logs \\
--etcd-servers=${ETCD_SERVERS} \\
--bind-address=${MASTER_ADDRESS} \\
--secure-port=6443 \\
--advertise-address=${MASTER_ADDRESS} \\
--allow-privileged=true \\
--service-cluster-ip-range=10.0.0.0/24 \\
--enable-admission-plugins=NamespaceLifecycle,LimitRanger,ServiceAccount,ResourceQuota,NodeRestriction \\
--authorization-mode=RBAC,Node \\
--enable-bootstrap-token-auth=true \\
--token-auth-file=/opt/kubernetes/cfg/token.csv \\
--service-node-port-range=30000-50000 \\
--kubelet-client-certificate=/opt/kubernetes/ssl/apiserver.pem \\
--kubelet-client-key=/opt/kubernetes/ssl/apiserver-key.pem \\
--tls-cert-file=/opt/kubernetes/ssl/apiserver.pem \\
--tls-private-key-file=/opt/kubernetes/ssl/apiserver-key.pem \\
--client-ca-file=/opt/kubernetes/ssl/ca.pem \\
--service-account-key-file=/opt/kubernetes/ssl/ca-key.pem \\
--service-account-issuer=api \\
--service-account-signing-key-file=/opt/kubernetes/ssl/apiserver-key.pem \\
--etcd-cafile=/opt/etcd/ssl/ca.pem \\
--etcd-certfile=/opt/etcd/ssl/server.pem \\
--etcd-keyfile=/opt/etcd/ssl/server-key.pem \\
--requestheader-client-ca-file=/opt/kubernetes/ssl/ca.pem \\
--proxy-client-cert-file=/opt/kubernetes/ssl/apiserver.pem \\
--proxy-client-key-file=/opt/kubernetes/ssl/apiserver-key.pem \\
--requestheader-allowed-names=kubernetes \\
--requestheader-extra-headers-prefix=X-Remote-Extra- \\
--requestheader-group-headers=X-Remote-Group \\
--requestheader-username-headers=X-Remote-User \\
--enable-aggregator-routing=true \\
--audit-log-maxage=30 \\
--audit-log-maxbackup=3 \\
--audit-log-maxsize=100 \\
--audit-log-path=/opt/kubernetes/logs/k8s-audit.log"
EOF#--logtostderr=true:啟用日志。輸出日志到標準錯誤控制臺,不輸出到文件
#--v=4:日志等級。指定輸出日志的級別,v=4為調試級別詳細輸出
#--etcd-servers:etcd集群地址。指定etcd服務器列表(格式://ip:port),逗號分隔
#--bind-address:監聽地址。指定 HTTPS 安全接口的監聽地址,默認值0.0.0.0
#--secure-port:https安全端口。指定 HTTPS 安全接口的監聽端口,默認值6443
#--advertise-address:集群通告地址。通過該 ip 地址向集群其他節點公布 api server 的信息,必須能夠被其他節點訪問
#--allow-privileged=true:啟用授權。允許擁有系統特權的容器運行,默認值false
#--service-cluster-ip-range:Service虛擬IP地址段。指定 Service Cluster IP 地址段
#--enable-admission-plugins:準入控制模塊。kuberneres集群的準入控制機制,各控制模塊以插件的形式依次生效,集群時必須包含ServiceAccount,運行在認證(Authentication)、授權(Authorization)之后,Admission Control是權限認證鏈上的最后一環, 對請求API資源對象進行修改和校驗
#--authorization-mode:認證授權,啟用RBAC授權和節點自管理。在安全端口使用RBAC,Node授權模式,未通過授權的請求拒絕,默認值AlwaysAllow。RBAC是用戶通過角色與權限進行關聯的模式;Node模式(節點授權)是一種特殊用途的授權模式,專門授權由kubelet發出的API請求,在進行認證時,先通過用戶名、用戶分組驗證是否是集群中的Node節點,只有是Node節點的請求才能使用Node模式授權
#--enable-bootstrap-token-auth:啟用TLS bootstrap機制。在apiserver上啟用Bootstrap Token 認證
#--token-auth-file=/opt/kubernetes/cfg/token.csv:指定bootstrap token認證文件路徑
#--service-node-port-range:指定 Service NodePort 的端口范圍,默認值30000-32767
#–-kubelet-client-xxx:apiserver訪問kubelet客戶端證書
#--tls-xxx-file:apiserver https證書
#1.20版本必須加的參數:–-service-account-issuer,–-service-account-signing-key-file
#--etcd-xxxfile:連接Etcd集群證書
#–-audit-log-xxx:審計日志
#啟動聚合層相關配置:–requestheader-client-ca-file,–proxy-client-cert-file,–proxy-client-key-file,–requestheader-allowed-names,–requestheader-extra-headers-prefix,–requestheader-group-headers,–requestheader-username-headers,–enable-aggregator-routing#創建 kube-apiserver.service 服務管理文件
cat >/usr/lib/systemd/system/kube-apiserver.service <<EOF
[Unit]
Description=Kubernetes API Server
Documentation=https://github.com/kubernetes/kubernetes[Service]
EnvironmentFile=-/opt/kubernetes/cfg/kube-apiserver
ExecStart=/opt/kubernetes/bin/kube-apiserver \$KUBE_APISERVER_OPTS
Restart=on-failure[Install]
WantedBy=multi-user.target
EOFsystemctl daemon-reload
systemctl enable kube-apiserver
systemctl restart kube-apiserver
[root@master01 k8s]# vim controller-manager.sh??
?[root@master01 k8s]# vim scheduler.sh?
[root@master01 k8s]# vim k8s-cert.sh??
2 創建kubernetes工作目錄?
mkdir -p /opt/kubernetes/{bin,cfg,ssl,logs}
3 創建用于生成CA證書、相關組件的證書和私鑰的目錄?
mkdir /opt/k8s/k8s-cert
mv /opt/k8s/k8s-cert.sh /opt/k8s/k8s-cert
cd /opt/k8s/k8s-cert/
./k8s-cert.sh #生成CA證書、相關組件的證書和私鑰ls *pem
admin-key.pem apiserver-key.pem ca-key.pem kube-proxy-key.pem
admin.pem apiserver.pem ca.pem kube-proxy.pem
?4 復制CA證書、apiserver相關證書和私鑰到 kubernetes工作目錄的 ssl 子目錄中
cp ca*pem apiserver*pem /opt/kubernetes/ssl/
5 解壓 kubernetes 壓縮包?
上傳 kubernetes-server-linux-amd64.tar.gz 到 /opt/k8s/ 目錄中,解壓 kubernetes 壓縮包
#下載地址:https://github.com/kubernetes/kubernetes/blob/release-1.20/CHANGELOG/CHANGELOG-1.20.md
#注:打開鏈接你會發現里面有很多包,下載一個server包就夠了,包含了Master和Worker Node二進制文件。
6 復制master組件的關鍵命令文件到 kubernetes工作目錄的 bin 子目錄中?
cd /opt/k8s/kubernetes/server/bin
cp kube-apiserver kubectl kube-controller-manager kube-scheduler /opt/kubernetes/bin/
ln -s /opt/kubernetes/bin/* /usr/local/bin/
7 創建 bootstrap token 認證文件,apiserver 啟動時會調用?
創建 bootstrap token 認證文件,apiserver 啟動時會調用,然后就相當于在集群內創建了一個這個用戶,接下來就可以用 RBAC 給他授權
cd /opt/k8s/
vim token.sh
#!/bin/bash
#獲取隨機數前16個字節內容,以十六進制格式輸出,并刪除其中空格
BOOTSTRAP_TOKEN=$(head -c 16 /dev/urandom | od -An -t x | tr -d ' ')
#生成 token.csv 文件,按照 Token序列號,用戶名,UID,用戶組 的格式生成
cat > /opt/kubernetes/cfg/token.csv <<EOF
${BOOTSTRAP_TOKEN},kubelet-bootstrap,10001,"system:kubelet-bootstrap"
EOFchmod +x token.sh
./token.shcat /opt/kubernetes/cfg/token.csv
8 二進制文件、token、證書都準備好后,開啟 apiserver 服務?
二進制文件、token、證書都準備好后,開啟 apiserver 服務
cd /opt/k8s/
./apiserver.sh 192.168.11.6 https://192.168.11.6:2379,https://192.168.11.7:2379,https://192.168.11.14:2379
9 檢查進程是否啟動成功?
ps aux | grep kube-apiservernetstat -natp | grep 6443 #安全端口6443用于接收HTTPS請求,用于基于Token文件或客戶端證書等認證
?
10 執行另外三個腳本
啟動 scheduler 服務
cd /opt/k8s/
./scheduler.sh
ps aux | grep kube-scheduler#啟動 controller-manager 服務
./controller-manager.sh
ps aux | grep kube-controller-manager#生成kubectl連接集群的kubeconfig文件
./admin.sh
11 通過kubectl工具查看當前集群組件狀態?
kubectl get cs
六? 部署 Worker Node 組件
1)在所有 node 節點上操作
1 創建kubernetes工作目錄
mkdir -p /opt/kubernetes/{bin,cfg,ssl,logs}
2 上傳 node.zip 到 /opt 目錄中,解壓 node.zip 壓縮包,獲得kubelet.sh、proxy.sh?
cd /opt/
unzip node.zip
chmod +x kubelet.sh proxy.sh
3 在 master01 節點上操作?
#把 kubelet、kube-proxy 拷貝到 node 節點
cd /opt/k8s/kubernetes/server/bin
scp kubelet kube-proxy root@192.168.10.18:/opt/kubernetes/bin/
scp kubelet kube-proxy root@192.168.10.19:/opt/kubernetes/bin/
4 上傳kubeconfig.sh文件到/opt/k8s/kubeconfig目錄中,生成kubelet初次加入集群引導kubeconfig文件和kube-proxy.kubeconfig文件?
上傳kubeconfig.sh文件到/opt/k8s/kubeconfig目錄中,生成kubelet初次加入集群引導kubeconfig文件和kube-proxy.kubeconfig文件
#kubeconfig 文件包含集群參數(CA 證書、API Server 地址),客戶端參數(上面生成的證書和私鑰),集群 context 上下文參數(集群名稱、用戶名)。Kubenetes 組件(如 kubelet、kube-proxy)通過啟動時指定不同的 kubeconfig 文件可以切換到不同的集群,連接到 apiserver。
mkdir /opt/k8s/kubeconfigcd /opt/k8s/kubeconfig
chmod +x kubeconfig.sh
./kubeconfig.sh 192.168.11.5 /opt/k8s/k8s-cert/
5 把配置文件 bootstrap.kubeconfig、kube-proxy.kubeconfig 拷貝到 node 節點?
把配置文件 bootstrap.kubeconfig、kube-proxy.kubeconfig 拷貝到 node 節點
scp bootstrap.kubeconfig kube-proxy.kubeconfig root@192.168.11.7:/opt/kubernetes/cfg/
scp bootstrap.kubeconfig kube-proxy.kubeconfig root@192.168.11.14:/opt/kubernetes/cfg/
4 RBAC授權,使用戶 kubelet-bootstrap 能夠有權限發起 CSR 請求證書?
RBAC授權,使用戶 kubelet-bootstrap 能夠有權限發起 CSR 請求證書
kubectl create clusterrolebinding kubelet-bootstrap --clusterrole=system:node-bootstrapper --user=kubelet-bootstrap若執行失敗,可先給kubectl綁定默認cluster-admin管理員集群角色,授權集群操作權限
kubectl create clusterrolebinding cluster-system-anonymous --clusterrole=cluster-admin --user=system:anonymous
kubelet 采用 TLS Bootstrapping 機制,自動完成到 kube-apiserver 的注冊,在 node 節點量較大或者后期自動擴容時非常有用。
Master apiserver 啟用 TLS 認證后,node 節點 kubelet 組件想要加入集群,必須使用CA簽發的有效證書才能與 apiserver 通信,當 node 節點很多時,簽署證書是一件很繁瑣的事情。因此 Kubernetes 引入了 TLS bootstraping 機制來自動頒發客戶端證書,kubelet 會以一個低權限用戶自動向 apiserver 申請證書,kubelet 的證書由 apiserver 動態簽署。kubelet 首次啟動通過加載 bootstrap.kubeconfig 中的用戶 Token 和 apiserver CA 證書發起首次 CSR 請求,這個 Token 被預先內置在 apiserver 節點的 token.csv 中,其身份為 kubelet-bootstrap 用戶和 system:kubelet-bootstrap 用戶組;想要首次 CSR 請求能成功(即不會被 apiserver 401 拒絕),則需要先創建一個 ClusterRoleBinding,將 kubelet-bootstrap 用戶和 system:node-bootstrapper 內置 ClusterRole 綁定(通過 kubectl get clusterroles 可查詢),使其能夠發起 CSR 認證請求。TLS bootstrapping 時的證書實際是由 kube-controller-manager 組件來簽署的,也就是說證書有效期是 kube-controller-manager 組件控制的;kube-controller-manager 組件提供了一個 --experimental-cluster-signing-duration 參數來設置簽署的證書有效時間;默認為 8760h0m0s,將其改為 87600h0m0s,即 10 年后再進行 TLS bootstrapping 簽署證書即可。也就是說 kubelet 首次訪問 API Server 時,是使用 token 做認證,通過后,Controller Manager 會為 kubelet 生成一個證書,以后的訪問都是用證書做認證了。
2) 在 node01 節點上操作
1 啟動 kubelet 服務
在 node01 節點上操作
#啟動 kubelet 服務
cd /opt/
./kubelet.sh 192.168.11.7
ps aux | grep kubelet
2 在 master01 節點上操作,通過 CSR 請求?
在 master01 節點上操作,通過 CSR 請求
#檢查到 node01 節點的 kubelet 發起的 CSR 請求,Pending 表示等待集群給該節點簽發證書
kubectl get csr
NAME AGE SIGNERNAME REQUESTOR CONDITION
node-csr-duiobEzQ0R93HsULoS9NT9JaQylMmid_nBF3Ei3NtFE 12s kubernetes.io/kube-apiserver-client-kubelet kubelet-bootstrap Pending通過 CSR 請求
kubectl certificate approve node-csr-duiobEzQ0R93HsULoS9NT9JaQylMmid_nBF3Ei3NtFE
3 Approved,Issued 表示已授權 CSR 請求并簽發證書?
Approved,Issued 表示已授權 CSR 請求并簽發證書
kubectl get csr
NAME AGE SIGNERNAME REQUESTOR CONDITION
node-csr-duiobEzQ0R93HsULoS9NT9JaQylMmid_nBF3Ei3NtFE 2m5s kubernetes.io/kube-apiserver-client-kubelet kubelet-bootstrap Approved,Issued
?4 查看節點,由于網絡插件還沒有部署,節點會沒有準備就緒 NotReady
kubectl get node
NAME STATUS ROLES AGE VERSION
192.168.10.18 NotReady <none> 108s v1.20.11
3)在 node01 節點上操作?
加載 ip_vs 模塊
啟動proxy服務
#加載 ip_vs 模塊
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#啟動proxy服務
cd /opt/
./proxy.sh 192.168.11.7
ps aux | grep kube-proxy