本文介紹我使用三台物理機在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' |
4. 設置設置root密碼和ssh權限
步驟一 | 設置root密碼 | sudo passwd root |
步驟二 | 設置root可以ssh訪問 | sudo vi /etc/ssh/sshd_config |
說明:本文以后都是以root身份登錄
在機器上安裝kubernetes軟件,注意下面說明
- 因為kubernetes安裝容易出錯,所以先做此操作,所有的node節點上都安裝kubernetes
- 注意:執行此操作之前apt鏡像不要設置阿里源,否則會導致iptables安裝的版本過高導致kubeadm等安裝失敗
- 所謂的kubernetes軟件的安裝指的是apt-get install kubelet kubeadm kubectl,在master和slave上都要執行
- kubeadm是一個命令工具用來創建管理kubernetes的安裝和啟動,kubernetes啟動成功了之后kubeadm就沒有用了,在master和slave上都用
- kubectl是一個命令行工具,用來管理kubernetes的pods等如創建和刪除,好像只在master上用
- kubelet是一個服務,可以用systemctl來管理,可以認為是kubernetes在每個node上啟動的服務,master和slave都要用
- 上面說的三個軟件在master和slave的node上都需要安裝
- 這一步安裝完了,其他安裝的問題就比較少了
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
kubernetes安裝完了之后,要通過kubeadm啟動他,在這之前要設置ubuntu server的配置環境,讓kubernetes運行起來,配置環境主要設置三個:
- 關閉交換區:關閉文件作為內存交換區
- ip轉發:出於安全考慮,Linux系統默認是禁止數據包轉發的
- 設置ubuntu server 的DNS
- 設置所有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 |
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
說明:
- 執行images.sh的時候會報錯,你先執行dpkg-reconfigure dash,在彈出的對話框中選擇“No”然后再執行kubernetes.sh即可
- 不同的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.
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上執行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>