ubuntu server 20.4.3下部署kubernetes集群


本文介紹我使用三台物理機在ubuntu server 20.4.3上部署kubernetes,因為ubuntu server 20.4.3有自動發現wifi的能力,ubuntu server 20.4.3下有一些需要注意的事項,本文會把遇到的問題都強調出來,debain也可以參考此方案(根據我的經驗,在虛擬機上使用debian10.9.0上部署kubernetes集群非常流暢)。

一、環境准備

1. 准備三台物理機器

他們的參數如下:

編號 主機名 IP 用途 配置
01 kbsm 192.168.0.105 作為master 12邏輯核,16G內存
02 kbs1 192.168.0.106 作為slave 1 8邏輯核,16G內存
03 kbs2 192.168.0.107 作為slave 2 2邏輯核,4G內存

2. ubuntu server 20.4.3安裝准備

  • 下載ubuntu server 20.4.3的iso,並做好U盤啟動盤
  • WIFI環境,准備好用戶名和密碼

3. 安裝ubuntu server 20.4.3

在三台機器上安裝ubuntu server 20.4.3系統,注意事項

  • 設置WIFI接入網絡
  • 自動安裝SshServer,不安裝其他的server
  • 安裝最后不要安裝自動更新

我的機器是家庭環境的WIFI自動獲取IP,如果是虛擬機或者靜態IP需要進行IP的設置,具體方式是:vi /etc/netplan/00-installer-config.yaml,然后編輯形如下面的內容:

# This is the network config written by 'subiquity'
network:
ethernets:
ens33: []
dhcp4: false[]
addresses: [192.168.71.150/24]
gateway4: 192.168.71.2
nameservers:
addresses: [192.168.71.2,8.8.8.8]
version: 2

 4. 設置設置root密碼和ssh權限

步驟一 設置root密碼 sudo passwd root
步驟二 設置root可以ssh訪問

sudo vi /etc/ssh/sshd_config
1.把PermitRootLogin Prohibit-password 添加#注釋掉
2.新添加:PermitRootLogin yes
3.重啟ssh服務 sudo /etc/init.d/ssh restart

說明:本文以后都是以root身份登錄

二、安裝kubernetes

在機器上安裝kubernetes軟件,注意下面說明

  1. 因為kubernetes安裝容易出錯,所以先做此操作,所有的node節點上都安裝kubernetes
  2. 注意:執行此操作之前apt鏡像不要設置阿里源,否則會導致iptables安裝的版本過高導致kubeadm等安裝失敗
  3. 所謂的kubernetes軟件的安裝指的是apt-get install kubelet kubeadm kubectl,在master和slave上都要執行
  4. kubeadm是一個命令工具用來創建管理kubernetes的安裝和啟動,kubernetes啟動成功了之后kubeadm就沒有用了,在master和slave上都用
  5. kubectl是一個命令行工具,用來管理kubernetes的pods等如創建和刪除,好像只在master上用
  6. kubelet是一個服務,可以用systemctl來管理,可以認為是kubernetes在每個node上啟動的服務,master和slave都要用
  7. 上面說的三個軟件在master和slave的node上都需要安裝
  8. 這一步安裝完了,其他安裝的問題就比較少了

 vi kubernetes.sh添加如下代碼,並執行:ssh kubernetes.sh

curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
tee /etc/apt/sources.list.d/kubernetes.list <<-'EOF'
deb https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial main
EOF
apt-get update
apt-get install -y kubelet kubeadm kubectl
三、Ubuntu Server設置

 kubernetes安裝完了之后,要通過kubeadm啟動他,在這之前要設置ubuntu server的配置環境,讓kubernetes運行起來,配置環境主要設置三個:

  1. 關閉交換區:關閉文件作為內存交換區
  2. ip轉發:出於安全考慮,Linux系統默認是禁止數據包轉發的
  3. 設置ubuntu server 的DNS
  4. 設置所有node之間ssh免密訪問

1. 關閉交換區

  • vi /etc/fstab
  • 注釋掉有swap的那一行,在ubuntu server 20.4.3下是最后一行
  • swapoff -a

