目錄
一、準備環境
1.1 修改主機名
1.2 關閉防火墻(三臺一起,這里只展示master01)
1.3?在master添加hosts(依舊是三臺一起)
1.4?調整內核參數并開啟網橋模式
二、部署docker引擎
三、部署 etcd 集群?
1.在master01節點上操作
2.生成Etcd證書
1.創建目錄
2.創建用于生成CA證書、etcd 服務器證書以及私鑰的目錄
3.拷貝服務端
4.把etcd相關證書文件、命令文件和服務管理文件全部拷貝到另外兩個etcd集群節點
3.在 node01 節點上操作
同理node2也是同樣操作
來到master01上檢查etcd群集狀態
四、部署Master組件
1.在 master01 節點上操作
1.1創建kubernetes工作目錄
1.2 創建用于生成CA證書、相關組件的證書和私鑰的目錄
1.3上傳 kubernetes-server-linux-amd64.tar.gz 到 /opt/k8s/ 目錄中,解壓 kubernetes 壓縮包??編輯
1.4 復制master組件的關鍵命令文件到 kubernetes工作目錄的 bin 子目錄中
1.5 創建 bootstrap token 認證文件
1.6開啟 apiserver 服務
?編輯
1.7啟動 scheduler 服務
1.8啟動 controller-manager 服務
1.9啟動admin服務并生成kubectl連接集群的kubeconfig文件
五、部署 Worker Node 組
1.先在node01和node02上創建kubernetes工作目錄
2.在 master01 節點上操作
2.1把配置文件 拷貝到 node 節點
3.RBAC授權,使用戶 kubelet-bootstrap 能夠有權限發起 CSR 請求證書
4.在node01上操作
5.在master01上操作
6.在node01上操作
一、準備環境
1.1 修改主機名
hostnamectl set-hostname master01
su
hostnamectl set-hostname node01
su
hostnamectl set-hostname node02
su
Master01 | 192.168.21.10 |
node01 | 192.168.21.30 |
node02 | 192.168.21.40 |
1.2 關閉防火墻(三臺一起,這里只展示master01)
關閉防火墻
systemctl stop firewalld
systemctl disable firewalld
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
#關閉selinux
setenforce 0
sed -i 's/enforcing/disabled/' /etc/selinux/config
關閉swap
swapoff -a
sed -ri 's/.*swap.*/#&/' /etc/fstab
1.3?在master添加hosts(依舊是三臺一起)
vim /etc/hosts#添加ip
192.168.21.10 master01
192.168.21.30 node01
192.168.21.40 node02
1.4?調整內核參數并開啟網橋模式
#調整內核參數
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
EOF
sysctl --system 刷新#時間同步
yum install ntpdate -y
ntpdate time.windows.com
如果報錯是軟件版本的問題,或者dns原因這邊建議修改dns都為114.114.114.114
二、部署docker引擎
//所有 node 節點部署docker引擎
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install -y docker-ce docker-ce-cli containerd.iosystemctl start docker.service
systemctl enable docker.service
三、部署 etcd 集群?
etcd是CoreOS團隊于2013年6月發起的開源項目,它的目標是構建一個高可用的分布式鍵值(key-value)數據庫。etcd內部采用raft協議作為一致性算法,etcd是go語言編寫的。
etcd 作為服務發現系統,有以下的特點:
簡單:安裝配置簡單,而且提供了HTTP API進行交互,使用也很簡單
安全:支持SSL證書驗證
快速:單實例支持每秒2k+讀操作
可靠:采用raft算法,實現分布式系統數據的可用性和一致性
etcd 目前默認使用2379端口提供HTTP API服務, 2380端口和peer通信(這兩個端口已經被IANA(互聯網數字分配機構)官方預留給etcd)。 即etcd默認使用2379端口對外為客戶端提供通訊,使用端口2380來進行服務器間內部通訊。
etcd 在生產環境中一般推薦集群方式部署。由于etcd 的leader選舉機制,要求至少為3臺或以上的奇數臺。
1.在master01節點上操作
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
chmod +x /usr/local/bin/cfssl*
因為事先準備好了 我直接拉入
2.生成Etcd證書
1.創建目錄
mkdir /opt/k8s
cd /opt/k8s/#上傳 etcd-cert.sh 和 etcd.sh 到 /opt/k8s/ 目錄中
chmod +x etcd-cert.sh etcd.sh
2.創建用于生成CA證書、etcd 服務器證書以及私鑰的目錄
mkdir /opt/k8s/etcd-cert
mv etcd-cert.sh etcd-cert/
cd /opt/k8s/etcd-cert/
./etcd-cert.sh #生成CA證書、etcd 服務器證書以及私鑰
vim etcd-cert.sh
這邊要注意兩個問題一個是年份,一個是ip地址
3.拷貝服務端
上傳 etcd-v3.4.9-linux-amd64.tar.gz 到 /opt/k8s 目錄中,啟動etcd服務
cd /opt/k8s/
拉入安裝包
tar zxvf etcd-v3.4.9-linux-amd64.tar.gz
cd etcd-v3.4.9-linux-amd64/
#創建用于存放 etcd 配置文件,命令文件,證書的目錄
mkdir -p /opt/etcd/{cfg,bin,ssl}
mv etcd etcdctl /opt/etcd/bin/
cp *.pem /opt/etcd/ssl/
ps -ef | grep etcd
4.把etcd相關證書文件、命令文件和服務管理文件全部拷貝到另外兩個etcd集群節點
scp -r /opt/etcd/ root@192.168.21.30:/opt/
scp -r /opt/etcd/ root@192.168.21.40:/opt/
scp /usr/lib/systemd/system/etcd.service root@192.168.21.30:/usr/lib/systemd/system/
scp /usr/lib/systemd/system/etcd.service root@192.168.21.40:/usr/lib/systemd/system/
3.在 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.21.30:2380"
ETCD_LISTEN_CLIENT_URLS="https://192.168.21.30:2379"#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.21.30:2380"
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.21.30:2379"
ETCD_INITIAL_CLUSTER="etcd01=https://192.168.21.10:2380,etcd02=https://192.168.21.30:2380,etcd03=https://192.168.21.40:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
啟動etcd服務
systemctl start etcd
systemctl enable etcd ##systemctl enable --now etcd
同理node2也是同樣操作
vim /opt/etcd/cfg/etcd
#[Member]
ETCD_NAME="etcd03"
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="https://192.168.21.40:2380"
ETCD_LISTEN_CLIENT_URLS="https://192.168.21.40:2379"#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.21.40:2380"
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.21.40:2379"
ETCD_INITIAL_CLUSTER="etcd01=https://192.168.21.10:2380,etcd02=https://192.168.21.30:2380,etcd03=https://192.168.21.40:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
來到master01上檢查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.21.10:2379,https://192.168.21.30:2379,https://192.168.21.40:2379" endpoint status --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.21.30:2379,https://192.168.21.30:2379,https://192.168.21.40:2379" endpoint health --write-out=table
查看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.21.10:2379,https://192.168.21.30:2379,https://192.168.21.40:2379" --write-out=table member list
四、部署Master組件
1.在 master01 節點上操作
上傳 master.zip 和 k8s-cert.sh 到 /opt/k8s 目錄中,解壓 master.zip 壓縮包
cd /opt/k8s/
unzip master.zip
chmod +x *.sh
1.1創建kubernetes工作目錄
mkdir -p /opt/kubernetes/{bin,cfg,ssl,logs}
1.2 創建用于生成CA證書、相關組件的證書和私鑰的目錄
mkdir /opt/k8s/k8s-cert
cd k8s-cert
拉入事先準備好的腳本
chmod +x k8s-cert.sh
記得腳本把注釋去了,并修改為自己的ip地址
vim k8s-cert
復制CA證書、apiserver相關證書和私鑰到 kubernetes工作目錄的 ssl 子目錄中
cp ca*pem apiserver*pem /opt/kubernetes/ssl/
1.3上傳 kubernetes-server-linux-amd64.tar.gz 到 /opt/k8s/ 目錄中,解壓 kubernetes 壓縮包
?
1.4 復制master組件的關鍵命令文件到 kubernetes工作目錄的 bin 子目錄中
cd /opt/k8s/kubernetes/server/bin
cp kube-apiserver kubectl kube-controller-manager kube-scheduler /opt/kubernetes/bin/
1.5 創建 bootstrap token 認證文件
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.sh
1.6開啟 apiserver 服務
cd /opt/k8s/master./apiserver.sh 192.168.21.10 https://192.168.21.10:2379,https://192.168.21.30:2379,https://192.168.10.40:2379
#檢查進程是否啟動成功
ps aux | grep kube-apiservernetstat -natp | grep 6443 #安全端口6443用于接收HTTPS請求,用于基于Token文件或客戶端證書等認證
1.7啟動 scheduler 服務
cd /opt/k8s/
./scheduler.sh
ps aux | grep kube-scheduler
vim scheduler.sh
1.8啟動 controller-manager 服務
./controller-manager.sh
ps aux | grep kube-controller-manager
1.9啟動admin服務并生成kubectl連接集群的kubeconfig文件
./admin.sh#通過kubectl工具查看當前集群組件狀態
kubectl get cs
NAME STATUS MESSAGE ERROR
controller-manager Healthy ok
scheduler Healthy ok
etcd-2 Healthy {"health":"true"}
etcd-1 Healthy {"health":"true"}
etcd-0 Healthy {"health":"true"} #查看版本信息
kubectl version
五、部署 Worker Node 組
1.先在node01和node02上創建kubernetes工作目錄
mkdir -p /opt/kubernetes/{bin,cfg,ssl,logs}
2.在 master01 節點上操作
把 kubelet、kube-proxy 拷貝到 node 節點
cd /opt/k8s/kubernetes/server/bin
scp kubelet kube-proxy root@node01:/opt/kubernetes/bin/
scp kubelet kube-proxy root@node02:/opt/kubernetes/bin/
上傳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.21.10 /opt/k8s/k8s-cert/
2.1把配置文件 拷貝到 node 節點
scp bootstrap.kubeconfig kube-proxy.kubeconfig root@node01:/opt/kubernetes/cfg/
scp bootstrap.kubeconfig kube-proxy.kubeconfig root@node02:/opt/kubernetes/cfg/
3.RBAC授權,使用戶 kubelet-bootstrap 能夠有權限發起 CSR 請求證書
kubectl create clusterrolebinding kubelet-bootstrap --clusterrole=system:node-bootstrapper --user=kubelet-bootstrap
4.在node01上操作
#啟動 kubelet 服務
cd /opt/
./kubelet.sh 192.168.10.18
ps aux | grep kubelet
5.在master01上操作
在 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#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#查看節點,由于網絡插件還沒有部署,節點會沒有準備就緒 NotReady
kubectl get node
NAME STATUS ROLES AGE VERSION
192.168.21.10 NotReady <none> 108s v1.20.11
6.在node01上操作
#加載 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.21.10
ps aux | grep kube-proxy