By:趙開恩
Date:2022年9月10日中秋節北京家中整理
截至2022年9月9日,終于完成k8s叢集的初步搭建,整個過程可以說是踩坑不少,踩坑的主要原因總結起來有兩個,一個是k8s有很多預設需要從國外鏡像源下載下傳鏡像的地方,而由于衆所周知gfw的存在,即使配置了國内鏡像源,很多時候也需要對鏡像進行tag才能解決問題;第二個問題是本人部署的筆記本是macbook m1的cpu,基于arm64架構,不同于伺服器領域主流的x86架構,初次接觸的人使用安裝包的時候可能會遇到一些問題,下面詳細說明下安裝部署過程,目标是全網最詳盡的k8s安裝示例。
一、部署環境
二、準備工作
1、目标描述
在macbook m1 pro筆記本上部署一個由三個虛拟機節點組成的k8s叢集,網絡元件采用calico,使用k8s官方可視化元件kubernetes dashboard管理叢集,私有容器倉庫采用harbor。
2、準備虛拟機
(1)下載下傳ubuntu20.04的作業系統ISO,本人使用的是macbook m1 pro,是以需要下載下傳對應的arm64的版本,官方下載下傳位址如下:
https://cdimage.ubuntu.com/releases/20.04/release/ubuntu-20.04.4-live-server-arm64.iso
(2)使用vmware fusion tech preivew安裝ubuntu虛拟機,配置成靜态IP位址,使用橋接網絡模式便于虛拟機上網。
(3)注意:必須使用此版本的vmware軟體才能支援在arm64架構上安裝虛拟機,virtualbox暫時不支援arm64架構的作業系統,是以不能選用,parallel desktop很順滑,但是需要花錢,土豪可入,本着免費不花錢的精神,是以使用了此版本的vmware。
3、網絡準備
以下是在本人所在區域網路内部署的k8s主節點的網絡設定
圖1、虛拟機網絡設定
主要是三個地方需要配置:
(1)/etc/netplan下的00-installer-config.yaml檔案配置靜态網絡IP位址、網關、掩碼、DNS等
(2)/etc/hostname檔案配置主機名稱
(3)/etc/hosts配置主機名與Ip的映射
配置完後記得執行netplan apply的指令使得配置生效。
4、配置ubuntu的apt源
試用了阿裡雲、清華大學和華為雲的源,還是華為的源對arm64的支援比較好用,配置如下:
圖2、配置華為apt源
文字内容如下:
deb https://repo.huaweicloud.com/ubuntu-ports/ bionic main restricted universe multiverse
deb-src https://repo.huaweicloud.com/ubuntu-ports/ bionic main restricted universe multiverse
deb https://repo.huaweicloud.com/ubuntu-ports/ bionic-security main restricted universe multiverse
deb-src https://repo.huaweicloud.com/ubuntu-ports/ bionic-security main restricted universe multiverse
deb https://repo.huaweicloud.com/ubuntu-ports/ bionic-updates main restricted universe multiverse
deb-src https://repo.huaweicloud.com/ubuntu-ports/ bionic-updates main restricted universe multiverse
deb https://repo.huaweicloud.com/ubuntu-ports/ bionic-backports main restricted universe multiverse
deb-src https://repo.huaweicloud.com/ubuntu-ports/ bionic-backports main restricted universe multiverse
##Not recommended
#deb https://repo.huaweicloud.com/ubuntu-ports/ bionic-proposed main restricted universe multiverse
#deb-src https://repo.huaweicloud.com/ubuntu-ports/ bionic-proposed main restricted universe multiverse
華為雲官方位址:https://mirrors.huaweicloud.com/home
圖3、華為port鏡像位址
因為本人使用的mac m1 的arm架構,是以選擇ubuntu-ports鏡像。配置完成源後,執行:
apt update
apt upgrade
兩個指令,完成源的更新與配置。
5、安裝docker
ubuntu已經提供了Docker的安裝包,直接安裝即可:
sudo apt install docker-io
sudo systemctl start docker
sudo systemctl enable docker
這裡安裝主要遇到的問題是重新開機虛拟機之後,執行docker 指令報無法識别的指令,執行systemctl start docker,報:
圖4、docker啟動問題
針對該問題,網上所說的執行如下指令:
systemctl unmask docker.service
systemctl unmask docker.socket
執行完後直接把 / lib/ systemd/ system下面的docker.service和docker.socket删掉了,但并不能解決問題。
本人實驗後的解決方案如下:
先解除安裝docker,執行:
dpkg -l | grep docker
再執行:
sudo apt remove --purge docker.io
如下:
圖5、解決docker安裝問題
再重新安裝docker:
sudo apt install docker.io
圖6、重新安裝docker
再重新開機,docker也不會出問題了,具體原因不明。
6、配置docker國内鏡像源并提前pull鏡像
這一步是非常關鍵的一步,如果這一步沒有配置好,後邊安裝導緻大量問題,浪費大量時間,理論上最好的辦法是找到k8s叢集部署過程中預設的下載下傳docker.io、k8s.io 、 k8s.gcr.io的配置,将其變更成國内的鏡像源,但是本人在部署過程中尚未找到準确的配置的地方,時間所限,後續會繼續研究再補充到這一節,為了簡化大家的時間,我将部署過程中處理鏡像源的下載下傳整理成了自動化腳本,可以 很大程度上減輕大家的部署難度,具體如下:
##by zhaokaien 20220905
#本腳本用于解決部署k8s叢集部署過程中無法下載下傳外網鏡像導緻部署叢集異常的問題
mirror_source1=registry.aliyuncs.com/google_containers
mirror_source2=registry.aliyuncs.com/k8sxio
namespace1=docker.io
namespace2=k8s.gcr.io
namespace3=quay.io
namespace4=k8s.io
kube_version=v1.24.4
pause_version1=3.5
pause_version2=3.7
etcd_version1=3.5.3-0
coredns_version=v1.8.6
tigera_operator_version=v1.28.0
calico_version=v3.24.1
harbor_address=10.122.128.58/library/google_containers
harbor_project=10.122.128.58/library
harbor_ip=10.122.128.58
#一、解決k8s叢集部署問題
#1、登入harbor私有鏡像倉庫
docker login 10.122.128.58 -u admin -p Harbor12345
#2、對于kube系列容器具有版本一緻性,采用循環解決
k8s_imgs=(
kube-apiserver
kube-proxy
kube-controller-manager
kube-scheduler
)
for k8s_img in ${k8s_imgs[@]}
do
#(1)使用docker指令pull kube系列容器并打上tag便于部署識别
docker pull $mirror_source1/$k8s_img:$kube_version
docker tag $mirror_source1/$k8s_img:$kube_version k8s.io/$k8s_img:$kube_version
docker tag $mirror_source1/$k8s_img:$kube_version k8s.gcr.io/$k8s_img:$kube_version
#(2)将從外網pull到的容器push到私有的harbor倉庫
docker tag $mirror_source1/$k8s_img:$kube_version $harbor_address/$k8s_img:$kube_version
docker push $harbor_address/$k8s_img:$kube_version
#(3)使用ctr指令從私有倉庫pull kube系列容器并打上tag便于部署識别
ctr -n k8s.io image pull $harbor_address/$k8s_img:$kube_version --skip-verify
ctr -n k8s.io image tag $harbor_address/$k8s_img:$kube_version k8s.io/$k8s_img:$kube_version
ctr -n k8s.io image tag $harbor_address/$k8s_img:$kube_version k8s.gcr.io/$k8s_img:$kube_version
done
#3、解決pause3.5版本容器問題,先pull打标簽,然後再推送到私有倉庫
docker pull $mirror_source1/pause:$pause_version1
docker tag $mirror_source1/pause:$pause_version1 k8s.io/pause:$pause_version1
docker tag $mirror_source1/pause:$pause_version1 $harbor_address/pause:$pause_version1
docker push $harbor_address/pause:$pause_version1
ctr -n k8s.io image pull $harbor_address/pause:$pause_version1 --skip-verify
ctr -n k8s.io image tag $harbor_address/pause:$pause_version1 k8s.io/pause:$pause_version1
ctr -n k8s.io image tag $harbor_address/pause:$pause_version1 k8s.gcr.io/pause:$pause_version1
#4、解決pause3.7版本容器問題,先pull打标簽,然後再推送到私有倉庫
docker pull $mirror_source1/pause:$pause_version2
docker tag $mirror_source1/pause:$pause_version2 k8s.io/pause:$pause_version2
docker tag $mirror_source1/pause:$pause_version2 $harbor_address/pause:$pause_version2
docker push $harbor_address/pause:$pause_version2
ctr -n k8s.io image pull $harbor_address/pause:$pause_version2 --skip-verify
ctr -n k8s.io image tag $harbor_address/pause:$pause_version2 k8s.io/pause:$pause_version1
ctr -n k8s.io image tag $harbor_address/pause:$pause_version2 k8s.gcr.io/pause:$pause_version1
#5、解決corednsv1.8.6容器問題,先pull打标簽,然後再推送到私有倉庫
docker pull $mirror_source1/coredns:$coredns_version
docker tag $mirror_source1/coredns:$coredns_version coredns/coredns:$coredns_version
docker tag $mirror_source1/coredns:$coredns_version $harbor_address/coredns:$coredns_version
docker push $harbor_address/coredns:$coredns_version
ctr -n k8s.io image pull $harbor_address/coredns:$coredns_version --skip-verify
ctr -n k8s.io image tag $harbor_address/coredns:$pause_version2 coredns/coredns:$coredns_version
#6、解決etcd3.5.3-0容器問題,先pull打标簽,然後再推送到私有倉庫
docker pull $mirror_source1/etcd:$etcd_version1
docker tag $mirror_source1/etcd:$etcd_version1 k8s.io/etcd:$etcd_version1
docker tag $mirror_source1/etcd:$etcd_version1 $harbor_address/etcd:$etcd_version1
docker push $harbor_address/etcd:$etcd_version1
ctr -n k8s.io image pull $harbor_address/etcd:$etcd_version1 --skip-verify
ctr -n k8s.io image tag $harbor_address/etcd:$etcd_version1 k8s.io/etcd:$etcd_version1
ctr -n k8s.io image tag $harbor_address/etcd:$etcd_version1 k8s.gcr.io/etcd:$etcd_version1
#二、解決calico網絡部署問題
#1、對于calico系列容器具有版本一緻性,采用循環解決
calico_imgs=(
node
pod2daemon-flexvol
cni
kube-controllers
typha
)
for calico_img in ${calico_imgs[@]}
do
#(1)使用docker指令pull calico系列容器并打上tag并推送到私有倉庫
docker pull calico/$calico_img:$calico_version
#(2)将從外網pull到的calico容器push到私有的harbor倉庫
docker tag calico/$calico_img:$calico_version $harbor_project/calico/$calico_img:$calico_version
docker push $harbor_project/calico/$calico_img:$calico_version
#(3)使用ctr指令從私有倉庫pull calico系列容器并打上tag便于部署識别
ctr -n docker.io image pull $harbor_project/calico/$calico_img:$calico_version --skip-verify
ctr -n docker.io image tag $harbor_project/calico/$calico_img:$calico_version docker.io/calico/$calico_img:$calico_version
done
#2、處理tigera_operator容器問題
docker pull quay.io/tigera/operator:$tigera_operator_version
docker tag quay.io/tigera/operator:$tigera_operator_version $harbor_project/tigera/operator:$tigera_operator_version
docker push $harbor_project/tigera/operator:$tigera_operator_version
ctr -n quay.io image pull $harbor_project/tigera/operator:$tigera_operator_version --skip-verify
ctr -n quay.io image tag $harbor_project/tigera/operator:$tigera_operator_version quay.io/tigera/operator:$tigera_operator_version
#三、解決kubernetes dashboard的問題
kube_ui_version=v2.6.1
kube_metrics_version=v1.0.8
docker pull kubernetesui/dashboard:$kube_ui_version
docker tag kubernetesui/dashboard:$kube_ui_version $harbor_project/kubernetesui/dashboard:$kube_ui_version
docker push $harbor_project/kubernetesui/dashboard:$kube_ui_version
ctr -n docker.io images pull $harbor_project/kubernetesui/dashboard:$kube_ui_version --skip-verify
ctr -n docker.io images tag $harbor_project/kubernetesui/dashboard:$kube_ui_version docker.io/kubernetesui/dashboard:$kube_ui_version
docker pull kubernetesui/metrics-scraper:$kube_metrics_version
docker tag kubernetesui/metrics-scraper:$kube_metrics_version $harbor_project/kubernetesui/metrics-scraper:$kube_metrics_version
docker push $harbor_project/kubernetesui/metrics-scraper:$kube_metrics_version
ctr -n docker.io images pull $harbor_project/kubernetesui/metrics-scraper:$kube_metrics_version --skip-verify
ctr -n docker.io images tag $harbor_project/kubernetesui/metrics-scraper:$kube_metrics_version docker.io/kubernetesui/metrics-scraper:$kube_metrics_version
需要注意的是主從節點都要執行該腳本。
7、預設鏡像修改探索
以下設定并不成熟,供參考:
(1)在初始化的時候加上參數:
--pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.7;
(2)在kubeadm-flags中可以檢視registry
cat /var/lib/kubelet/kubeadm-flags.env #檢視環境變量的registry
8、修改時區
先執行指令:date看看是否時間日期顯示的最後是UTC,如果是說明使用的是美國時區,需要修正,執行以下指令:
sudo timedatectl set-timezone Asia/Shanghai
然後再次執行date檢視時間日期最後是否變成了CST。最後為了使得系統日志的時間戳也立即生效,需要執行一下指令重新開機rsyslog:
sudo systemctl restart rsyslog
9、設定核心參數
br_netfilter子產品用于将橋接流量轉發至iptables鍊。執行如下語句安裝br_netfilter子產品:
sudo apt-get install bridge-utils
sudo modprobe br_netfilter
執行
lsmod | grep br_netfilter
sudo sysctl -a | grep bridge
檢視是否已經安裝完畢。
圖7、檢視br_netfilter是否安裝
需要注意的是重新開機之後可能需要重新執行sudo modprobe br_netfilter進行加載。
10、修改rp_filter
如果後期需要部署calico網絡插件的話,需要rp_filter這個核心參數是0或者1,但是Ubuntu20.04上預設是2,需要修改/ etc/ sysctl.d / 10-network-security.conf檔案,修改如下:
圖8、修改rp_filter
然後執行 sudo sysctl --system使得配置生效。
11、安裝kubeadm、kubelet、kubectl三個核心元件
這裡首先要解決源的問題,之前的apt源使用了華為的源,是以這裡也需要使用華為的kubenetes源來安裝,執行如下指令:
#先安裝部分元件
sudo apt-get install ca-certificates curl software-properties-common apt-transport-https
#擷取gpg
curl -s https://repo.huaweicloud.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -
#在/etc/apt/sources.list.d目錄下建立kubernetes.list檔案,内容如下:
deb https://repo.huaweicloud.com/kubernetes/apt/ kubernetes-xenial main
#重新整理軟體清單
apt-get update
#開始安裝元件
apt-get install kubelet kubeadm kubectl
安裝的過程中如下一些問題:
(1)報缺少ebtables的依賴
kubelet : Depends: ebtables but it is not going to be installed
缺啥就裝下:
apt-get install ebtables
(2)版本不相容
kubelet : Depends: iptables (>= 1.4.21)
執行:apt-get upgrade iptables
又報如下問題:
iptables : Depends: libip4tc0 (= 1.6.1-2ubuntu2) but it is not going to be installed
Depends: libip6tc0 (= 1.6.1-2ubuntu2) but it is not going to be installed
Depends: libiptc0 (= 1.6.1-2ubuntu2) but it is not going to be installed
Depends: libxtables12 (= 1.6.1-2ubuntu2) but 1.8.4-3ubuntu2 is to be installed
執行:apt-get install libxtables12=1.6.1-2ubuntu2
# 這裡報錯更高版本的包已經裝過了,這是一個坑點,千萬不要解除安裝這個更高版本1.8.4-3ubuntu2的包,解除安裝會報廢系統,直接安裝1.6.1-2ubuntu2版本的包,然後遞歸向上更新即可。安裝完成後再執行:apt-get upgrade iptables即可。
最後再執行:
apt-get install kubelet kubeadm kubectl
順利完成kubenete核心元件的安裝。
安裝完這三個核心組建後執行:
apt-mark hold kubelet kubeadm kubectl
用于将三個元件的軟體包标記為保留,以防止軟體包被自動安裝、更新或删除。以後需要更新的時候執行 apt-mark unhold 選項用于取消先前面的設定。
12、關閉swap
有說新版本的不需要關閉這個,實際情況是還是關掉好。
sudo swapoff -a
vi / etc/ fstab 注釋掉swap那行
圖9、關閉swap
13、配置NTP同步
apt install ntpdate
ntpdate ntp.ntsc.ac.cn
hwclock(檢視時間)
14、關閉selinux和防火牆(可選)
setenforce 0 #關閉selinux
systemctl disable firewalld.service
三、建構叢集
1、克隆虛拟機
至此,由于以上的過程需要在所有叢集的節點上重複進行,是以可以先在一個虛拟機上安裝以上過程,然後到這裡開始對這個虛拟機進行克隆,這樣免除在每一台伺服器上進行以上操作了:
圖10、克隆虛拟機
注意:務必使用建立完整克隆。
克隆完的虛拟機記得修改網絡IP位址(修改/etc/netplan下的檔案)、變更hostname(修改/etc/hostname,/etc/hosts 檔案),檢查克隆的虛拟機的mac位址和UUID(UUID号所在路徑/sys/class/dmi/id/product_uuid)保證都是不相同的。最後執行netplan apply,然後重新開機伺服器,保證叢集中各節點網絡是通的,通路主控端網絡是通的,通路網際網路網絡是通暢的。這樣叢集節點就都準備好了。
2、配置k8s叢集master節點
由于本人部署的是k8s較新的版本1.24.4,是以此處不能按網上大多數方式執行如下指令:
sudo kubeadm init --pod-network-cidr 172.16.0.0/16 \
--image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \
--apiserver-advertise-address 172.20.20.200 \
--apiserver-bind-port 6443
使用以上指令行在1.22+版本以上的kubenetes上部署都會失敗,沒有試過。
本人采用的解決辦法是使用配置檔案方式進行叢集的初始化:sudo kubeadm init --config kubeadm-config.yaml。首先執行kubeadm config print init-defaults 可以生成預設配置文檔,在預設基礎上修改符合自己要求的kubeadm-config.yaml檔案,如下:
apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: abcdef.0123456789abcdef
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 10.122.128.58
controllerManager:
extraArgs:
"node-cidr-mask-size-ipv4": "23"
bindPort: 6443
nodeRegistration:
criSocket: unix:///var/run/containerd/containerd.sock
imagePullPolicy: IfNotPresent
name: master
taints: null
---
apiServer:
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: k8sCluster1
controllerManager: {}
dns: {}
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: 1.24.0
networking:
dnsDomain: cluster.local
serviceSubnet: 10.96.0.0/12
scheduler: {}
---
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
cgroupDriver: systemd
相對于預設的yaml檔案主要修改了如下圖所示紅框内的内容:
圖11、修改kubeadm-config.yaml配置檔案
圖12、主節點安裝成功界面
看到上述圖檔所示界面表示master安裝成功,緊接着接着按照上面的說明訓示建立相應的檔案夾:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
export KUBECONFIG=/etc/kubernetes/admin.conf
這樣master節點配置完畢。
3、配置叢集worker節點
worker節點的配置要簡單很多,要将 worker 節點加入叢集,執行如下指令即可:
kubeadm join 10.122.128.58:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:6d63ce3ab0e5eca2546bac5db05c9ec8bb8d98f0430abf127355b910413a5263
這條指令有有效期,過期後在master上執行如下指令重新擷取:
kubeadm token create --print-join-command
在worker節點執行上面語句後,傳回如下所示資訊表示worker節點添加成功:
圖13、worker節點安裝成功界面
至此,叢集部署完畢,執行如下指令檢視叢集狀态:
圖14、擷取叢集資訊
圖15、擷取叢集各節點狀态
4、複用master節點虛拟機重新建構一個叢集
因為家裡網絡和公司不一緻,是以在家裡也部署了一套叢集,具體步驟如下:
1、先拷貝一個master節點虛拟機
2、在master節點上執行
kubectl delete nodes worker1
kubectl delete nodes worker2
3、執行kubeadm reset -f
4、删除$HOME/.kube檔案夾
5、修改/ etc/ netplan下的00-installer-config.yaml檔案中的IP位址與家裡區域網路段一緻
6、修改/ etc / hosts檔案中的ip位址
執行netplan apply使得網絡生效,确認伺服器已經加入到家裡的區域網路中
7、重新執行kubeadm init --config /home /zhaokaien / kubeadm-config.yaml
mkdir -p $HOME/.kube
cp -i /etc /kubenetes / admin.conf $HOME/ .kube /config
chown $(id -u):$(id -g) $HOME/.kube/config
export KUBECONFIG=/etc /kubenetes / admin.conf
具體步驟如下圖:
圖16、重新部署叢集操作
8、重新克隆worker節點虛拟機,與master節點一樣修改網絡設定和hosts檔案,執行netplan apply使網絡生效
9、再将worker節點重新加入叢集,在設定好網絡的worker節點上執行:
kubeadm reset -f
再在master節點上執行:
kubeadm token create --print-join-command
最後在worker節點上執行:
kubeadm join 192.168.31.66:6443 --token hwhxck.w6xzsa1uarsrcucl --discovery-token-ca-cert-hash sha256:1a748992c52b902c705b2610d42158a7ccb817f2bbdb6c52d698648b3075873a
則完成建立叢集的工作。
圖17、重新部署叢集成功
5、去除taint允許主節點部署pods
污點taint主要是用來辨別k8s叢集中哪些節點适合部署特定pod,哪些不适合部署特定pod,它與tolerent是一個相對的概念,如果需要去除主節點上的taint執行如下指令即可:
kubectl taint nodes --all node-role.kubernetes.io/master-
不去除污點,master節點的kube-controller-manager-master會報crashloopbackoff的問題。可以使用kubectl describe node master來檢視master節點的污點設定。
不去除以下這個污點,master節點的kube-controller-manager-master會報ContainerCreating的異常
kubectl taint node master node.kubernetes.io/not-ready:NoSchedule-
類似的還可以使用以下指令去除如下污點:
kubectl taint node master node-role.kubernetes.io/control-plane:NoSchedule-
6、叢集部署回退
執行部署的過程中,如果出現問題可以随時執行:kubeadm reset -f來進行回退部署。需要注意的是有兩點,一是需要在主、從節點上都要執行該指令,二是注意及時手動清理主節點上的$HOME/.kube檔案夾。
7、碰到的主要問題
(1)master執行完init後卡死,然後逾時報異常
這種情況一般都是因為鏡像下載下傳問題導緻的,具體表現為執行kubeadm init --config=kubeadm-config.yaml後,卡死在如下階段:
[wait-control-plane] Waiting for the kubelet to boot up the control plane as static Pods from directory "/etc/kubernetes/manifests". This can take up to 4m0s
[kubelet-check] Initial timeout of 40s passed.
超過4m0s後,報錯。通過journalctl -f -u containerd看容器引擎的日志,發現:
failed, error" error="failed to get sandbox image \"k8s.gcr.io/pause:3.6\": failed to pull image \"k8s.gcr.io/pause:3.6\": failed to pull and unpack image \"k8s.gcr.io/pause:3.6\": failed to resolve reference \"k8s.gcr.io/pause:3.6\": failed to do request: Head \"https://k8s.gcr.io/v2/pause/manifests/3.6\": dial tcp 108.177.125.82:443: i/o timeout"
Jul 05 19:08:30 k8s-testing01-190 containerd[13788]: time="2022-07-05T19:08:30.696324518+08:00" level=info msg="trying next host" error="failed to do request: Head \"https://k8s.gcr.io/v2/pause/manifests/3.6\": dial tcp 108.177.125.82:443: i/o timeout" host=k8s.gcr.io
(這裡會無視kubelet的配置,如下指定了基礎設定image并沒用:--pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.7;kubeadm啟動control plane還是會使用k8s.gcr.io/pause:3.5)
還會報找不到master node,仔細檢視IP位址,hostname都沒有問題。最後通過如下方式進行了解決,執行如下指令:
ctr -n k8s.io images tag registry.aliyuncs.com/google_containers/pause:3.7 k8s.gcr.io/pause:3.5
然後重新初始化:
kubeadm reset -f
kubeadm init --config /home/zhaokaien/kubeadm-config.yaml
解決辦法參照的網址是:https://blog.csdn.net/avatar_2009/article/details/109601762
(2)Unable to connect to the server: x509: certificate signed by unknown authority (possibly because of "crypto/rsa: verification error" while trying to verify candidate authority certificate "kubernetes")
在部署過程中會頻繁使用kubeadm reset -f對主、從節點進行重置,有時候會沒有清理master上的$HOME/.kube檔案夾,部署的時候程式也會清晰提示:
The reset process does not clean your kubeconfig files and you must remove them manually.
Please, check the contents of the $HOME/.kube/config file
如果忽略清理這個檔案夾的話,會導緻從節點加入到叢集後無法通路master是以隻需要在每次reset之後将master 節點上的該檔案夾清理掉就可以了。
(3)The kubelet is unhealthy due to a misconfiguration of the node in some way (required cgroups disabled)
報這個錯的時候:
The kubelet is unhealthy due to a misconfiguration of the node in some way (required cgroups disabled)
解決辦法:在/ etc / docker / daemon.json檔案中增加如下一行:
圖18、修改docker的daemon.json檔案
然後執行
systemctl daemon-reload
systemctl restart docker
執行 docker system info | grep -i driver檢視driver是否已經由cgroups變成了systemd
圖18、檢視系統cgroup的driver
當然,很多時候init的時候卡在這裡,報這個錯并不是cgroup driver沒有被設定成systemd,而是因為鏡像下載下傳到的原因,隻要按照第二章第6節的操作解決鏡像問題,也就解決了此問題。
(4)解決kube-proxy總是處于container-createing狀态的問題
解決從節點上kube-proxy總是在kubectl get pods -n kube-system -o wide下顯示的時候總是處于container-createing狀态的問題:
cat /var/lib/kubelet/kubeadm-flags.env #檢視環境變量的registry
圖19、解決container-creating的問題-1
這種問題主要還是因為和外網不通(雖然配置了國内鏡像源,但這個地方還是不能完全解決),不能通路k8s.gcr.io下載下傳鏡像所導緻的問題,是以需要在所有節點執行如下指令:
ctr -n k8s.io i pull registry.aliyuncs.com/k8sxio/pause:3.7#下載下傳國内鏡像
ctr -n k8s.io i tag registry.aliyuncs.com/k8sxio/pause:3.7 k8s.gcr.io/pause:3.7#改名
ctr -n k8s.io i pull registry.aliyuncs.com/k8sxio/pause:3.5#下載下傳國内鏡像
ctr -n k8s.io i tag registry.aliyuncs.com/k8sxio/pause:3.5 k8s.gcr.io/pause:3.5#改名
ctr -n quay.io i tag tigera/operator:v1.28.0 quay.io/tigera/operator:v1.28.0
執行完後,很快就恢複了正常:
圖20、解決container-creating的問題-2
(5)找不到主節點的報錯:kubelet.go:2466] "Error getting node" err="node \"master\" not found"
首先檢查本機的/ etc / hosts中的主機名和ip的配置是否有誤,其次檢查kubeadm-config.yaml檔案中的advertise_ip是否外網IP,如是,改成内網試試,最後檢查防火牆設定,在 / etc / sysctl.conf檔案中添加如下内容:
圖21、解決找不到主節點的問題
再執行sysctl -p
四、配置Calico網絡插件
1、關于calico網絡插件的理論知識
簡而言之,calico插件主要作用就是是的k8s叢集中的所有pod之間可以進行自由通信,其主要架構如下:
圖22、calico架構圖1
圖23、calico架構圖2
圖24、calicoIPIP網絡
圖25、calicoBGP網絡
很好的說明文檔:
https://blog.frognew.com/2021/07/relearning-container-22.html
https://system51.github.io/2020/05/27/using-calico/
官網:https://www.tigera.io/project-calico/#
官方文檔說明:
https://projectcalico.docs.tigera.io/networking/determine-best-networking
安裝calico的必要條件:
https://projectcalico.docs.tigera.io/getting-started/kubernetes/requirements
2、calico部署的環境需求
我們部署使用的是calico3.24.1,這裡就直接截取官方需求了,如下:
圖26、安裝calicoNODE必須條件
圖27、安裝calicoKubernetes必須條件
圖28、安裝calico應用層元件必須條件
3、使用tigera-operator的方式安裝部署
calico的安裝部署方式非常多,官方安裝介紹首頁:
https://projectcalico.docs.tigera.io/getting-started/kubernetes/
官方推薦采用tigera-operator方式進行安裝,這個過程中主要踩坑的也是因為所需鏡像都在國外,部署過程不能按照預設的配置自動下載下傳鏡像,是以導緻過程中充滿了坑。為了避免踩坑,需要先提前下載下傳鏡像并配置docker鏡像源,以下内容也可以直接執行第二章第6節的腳本解決。
(1)準備鏡像
先pull鏡像:
docker pull calico/node:v3.24.1
docker pull calico/pod2daemon-flexvol:v3.24.1
docker pull calico/cni:v3.24.1
docker pull calico/kube-controllers:v3.24.1
docker pull calico/typha:v3.24.1
docker pull quay.io/tigera/operator:v1.28.0
再push到harbor倉庫:
docker login 10.122.128.58 -u admin -p Harbor12345
docker tag calico/typha:v3.24.1 10.122.128.58/library/calico/typha:v3.24.1
docker push 10.122.128.58/library/calico/typha:v3.24.1
docker tag calico/kube-controllers:v3.24.1 10.122.128.58/library/calico/kube-controllers:v3.24.1
docker push 10.122.128.58/library/calico/kube-controllers:v3.24.1
docker tag calico/cni:v3.24.1 10.122.128.58/library/calico/cni:v3.24.1
docker push 10.122.128.58/library/calico/cni:v3.24.1
docker tag calico/pod2daemon-flexvol:v3.24.1 10.122.128.58/library/calico/pod2daemon-flexvol:v3.24.1
docker push 10.122.128.58/library/calico/pod2daemon-flexvol:v3.24.1
docker tag calico/node:v3.24.1 10.122.128.58/library/calico/node:v3.24.1
docker push 10.122.128.58/library/calico/node:v3.24.1
docker tag quay.io/tigera/operator:v1.28.0 10.122.128.58/library/tigera/operator:v1.28.0
docker push 10.122.128.58/library/tigera/operator:v1.28.0
以下代碼無效,原因不明 加了docker就不行,可能是需要對docker轉義
#docker tag calico/typha:v3.24.1 docker.io/calico/typha:v3.24.1
#docker tag calico/kube-controllers:v3.24.1 docker.io/calico/kube-controllers:v3.24.1
#docker tag calico/cni:v3.24.1 docker.io/calico/cni:v3.24.1
#docker tag calico/pod2daemon-flexvol:v3.24.1 docker.io/calico/pod2daemon-flexvol:v3.24.1
#docker tag calico/node:v3.24.1 docker.io/calico/node:v3.24.1
#docker tag 192.168.31.66/library/tigera/operator:v1.28.0 quay.io/tigera/operator:v1.28.0
最後在主節點使用ctr pull私有庫鏡像,并改标簽名:
ctr -n docker.io images pull 192.168.31.66/library/calico/node:v3.24.1 --skip-verify
ctr -n docker.io images pull 192.168.31.66/library/calico/pod2daemon-flexvol:v3.24.1 --skip-verify
ctr -n docker.io images pull 192.168.31.66/library/calico/cni:v3.24.1 --skip-verify
ctr -n docker.io images pull 192.168.31.66/library/calico/kube-controllers:v3.24.1 --skip-verify
ctr -n docker.io images pull 192.168.31.66/library/calico/typha:v3.24.1 --skip-verify
ctr -n query.io images pull 192.168.31.66/library/tigera/operator:v1.28.0 --skip-verify
在從節點上執行類似操作:
編輯/etc/hosts,添加
192.168.31.66 master
ctr -n docker.io images pull -u admin:Harbor12345 192.168.31.66/library/calico/node:v3.24.1 --skip-verify
ctr -n docker.io images pull -u admin:Harbor12345 192.168.31.66/library/calico/pod2daemon-flexvol:v3.24.1 --skip-verify
ctr -n docker.io images pull -u admin:Harbor12345 192.168.31.66/library/calico/cni:v3.24.1 --skip-verify
ctr -n docker.io images pull -u admin:Harbor12345 192.168.31.66/library/calico/kube-controllers:v3.24.1 --skip-verify
ctr -n docker.io images pull -u admin:Harbor12345 192.168.31.66/library/calico/typha:v3.24.1 --skip-verify
ctr -n quay.io images pull -u admin:Harbor12345 192.168.31.66/library/tigera/operator:v1.28.0 --skip-verify
ctr -n docker.io i tag 192.168.31.66/library/calico/cni:v3.24.1 docker.io/calico/cni:v3.24.1
ctr -n docker.io i tag 192.168.31.66/library/calico/typha:v3.24.1 docker.io/calico/typha:v3.24.1
ctr -n docker.io i tag 192.168.31.66/library/calico/kube-controllers:v3.24.1 docker.io/calico/kube-controllers:v3.24.1
ctr -n docker.io i tag 192.168.31.66/library/calico/pod2daemon-flexvol:v3.24.1 docker.io/calico/pod2daemon-flexvol:v3.24.1
ctr -n docker.io i tag 192.168.31.66/library/calico/node:v3.24.1 docker.io/calico/node:v3.24.1
ctr -n quay.io i tag 192.168.31.66/library/tigera/operator:v1.28.0 quay.io/tigera/operator:v1.28.0
(2)使用tigera-operator安裝部署
官方使用tigera-operator方式安裝部署非常簡單,直接先執行:
kubectl create -f https://projectcalico.docs.tigera.io/manifests/tigera-operator.yaml
圖29、執行tigera-operator.yaml
kubectl create -f /home/zhaokaien/custom-resources.yaml
圖30、執行custom-resources.yaml
上面的兩個檔案都可以從官方網站下載下傳到,其中這兩個檔案需要進行如下一些修改才能執行:
修改tigera-operator.yaml檔案
圖31、修改tigera-operatoryaml
vi custom-resources.yaml
圖32、修改custom-resources.yaml-1
圖32、修改custom-resources.yaml-2
如果需要對初始化的網絡配置進行修改,可以執行如下語句:
kubectl edit cm kubeadm-config -n kube-system
圖33、修改kubeadm的初始化網絡配置
vi /etc/kubernetes/manifests/kube-controller-manager.yaml
圖33、修改kube-controller-manager.yaml檔案
檢視叢集網絡配置:
kubectl cluster-info dump | grep -m 1 cluster-cidr
圖34、檢視叢集的cidr設定
終于看到了勝利的曙光
圖35、叢集配置成功
4、使用calico.yaml部署
第二種方式是使用官方的calico.yaml檔案部署,先對calico.yaml檔案進行修改如下:
圖35、修改calico.yaml檔案-1
圖36、修改calico.yaml檔案-2
然後執行kubectl create -f calico.yaml即可完成網絡部署。
5、部署回退
執行過程發現有任何問題可以執行:
kubectl delete -f tigera-operator.yaml
kubectl delete -f customer-resources.yaml
或執行
kubectl delete -f calico.yaml
來分别對使用tigera-operator方式和使用calico.yaml方式進行部署的回退,然後再重新部署。
6、主要問題解決
(1)The CustomResourceDefinition "installations.operator.tigera.io" is invalid: metadata.annotations: Too long: must have at most 262144 bytes
這種情況主要發生在執行 kubectl apply -f 指令的過程中,實際上kubectl apply和kubectl create兩個指令執行的效果是差不多的,建議優先使用kubectl create指令執行,要撤回kubectl apply / create -f的結果,執行:
kubectl delete -f https://projectcalico.docs.tigera.io/manifests/tigera-operator.yaml 即可。
盡量不要執行kubectl apply -f,因為有些情況下會報上述的錯誤:The CustomResourceDefinition "xxx" is invalid: metadata.annotations: Too long: must have at most 262144 bytes的異常,再去删除namespace就比較費勁。
(2)namespaces删除的時候一直報terminating的問題
解決辦法如下:
1、執行kubectl get namespace -o json >tmp.json
2、編輯tmp.json, 将finalizers中的kubenetes清空
圖37、修改tmp.json檔案
3、在一個終端中啟動一個臨時的proxy
kubectl proxy
4、再開啟一個終端,執行如下語句:
curl -k -H "Content-Type: application/json" -X PUT --data-binary @tmp.json http://127.0.0.1:8001/api/v1/namespaces/tigera-operator/finalize
圖38、删除terminating的namespaces
5、再執行kubectl get namespace ,發現namespace已經删除了
删除terminating namespace的解決辦法參考網址:https://blog.csdn.net/qq_31977125/article/details/120303165
(3)calico/node is not ready: BIRD is not ready: BGP not established with
如果直接執行calico.yaml檔案,不做修改,則安裝成功後calico-node 報錯calico/node is not ready: BIRD is not ready: BGP not established with 報錯的解決辦法,修改如下:
圖39、修改calico.yaml檔案-3
圖40、修改calico.yaml檔案-4
(4)國外鏡像無法下載下傳的問題
解決國外鏡像無法下載下傳的問題參考如下兩個網址:
https://www.yixuebiancheng.com/article/97518.html
https://blog.csdn.net/liuyanwuyu/article/details/119296259
7、其他參考網址
https://juejin.cn/post/6867846255884632078
https://www.cnblogs.com/khtt/p/16563088.html
https://www.modb.pro/db/456425
https://projectcalico.docs.tigera.io/reference/node/configuration
https://docs.projectcalico.org/getting-started/kubernetes/installation/config-options
https://www.cnblogs.com/leozhanggg/p/12930006.html
https://projectcalico.docs.tigera.io/getting-started/kubernetes/self-managed-onprem/onpremises
https://projectcalico.docs.tigera.io/getting-started/kubernetes/helm
https://projectcalico.docs.tigera.io/getting-started/kubernetes/
https://tinychen.com/20220508-k8s-03-deploy-k8s-with-calico/
https://blog.csdn.net/weixin_40248198/article/details/124798342
https://system51.github.io/2020/05/27/using-calico/
https://projectcalico.docs.tigera.io/networking/determine-best-networking
https://projectcalico.docs.tigera.io/getting-started/kubernetes/quickstart
https://zhuanlan.zhihu.com/p/138554103
https://blog.csdn.net/weixin_36338224/article/details/122532922
https://github.com/goharbor/harbor/releases/tag/v2.6.0
https://github.com/docker/compose
https://blog.csdn.net/weixin_41923467/article/details/122121370
https://xie.infoq.cn/article/6f277393176e42abdc284ce4d
https://blog.csdn.net/liuyanwuyu/article/details/119296259 重要
https://www.jianshu.com/p/b8a4c5ccc92d
https://www.learnfk.com/articles/C16301622.html
https://www.teanote.pub/archives/287
五、安裝harbor v2.2.2私有倉庫
1、部署方法
先參考網址:https://blog.csdn.net/u010533742/article/details/121522093内容将harbor的git clone到本地,并切換到版本v2.2.2:
mkdir -p /data
git clone https://github.com/goharbor/harbor.git
cd harbor
git checkout -b v2.2.2 v2.2.2
這一步裡可能出現的主要問題是mac m1的情況下直接下載下傳官網的安裝包安裝會失敗,會報這樣的問題:
WARNING: The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested
是以需要基于arm的支援。
2、配置harbor的https
為了配置harbor的https,還需要執行如下步驟:
mkdir /data/ssl
cd /data/ssl
openssl genrsa -out ca.key 3072
openssl req -new -x509 -days 3650 -key ca.key -out ca.pem
openssl genrsa -out harbor.key 3072
openssl req -new -key harbor.key -out harbor.csr
openssl x509 -req -in harbor.csr -CA ca.pem -CAkey ca.key -CAcreateserial -out harbor.pem -days 3650
openssl x509 -noout -text -in harbor.pem
進而生成如下檔案:
圖41、生成的harbor證書檔案
這樣harbor.yml檔案修改的地方如下:
圖42、修改harbor.yaml檔案-1
圖43、修改harbor.yaml檔案-2
3、準備鏡像
下載下傳鏡像的腳本 download _images.sh内容如下:
namespace=cocl666
version=v2.2.2
imgs=(
redis-photon
harbor-db
harbor-jobservice
harbor-log
nginx-photon
registry-photon
harbor-registryctl
notary-signer-photon
notary-server-photon
trivy-adapter-photon
chartmuseum-photon
harbor-exporter
prepare
harbor-portal
harbor-core
)
for img in ${imgs[@]}
do
docker pull $namespace/$img:$version
docker tag $namespace/$img:$version goharbor/$img:$version
done
docker pull $namespace/swagger:v0.21.0
docker tag $namespace/swagger:v0.21.0 goharbor/swagger:v0.21.0
docker save `docker images | grep $version | awk '{print $1":"$2}'` goharbor/swagger:v0.21.0 | gzip > harbor.$version.tar.gz
部署過程中可能會有部分鏡像下載下傳失敗,如下:
error pulling image configuration: Get https://production.cloudflare.docker.com/registry-v2/docker/registry/v2/blobs/sha256/16/163245e857c91b0bbf1a8403624e70c97033701b3828ca080dda6c95acd6e482/data?verify=1662018912-DhMFuf4lWAnl7dOThEqWY4hWBCc%3D: dial tcp 104.18.122.25:443: i/o timeout
Error response from daemon: No such image: cocl666/harbor-core:v2.2.2
圖44、重複執行直到所有鏡像下載下傳完成
隻需要重新執行download_images.sh檔案就可以,直到image下載下傳成功後,就可以。
4、安裝docker-compose
curl -L "https://github.com/docker/compose/releases/download/v2.10.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose --version
5、開始安裝harbor
執行./install.sh --with-chartmuseum --with-trivy
# --with-chartmuseum 啟用helm倉庫
# --with-trivy 使用trivy安全掃描工具
圖45、安裝harbor
安裝成功後,執行docker-compose ps
圖46、檢視harbor安裝情況
說明harbor運作正常。
在主控端的浏覽器裡執行:http://10.122.128.58,就會彈出harbor的網絡界面:
圖47、harbor登入界面
輸入admin/ Harbor12345(在harbor.yml中配置的預設管理密碼,可以通過該檔案修改),則可進入管理界面。
這個過程可能出現的一個問題是:docker login可以成功,但是頁面通路的時候使用curl總是報:
SSL certificate problem: self signed certificate in certificate
其實這樣已經是可以通路了,對于curl加上-k參數即可通路,對于浏覽器主要是因為開了vpn是以通路不了,關閉VPN之後就正常了,如果有問題,可以重新生成證書,重新開機harbor即可。
6、docker配置harbor倉庫
在/ etc/ docker/ daemon.json(如果沒有建立即可)中添加如下内容,就可以配置docker的harbor倉庫
圖48、docker配置harbor私有倉庫
{
"experimental": true,
"registry-mirrors": [
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com",
"https://p02uzmeg.mirror.aliyuncs.com"
],
"insecure-registries":["192.168.31.66"]
}
此處不配置會導緻docker login 的時候報:
Error response from daemon: Get https://192.168.31.66/v2/: x509: cannot validate certificate for 192.168.31.66 because it doesn't contain any IP SANs
的異常。
#重新開機docker使配置生效
systemctl daemon-reload
systemctl restart docker
#嘗試使用docker登入
docker login 10.122.128.58
docker login 10.122.128.58 -u admin -p Harbor12345
#嘗試推送鏡像到harbor倉庫
docker push 10.122.128.58/library/test:1.0
圖49、harbor私有倉庫配置完成
出現上面界面說明harbor已完全配置成功。
7、harbor的重新開機操作
注意:以下指令隻能在 /data /harbor /make 檔案夾下執行:
docker-compose restart proxy
docker-compose down
./prepare
docker-compose up -d
harbor的其他具體使用手冊如下:
https://goharbor.io/docs/2.0.0/install-config/configure-https/#verify-the-https-connection
指令行中harbor主要動過docker-compose來操作,其他操作相關指令還有:
docker-compose up -d
docker-compose top
docker-compose ps
docker-compose stop
docker-compose start #再次啟動
docker-compose down #停用移除所有容器
docker-compose logs
8、将harbor配置成services
将harbor配置成service形式,添加配置檔案 /etc/systemd/system/harbor.service
[Unit]
Description=Harbor
After=docker.service systemd-networkd.service systemd-resolved.service
Requires=docker.service
Documentation=http://github.com/vmware/harbor
[Service]
Type=simple
Restart=on-failure
RestartSec=5
ExecStart=/usr/local/bin/docker-compose -f /opt/harbor/docker-compose.yml up
ExecStop=/usr/local/bin/docker-compose -f /opt/harbor/docker-compose.yml down
[Install]
WantedBy=multi-user.target
9、其他參考網址
https://github.com/goharbor/harbor-arm
阿裡雲docker鏡像位址:https://p02uzmeg.mirror.aliyuncs.com
https://www.dounaite.com/article/627a6991ac359fc913296ce7.html
官方下載下傳位址:https://github.com/goharbor/harbor/releases
10、使用docker buildx重新編譯harbor的嘗試
因官方二進制版本的Harbar并不支援arm64架構,是以曾經嘗試過使用docker buildx重新編譯,但是過程很繁瑣,參考網址如下,這裡不做展開了:
https://blog.csdn.net/u014110320/article/details/124406628
https://github.com/docker/buildx/releases/tag/v0.9.1
https://waynerv.com/posts/building-multi-architecture-images-with-docker-buildx/#contents:builder-%E5%AE%9E%E4%BE%8B
https://goodcommand.readthedocs.io/zh_CN/latest/command/docker_buildx.html#gitbuh-buildx
https://qiao.dev/2020/08/31/centos7%E5%AE%89%E8%A3%85docker-buildx%E6%9E%84%E5%BB%BA%E5%A4%9Acpu%E6%9E%B6%E6%9E%84%E9%95%9C%E5%83%8F.html
https://qizhidao.top/2021/02/11/ARM%E6%9E%B6%E6%9E%84-%E7%A6%BB%E7%BA%BF%E9%83%A8%E7%BD%B2harbor%E9%95%9C%E5%83%8F%E4%BB%93%E5%BA%93%E8%B8%A9%E5%9D%91/
https://qizhidao.top/2021/02/11/ARM%E6%9E%B6%E6%9E%84-%E7%A6%BB%E7%BA%BF%E9%83%A8%E7%BD%B2harbor%E9%95%9C%E5%83%8F%E4%BB%93%E5%BA%93%E8%B8%A9%E5%9D%91/
https://www.jianshu.com/p/e26a95cbe5c5
https://blog.csdn.net/shenhonglei1234/article/details/124183802
https://cloud.tencent.com/developer/article/2002959
https://www.cnblogs.com/hallejuayahaha/p/13926575.html
https://blog.csdn.net/weixin_41923467/article/details/122121370
https://xie.infoq.cn/article/6f277393176e42abdc284ce4d
六、安裝官方可視化元件Kubenetes Dashboard
安裝這個之前踩過一個坑,去安裝kuboard這個工具,這個工具不支援arm架構的eipwork / etcd-host ,具體是eipwork/etcd-host:3.4.16-2這個鏡像不支援arm64架構,在dockerhub上看到有arm版本,但是pull下的都是amd64,即使使用--platform arm64參數進行pull也不行,是以安裝總是失敗。
1、Kubenetes Dashboard安裝
安裝官方參考:
https://github.com/kubernetes/dashboard/blob/master/docs/user/access-control/creating-sample-user.md
先到https://github.com/kubernetes/dashboard/releases網站檢視kubenetes版本對應的Dashboard版本是哪個,以本文安裝的Kubenete v1.24.4版本為例子,對應的dashboard版本是v2.6.1,是以安裝語句如下:
kubectl apply -f
https://raw.githubusercontent.com/kubernetes/dashboard/v2.6.1/aio/deploy/recommended.yaml
需要提前準備如下兩個鏡像:
kubernetesui/dashboard:v2.6.1
kubernetesui/metrics-scraper:v1.0.8
docker pull kubernetesui/metrics-scraper:v1.0.8
docker pull kubernetesui/dashboard:v2.6.1
執行如下指令,檢視dashboard提供的端口:
kubectl get svc -n kubernetes-dashboard
圖50、檢視dashboard運作端口
在浏覽器中輸入 https://10.122.128.59:31847/#/login (59,60都可以,master似乎不可以)
2、建立賬戶登入
我們建立一個admin使用者并授予admin 角色綁定,使用下面的yaml檔案建立admin使用者并賦予他管理者權限,然後就可以通過token 登陸dashbaord,這種認證方式本質實際上是通過Service Account 的身份認證加上Bearer token請求 API server 的方式實作,參考 Kubernetes 中的認證
先建立有如下内容的檔案admin-token.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kubernetes-dashboard
然後執行:
kubectl create -f admin-token.yaml
再執行:
kubectl -n kubernetes-dashboard create token admin-user
eyJhbGciOiJSUzI1NiIsImtpZCI6ImczaDMxanBzUEljVzRBenhwV3gwelBzd0o2ZmpGcDVMVEFZT0NxLUs5dDgifQ.eyJhdWQiOlsiaHR0cHM6Ly9rdWJlcm5ldGVzLmRlZmF1bHQuc3ZjLmNsdXN0ZXIubG9jYWwiXSwiZXhwIjoxNjYyNjMyOTA2LCJpYXQiOjE2NjI2MjkzMDYsImlzcyI6Imh0dHBzOi8va3ViZXJuZXRlcy5kZWZhdWx0LnN2Yy5jbHVzdGVyLmxvY2FsIiwia3ViZXJuZXRlcy5pbyI6eyJuYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsInNlcnZpY2VhY2NvdW50Ijp7Im5hbWUiOiJhZG1pbi11c2VyIiwidWlkIjoiY2IyNWZiYjgtODJjZC00ZGYwLWFhMWUtZjNkMzA5NDkwNzkyIn19LCJuYmYiOjE2NjI2MjkzMDYsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlcm5ldGVzLWRhc2hib2FyZDphZG1pbi11c2VyIn0.hvq_CPGtjwBqNP9yoz5Rx53X9huPD9A3jxEETLzlJ-Vkl2w4m-0cOm02LqqOLzhL7PsTH_Bi5fbGptw1P1CGD_Bo4JCYutUXCnAYu839L3BDhMmcy_6-YxTAndaOYycmkGkJpbZ7pqyBVBmhyitC0o68KOFnh710T76I69iXW9EqX-8_vBIzaN9c3myXMR7LHPg6CNWzvc-eqLsGgvm_PeJ3KDnQfFYV-vLoGd_CGmR1gJuxiFIPy0rrJ5NP0R3o1alGywKlMYS32OUrZFggjGFDkcCVM4fhGGaGHkShqUn4JYmWXVEb_o6HOfaarREg8isbb0qFXQvw1URzPmM9Nw
這樣就可以使用token進行登入了,這個token有時間限制,每十分鐘更新一次,每次都要create一下才能登入。
七、調試方法總結
安裝部署過程很多地方需要去檢視異常日志,主要有如下一些方法,總結如下:
kubectl -n kube-system get pod -o yaml kube-controller-manager-master#檢視pod異常,yaml格式
kubectl describe pod tigera-operator-6d9c8d9dc6-2ddxj -n tigera-operator#對pod進行描述
journalctl -u kube-controller-manager #檢視對應元件的異常資訊
kubectl logs -n kube- system -f podname#檢視對應pod的日志資訊
systemctl status kubelet#檢視服務狀态資訊
journalctl -xeu kubelet#檢視元件異常資訊
ctr namespaces ls #檢視containerd中所有的命名空間
ctr -n docker.io images ls #檢視containerd指定命名空間中的images
八、附錄
1、擷取鏡像腳本
以下腳本為部署過程中積累下來的,已經被本人用腳本進行了簡化總結,大家完全可以使用那個腳本批量執行即可,詳細見第二章第6節,以下腳本僅做回溯參考:
#1、docker下載下傳鏡像
docker pull registry.aliyuncs.com/google_containers/kube-apiserver:v1.24.4
docker pull registry.aliyuncs.com/google_containers/kube-proxy:v1.24.4
docker pull registry.aliyuncs.com/google_containers/kube-controller-manager:v1.24.4
docker pull registry.aliyuncs.com/google_containers/kube-scheduler:v1.24.4
docker pull registry.aliyuncs.com/google_containers/pause:3.7
docker pull registry.aliyuncs.com/google_containers/coredns:v1.8.6
docker pull registry.aliyuncs.com/google_containers/etcd:3.5.3-0
#2、docker改标簽
docker tag registry.aliyuncs.com/google_containers/kube-apiserver:v1.24.4 k8s.gcr.io/kube-apiserver:v1.24.4
docker tag registry.aliyuncs.com/google_containers/kube-controller-manager:v1.24.4 k8s.gcr.io/kube-controller-manager:v1.24.4
docker tag registry.aliyuncs.com/google_containers/kube-scheduler:v1.24.4 k8s.gcr.io/kube-scheduler:v1.24.4
docker tag registry.aliyuncs.com/google_containers/pause:3.7 k8s.gcr.io/pause:3.7
docker tag registry.aliyuncs.com/google_containers/kube-proxy:v1.24.4 k8s.gcr.io/kube-proxy:v1.24.4
docker tag registry.aliyuncs.com/google_containers/coredns:v1.8.6 coredns/coredns:v1.8.6
docker tag registry.aliyuncs.com/google_containers/etcd:3.5.3-0 k8s.gcr.io/etcd:3.5.3-0
#3、docker改标簽并push到私有倉庫
docker tag registry.aliyuncs.com/google_containers/kube-apiserver:v1.24.4 192.168.31.66/library/google_containers/kube-apiserver:v1.24.4
docker push 192.168.31.66/library/google_containers/kube-apiserver:v1.24.4
docker tag registry.aliyuncs.com/google_containers/kube-proxy:v1.24.4 192.168.31.66/library/google_containers/kube-proxy:v1.24.4
docker push 192.168.31.66/library/google_containers/kube-proxy:v1.24.4
docker tag registry.aliyuncs.com/google_containers/kube-controller-manager:v1.24.4 192.168.31.66/library/google_containers/kube-controller-manager:v1.24.4
docker push 192.168.31.66/library/google_containers/kube-controller-manager:v1.24.4
docker tag registry.aliyuncs.com/google_containers/kube-scheduler:v1.24.4 192.168.31.66/library/google_containers/kube-scheduler:v1.24.4
docker push 192.168.31.66/library/google_containers/kube-scheduler:v1.24.4
docker tag registry.aliyuncs.com/google_containers/pause:3.7 192.168.31.66/library/google_containers/pause:3.7
docker push 192.168.31.66/library/google_containers/pause:3.7
docker tag registry.aliyuncs.com/google_containers/coredns:v1.8.6 192.168.31.66/library/google_containers/coredns:v1.8.6
docker push 192.168.31.66/library/google_containers/coredns:v1.8.6
docker tag registry.aliyuncs.com/google_containers/etcd:3.5.3-0 192.168.31.66/library/google_containers/etcd:3.5.3-0
docker push 192.168.31.66/library/google_containers/etcd:3.5.3-0
#4、安裝kuboard需要,但是etcd-host:3.4.16-2-arm64不支援arm架構
docker push 192.168.31.66/library/eipwork/kuboard:v3
docker push 192.168.31.66/library/eipwork/etcd-host:3.4.16-2-arm64
#5、ctr從私有倉庫拉取鏡像
ctr -n docker.io images pull 192.168.31.66/library/eipwork/kuboard:v3 --skip-verify
ctr -n docker.io images pull 192.168.31.66/library/eipwork/etcd-host:3.4.16-2-arm64 --skip-verify
ctr -n docker.io images pull -u admin:Harbor12345 192.168.31.66/library/eipwork/kuboard:v3 --skip-verify
ctr -n docker.io images pull -u admin:Harbor12345 192.168.31.66/library/eipwork/etcd-host:3.4.16-2-arm64 --skip-verify
#6、ctr對鏡像改标簽名
ctr -n docker.io i tag 192.168.31.66/library/eipwork/kuboard:v3 docker.io/eipwork/kuboard:v3
ctr -n docker.io i tag 192.168.31.66/library/eipwork/etcd-host:3.4.16-2-arm64 docker.io/eipwork/etcd-host:3.4.16-2
#7、ctr和docker删除鏡像
ctr -n docker.io images rm docker.io/eipwork/etcd-host:3.4.16-2
docker rmi eipwork/etcd-host:3.4.16-2
ctr -n docker.io images rm 192.168.31.66/library/eipwork/etcd-host:3.4.16-2
#8、批量删除鏡像
docker rmi `docker images -q`#通過imageid删除全部鏡像,危險!慎用!
docker rmi $(docker images | grep "10.122.128.58" | awk '{a=$1;b=$2;c=(a":"b);print c}') #通過鏡像名稱和版本号删除鏡像,删除時比較有用
ctr -n docker.io image rm $(ctr -n docker.io images ls | grep "10.122.128.58" | awk '{print $1}')
ctr -n k8s.io image rm $(ctr -n k8s.io images ls | grep "10.122.128.58" | awk '{print $1}')
ctr -n quay.io image rm $(ctr -n quay.io images ls | grep "10.122.128.58" | awk '{print $1}')