2. 設置IP轉發ubuntu server 20.4.3

  • vi /etc/sysctl.conf
  • 找到net.ipv4.ip_forward=1這一行,取消注釋
  • 運行sysctl -p后出現net.ipv4.ip_forward = 1則正常

 設置ssh免密訪問(所有的機器都要設置)

生成秘鑰(所有master和slave的node都要生成):

  • ssh-keygen -t rsa # 出現輸入地方不用輸入直接enter

3.設置ubuntu server的DNS

默認情況下,你執行ping www.baidu.com是不通的,所以不能訪問外網,以后的docker pull image以及下載yaml文件都會失敗,因為默認使用的是本地DNS,需要進行設置

echo -e "DNS=8.8.8.8 114.114.114.114" >> /etc/systemd/resolved.conf
systemctl restart systemd-resolved

4. 設置node間ssh免密訪問

1) 每個node執行:vi /etc/hosts,然后編輯

192.168.0.105 kbsm

192.168.0.106 kbs1

192.168.0.107 kbs2

 2) 每個機器都要設置到另外兩台node的ssh-copy-id,自己就不用了,下面寫出了命令的全集

ssh-copy-id root@kbsm

ssh-copy-id root@kbs1

ssh-copy-id root@kbs2

3) ssh-copy-id是否成功通過如下命令來檢測,如果不輸入密碼就可以ssh成功就可以了

ssh root@kbsm

ssh root@kbs1

ssh root@kbs2

四、安裝docker及pull images

1. 安裝docker

vi docker.sh然后錄入如下腳本,然后執行sh docker.sh

# 1. 安裝/升級Docker客戶端
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

# 2. 配置鏡像加速器
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://wn8y8b1w.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker

2. 加載kubernetes鏡像

因為kubernetes在啟動的時候,kubernetes的proxy這些組件也是docker容器,如果使用kubeadm init的話,會到官方的鏡像庫加載image而失敗,但是我們可以提前進行下載,這樣kubeadm init的時候就不會再下載了

vi images.sh然后輸入如下腳本,然后執行sh images.sh

#!/bin/bash
# https://my.oschina.net/u/1248740/blog/3138132
# 執行報錯參見:https://blog.csdn.net/Panda_813/article/details/88634181
# 既執行:dpkg-reconfigure dash 彈框選擇No
# kubeadm config images list 查看當前容器版本
images=("kube-apiserver:v1.22.2" "kube-controller-manager:v1.22.2" "kube-scheduler:v1.22.2" "kube-proxy:v1.22.2" "pause:3.5" "etcd:3.5.0-0")
for imageName in ${images[@]}
do
  docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/${imageName}
  docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/${imageName} k8s.gcr.io/${imageName}
  docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/${imageName}
done

# coredns/coredns:1.8.0使用DockerHub上的源,我用阿里雲的的會有問題
docker pull coredns/coredns:1.8.4
docker tag coredns/coredns:1.8.4 k8s.gcr.io/coredns/coredns:v1.8.4
docker rmi coredns/coredns:1.8.4

 說明:

  1. 執行images.sh的時候會報錯,你先執行dpkg-reconfigure dash,在彈出的對話框中選擇“No”然后再執行kubernetes.sh即可
  2. 不同的kubernetes對應的image的版本不一樣,參見下面的腳本,我用的是v1.22.2和1.8.4,版本不一樣需要修改這些版本號

3. 設置kubernetes和docker的cgoups一致

vi /etc/docker/daemon.json打開后,添加紅色行,上一行別忘記加逗號

vi /etc/docker/daemon.json
{
"registry-mirrors": ["https://wn8y8b1w.mirror.aliyuncs.com"],
"exec-opts":["native.cgroupdriver=systemd"]
}

說明:如果不cgroups不一致,在kubeadm init的時候會出現這個錯誤

[kubelet-check] The HTTP call equal to 'curl -sSL http://localhost:10248/healthz' failed with error: Get "http://localhost:10248/healthz": dial tcp 127.0.0.1:10248: connect: connection refused.
五、master啟動kubernetes

1. master上執行kubeadm init

