K8s二進位制部署單節點 master元件 node元件 ——頭懸樑
阿新 • • 發佈:2021-10-28
K8s二進位制部署單節點 master元件 node元件 ——頭懸樑
1、master元件部署
2、node 元件部署
k8s叢集搭建:
- etcd叢集
- flannel網路外掛
- 搭建master元件
- 搭建node元件
1、master元件部署:
建立工作目錄
生成證書
準備k8s軟體包
生成bootstrap token 認證檔案
啟動 apiserver
啟動controller-manager、scheduler
驗證master元件狀態
1 ##### 在 master01 節點上操作 ##### 2 //上傳 master.zip 和 k8s-cert.sh 到 /opt/k8s 目錄中,解壓 master.zip 壓縮包 3 cd /opt/k8s/ 4 unzip master.zip 5 apiserver.sh 6 scheduler.sh 7 controller-manager.sh 8 9 chmod +x *.sh 10 11 //建立kubernetes工作目錄 12 mkdir -p /opt/kubernetes/{cfg,bin,ssl} 13 14 //建立用於生成CA證書、相關元件的證書和私鑰的目錄 15 mkdir /opt/k8s/k8s-cert 16 mv /opt/k8s/k8s-cert.sh /opt/k8s/k8s-cert 17 cd /opt/k8s/k8s-cert/ 18 ./k8s-cert.sh #生成CA證書、相關元件的證書和私鑰 19 20 ls *pem 21 admin-key.pem apiserver-key.pem ca-key.pem kube-proxy-key.pem 22 admin.pem apiserver.pem ca.pem kube-proxy.pem 23 //controller-manager 和 kube-scheduler 設定為只調用當前機器的 apiserver,使用 127.0.0.1:8080 通訊,因此不需要簽發證書 24 25 //複製CA證書、apiserver相關證書和私鑰到 kubernetes工作目錄的 ssl 子目錄中 26 cp ca*pem apiserver*pem /opt/kubernetes/ssl/ 27 28 //上傳 kubernetes-server-linux-amd64.tar.gz 到 /opt/k8s/ 目錄中,解壓 kubernetes 壓縮包 29 cd /opt/k8s/ 30 tar zxvf kubernetes-server-linux-amd64.tar.gz 31 32 //複製master元件的關鍵命令檔案到 kubernetes工作目錄的 bin 子目錄中 33 cd /opt/k8s/kubernetes/server/bin 34 cp kube-apiserver kubectl kube-controller-manager kube-scheduler /opt/kubernetes/bin/ 35 ln -s /opt/kubernetes/bin/* /usr/local/bin/ 36 37 //建立 bootstrap token 認證檔案,apiserver 啟動時會呼叫,然後就相當於在叢集內建立了一個這個使用者,接下來就可以用 RBAC 給他授權 38 cd /opt/k8s/ 39 vim token.sh 40 #!/bin/bash 41 #獲取隨機數前16個位元組內容,以十六進位制格式輸出,並刪除其中空格 42 BOOTSTRAP_TOKEN=$(head -c 16 /dev/urandom | od -An -t x | tr -d ' ') 43 #生成 token.csv 檔案,按照 Token序列號,使用者名稱,UID,使用者組 的格式生成 44 cat > /opt/kubernetes/cfg/token.csv <<EOF 45 ${BOOTSTRAP_TOKEN},kubelet-bootstrap,10001,"system:kubelet-bootstrap" 46 EOF 47 48 chmod +x token.sh 49 ./token.sh 50 51 cat /opt/kubernetes/cfg/token.csv 52 53 //二進位制檔案、token、證書都準備好後,開啟 apiserver 服務 54 cd /opt/k8s/ 55 56 57 //檢查程序是否啟動成功 58 ps aux | grep kube-apiserver 59 60 //k8s通過kube-apiserver這個程序提供服務,該程序執行在單個master節點上。預設有兩個埠6443和8080 61 //安全埠6443用於接收HTTPS請求,用於基於Token檔案或客戶端證書等認證 62 netstat -natp | grep 6443 63 64 //本地埠8080用於接收HTTP請求,非認證或授權的HTTP請求通過該埠訪問API Server 65 netstat -natp | grep 8080 66 67 //檢視版本資訊(必須保證apiserver啟動正常,不然無法查詢到server的版本資訊) 68 kubectl version 69 70 71 //啟動 scheduler 服務 72 cd /opt/k8s/ 73 ./scheduler.sh 127.0.0.1 74 75 ps aux | grep kube-scheduler 76 77 78 //啟動 controller-manager 服務 79 cd /opt/k8s/ 80 ./controller-manager.sh 127.0.0.1 81 82 83 //檢視 master 節點狀態 84 kubectl get componentstatuses #也可以 kubectl get cs 85 NAME STATUS MESSAGE ERROR 86 controller-manager Healthy ok 87 scheduler Healthy ok 88 etcd-2 Healthy {"health":"true"} 89 etcd-1 Healthy {"health":"true"} 90 etcd-0 Healthy {"health":"true"}
2、node元件部署:
node搭建流程
- 準備 kubelet kube-proxy 啟動,停止等操作,用於管理kubelei和kube-proxy程序
- 在master節點上準備kubelet和kube-proxy加入k8s群集所要使用的kubeconfig檔案,並傳給node節點
- kubeconfig檔案包含了加入k8s叢集需要的ca證書,tls證書和私鑰,bootstrap的token資訊,master的apisever IP+埠(6443)
- node節點啟動kubelet,node節點的kublet會向master的apiserver發起CSR認證請求
- 在Master節點上通過CSR認證,node會自動生成證書,以後的node的kubelet訪問都會通過這個證書做認證
- node節點上載入ipvs模組,再啟動kube-proxy
1 ##### 在 master01 節點上操作 ##### 2 //把 kubelet、kube-proxy 拷貝到 node 節點 3 cd /opt/k8s/kubernetes/server/bin 4 scp kubelet kube-proxy [email protected]:/opt/kubernetes/bin/ 5 scp kubelet kube-proxy [email protected]:/opt/kubernetes/bin/ 6 7 8 ##### 在 node01 節點上操作 ##### 9 //上傳 node.zip 到 /opt 目錄中,解壓 node.zip 壓縮包,獲得kubelet.sh、proxy.sh 10 cd /opt/ 11 unzip node.zip 12 13 14 ##### 在 master01 節點上操作 ##### 15 //建立用於生成kubelet的配置檔案的目錄 16 mkdir /opt/k8s/kubeconfig 17 18 //上傳 kubeconfig.sh 檔案到 /opt/k8s/kubeconfig 目錄中 19 #kubeconfig.sh 檔案包含叢集引數(CA 證書、API Server 地址),客戶端引數(上面生成的證書和私鑰),叢集 context 上下文引數(叢集名稱、使用者名稱)。Kubenetes 元件(如 kubelet、kube-proxy)通過啟動時指定不同的 kubeconfig 檔案可以切換到不同的叢集,連線到 apiserver。 20 cd /opt/k8s/kubeconfig 21 chmod +x kubeconfig.sh 22 23 //生成kubelet的配置檔案 24 cd /opt/k8s/kubeconfig 25 ./kubeconfig.sh 192.168.80.10 /opt/k8s/k8s-cert/ 26 27 ls 28 bootstrap.kubeconfig kubeconfig.sh kube-proxy.kubeconfig 29 30 //把配置檔案 bootstrap.kubeconfig、kube-proxy.kubeconfig 拷貝到 node 節點 31 cd /opt/k8s/kubeconfig 32 scp bootstrap.kubeconfig kube-proxy.kubeconfig [email protected]:/opt/kubernetes/cfg/ 33 scp bootstrap.kubeconfig kube-proxy.kubeconfig [email protected]:/opt/kubernetes/cfg/ 34 35 //RBAC授權,將預設使用者 kubelet-bootstrap 與內建的 ClusterRole system:node-bootstrapper 繫結到一起,使其能夠發起 CSR 請求 36 kubectl create clusterrolebinding kubelet-bootstrap --clusterrole=system:node-bootstrapper --user=kubelet-bootstrap 37 38 ------------------------------------------------------------------------------------------ 39 kubelet 採用 TLS Bootstrapping 機制,自動完成到 kube-apiserver 的註冊,在 node 節點量較大或者後期自動擴容時非常有用。 40 Master apiserver 啟用 TLS 認證後,node 節點 kubelet 元件想要加入叢集,必須使用CA簽發的有效證書才能與 apiserver 通訊,當 node 節點很多時,簽署證書是一件很繁瑣的事情。因此 Kubernetes 引入了 TLS bootstraping 機制來自動頒發客戶端證書,kubelet 會以一個低許可權使用者自動向 apiserver 申請證書,kubelet 的證書由 apiserver 動態簽署。 41 42 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 認證請求。 43 44 TLS bootstrapping 時的證書實際是由 kube-controller-manager 元件來簽署的,也就是說證書有效期是 kube-controller-manager 元件控制的;kube-controller-manager 元件提供了一個 --experimental-cluster-signing-duration 引數來設定簽署的證書有效時間;預設為 8760h0m0s,將其改為 87600h0m0s,即 10 年後再進行 TLS bootstrapping 簽署證書即可。 45 46 也就是說 kubelet 首次訪問 API Server 時,是使用 token 做認證,通過後,Controller Manager 會為 kubelet 生成一個證書,以後的訪問都是用證書做認證了。 47 ------------------------------------------------------------------------------------------ 48 49 //檢視角色: 50 kubectl get clusterroles | grep system:node-bootstrapper 51 52 //檢視已授權的角色: 53 kubectl get clusterrolebinding 54 55 56 ##### 在 node01 節點上操作 ##### 57 //使用kubelet.sh指令碼啟動kubelet服務 58 cd /opt/ 59 chmod +x kubelet.sh 60 ./kubelet.sh 192.168.80.11 61 62 //檢查kubelet服務啟動 63 ps aux | grep kubelet 64 65 //此時還沒有生成證書 66 ls /opt/kubernetes/ssl/ 67 68 69 ##### 在 master01 節點上操作 ##### 70 //檢查到 node01 節點的 kubelet 發起的 CSR 請求,Pending 表示等待叢集給該節點簽發證書 71 kubectl get csr 72 NAME AGE REQUESTOR CONDITION 73 node-csr-lkyZ8aZjWPwXc8PeWbzTdcSScoepFsp4gPGECrpIwjA 2m kubelet-bootstrap Pending 74 75 //通過 CSR 請求 76 kubectl certificate approve node-csr-lkyZ8aZjWPwXc8PeWbzTdcSScoepFsp4gPGECrpIwjA 77 78 //再次檢視 CSR 請求狀態,Approved,Issued 表示已授權 CSR 請求並簽發證書 79 kubectl get csr 80 NAME AGE REQUESTOR CONDITION 81 node-csr-lkyZ8aZjWPwXc8PeWbzTdcSScoepFsp4gPGECrpIwjA 4m kubelet-bootstrap Approved,Issued 82 83 //檢視群集節點狀態,成功加入node01節點 84 kubectl get nodes 85 NAME STATUS ROLES AGE VERSION 86 192.168.80.11 Ready 87 88 89 ##### 在 node01 節點上操作 ##### 90 //自動生成了證書和 kubelet.kubeconfig 檔案 91 ls /opt/kubernetes/cfg/kubelet.kubeconfig 92 ls /opt/kubernetes/ssl/ 93 94 //載入 ip_vs 模組 95 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 96 97 //使用proxy.sh指令碼啟動proxy服務 98 cd /opt/ 99 chmod +x proxy.sh 100 ./proxy.sh 192.168.80.11 101 102 systemctl status kube-proxy.service 103 104 ---------- node02 節點部署 ---------- 105 ##方法一: 106 //在 node01 節點上將 kubelet.sh、proxy.sh 檔案拷貝到 node02 節點 107 cd /opt/ 108 scp kubelet.sh proxy.sh [email protected]:/opt/ 109 110 ##### 在 node02 節點上操作 ##### 111 //使用kubelet.sh指令碼啟動kubelet服務 112 cd /opt/ 113 chmod +x kubelet.sh 114 ./kubelet.sh 192.168.208.30 115 116 ##### 在 master01 節點上操作 ##### 117 //在 master01 節點上操作檢視 CSR 請求 118 kubectl get csr 119 NAME AGE REQUESTOR CONDITION 120 node-csr-sRyUesJHUjfl1Q1E1haiStDvPXs2JzaA0jO8OnA2f3Y 15s kubelet-bootstrap Pending 121 122 //通過 CSR 請求 123 kubectl certificate approve node-csr-sRyUesJHUjfl1Q1E1haiStDvPXs2JzaA0jO8OnA2f3Y124 125 kubectl get csr 126 NAME AGE REQUESTOR CONDITION 127 node-csr-sRyUesJHUjfl1Q1E1haiStDvPXs2JzaA0jO8OnA2f3Y 2m kubelet-bootstrap Approved,Issued 128 129 //檢視群集中的節點狀態 130 kubectl get nodes 131 NAME STATUS ROLES AGE VERSION 132 192.168.80.11 Ready 133 192.168.80.12 Ready 134 135 //載入 ipvs 模組 136 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 137 138 //使用proxy.sh指令碼啟動proxy服務 139 cd /opt/ 140 chmod +x proxy.sh 141 ./proxy.sh 192.168.80.12 142 143 systemctl status kube-proxy.service 144 145 ##方法二: 146 //在node01節點操作,把現成的/opt/kubernetes目錄和kubelet、kube-proxy的service服務管理檔案複製到其他node節點 147 scp -r /opt/kubernetes/ [email protected]:/opt/ 148 scp /usr/lib/systemd/system/{kubelet,kube-proxy}.service [email protected]:/usr/lib/systemd/system/ 149 150 //在node02節點上操作,進行修改 151 //首先刪除複製過來的證書,等會node02會自行申請證書 152 cd /opt/kubernetes/ssl/ 153 rm -rf * 154 155 //修改配置檔案kubelet、kubelet.config、kube-proxy的相關IP地址配置為當前節點的IP地址 156 cd /opt/kubernetes/cfg 157 vim kubelet 158 KUBELET_OPTS="--logtostderr=true \ 159 --v=4 \ 160 --hostname-override=192.168.80.12 \ #修改 161 ...... 162 163 vim kubelet.config 164 kind: KubeletConfiguration 165 apiVersion: kubelet.config.k8s.io/v1beta1 166 address: 192.168.80.12 #修改 167 168 vim kube-proxy 169 KUBE_PROXY_OPTS="--logtostderr=true \ 170 --v=4 \ 171 --hostname-override=192.168.80.12 \ #修改 172 173 //載入 ipvs 模組 174 modprobe ip_vs 175 176 //啟動kubelet和kube-proxy服務並設定開機自啟 177 systemctl start kubelet.service 178 systemctl enable kubelet.service 179 systemctl start kube-proxy.service 180 systemctl enable kube-proxy.service 181 182 //到master01節點上發現未授權的node02請求,授權node02加入叢集 183 kubectl get csr 184 NAME AGE REQUESTOR CONDITION 185 node-csr-P3996HQxx_2PLeo9bxBu7TVPcWgbAWqla5yj8Wa_5ks 15s kubelet-bootstrap Pending 186 187 //授權許可加入群集 188 kubectl certificate approve node-csr-P3996HQxx_2PLeo9bxBu7TVPcWgbAWqla5yj8Wa_5ks 189 190 kubectl get csr 191 192 kubectl get nodes
部署node2節點
#把node1節點的/opt/kubernetes 目錄複製到node2節點中(node1上操作) scp -r /opt/kubernetes/ [email protected]:/opt #拷貝啟動指令碼 (node1上操作) scp /usr/lib/systemd/system/{kubelet,kube-proxy}.service [email protected]:/usr/lib/systemd/system/ #刪除所有證書檔案 cd /opt/kubernetes/ssl/ rm -rf * #修改kubelet配置檔案IP地址 cd ../cfg vim kubelet KUBELET_OPTS="--logtostderr=true \ --v=4 \ --hostname-override=192.168.184.142 \ #修改為node2節點本地地址 --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" #修改kubelet.conf配置檔案 vim kubelet.config kind: KubeletConfiguration apiVersion: kubelet.config.k8s.io/v1beta1 address: 192.168.184.142 #修改為本地地址 port: 10250 readOnlyPort: 10255 cgroupDriver: cgroupfs clusterDNS: - 10.0.0.2 #DNS解析地址,需要記下來 clusterDomain: cluster.local. failSwapOn: false authentication: anonymous: enabled: true #修改kube-proxy 配置檔案 vim kube-proxy KUBE_PROXY_OPTS="--logtostderr=true \ --v=4 \ --hostname-override=192.168.184.142 \ #修改為本地地址 --cluster-cidr=10.0.0.0/24 \ --proxy-mode=ipvs \ --kubeconfig=/opt/kubernetes/cfg/kube-proxy.kubeconfig" #啟動服務 systemctl start kubelet systemctl enable kubelet systemctl start kube-proxy systemctl enable kube-proxy #master節點授權(master上操作) kubectl get csr kubectl certificate approve 節點2的名稱 kubectl get csr #master檢視叢集狀態(master上操作) kubectl get node
自古英雄多磨難