說明
本次搭建使用三臺雲主機,一個master節點,兩個node節點,配置均為:2核8G,30G儲存。
系統採用Ubuntu 20.04。
安裝過程
關閉 swap
// 註釋掉有swap的行
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
// 關閉swap
sudo swapoff -a
關閉防火牆
systemctl stop ufw
systemctl disable ufw
修改 cloud.cfg(如果有該檔案)
vi /etc/cloud/cloud.cfg
#該配置預設為 false,修改為 true 即可
preserve_hostname: true
修改DNS
vi /etc/systemd/resolved.conf
開啟檔案,修改如下:
[Resolve]
DNS=114.114.114.114
修改hostname
執行hostnamectl set-hostname kubernetes-master
修改hostname,kubernetes-master
為修改後的hostname。
安裝docker
使用最新的docker,會提示:this Docker version is not on the list of validated versions: 20.10.5. Latest validated version: 19.03。20.10.5版本不在支援列表裡面,所以這裡安裝的時候需限制版本為19.03
依次執行以下命令:
// 確保移除已安裝的docker
sudo apt-get remove docker docker-engine docker-ce docker.io
// 更新軟體
sudo apt-get update
// 安裝必要的工具
sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
// 新增Docker官方的GPG金鑰
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
// 設定stable儲存庫
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
// 更新軟體源
sudo apt-get update
// 檢視docker可用的版本
apt-cache madison docker-ce
檢視docker可用的版本輸出大概結果如下:
.
.
.
docker-ce | 5:19.03.9~3-0~ubuntu-focal | https://download.docker.com/linux/ubuntu focal/stable amd64 Packages
第二欄為版本號,這裡選擇版本號為:5:19.03.9~3-0~ubuntu-focal
。將版本號放到docker-ce=
後面,執行命令如下所示:
sudo apt-get install docker-ce=5:19.03.9~3-0~ubuntu-focal
安裝完後檢查docker的狀態:
systemctl status docker
執行以下命令配置docker:
cat <<EOF | sudo tee /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"registry-mirrors": ["https://1uovoul9.mirror.aliyuncs.com"],
"storage-driver": "overlay2"
}
EOF
其中,registry-mirrors新增國內的docker映象源,這裡使用阿里雲的。獲取方法:登入阿里雲後,轉到cr.console.aliyun.com/cn-guangzhou... ,點選左邊選單欄的「映象工具」-「映象加速」即可看到映象源地址。
最後,重新啟動 Docker 並在啟動時啟用:
sudo systemctl enable docker
sudo systemctl daemon-reload
sudo systemctl restart docker
安裝 kubeadm,kubelet,kubectl
先安裝一些依賴和做一些配置:
# 安裝系統工具
apt-get update && apt-get install -y apt-transport-https
# 安裝 GPG 證照
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
# 寫入軟體源;注意:我們用系統代號為 bionic,但目前阿里雲不支援,所以沿用 16.04 的 xenial
cat << EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
開始安裝:
apt-get update
apt-get install -y kubelet kubeadm kubectl
各元件的作用說明:
kubeadm
:用來初始化叢集的指令。kubelet
:在叢集中的每個節點上用來啟動 Pod 和容器等。kubectl
:用來與叢集通訊的命令列工具。
接著,設定kubelet
自啟動並啟動:
systemctl enable kubelet && systemctl start kubelet
配置kubeadm
# 匯出配置檔案
# 在home目錄下
kubeadm config print init-defaults --kubeconfig ClusterConfiguration > kubeadm.yml
修改配置檔案如下所示:
# 修改配置為如下內容
apiVersion: kubeadm.k8s.io/v1beta1
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: abcdef.0123456789abcdef
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
# 修改為`主節點` IP
advertiseAddress: 172.19.122.236
bindPort: 6443
nodeRegistration:
criSocket: /var/run/dockershim.sock
name: kubernetes-master
taints:
- effect: NoSchedule
key: node-role.kubernetes.io/master
---
apiServer:
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta1
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controlPlaneEndpoint: ""
controllerManager: {}
dns:
type: CoreDNS
etcd:
local:
dataDir: /var/lib/etcd
# 國內不能訪問 Google,修改為阿里雲
imageRepository: registry.aliyuncs.com/google_containers
kind: ClusterConfiguration
# 修改版本號 必須對應
kubernetesVersion: v1.20.5
networking:
# 新增該配置 用於後續 Calico網路外掛
podSubnet: 192.168.0.0/16
dnsDomain: cluster.local
serviceSubnet: 10.96.0.0/12
scheduler: {}
---
接著,執行以下命令拉取映象:
kubeadm config images pull --config kubeadm.yml
初始化master節點
在home目錄下(kubeadm.yml所在目錄)執行:
kubeadm init --config=kubeadm.yml --upload-certs | tee kubeadm-init.log
大概等幾分鐘就執行完畢。輸出資訊的結尾會有如下資訊:
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 172.19.122.236:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:05bc648be3f406d2bde977cdfe1c0dfe4fb50c3d7b62b8f0950c66c0052e27c0
後面新增worker
節點的時候,可透過執行kubeadm join...
命令新增。
接下來配置kubectl
,執行:
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# 修改檔案所有者(非 ROOT 使用者才需要執行)
chown $(id -u):$(id -g) $HOME/.kube/config
驗證是否成功:
kubectl get nodes
輸出資訊大概如下所示;
NAME STATUS ROLES AGE VERSION
kubernetes-master NotReady control-plane,master 39m v1.20.5
表示主節點已經配置成功。如果安裝失敗,重試的話,需先執行: kubeadm reset
清理配置檔案。
配置worker節點
首先,新開一臺機器,重複上面配置kubeadm之前的操作,在worker節點安裝docker, kubeadm,kubectl,kubelet,除了hostname改為不一樣的名字,安裝完後不用執行啟動命令。
其次,在master節點上,可以使用之前控制檯輸出的join命令,也可以重新生成join命令。步驟如下:
- 建立新的token:
輸出結果示例:kubeadm token generate
18ezo4.huyg5hw5tv0g07kg
- 使用上面生成的token生成join命令:
ttl代表token有效期,0為永久有效。可用kubeadm token create 18ezo4.huyg5hw5tv0g07kg --print-join-command --ttl=0
kubeadm token list
檢視現有的token。
執行結果示例:kubeadm join 172.19.122.236:6443 --token 18ezo4.huyg5hw5tv0g07kg --discovery-token-ca-cert-hash sha256:05bc648be3f406d2bde977cdfe1c0dfe4fb50c3d7b62b8f0950c66c0052e27c0
複製該命令到子節點上執行,如果執行成功,會有如下提示:
This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.
Run 'kubectl get nodes' on the control-plane to see this node join the cluster.
到master節點上執行:
kubectl get nodes
可看到新新增的節點:
NAME STATUS ROLES AGE VERSION
kubenetes-node1 NotReady <none> 11s v1.20.5
kubernetes-master NotReady control-plane,master 5h44m v1.20.5
按照同樣的步驟,可新增更多節點。
安裝網路外掛(CNI)
在master節點執行:kubectl get pod -n kube-system -o wide
,輸出如下所示:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE REA
coredns-7f89b7bc75-5chtb 0/1 Pending 0 6h9m <none> <none> <none> <no
coredns-7f89b7bc75-nrwmw 0/1 Pending 0 6h9m <none> <none> <none> <no
etcd-kubernetes-master 1/1 Running 1 6h9m 172.19.122.236 kubernetes-master <none> <no
kube-apiserver-kubernetes-master 1/1 Running 1 6h9m 172.19.122.236 kubernetes-master <none> <no
kube-controller-manager-kubernetes-master 1/1 Running 1 6h9m 172.19.122.236 kubernetes-master <none> <no
kube-proxy-fw96l 1/1 Running 1 6h9m 172.19.122.236 kubernetes-master <none> <no
kube-proxy-gcjwr 1/1 Running 0 25m 172.19.122.237 kubenetes-node1 <none> <no
kube-proxy-xz25z 1/1 Running 0 71s 172.19.122.238 kubenetes-node2 <none> <no
kube-scheduler-kubernetes-master 1/1 Running 1 6h9m 172.19.122.236 kubernetes-master <none> <no
coredns還未執行,說明缺少網路外掛。
這裡選擇Calico作為CNI外掛。
依次執行如下命令:
kubectl create -f https://docs.projectcalico.org/manifests/tigera-operator.yaml
kubectl create -f https://docs.projectcalico.org/manifests/custom-resources.yaml
然後檢視pod狀態:
watch kubectl get pods --all-namespaces
可能要等待幾分鐘,等所有 container 都變成 running 狀態才算安裝完成。最終結果如下所示:
NAMESPACE NAME READY STATUS RESTARTS AGE
calico-system calico-kube-controllers-f95867bfb-jpfd5 1/1 Running 0 6m3s
calico-system calico-node-47vkb 1/1 Running 0 6m3s
calico-system calico-node-7sj6n 1/1 Running 0 6m3s
calico-system calico-node-v2g49 1/1 Running 0 6m3s
calico-system calico-typha-57c9945bcf-4zbfw 1/1 Running 0 6m
calico-system calico-typha-57c9945bcf-cz7wx 1/1 Running 0 6m
calico-system calico-typha-57c9945bcf-tmc5s 1/1 Running 0 6m4s
kube-system coredns-7f89b7bc75-5chtb 1/1 Running 0 6h36m
kube-system coredns-7f89b7bc75-nrwmw 1/1 Running 0 6h36m
kube-system etcd-kubernetes-master 1/1 Running 1 6h36m
kube-system kube-apiserver-kubernetes-master 1/1 Running 1 6h36m
kube-system kube-controller-manager-kubernetes-master 1/1 Running 1 6h36m
kube-system kube-proxy-fw96l 1/1 Running 1 6h36m
kube-system kube-proxy-gcjwr 1/1 Running 0 52m
kube-system kube-proxy-xz25z 1/1 Running 0 28m
kube-system kube-scheduler-kubernetes-master 1/1 Running 1 6h36m
tigera-operator tigera-operator-675ccbb69c-2d68b 1/1 Running 0 6m51s
自此,kubenetes叢集搭建完成。
狀態元件執行檢查
執行 kubectl get cs
:
NAME STATUS MESSAGE ERROR
scheduler Unhealthy Get "http://127.0.0.1:10251/healthz": dial tcp 127.0.0.1:10251: connect: connection refused
controller-manager Unhealthy Get "http://127.0.0.1:10252/healthz": dial tcp 127.0.0.1:10252: connect: connection refused
etcd-0 Healthy {"health":"true"}
- scheduler 為排程服務,主要作用是將 POD 排程到 Node
- controller-manager 為自動化修復服務,主要作用是 Node 當機後自動修復 Node 回到正常的工作狀態
- etcd-0 則是熟悉的服務註冊與發現
輸出結果中,有兩個元件是unhealthy,出現這種情況,是/etc/kubernetes/manifests
下的kube-controller-manager.yaml
和kube-scheduler.yaml
設定的預設埠是0,在檔案中註釋掉- --port=0
就可以了(在前面加上#號)。再次執行檢視命令,修改後都變為ok狀態了。
參考
- 較詳細的過程(但缺少了docker的安裝步驟):lixueduan.com/post/kubernetes/01-i...
- 安裝指定docker版本:blog.csdn.net/liqi_q/article/detai...
- docker配置相關:kubernetes.io/zh/docs/setup/produc...
- devtech0101.medium.com/create-your... (這裡面使用的容器執行時是crio,沒法安裝成功。)
本作品採用《CC 協議》,轉載必須註明作者和本文連結