目錄
一、安裝k8s
1、拓撲圖
2、系統初始化配置
2.1關閉防火墻selinx以及swap
2.2設置主機名
2.3在每臺主機中添加hosts,做映射
2.4調整內核參數,將橋接的ipv4流量傳遞到iptables,關閉ipv6
2.4時間同步
3、部署docker引擎(兩個node節點執行)
4、部署etcd集群
4.1在master01節點操作
4.2生成etcd證書,上傳etcd-cert.sh 和 etcd.sh 到 /opt/k8s/ 目錄中
4.3創建用于生成CA證書,etcd服務器證書以及私鑰的目錄
4.4上傳 etcd-v3.4.9-linux-amd64.tar.gz 到 /opt/k8s 目錄中,啟動etcd服務
4.5創建用于存放etcd配置文件,命令文件,證書的目錄
4.6把etcd相關證書文件、命令文件和服務管理文件全部拷貝到另外兩個etcd集群節點
4.7在node1節點操作(node2同樣)
4.8啟動etcd,并檢查etcd集群狀態
5、master部署組件
6、部署worker node組件
6.1在所有 node 節點上操作創建kubernetes工作目錄
6.2上傳 node.zip 到 /opt 目錄中,解壓 node.zip 壓縮包,獲得kubelet.sh、prox
6.3在master01節點上操作把 kubelet、kube-proxy 拷貝到 node 節點
6.4上傳kubeconfig.sh文件到/opt/k8s/kubeconfig目錄中,生成kubelet初次加入集群引導kubeconfig文件和kube-proxy.kubeconfig文件#kubeconfig 文件包含集群參數(CA 證書、API Server 地址),客戶端參數(上面生成的證書和私鑰),集群 context 上下文參數(集群名稱、用戶名)。Kubenetes 組件(如 kubelet、kube-proxy)通過啟動時指定不同的 kubeconfig 文件可以切換到不同的集群,連接到 apiserver。
6.5把配置文件 bootstrap.kubeconfig、kube-proxy.kubeconfig 拷貝到 node 節點
6.6RBAC授權,使用戶 kubelet-bootstrap 能夠有權限發起 CSR 請求證書
7、在node01節點上操作
7.1啟動kubelet
7.2在 master01 節點上操作,通過 CSR 請求檢查到 node01 節點的 kubelet 發起的 CSR 請求,Pending 表示等待集群給該節點簽發證書
7.3通過 CSR 請求
7.4查看節點,由于網絡插件還沒有部署,節點會沒有準備就緒 NotReady
7.5在 node01 節點上操作加載 ip_vs 模塊?啟動proxy服務
一、安裝k8s
1、拓撲圖
2、系統初始化配置
#所有節點執行
systemctl stop firewalld
systemctl disable firewalld
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
#永久關閉firewalld并清空iptables所有表規則
setenforce 0
sed -i 's/enforcing/disabled/' /etc/selinux/config
swapoff -a
sed -ri 's/.*swap.*/#&/' /etc/fstab
#永久關閉selinux和swap分區
#三個節點分開執行
hostnamectl set-hostname master01
#192.168.170.111的master上執行修改主機名
hostnamectl set-hostname node01
#192.168.170.113的node1上執行修改主機名
hostnamectl set-hostname node02
#192.168.170.114的node2上執行修改主機名
#所有節點執行
bash
#刷新bash使得修改的主機名生效
cat >> /etc/hosts << EOF
192.168.170.111 master01
192.168.170.113 node1
192.168.170.114 node2
EOF
#使用多行重定向將主機名對應的ip寫到hosts里面加快訪問速度,注意改為自己的ip
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv6.conf.all.disable_ipv6=1
net.ipv4.ip_forward=1
EOF
#使用多行重定向調整內核參數,前2行為開啟網橋模式后2行為關閉ipv6協議和開啟路由轉發
sysctl --system
#加載內核使得配置內核參數生效
yum install ntpdate -y
ntpdate time.windows.com
#安裝ntpdate時間同步程序,并與本機的windows同步時間
2.1關閉防火墻selinx以及swap
2.2設置主機名
2.3在每臺主機中添加hosts,做映射
2.4調整內核參數,將橋接的ipv4流量傳遞到iptables,關閉ipv6
2.4時間同步
3、部署docker引擎(兩個node節點執行)
#2個node節點執行
yum install -y yum-utils device-mapper-persistent-data lvm2
#安裝依賴包以便在系統上安裝docker
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#添加Docker官方源,并將它設置為docker-ce.repo文件
yum install -y docker-ce docker-ce-cli containerd.io
#yum安裝docker-ce和docker客戶端以及容器io
systemctl start docker.service
systemctl enable docker.service
#開機自啟并現在啟動docker
4、部署etcd集群
#master節點操作,#本文的所有需要上傳資源在博客資源包中K8S壓縮包中均有
cd /usr/local/bin
chmod +x /usr/local/bin/cfssl*
#將cfssl證書簽發的工具和命令(cfssl、cfssljson、cfssl-certinfo)上傳到/usr/local/bin目錄下并添加執行權限
#本文的cfssl工具在博客資源包中K8S壓縮包中有
#cfssl:證書簽發的工具命令
#cfssljson:將 cfssl 生成的證書(json格式)變為文件承載式證書
#cfssl-certinfo:驗證證書的信息
#cfssl-certinfo -cert <證書名稱> #查看證書的信息
mkdir /opt/k8s
cd /opt/k8s/
#上傳 etcd-cert.sh(生成證書腳本) 和 etcd.sh(創建etcd集群腳本) 到 /opt/k8s/ 目錄中
chmod +x etcd-cert.sh etcd.sh
#添加可執行權限
mkdir /opt/k8s/etcd-cert
#創建etcd-cert目錄用于存放etcd的證書
mv etcd-cert.sh /opt/k8s/etcd-cert
#移動生成證書的腳本到存放etcd證書的目錄下
vim /opt/k8s/etcd-cert/etcd-cert.sh
#此腳本ip需要修改80到82行master,node1,node2順序保存退出
vim ./etcd-cert.sh
#修改腳本中的ip為自己的ip
./etcd-cert.sh
#生成CA證書、etcd 服務器證書以及私鑰
ls /opt/k8s/etcd-cert
#查看生成的證書是否為4個.pem結尾3個.json結尾
#上傳 etcd-v3.4.9-linux-amd64.tar.gz(etcd程序命令及證書) 到 /opt/k8s 目錄中,啟動etcd服務
cd /opt/k8s/
tar zxvf etcd-v3.4.9-linux-amd64.tar.gz
ls etcd-v3.4.9-linux-amd64
#解壓上傳的etcd包,內容為3個.md文件一個目錄,一個etcd和一個etcdctl啟動控制腳本
mkdir -p /opt/etcd/{cfg,bin,ssl}
#創建用于存放etcd配置文件,命令文件,證書的目錄
cd /opt/k8s/etcd-v3.4.9-linux-amd64
#進入解壓的etcd包中
mv etcd etcdctl /opt/etcd/bin/
#將etcd啟動和etcdctl控制腳本移動到創建的用于存放etcd命令文件的bin目錄下
cd /opt/k8s/etcd-cert
#進入創建etcd證書的目錄
cp ./*.pem /opt/etcd/ssl
#將本目錄下所有證書全部拷貝一份到創建的用于存放etcd證書的路徑ssl上
cd /opt/k8s
./etcd.sh etcd01 192.168.170.111 etcd02=https://192.168.170.113:2380,etcd03=https://192.168.170.114:2380
#進入存放etcd.sh部署etcd集群的腳本目錄執行etcd.sh腳本 后面跟三個etcd集群的ip注意格式,進入卡住狀態等待其他節點加入,這里需要三臺etcd服務同時啟動,如果只啟動其中一臺后,服務會卡在那里,直到集群中所有etcd節點都已啟動,先操作不然不會生成system管理和配置文件,重新開啟一個shell查看etcd狀態
#另一個窗口執行
ps -ef | grep etcd
#查看etcd集群狀態是否為自己的三個etcd ip
scp -r /opt/etcd/ root@192.168.170.113:/opt/
scp -r /opt/etcd/ root@192.168.170.114:/opt/
scp /usr/lib/systemd/system/etcd.service root@192.168.170.113:/usr/lib/systemd/system/
scp /usr/lib/systemd/system/etcd.service root@192.168.170.114:/usr/lib/systemd/system/
#把etcd相關證書文件、命令文件和服務管理文件全部拷貝到另外兩個etcd集群節點
#node1節點執行
vim /opt/etcd/cfg/etcd
#修改scp過來的etcd配置文件
#[Member]
ETCD_NAME="etcd02" #修改為etcd02
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="https://192.168.170.113:2380" #修改為node1的ip地址
ETCD_LISTEN_CLIENT_URLS="https://192.168.170.113:2379" #修改為node1的ip地址
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.170.113:2380" #修改為node1的ip地址
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.170.113:2379" #修改為node1的ip地址
ETCD_INITIAL_CLUSTER="etcd01=https://192.168.170.111:2380,etcd02=https://192.168.170.113:2380,etcd03=https://192.168.170.114:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
#node2節點執行
vim /opt/etcd/cfg/etcd
#修改scp過來的etcd配置文件
#[Member]
ETCD_NAME="etcd03" #修改為etcd03
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="https://192.168.170.114:2380" #修改為node1的ip地址
ETCD_LISTEN_CLIENT_URLS="https://192.168.170.114:2379" #修改為node1的ip地址
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.170.114:2380" #修改為node1的ip地址
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.170.114:2379" #修改為node1的ip地址
ETCD_INITIAL_CLUSTER="etcd01=https://192.168.170.111:2380,etcd02=https://192.168.170.113:2380,etcd03=https://192.168.170.114:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
#master節點執行
cd /opt/k8s
./etcd.sh etcd01 192.168.170.111 etcd02=https://192.168.170.113:2380,etcd03=https://192.168.170.114:2380
#重新啟動etcd集群
#node1 node2執行
systemctl enable --now etcd
#設置開機啟動并立即啟動etcd,然后回到master上查看是否成功。不是一直前臺運行狀態即成功
#master執行:
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.170.111:2379,https://192.168.170.113:2379,https://192.168.170.114:2379" endpoint health --write-out=table
#檢查集群監控狀態,health全部未true即可
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.170.111:2379,https://192.168.170.113:2379,https://192.168.170.114:2379" endpoint status --write-out=table
#檢查集群狀態,有一個is leader為true即可
ETCDCTL_API=3 /opt/etcd/bin/etcdctl --cacert=/opt/etcd/ssl/ca.m --key=/opt/etcd/ssl/server-key.pem --endpoints="https://192.168.170.114:2379" --write-out=table member list
##查看etcd集群成員列表
4.1在master01節點操作
4.2生成etcd證書,上傳etcd-cert.sh 和 etcd.sh 到 /opt/k8s/ 目錄中
4.3創建用于生成CA證書,etcd服務器證書以及私鑰的目錄
4.4上傳 etcd-v3.4.9-linux-amd64.tar.gz 到 /opt/k8s 目錄中,啟動etcd服務
4.5創建用于存放etcd配置文件,命令文件,證書的目錄
注意:進入卡住狀態等待其他節點加入,這里需要三臺etcd服務同時啟動,如果只啟動其中一臺后,服務會卡在那里,直到集群中所有etcd節點都已啟動,可忽略這個情況
可以開啟另外一個窗口來查看etcd進程是否正常
4.6把etcd相關證書文件、命令文件和服務管理文件全部拷貝到另外兩個etcd集群節點
4.7在node1節點操作(node2同樣)
4.8啟動etcd,并檢查etcd集群狀態
5、master部署組件
//在 master01 節點上操作
#上傳 master.zip(master組件) 和 k8s-cert.sh(證書) 到 /opt/k8s 目錄中,解壓 master.zip 壓縮包
cd /opt/k8s/
unzip master.zip
cd master
chmod +x *.sh
mv * /opt/k8s
#解壓master組件包,里面有master的4個組件腳本,添加權限移動到/opt/k8s文件夾中
mkdir -p /opt/kubernetes/{bin,cfg,ssl,logs}
#創建kubernetes工作目錄
mkdir /opt/k8s/k8s-cert
#創建k8s的證書存放路徑
mv /opt/k8s/k8s-cert.sh /opt/k8s/k8s-cert
#將k8s證書移動到創建的k8s的證書存放路徑
cd /opt/k8s/k8s-cert/
vim /opt/k8s/k8s-cert/k8s-cert.sh
#修改腳本中的ip56-60行順序是第一個為master、第二個為master高可用ip、第三個為master虛擬ip、第四load balancer01(master)第五為load balancer01(backup)。第四第五可以刪除。單節點master不用,若后面需要做集群需要提前規劃好ip
chmod +x k8s-cert.sh
./k8s-cert.sh
#生成CA證書、相關組件的證書和私鑰
ls *pem
#顯示生成的證書等一共8個.pem結尾
cp ca*pem apiserver*pem /opt/kubernetes/ssl/
#將ca證書和apiserver證書拷貝到創建的存放證書的ssl/目錄下
cd /opt/k8s/
tar zxvf kubernetes-server-linux-amd64.tar.gz
#上傳 kubernetes-server-linux-amd64.tar.gz 到 /opt/k8s/ 目錄中,解壓 kubernetes 壓縮包
cd /opt/k8s/kubernetes/server/bin
#進入解壓后的k8s的bin目錄中將4個組件拷貝到創建的k8s存放bin文件的路徑下
cp kube-apiserver kubectl kube-controller-manager kube-scheduler /opt/kubernetes/bin/
cp /opt/kubernetes/bin/* /usr/local/bin/
#將腳本程序存放到 /usr/local/bin下可以全局使用4個命令
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"
EOF
#保存后退出
chmod +x token.sh
./token.sh
cat /opt/kubernetes/cfg/token.csv
#創建 bootstrap token 認證文件,apiserver 啟動時會調用,然后就相當于在集群內創建了一個這個用戶,接下來就可以用 RBAC 給他授權,查看是否生成了csv文件
cd /opt/k8s/
./apiserver.sh 192.168.170.111 https://192.168.30.11:2379,https://192.168.170.113:2379,https://192.168.170.114:2379
#二進制文件、token、證書都準備好后,開啟 apiserver 服務
ps aux | grep kube-apiserver
#檢查進程是否啟動成功,過濾kube-apiserver最上面一個后面會有-etcd-servers=https://192.168.170.111:2379,https://192.168.170.113:2379,https://192.168.170.114:2379 --bind-address=192.168.170.111 --secure-port=6443此信息為正常,注意ip要改為自己的ip地址
netstat -natp | grep 6443
#過濾端口只有監控本機ip的6443為正常
cd /opt/k8s/
vim scheduler.sh
#修改腳本ip。KUBE_APISERVER="https://192.168.170.111:6443"為自己的apiserver的ip地址本文是master地址
./scheduler.sh
ps aux | grep kube-scheduler
#運行shceduler組件腳本,查看服務是否正常
vim controller-manager.sh
#修改ipKUBE_APISERVER="https://192.168.170.111:6443"為自己的apiserver的ip地址本文是master地址
./controller-manager.sh
ps aux | grep kube-controller-manager
#運行controller-manager.sh組件腳本,查看服務是否正常
vim ./admin.sh
#修改ipKUBE_APISERVER="https://192.168.170.111:6443"為自己的apiserver的ip地址本文是master地址
./admin.sh
#生成kubectl連接集群的kubeconfig文件
kubectl get cs
#通過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
#查看版本信息
上傳 kubernetes-server-linux-amd64.tar.gz 到 /opt/k8s/ 目錄中,解壓 kubernetes 壓縮包
復制master組件的關鍵命令文件到 kubernetes工作目錄的 bin 子目錄中
創建 bootstrap token 認證文件,apiserver 啟動時會調用,然后就相當于在集群內創建了一個這個用戶,接下來就可以用 RBAC 給他授權
二進制文件、token、證書都準備好后,開啟 apiserver 服務
#啟動 scheduler 服務
#啟動 controller-manager 服務
#生成kubectl連接集群的kubeconfig文件
6、部署worker node組件
#node1執行
mkdir -p /opt/kubernetes/{bin,cfg,ssl,logs}
#創建kubernetes工作目錄
cd /opt/
unzip node.zip
#上傳 node.zip 到 /opt 目錄中,解壓 node.zip 壓縮包,獲得kubelet.sh、proxy.shchmod +x kubelet.sh proxy.sh
#master執行
cd /opt/k8s/kubernetes/server/bin
scp kubelet kube-proxy root@192.168.30.12:/opt/kubernetes/bin/
#把 kubelet、kube-proxy 節點的組件拷貝到 node1 節點
mkdir /opt/k8s/kubeconfig
cd /opt/k8s/kubeconfig
chmod +x kubeconfig.sh
vim kubeconfig.sh
./kubeconfig.sh 192.168.170.111 /opt/k8s/k8s-cert/
#上傳kubeconfig.sh文件到/opt/k8s/kubeconfig目錄中,生成kubelet初次加入集群引導kubeconfig文件和kube-proxy.kubeconfig文件
scp bootstrap.kubeconfig kube-proxy.kubeconfig root@192.168.170.113:/opt/kubernetes/cfg/
#把配置文件 bootstrap.kubeconfig、kube-proxy.kubeconfig 2個授權文件拷貝到 node1 節點
kubectl create clusterrolebinding kubelet-bootstrap --clusterrole=system:node-bootstrapper --user=kubelet-bootstrap
#RBAC授權,使用戶 kubelet-bootstrap 能夠有權限發起 CSR 請求證書
kubectl create clusterrolebinding cluster-system-anonymous --clusterrole=cluster-admin --user=system:anonymous
#若執行失敗,可先給kubectl綁定默認cluster-admin管理員集群角色,授權集群操作權限
##node1節點執行
cd /opt/
./kubelet.sh 192.168.170.113
ps aux | grep kubelet
#node1節點執行kubelet安裝腳步,注意要寫node1節點的ip地址,查看kubelet服務是否正常運行
#在 master01 節點上操作,通過 CSR 請求
kubectl get csr
#可以查看有誰發起請求Pending 表示等待集群給該節點簽發證書,查看的內容如下
NAME AGE SIGNERNAME REQUESTOR CONDITION
node-csr-saZodXI7_rtwU6VJGMB1UKPx8sHUsAonx4l1BKJRXOo 53m kubernetes.io/kube-apiserver-client-kubelet kubelet-bootstrap Pendingkubectl certificate approve node-csr-saZodXI7_rtwU6VJGMB1UKPx8sHUsAonx4l1BKJRXOo
#執行命令授權csr請求并簽發證書
kubectl get csr
#再次查看請求的csr狀態Approved,Issued 表示已授權 CSR 請求并簽發證書
kubectl get node
#查看節點,狀態為NotReady 由于網絡插件還沒部署
NAME STATUS ROLES AGE VERSION
192.168.170.113 NotReady <none> 108s v1.20.11