我的K8s之路(1)-實踐多次的kubeadm部署源生k8s


kubernetes做爲PAAS雲的落地平臺已經不是新聞了,從2016年開始國內很多雲廠紛紛開始做二次研發,一些IT集團根據自己的業務需求,自研適合自身業務的容器編排平臺,包括很多大客戶的技術提供商,也在爲客戶的業務應用做平臺開發,可巧筆者當初就曾用ansible寫過k8s的自動部署腳本,這算是第一次接觸k8s。

後來國內考CKA認證的技術人員越來越多,到我考的時候已經有5000多號人了,現在應該更多,CKA認證基本已經成爲從業人員的標配。儘管google也好,rancher也罷,包括很多雲廠商都有各自的部署工具,但CKA考試還是要從開源版本學起,kubeadm是源生的部署工具,特別考試有一道8分的題,就是在裸機上用kubeadm部署k8s集羣。即便不考認證,如果你要從事容器雲的相關工作,個人認爲也應該從開源版本學起。

再到後來有幸成爲紅旗教育學院的k8s講師,想將部署操作k8s的內容做下梳理,故撰成此文。此爲第一回,先說部署,後續再慢慢加其它內容。


其實說到源生的K8s部署,剛開始應該先從源碼安裝開始,這個我也做過幾回,優點是能快速熟悉kubernetes架構和組件構成和組件與組件之前的耦合關係。不過從易用性和可用性角度出發,無論是測試還是上生產,我想基本都不會考慮, 費時費力還一堆坑,這個還是留待大夥學習,或我哪天心情特別差的時候再說哈。所以第一回先從kubeadm部署k8s集羣開始。

小提示:kubernetes爲啥又叫k8s,是因爲k與s之間有8個字母,國人的簡便稱謂。。。。。

好,現在開始部署,首先要準備最起碼三臺設備,虛擬機也好,物理機也罷,這個隨便,建議配置如下:

機器配置:2核CPU,8G內存,40G系統盤
系統:Ubuntu 16.04.6 LTS
機器數量:3臺 (master node01 node02)

當然了,你要說內存4G行不行,也可以,一個測試不必要在這方面那麼嚴謹,至於爲啥要用Ubuntu,這是CNCF社區的建議版本,其實用centos也一樣。能把集羣跑起來就算得~

接下來開始基礎環境配置(3臺都要執行)
(其實這部分屬於Linux基礎配置,如果對Linux不熟請先自行補課,當然在評論區問我也可以哈)

(1) ### 修改配置靜態hostname

hostnamectl set-hostname master1(node01,node02)

(2)### hosts表:

172.16.100.206 master
172.16.100.205 node01
172.16.100.204 node02

(3)### 關閉firewalld

ufw disable

(4)### 關閉SELinux
ubuntu默認關閉SELinux

(5)### 關閉swap
臨時關閉:swapoff -a
永久關閉:註釋掉/etc/fstab下的swap一行
如果使用swap會影響性能,一般建議關閉,當然你非要用也不是沒有辦法。

(6)### 更新apt包索引

apt-get update

這個是ubuntu比較方便的地方,隨時更新隨時新~~

(7)### 安裝軟件包

apt-get -y install apt-transport-https ca-certificates curl gnupg-agent software-properties-common

這一步的作用是允許apt通過HTTPS使用存儲庫

(8)### 安裝add-apt-repository工具

apt-get -y install software-properties-common

(9)### 添加Docker的官方GPG密鑰

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

(10)### 添加穩定的存儲庫

add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

上兩步的是爲了安裝docker做準備

(11)### 查看Docker版本

apt-cache madison docker-ce

現在已經到19版本了,不過我測試還是用的18.09.9

(12)### 安裝docker-ce=5:18.09.9~3-0~ubuntu-bionic

apt-get -y install docker-ce=5:18.09.9~3-0~ubuntu-xenial docker-ce-cli=5:18.09.9~3-0~ubuntu-xenial containerd.io

執行docker info進行驗證

(13)### 解決swap報錯
執行docker info命令在最後一層會出現:

WARNING: No swap limit support(操作系統下docker內存限制的警告)

執行命令,vim /etc/default/grub 添加或編輯GRUB_CMDLINE_LINUX行以添加這鍵值:

GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1 net.ifnames=0 vga=792 console=tty0 console=ttyS0,115200n8 noibrs"

更新grub並重啓機器

update-grub
reboot

(14)### 解決防火牆轉發策略問題
docker 在 1.13 版本之後,將系統iptables 中 FORWARD 鏈的默認策略設置爲 DROP,併爲連接到 docker0 網橋的容器添加了ACCEPT規則,
臨時解決辦法:

iptables -P FORWARD ACCEPT

永久解決辦法:

vim /lib/systemd/system/docker.service.
在[Service]下添加:ExecStartPost=/sbin/iptables -P FORWARD ACCEPT

(15)### 設置daemon.json

cat > /etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": ["https://7bezldxe.mirror.aliyuncs.com/"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF

主要是配置docker的日誌和拉取鏡像源,registry-mirrorsr使用國內阿里雲的源,這很重要,因爲如果不配置,默認的源要能***才能搞。
讀取配置並重啓服務

systemctl daemon-reload && systemctl restart docker.service

(16)### 安裝kubeadm、kubelet、kubectl

sudo apt-get update && sudo apt-get install -y apt-transport-https curl
sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF

還是一樣,kubernetes的源需要***,所以依然用阿里的源,其實搞了k8s才知道阿里雲做了很多貢獻。
默認安裝最高版

sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl

本鎖定版本

sudo apt-mark hold kubelet kubeadm kubectl

(17)###免密訪問(master節點)

ssh-keygen -t rsa
ssh-copy-id k8s-master
ssh-copy-id k8s-node01
ssh-copy-id k8s-node02

到此,基礎環境配置完成,接下來開始正式部署。


情況是這樣的,測試環境只有一個master,所以是single control-plane的集羣,在在master節點執行

(1)### 初始化control-plane節點
生成配置文件

kubeadm config print init-defaults > init-defaults.yaml

kubeadm工具提供部署k8s的默認配置,可以輸出爲yaml文件,但需要修改。
文件中的鏡像源imageRepository爲

k8s.gcr.io

安裝時默認會從這個源下載鏡像,如果不***無法下載,故可事先將其改爲:

registry.cn-hangzhou.aliyuncs.com/google_containers

在networking下修改clusterName(集羣名稱),修改apiservice地址

localAPIEndpoint:
advertiseAddress: 172.16.100.206
clusterName: cluster01

(2)### 執行初始化操作

kubeadm init --config=init-defaults.yaml

或者

kubeadm init \
--kubernetes-version=v1.18.0 \
--apiserver-advertise-address=172.16.100.206

部署現在k8s的最新版1.18.0,執行初始化操作時會先下載鏡像,也可以先下載再部署。
列出需下載鏡像列表

kubeadm config images list

拉取鏡像到本地

kubeadm config images pull

(3)###初始化完成後馬上需要做的
執行完初始化後,會有提示如何添加worker節點,與集羣管理員帳戶配置。
集羣管理員帳戶配置:

root用戶
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> /root/.bashrc
source /root/.bashrc
非root用戶
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

注意,將添加worker節點命令保存,例如:

kubeadm join 172.16.100.206:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:a84eff9fe6cb5b9b01326b8790f86d73d59b99d124cdc8d8eb8d0208aeaeb905

(4)###檢查集羣
檢查組件狀態是否正常

kubectl get componentstatuses

查看集羣系統信息

kubectl cluster-info

檢查支撐集羣運行所有組件

kubectl -n kube-system get all

這些都是集羣初始化完成後的基本操做,至此初始化集羣完成,接下來開始配置集羣。


初始化完成且,需要對集羣做配置纔可以投入使用

(1)###自動補全
爲什麼先做它,是因爲懶的原因,這步操作可以將kubectl命令,所有參數用tab健補全,就像Linux一樣:)

首先,取消bash-completion註釋

vim /etc/bash.bashrc
enable bash completion in interactive shells
if ! shopt -oq posix; then
if [ -f /usr/share/bash-completion/bash_completion ]; then
. /usr/share/bash-completion/bash_completion
elif [ -f /etc/bash_completion ]; then
. /etc/bash_completion
fi
fi
source /etc/bash.bashrc

第二步是查看completion幫助

kubectl completion -h

可獲取自動補全的命令

source <(kubectl completion bash)

如果執行一遍只是當前可用,再登陸就不行了。
將kubectl自動補全添加到配置文件中,可以在以後的shell中自動加載

echo "source <(kubectl completion bash)" >> ~/.bashrc
source ~/.bashrc

(2)###配置網絡

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

注,在集羣部署結束後,kube-system命名空間內集羣運行所需的所有控制器與POD,其中coredns是未running狀態,需要安裝網絡插件才能running,此步要在添加節點前執行。

(3)###添加work節點
登陸兩臺work節點,分別執行集羣初始化完成時保存的內容,例如:

kubeadm join 172.16.100.206:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:a84eff9fe6cb5b9b01326b8790f86d73d59b99d124cdc8d8eb8d0208aeaeb905

如果沒保存,可以用命令生成再執行
創建token

kubeadm token create

查看token

kubeadm token list

獲取discovery-token-ca-cert-hash值

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

檢查集羣節點

kubectl get node

如果出現三臺節點都是ready狀態,即表示成功,如下所示:

NAME STATUS ROLES AGE VERSION
k8s-master Ready master 23h v1.18.2
k8s-node01 Ready <none> 23h v1.18.2
k8s-node02 Ready <none> 23h v1.18.2

###重新初始化
如果部署遇到問題或報錯,需要重新初始化

kubeadm reset

注,master與work節點都要執行

至此,k8s集羣部署完成,很多人都說誰也無法保證kubeadm能一次部署成功。基本上照着做的話成功率還是很高的,如果能出現節點狀態都ready的話,就可以用了。

不過這裏我只寫了操作,說實話想着沒啥,可寫起來這麼老多,還牽扯很多k8s組件的運行原理和概念沒說,大夥要是看着還行,可以留言討論,請期待下回,謝謝。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章