天天看點

ubuntu20.04下k8s叢集及網絡部署史上最詳細文檔

作者:開心感恩

By:趙開恩

Date:2022年9月10日中秋節北京家中整理

截至2022年9月9日,終于完成k8s叢集的初步搭建,整個過程可以說是踩坑不少,踩坑的主要原因總結起來有兩個,一個是k8s有很多預設需要從國外鏡像源下載下傳鏡像的地方,而由于衆所周知gfw的存在,即使配置了國内鏡像源,很多時候也需要對鏡像進行tag才能解決問題;第二個問題是本人部署的筆記本是macbook m1的cpu,基于arm64架構,不同于伺服器領域主流的x86架構,初次接觸的人使用安裝包的時候可能會遇到一些問題,下面詳細說明下安裝部署過程,目标是全網最詳盡的k8s安裝示例。

一、部署環境

ubuntu20.04下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主節點的網絡設定

ubuntu20.04下k8s叢集及網絡部署史上最詳細文檔

圖1、虛拟機網絡設定

主要是三個地方需要配置:

(1)/etc/netplan下的00-installer-config.yaml檔案配置靜态網絡IP位址、網關、掩碼、DNS等

(2)/etc/hostname檔案配置主機名稱

(3)/etc/hosts配置主機名與Ip的映射

配置完後記得執行netplan apply的指令使得配置生效。

4、配置ubuntu的apt源

試用了阿裡雲、清華大學和華為雲的源,還是華為的源對arm64的支援比較好用,配置如下:

ubuntu20.04下k8s叢集及網絡部署史上最詳細文檔

圖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

ubuntu20.04下k8s叢集及網絡部署史上最詳細文檔

圖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,報:

ubuntu20.04下k8s叢集及網絡部署史上最詳細文檔

圖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

如下:

ubuntu20.04下k8s叢集及網絡部署史上最詳細文檔

圖5、解決docker安裝問題

再重新安裝docker:

sudo apt install docker.io

ubuntu20.04下k8s叢集及網絡部署史上最詳細文檔

圖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

檢視是否已經安裝完畢。

ubuntu20.04下k8s叢集及網絡部署史上最詳細文檔

圖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檔案,修改如下:

ubuntu20.04下k8s叢集及網絡部署史上最詳細文檔

圖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那行

ubuntu20.04下k8s叢集及網絡部署史上最詳細文檔

圖9、關閉swap

13、配置NTP同步

apt install ntpdate

ntpdate ntp.ntsc.ac.cn

hwclock(檢視時間)

14、關閉selinux和防火牆(可選)

setenforce 0 #關閉selinux

systemctl disable firewalld.service

三、建構叢集

1、克隆虛拟機

至此,由于以上的過程需要在所有叢集的節點上重複進行,是以可以先在一個虛拟機上安裝以上過程,然後到這裡開始對這個虛拟機進行克隆,這樣免除在每一台伺服器上進行以上操作了:

ubuntu20.04下k8s叢集及網絡部署史上最詳細文檔

圖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檔案主要修改了如下圖所示紅框内的内容:

ubuntu20.04下k8s叢集及網絡部署史上最詳細文檔

圖11、修改kubeadm-config.yaml配置檔案

ubuntu20.04下k8s叢集及網絡部署史上最詳細文檔

圖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節點添加成功:

ubuntu20.04下k8s叢集及網絡部署史上最詳細文檔

圖13、worker節點安裝成功界面

至此,叢集部署完畢,執行如下指令檢視叢集狀态:

ubuntu20.04下k8s叢集及網絡部署史上最詳細文檔

圖14、擷取叢集資訊

ubuntu20.04下k8s叢集及網絡部署史上最詳細文檔

圖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

具體步驟如下圖:

ubuntu20.04下k8s叢集及網絡部署史上最詳細文檔

圖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

則完成建立叢集的工作。

ubuntu20.04下k8s叢集及網絡部署史上最詳細文檔

圖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檔案中增加如下一行:

ubuntu20.04下k8s叢集及網絡部署史上最詳細文檔

圖18、修改docker的daemon.json檔案

然後執行

systemctl daemon-reload

systemctl restart docker

執行 docker system info | grep -i driver檢視driver是否已經由cgroups變成了systemd

ubuntu20.04下k8s叢集及網絡部署史上最詳細文檔

圖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

ubuntu20.04下k8s叢集及網絡部署史上最詳細文檔

圖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

執行完後,很快就恢複了正常:

ubuntu20.04下k8s叢集及網絡部署史上最詳細文檔

圖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檔案中添加如下内容:

ubuntu20.04下k8s叢集及網絡部署史上最詳細文檔

圖21、解決找不到主節點的問題

再執行sysctl -p

四、配置Calico網絡插件

1、關于calico網絡插件的理論知識

簡而言之,calico插件主要作用就是是的k8s叢集中的所有pod之間可以進行自由通信,其主要架構如下:

ubuntu20.04下k8s叢集及網絡部署史上最詳細文檔

圖22、calico架構圖1

ubuntu20.04下k8s叢集及網絡部署史上最詳細文檔

圖23、calico架構圖2

ubuntu20.04下k8s叢集及網絡部署史上最詳細文檔

圖24、calicoIPIP網絡

ubuntu20.04下k8s叢集及網絡部署史上最詳細文檔

圖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,這裡就直接截取官方需求了,如下:

ubuntu20.04下k8s叢集及網絡部署史上最詳細文檔

圖26、安裝calicoNODE必須條件

ubuntu20.04下k8s叢集及網絡部署史上最詳細文檔
ubuntu20.04下k8s叢集及網絡部署史上最詳細文檔

圖27、安裝calicoKubernetes必須條件

ubuntu20.04下k8s叢集及網絡部署史上最詳細文檔

圖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

ubuntu20.04下k8s叢集及網絡部署史上最詳細文檔

圖29、執行tigera-operator.yaml

kubectl create -f /home/zhaokaien/custom-resources.yaml

ubuntu20.04下k8s叢集及網絡部署史上最詳細文檔

圖30、執行custom-resources.yaml

上面的兩個檔案都可以從官方網站下載下傳到,其中這兩個檔案需要進行如下一些修改才能執行:

修改tigera-operator.yaml檔案

ubuntu20.04下k8s叢集及網絡部署史上最詳細文檔

圖31、修改tigera-operatoryaml

vi custom-resources.yaml

ubuntu20.04下k8s叢集及網絡部署史上最詳細文檔

圖32、修改custom-resources.yaml-1

ubuntu20.04下k8s叢集及網絡部署史上最詳細文檔

圖32、修改custom-resources.yaml-2

如果需要對初始化的網絡配置進行修改,可以執行如下語句:

kubectl edit cm kubeadm-config -n kube-system

ubuntu20.04下k8s叢集及網絡部署史上最詳細文檔

圖33、修改kubeadm的初始化網絡配置

vi /etc/kubernetes/manifests/kube-controller-manager.yaml

ubuntu20.04下k8s叢集及網絡部署史上最詳細文檔

圖33、修改kube-controller-manager.yaml檔案

檢視叢集網絡配置:

kubectl cluster-info dump | grep -m 1 cluster-cidr

ubuntu20.04下k8s叢集及網絡部署史上最詳細文檔

圖34、檢視叢集的cidr設定

終于看到了勝利的曙光

ubuntu20.04下k8s叢集及網絡部署史上最詳細文檔

圖35、叢集配置成功

4、使用calico.yaml部署

第二種方式是使用官方的calico.yaml檔案部署,先對calico.yaml檔案進行修改如下:

ubuntu20.04下k8s叢集及網絡部署史上最詳細文檔

圖35、修改calico.yaml檔案-1

ubuntu20.04下k8s叢集及網絡部署史上最詳細文檔

圖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清空

ubuntu20.04下k8s叢集及網絡部署史上最詳細文檔

圖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

ubuntu20.04下k8s叢集及網絡部署史上最詳細文檔

圖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 報錯的解決辦法,修改如下:

ubuntu20.04下k8s叢集及網絡部署史上最詳細文檔

圖39、修改calico.yaml檔案-3

ubuntu20.04下k8s叢集及網絡部署史上最詳細文檔

圖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

進而生成如下檔案:

ubuntu20.04下k8s叢集及網絡部署史上最詳細文檔

圖41、生成的harbor證書檔案

這樣harbor.yml檔案修改的地方如下:

ubuntu20.04下k8s叢集及網絡部署史上最詳細文檔

圖42、修改harbor.yaml檔案-1

ubuntu20.04下k8s叢集及網絡部署史上最詳細文檔

圖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

ubuntu20.04下k8s叢集及網絡部署史上最詳細文檔

圖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安全掃描工具

ubuntu20.04下k8s叢集及網絡部署史上最詳細文檔

圖45、安裝harbor

安裝成功後,執行docker-compose ps

ubuntu20.04下k8s叢集及網絡部署史上最詳細文檔

圖46、檢視harbor安裝情況

說明harbor運作正常。

在主控端的浏覽器裡執行:http://10.122.128.58,就會彈出harbor的網絡界面:

ubuntu20.04下k8s叢集及網絡部署史上最詳細文檔

圖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倉庫

ubuntu20.04下k8s叢集及網絡部署史上最詳細文檔

圖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

ubuntu20.04下k8s叢集及網絡部署史上最詳細文檔

圖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

ubuntu20.04下k8s叢集及網絡部署史上最詳細文檔

圖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}')