這一步如果成功,kubernetes的安裝基本就沒有障礙了,在master上執行

kubeadm init --pod-network-cidr=192.168.0.0/16

如果出現問題也不要害怕,執行kubeadm reset之后就可以重新kubeadm init

mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

2. master上安裝網絡:

kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml

3. token及hash管理
token在slave join到slave的時候會使用,但是kubeadm init生成的token有效期只有一天,可以自己通過命令來重新生成一個永不過期的token

kubeadm token create --ttl 0 --print-join-command

--print-join-command 選項的意思是自動生成kubeadm join語句,這樣salve在join的時候直接使用,如:

kubeadm join 192.168.0.105:6443 --token 6btowg.ybc1qw412yvjeq4e  --discovery-token-ca-cert-hash sha256:61a5ac64ceea78dbb20c4bb6b71a8f16d9144c20760853989d8386c1e8619a8b

如果已經創建,可以通過如下兩個命令分別得到token與hash值

# 查看token
kubeadm token list

# 查看hash
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'

 

六、slave啟動kubernetes

slave上執行kubeadm join

kubeadm join 192.168.0.105:6443 --token 6btowg.ybc1qw412yvjeq4e  --discovery-token-ca-cert-hash sha256:61a5ac64ceea78dbb20c4bb6b71a8f16d9144c20760853989d8386c1e8619a8b
七、成功驗證

1.在master上看節點的情況

所有狀態都是Ready是正常的,如果不是有時候是因為慢,要等一下

kubectl get nodes
NAME   STATUS   ROLES                  AGE     VERSION
kbs1   Ready    <none>                 6h37m   v1.22.2
kbs2   Ready    <none>                 10h     v1.22.2
kbsm   Ready    control-plane,master   4d22h   v1.22.2

2. 在master上查看kubernetes自己安裝的pod

所有狀態都是Running是正常的,如果不是有時候是因為慢,要等一下

kubectl get pods --all-namespaces -o wide
NAMESPACE     NAME                                       READY   STATUS    RESTARTS        AGE     IP              NODE   NOMINATED NODE   READINESS GATES
kube-system   calico-kube-controllers-75f8f6cc59-nrz6g   1/1     Running   1 (10h ago)     4d21h   192.168.205.6   kbsm   <none>           <none>
kube-system   calico-node-jwkvd                          1/1     Running   1 (6h47m ago)   6h53m   192.168.0.106   kbs1   <none>           <none>
kube-system   calico-node-svx9b                          1/1     Running   4 (6h5m ago)    10h     192.168.0.107   kbs2   <none>           <none>
kube-system   calico-node-t6qrw                          1/1     Running   1 (10h ago)     4d21h   192.168.0.105   kbsm   <none>           <none>
kube-system   coredns-78fcd69978-c24p2                   1/1     Running   1 (10h ago)     4d22h   192.168.205.5   kbsm   <none>           <none>
kube-system   coredns-78fcd69978-w5qhm                   1/1     Running   1 (10h ago)     4d22h   192.168.205.4   kbsm   <none>           <none>
kube-system   etcd-kbsm                                  1/1     Running   3 (10h ago)     4d22h   192.168.0.105   kbsm   <none>           <none>
kube-system   kube-apiserver-kbsm                        1/1     Running   3 (10h ago)     4d22h   192.168.0.105   kbsm   <none>           <none>
kube-system   kube-controller-manager-kbsm               1/1     Running   2 (10h ago)     4d22h   192.168.0.105   kbsm   <none>           <none>
kube-system   kube-proxy-6dfgj                           1/1     Running   4 (6h5m ago)    10h     192.168.0.107   kbs2   <none>           <none>
kube-system   kube-proxy-bpmss                           1/1     Running   1 (10h ago)     4d22h   192.168.0.105   kbsm   <none>           <none>
kube-system   kube-proxy-gmmnw                           1/1     Running   1 (6h47m ago)   6h53m   192.168.0.106   kbs1   <none>           <none>
kube-system   kube-scheduler-kbsm                        1/1     Running   5 (10h ago)     4d22h   192.168.0.105   kbsm   <none>           <none>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM