By:赵开恩

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

截至2022年9月9日,终于完成k8s集群的初步搭建,整个过程可以说是踩坑不少,踩坑的主要原因总结起来有两个,一个是k8s有很多默认需要从国外镜像源下载镜像的地方,而由于众所周知gfw的存在,即使配置了国内镜像源,很多时候也需要对镜像进行tag才能解决问题;第二个问题是本人部署的笔记本是macbook m1的cpu,基于arm64架构,不同于服务器领域主流的x86架构,初次接触的人使用安装包的时候可能会遇到一些问题,下面详细说明下安装部署过程,目标是全网最详尽的k8s安装示例。

一、部署环境

ubuntu18.04换用户命令(ubuntu20.04下k8s集群及网络部署史上最详细文档)(1)

二、准备工作

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主节点的网络设置

ubuntu18.04换用户命令(ubuntu20.04下k8s集群及网络部署史上最详细文档)(2)

图1、虚拟机网络设置

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

(1)/etc/netplan下的00-installer-config.yaml文件配置静态网络IP地址、网关、掩码、DNS等

(2)/etc/hostname文件配置主机名称

(3)/etc/hosts配置主机名与Ip的映射

配置完后记得执行netplan apply的命令使得配置生效。

4、配置ubuntu的apt源

试用了阿里云、清华大学和华为云的源,还是华为的源对arm64的支持比较好用,配置如下:

ubuntu18.04换用户命令(ubuntu20.04下k8s集群及网络部署史上最详细文档)(3)

图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

ubuntu18.04换用户命令(ubuntu20.04下k8s集群及网络部署史上最详细文档)(4)

图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,报:

ubuntu18.04换用户命令(ubuntu20.04下k8s集群及网络部署史上最详细文档)(5)

图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

如下:

ubuntu18.04换用户命令(ubuntu20.04下k8s集群及网络部署史上最详细文档)(6)

图5、解决docker安装问题

再重新安装docker:

sudo apt install docker.io

ubuntu18.04换用户命令(ubuntu20.04下k8s集群及网络部署史上最详细文档)(7)

图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

查看是否已经安装完毕。

ubuntu18.04换用户命令(ubuntu20.04下k8s集群及网络部署史上最详细文档)(8)

图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文件,修改如下:

ubuntu18.04换用户命令(ubuntu20.04下k8s集群及网络部署史上最详细文档)(9)

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

ubuntu18.04换用户命令(ubuntu20.04下k8s集群及网络部署史上最详细文档)(10)

图9、关闭swap

13、配置NTP同步

apt install ntpdate

ntpdate ntp.ntsc.ac.cn

hwclock(查看时间)

14、关闭selinux和防火墙(可选)

setenforce 0 #关闭selinux

systemctl disable firewalld.service

三、构建集群

1、克隆虚拟机

至此,由于以上的过程需要在所有集群的节点上重复进行,所以可以先在一个虚拟机上安装以上过程,然后到这里开始对这个虚拟机进行克隆,这样免除在每一台服务器上进行以上操作了:

ubuntu18.04换用户命令(ubuntu20.04下k8s集群及网络部署史上最详细文档)(11)

图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文件主要修改了如下图所示红框内的内容:

ubuntu18.04换用户命令(ubuntu20.04下k8s集群及网络部署史上最详细文档)(12)

图11、修改kubeadm-config.yaml配置文件

ubuntu18.04换用户命令(ubuntu20.04下k8s集群及网络部署史上最详细文档)(13)

图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节点添加成功:

ubuntu18.04换用户命令(ubuntu20.04下k8s集群及网络部署史上最详细文档)(14)

图13、worker节点安装成功界面

至此,集群部署完毕,执行如下命令查看集群状态:

ubuntu18.04换用户命令(ubuntu20.04下k8s集群及网络部署史上最详细文档)(15)

图14、获取集群信息

ubuntu18.04换用户命令(ubuntu20.04下k8s集群及网络部署史上最详细文档)(16)

图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

具体步骤如下图:

ubuntu18.04换用户命令(ubuntu20.04下k8s集群及网络部署史上最详细文档)(17)

图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

则完成新建集群的工作。

ubuntu18.04换用户命令(ubuntu20.04下k8s集群及网络部署史上最详细文档)(18)

图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文件中增加如下一行:

ubuntu18.04换用户命令(ubuntu20.04下k8s集群及网络部署史上最详细文档)(19)

图18、修改docker的daemon.json文件

然后执行

systemctl daemon-reload

systemctl restart docker

执行 docker system info | grep -i driver查看driver是否已经由cgroups变成了systemd

ubuntu18.04换用户命令(ubuntu20.04下k8s集群及网络部署史上最详细文档)(20)

图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

ubuntu18.04换用户命令(ubuntu20.04下k8s集群及网络部署史上最详细文档)(21)

图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

执行完后,很快就恢复了正常:

ubuntu18.04换用户命令(ubuntu20.04下k8s集群及网络部署史上最详细文档)(22)

图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文件中添加如下内容:

ubuntu18.04换用户命令(ubuntu20.04下k8s集群及网络部署史上最详细文档)(23)

图21、解决找不到主节点的问题

再执行sysctl -p

四、配置Calico网络插件

1、关于calico网络插件的理论知识

简而言之,calico插件主要作用就是是的k8s集群中的所有pod之间可以进行自由通信,其主要架构如下:

ubuntu18.04换用户命令(ubuntu20.04下k8s集群及网络部署史上最详细文档)(24)

图22、calico架构图1

ubuntu18.04换用户命令(ubuntu20.04下k8s集群及网络部署史上最详细文档)(25)

图23、calico架构图2

