準(zhǔn)備工作——K8s集群環(huán)境搭建
官方文檔:
使用Keadm進(jìn)行部署
首先要配置好Kubernetes集群。
K8s需要全程在root用戶下進(jìn)行操作,因此需要先切換到root用戶下:
sudo su
安裝K8s一般使用kubeadm,官方文檔:
kubeadm官方文檔
按照官方文檔進(jìn)行安裝
準(zhǔn)備開始
- 一臺兼容的 Linux 主機(jī)。Kubernetes 項(xiàng)目為基于 Debian 和 Red Hat 的 Linux 發(fā)行版以及一些不提供包管理器的發(fā)行版提供通用的指令。
- 每臺機(jī)器 2 GB 或更多的 RAM(如果少于這個數(shù)字將會影響你應(yīng)用的運(yùn)行內(nèi)存)。
CPU 2 核心及以上。 - 集群中的所有機(jī)器的網(wǎng)絡(luò)彼此均能相互連接(公網(wǎng)和內(nèi)網(wǎng)都可以)。
- 節(jié)點(diǎn)之中不可以有重復(fù)的主機(jī)名、MAC 地址或 product_uuid。
- 開啟機(jī)器上的某些端口。
- 禁用交換分區(qū)。為了保證 kubelet 正常工作,你必須禁用交換分區(qū)。
禁用交換分區(qū)使用命令
swapoff -a
但是重啟機(jī)器后會失效,如果需要永久關(guān)閉需要編輯文件
vi /etc/fstab
在里面注釋掉最后一行(應(yīng)該有swap字樣,大概長這樣/dev/mapper/cl-swap swap swap defaults 0 0),如果不含swap那就還是別亂注釋,每次開機(jī)運(yùn)行上面的命令關(guān)一下吧。
配置國內(nèi)鏡像(僅amd64架構(gòu),如果是arm架構(gòu)的不要更改鏡像)
首先使用以下命令進(jìn)入root用戶。
sudo su
先把原來的軟件源備份一下
cp /etc/apt/sources.list /etc/apt/sources.list.bak
然后輸入以下命令配置清華源鏡像(適用于20.04版本的Ubuntu,其它版本可以去清華源鏡像官網(wǎng)查看)
echo "# 默認(rèn)注釋了源碼鏡像以提高 apt update 速度,如有需要可自行取消注釋
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse
# 預(yù)發(fā)布軟件源,不建議啟用
# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse" > /etc/apt/sources.list
然后執(zhí)行更新
apt update
安裝docker
這一步很簡單,只要輸入docker,就會提示安裝docker的命令。
使用
sudo apt install docker.io
安裝K8s
安裝K8s一般使用kubeadm,官方文檔:
kubeadm官方文檔
官方文檔中給出的安裝命令如下:
#請不要使用這段代碼!
sudo apt-get update && sudo apt-get install -y apt-transport-https
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee -a /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
sudo apt-get install -y kubectl
但是官方文檔在國內(nèi)網(wǎng)絡(luò)環(huán)境下并不適用,請使用以下代碼:
第一步是安裝https
sudo apt-get update && sudo apt-get install -y apt-transport-https
但是,由于國內(nèi)網(wǎng)絡(luò)原因,無法連接Google,很可能第二步會卡死。
這里可以使用阿里云的鏡像,把第二步的命令改為:
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
如果這里出錯可能是你沒有安裝curl,先
apt install curl
然后運(yùn)行:
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
修改完這個list文件后,更新一下apt-get的配置
apt-get update
下面這句就是安裝kubelet,kubeadm,kubectl三個k8s的核心組件
# 如果需要指定版本,使用下一段的命令,此命令是默認(rèn)安裝最新版
apt-get install kubelet kubeadm kubectl
如果需要指定老版本,可以通過=<版本號>來指定版本,如下:
# 需要指定版本才使用下面的命令
apt install kubelet=1.22.15-00 kubectl=1.22.15-00 kubeadm=1.22.15-00
至此,kubelet,kubeadm和kubectl就安裝成功了。
初始化Master節(jié)點(diǎn)
在準(zhǔn)備工作全部完成后,就可以在主節(jié)點(diǎn)上使用kubeadm init命令,不過這里還要加三個參數(shù),–image-repository指定了阿里云鏡像,–pod-network-cidr指明pod網(wǎng)絡(luò)可以使用的IP地址段。如果設(shè)置了這個參數(shù),控制平面將會為每一個節(jié)點(diǎn)自動分配CIDRs,–kubernetes-version指明k8s的版本:
kubeadm init --image-repository=registry.aliyuncs.com/google_containers --pod-network-cidr=10.244.0.0/16 --kubernetes-version=v1.22.15
我這里出現(xiàn)了等待條件超時的錯誤:
解決方法是vim創(chuàng)建一個文件/etc/docker/daemon.json
,里面輸入
{
"exec-opts": ["native.cgroupdriver=systemd"]
}
把docker的驅(qū)動配置為systemd,然后重啟docker和kubelet:
sudo systemctl daemon-reload
sudo systemctl restart docker
sudo systemctl restart kubelet
再運(yùn)行kubeadm reset
和剛剛的kubeadm init --image-repository=registry.aliyuncs.com/google_containers --pod-network-cidr=10.244.0.0/16 --kubernetes-version=v1.22.15
就成功了
成功之后會提示運(yùn)行這三條命令:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
在root用戶和普通用戶下都要運(yùn)行一遍,然后就配置成功了。
如果是root用戶還可以執(zhí)行一條
export KUBECONFIG=/etc/kubernetes/admin.conf
網(wǎng)絡(luò)插件安裝
k8s支持的網(wǎng)絡(luò)插件: https://kubernetes.io/docs/concepts/cluster-administration/addons/
我們使用flannel插件,但是由于kubeedge和網(wǎng)絡(luò)插件不兼容,所以需要親和性配置。
首先下載flannel插件的配置文件:
wget https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
下載下來后,復(fù)制一份kube-flannel-cloud.yaml
修改其中:
在93行左右改名為kube-flannel-cloud-ds
在118行左右添加:
- key: node-role.kubernetes.io/agent
operator: DoesNotExist
然后再應(yīng)用該配置文件:
kubectl apply -f kube-flannel-cloud.yml
過段時間后查看node狀態(tài)可以看到master已經(jīng)ready:
再復(fù)制一份kube-flannel-edge.yaml
修改其中:
93行改名為kube-flannel-edge-ds
118行左右添加:
- key: node-role.kubernetes.io/agent
operator: Exists
并且我的邊緣節(jié)點(diǎn)架構(gòu)是arm64,所以也修改了一下
在161行左右添加一行參數(shù):
- --kube-api-url=http://127.0.0.1:10550
然后再應(yīng)用該配置文件:
kubectl apply -f kube-flannel-edge.yml
部署可視化KuBoard
Kuboard官網(wǎng)
提供的命令如下:
kubectl apply -f https://addons.kuboard.cn/kuboard/kuboard-v3.yaml
部署完成后,進(jìn)入30080端口可以看到這個命令,運(yùn)行
curl -k 'http://192.168.31.209:30080/kuboard-api/cluster/default/kind/KubernetesCluster/default/resource/installAgentToKubernetes?token=mFUwzGqKRFgHrT2rj328UeCZKjs0qrUW' > kuboard-agent.yaml
kubectl apply -f ./kuboard-agent.yaml
然后就可以看到集群信息了
Cloud節(jié)點(diǎn)配置
進(jìn)入GitHub的release頁面復(fù)制keadm的下載地址,使用wget命令下載:
wget https://github.com/kubeedge/kubeedge/releases/download/v1.12.0/keadm-v1.12.0-linux-amd64.tar.gz
解壓下載好的文件
tar -zxvf keadm-v1.12.0-linux-amd64.tar.gz
然后進(jìn)入解壓后的目錄
cd keadm-v1.12.0-linux-amd64/keadm/
然后運(yùn)行下面的會出現(xiàn)問題,先不要運(yùn)行
后面的參數(shù)是啟用cloudCore的dynamicController
# 先不要運(yùn)行,會出現(xiàn)問題,往下看
# ./keadm init --set cloudCore.modules.dynamicController.enable=true
出現(xiàn)問題:
execute keadm command failed: timed out waiting for the condition
是因?yàn)閏loudcore沒有污點(diǎn)容忍,默認(rèn)master節(jié)點(diǎn)是不部署應(yīng)用的,可以用下面的命令查看污點(diǎn):
kubectl describe nodes master2015 | grep Taints
把master的污點(diǎn)刪掉
kubectl taint node master2015 node-role.kubernetes.io/master-
然后
./keadm reset
./keadm init --set cloudCore.modules.dynamicController.enable=true
CloudCore成功啟動。
查看kubeedge命名空間里的pods,可以看到cloudcore成功運(yùn)行。
使用
./keadm gettoken
獲取token
Edge節(jié)點(diǎn)配置
下載keadm,與上面Master的下載方法相同,解壓完成后進(jìn)入目錄(我這里是arm,你們的目錄不一定一樣)
cd keadm-v1.12.0-linux-arm64/keadm/
需要運(yùn)行:(<ip>是master的ip,<token>就是上面獲取的token)
./keadm join --cloudcore-ipport=<ip>:10000 --token=<token>
我這里是:
./keadm join --cloudcore-ipport=192.168.31.209:10000 --token=d593d53f0d1294c1088e8f3700dedc842fc9d276a0ab472397fdc5634463c921.eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2Njc1NDMyNzl9.pdVbe-jpHXKcjiM9iIq-Rj6mS4_m6xyp7v2_fP8nXiA
在Master上驗(yàn)證是否成功,使用
kubectl get nodes -o wide
如果出現(xiàn)版本中帶有kubeedge的node,則說明部署成功。
如果去主節(jié)點(diǎn)看還是沒有,可以看日志尋找問題,見最后一章問題排查
修改EdgeCore配置
為了讓flannel能夠訪問到 http://127.0.0.1:10550,我們需要配置EdgeCore的metaServer功能,在邊緣節(jié)點(diǎn)上修改:
vim /etc/kubeedge/config/edgecore.yaml
在161行左右配置為true
然后重啟一下edgecore:
service edgecore restart
問題排查
查看edgecore的日志:
journalctl -u edgecore.service -xe
我第一次失敗的原因是Docker中Cgroup Driver的問題,因?yàn)閗ubeedge的默認(rèn)驅(qū)動為cgroupfs,而我的docker以前把默認(rèn)驅(qū)動改成了systemd,所以無法啟動。
一種解決方法是修改/etc/docker/daemon.json
,把 "exec-opts": ["native.cgroupdriver=systemd"]
刪掉(不要把大括號刪掉,不然docker無法啟動),重啟docker
systemctl daemon-reload
systemctl restart docker
另一種解決方法是使用命令
./keadm join --help
可以看到幫助中提到:
可以運(yùn)行join命令時指定該參數(shù)為systemd
如果重新join時,可能會提示要刪除/etc/kubeedge目錄,如果提示mqtt容器已經(jīng)存在之類的問題,可以
1、殺死運(yùn)行的容器:
docker kill $(docker ps -a -q)
2、刪除所有容器:文章來源:http://www.zghlxwxcb.cn/news/detail-416877.html
docker rm $(docker ps -a -q)
最后再執(zhí)行join命令,運(yùn)行成功:文章來源地址http://www.zghlxwxcb.cn/news/detail-416877.html
到了這里,關(guān)于KubeEdge環(huán)境搭建(支持網(wǎng)絡(luò)插件flannel)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!