ubuntu20.04下k8s集群及网络部署史上最详细文档

ubuntu20.04下k8s集群及网络部署史上最详细文档

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的版本,官方下载地址如下:

cdimage.ubuntu.com/rele

(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

华为云官方地址:mirrors.huaweicloud.com

图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.iok8s.iok8s.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_ip=10.122.128.58
harbor_project=$harbor_ip/library
harbor_address=$harbor_project/google_containers

#一、解决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/g;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

解决办法参照的网址是:blog.csdn.net/avatar_20

(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的解决办法参考网址:blog.csdn.net/qq_319771

(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、部署方法

先参考网址:blog.csdn.net/u01053374内容将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运行正常。

在宿主机的浏览器里执行: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

先到github.com/kubernetes/d网站查看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运行端口

在浏览器中输入 10.122.128.59:31847/# (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}')

编辑于 2022-09-11 11:11