ubuntu18.04换用户命令(ubuntu20.04下k8s集群及网络部署史上最详细文档)(26)

图24、calicoIPIP网络

ubuntu18.04换用户命令(ubuntu20.04下k8s集群及网络部署史上最详细文档)(27)

图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,这里就直接截取官方需求了,如下:

ubuntu18.04换用户命令(ubuntu20.04下k8s集群及网络部署史上最详细文档)(28)

图26、安装calicoNODE必须条件

ubuntu18.04换用户命令(ubuntu20.04下k8s集群及网络部署史上最详细文档)(29)

ubuntu18.04换用户命令(ubuntu20.04下k8s集群及网络部署史上最详细文档)(30)

图27、安装calicoKubernetes必须条件

ubuntu18.04换用户命令(ubuntu20.04下k8s集群及网络部署史上最详细文档)(31)

图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

ubuntu18.04换用户命令(ubuntu20.04下k8s集群及网络部署史上最详细文档)(32)

图29、执行tigera-operator.yaml

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

ubuntu18.04换用户命令(ubuntu20.04下k8s集群及网络部署史上最详细文档)(33)

图30、执行custom-resources.yaml

上面的两个文件都可以从官方网站下载到,其中这两个文件需要进行如下一些修改才能执行:

修改tigera-operator.yaml文件

ubuntu18.04换用户命令(ubuntu20.04下k8s集群及网络部署史上最详细文档)(34)

图31、修改tigera-operatoryaml

vi custom-resources.yaml

ubuntu18.04换用户命令(ubuntu20.04下k8s集群及网络部署史上最详细文档)(35)

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

ubuntu18.04换用户命令(ubuntu20.04下k8s集群及网络部署史上最详细文档)(36)

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

如果需要对初始化的网络配置进行修改,可以执行如下语句:

kubectl edit cm kubeadm-config -n kube-system

ubuntu18.04换用户命令(ubuntu20.04下k8s集群及网络部署史上最详细文档)(37)

图33、修改kubeadm的初始化网络配置

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

ubuntu18.04换用户命令(ubuntu20.04下k8s集群及网络部署史上最详细文档)(38)

图33、修改kube-controller-manager.yaml文件

查看集群网络配置:

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

ubuntu18.04换用户命令(ubuntu20.04下k8s集群及网络部署史上最详细文档)(39)

图34、查看集群的cidr设置

终于看到了胜利的曙光

ubuntu18.04换用户命令(ubuntu20.04下k8s集群及网络部署史上最详细文档)(40)

图35、集群配置成功

4、使用calico.yaml部署

第二种方式是使用官方的calico.yaml文件部署,先对calico.yaml文件进行修改如下:

ubuntu18.04换用户命令(ubuntu20.04下k8s集群及网络部署史上最详细文档)(41)

图35、修改calico.yaml文件-1

ubuntu18.04换用户命令(ubuntu20.04下k8s集群及网络部署史上最详细文档)(42)

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

ubuntu18.04换用户命令(ubuntu20.04下k8s集群及网络部署史上最详细文档)(43)

图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

ubuntu18.04换用户命令(ubuntu20.04下k8s集群及网络部署史上最详细文档)(44)

图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 报错的解决办法,修改如下:

ubuntu18.04换用户命令(ubuntu20.04下k8s集群及网络部署史上最详细文档)(45)

图39、修改calico.yaml文件-3

ubuntu18.04换用户命令(ubuntu20.04下k8s集群及网络部署史上最详细文档)(46)

图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

从而生成如下文件:

ubuntu18.04换用户命令(ubuntu20.04下k8s集群及网络部署史上最详细文档)(47)

图41、生成的harbor证书文件

这样harbor.yml文件修改的地方如下:

ubuntu18.04换用户命令(ubuntu20.04下k8s集群及网络部署史上最详细文档)(48)

图42、修改harbor.yaml文件-1

ubuntu18.04换用户命令(ubuntu20.04下k8s集群及网络部署史上最详细文档)(49)

图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=: dial tcp 104.18.122.25:443: i/o timeout

Error response from daemon: No such image: cocl666/harbor-core:v2.2.2

ubuntu18.04换用户命令(ubuntu20.04下k8s集群及网络部署史上最详细文档)(50)

图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安全扫描工具

ubuntu18.04换用户命令(ubuntu20.04下k8s集群及网络部署史上最详细文档)(51)

图45、安装harbor

安装成功后,执行docker-compose ps

ubuntu18.04换用户命令(ubuntu20.04下k8s集群及网络部署史上最详细文档)(52)

图46、查看harbor安装情况

说明harbor运行正常。

在宿主机的浏览器里执行:http://10.122.128.58,就会弹出harbor的网络界面:

ubuntu18.04换用户命令(ubuntu20.04下k8s集群及网络部署史上最详细文档)(53)

图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仓库

ubuntu18.04换用户命令(ubuntu20.04下k8s集群及网络部署史上最详细文档)(54)

图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

ubuntu18.04换用户命令(ubuntu20.04下k8s集群及网络部署史上最详细文档)(55)

图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-实例

https://goodcommand.readthedocs.io/zh_CN/latest/command/docker_buildx.html#gitbuh-buildx

https://qiao.dev/2020/08/31/centos7安装docker-buildx构建多cpu架构镜像.html

https://qizhidao.top/2021/02/11/ARM架构-离线部署harbor镜像仓库踩坑/

https://qizhidao.top/2021/02/11/ARM架构-离线部署harbor镜像仓库踩坑/

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

ubuntu18.04换用户命令(ubuntu20.04下k8s集群及网络部署史上最详细文档)(56)

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

,