ubuntu18.04换用户命令(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的版本,官方下载地址如下:
https://cdimage.ubuntu.com/releases/20.04/release/ubuntu-20.04.4-live-server-arm64.iso
(2)使用vmware fusion tech preivew安装ubuntu虚拟机,配置成静态IP地址,使用桥接网络模式便于虚拟机上网。
(3)注意:必须使用此版本的vmware软件才能支持在arm64架构上安装虚拟机,virtualbox暂时不支持arm64架构的操作系统,所以不能选用,parallel desktop很顺滑,但是需要花钱,土豪可入,本着免费不花钱的精神,所以使用了此版本的vmware。
3、网络准备
以下是在本人所在局域网内部署的k8s主节点的网络设置
图1、虚拟机网络设置
主要是三个地方需要配置:
(1)/etc/netplan下的00-installer-config.yaml文件配置静态网络IP地址、网关、掩码、DNS等
(2)/etc/hostname文件配置主机名称
(3)/etc/hosts配置主机名与Ip的映射
配置完后记得执行netplan apply的命令使得配置生效。
4、配置ubuntu的apt源
试用了阿里云、清华大学和华为云的源,还是华为的源对arm64的支持比较好用,配置如下:
图2、配置华为apt源
文字内容如下:
deb https://repo.huaweicloud.com/ubuntu-ports/ bionic main restricted universe multiverse
deb-src https://repo.huaweicloud.com/ubuntu-ports/ bionic main restricted universe multiverse
deb https://repo.huaweicloud.com/ubuntu-ports/ bionic-security main restricted universe multiverse
deb-src https://repo.huaweicloud.com/ubuntu-ports/ bionic-security main restricted universe multiverse
deb https://repo.huaweicloud.com/ubuntu-ports/ bionic-updates main restricted universe multiverse
deb-src https://repo.huaweicloud.com/ubuntu-ports/ bionic-updates main restricted universe multiverse
deb https://repo.huaweicloud.com/ubuntu-ports/ bionic-backports main restricted universe multiverse
deb-src https://repo.huaweicloud.com/ubuntu-ports/ bionic-backports main restricted universe multiverse
##Not recommended
#deb https://repo.huaweicloud.com/ubuntu-ports/ bionic-proposed main restricted universe multiverse
#deb-src https://repo.huaweicloud.com/ubuntu-ports/ bionic-proposed main restricted universe multiverse
华为云官方地址:https://mirrors.huaweicloud.com/home
图3、华为port镜像地址
因为本人使用的mac m1 的arm架构,所以选择ubuntu-ports镜像。配置完成源后,执行:
apt update
apt upgrade
两个命令,完成源的更新与配置。
5、安装Docker
ubuntu已经提供了Docker的安装包,直接安装即可:
sudo apt install docker-io
sudo systemctl start docker
sudo systemctl enable docker
这里安装主要遇到的问题是重启虚拟机之后,执行docker 命令报无法识别的命令,执行systemctl start docker,报:
图4、docker启动问题
针对该问题,网上所说的执行如下命令:
systemctl unmask docker.service
systemctl unmask docker.socket
执行完后直接把 / lib/ systemd/ system下面的docker.service和docker.socket删掉了,但并不能解决问题。
本人实验后的解决方案如下:
先卸载docker,执行:
dpkg -l | grep docker
再执行:
sudo apt remove --purge docker.io
如下:
图5、解决docker安装问题
再重新安装docker:
sudo apt install docker.io
图6、重新安装docker
再重启,docker也不会出问题了,具体原因不明。
6、配置docker国内镜像源并提前pull镜像
这一步是非常关键的一步,如果这一步没有配置好,后边安装导致大量问题,浪费大量时间,理论上最好的办法是找到k8s集群部署过程中默认的下载docker.io、k8s.io 、 k8s.gcr.io的配置,将其变更成国内的镜像源,但是本人在部署过程中尚未找到准确的配置的地方,时间所限,后续会继续研究再补充到这一节,为了简化大家的时间,我将部署过程中处理镜像源的下载整理成了自动化脚本,可以 很大程度上减轻大家的部署难度,具体如下:
##by zhaokaien 20220905
#本脚本用于解决部署k8s集群部署过程中无法下载外网镜像导致部署集群异常的问题
mirror_source1=registry.aliyuncs.com/google_containers
mirror_source2=registry.aliyuncs.com/k8sxio
namespace1=docker.io
namespace2=k8s.gcr.io
namespace3=quay.io
namespace4=k8s.io
kube_version=v1.24.4
pause_version1=3.5
pause_version2=3.7
etcd_version1=3.5.3-0
coredns_version=v1.8.6
tigera_operator_version=v1.28.0
calico_version=v3.24.1
harbor_address=10.122.128.58/library/google_containers
harbor_project=10.122.128.58/library
harbor_ip=10.122.128.58
#一、解决k8s集群部署问题
#1、登录harbor私有镜像仓库
docker login 10.122.128.58 -u admin -p Harbor12345
#2、对于kube系列容器具有版本一致性,采用循环解决
k8s_imgs=(
kube-apiserver
kube-proxy
kube-controller-manager
kube-scheduler
)
for k8s_img in ${k8s_imgs[@]}
do
#(1)使用docker命令pull kube系列容器并打上tag便于部署识别
docker pull $mirror_source1/$k8s_img:$kube_version
docker tag $mirror_source1/$k8s_img:$kube_version k8s.io/$k8s_img:$kube_version
docker tag $mirror_source1/$k8s_img:$kube_version k8s.gcr.io/$k8s_img:$kube_version
#(2)将从外网pull到的容器push到私有的harbor仓库
docker tag $mirror_source1/$k8s_img:$kube_version $harbor_address/$k8s_img:$kube_version
docker push $harbor_address/$k8s_img:$kube_version
#(3)使用ctr命令从私有仓库pull kube系列容器并打上tag便于部署识别
ctr -n k8s.io image pull $harbor_address/$k8s_img:$kube_version --skip-verify
ctr -n k8s.io image tag $harbor_address/$k8s_img:$kube_version k8s.io/$k8s_img:$kube_version
ctr -n k8s.io image tag $harbor_address/$k8s_img:$kube_version k8s.gcr.io/$k8s_img:$kube_version
done
#3、解决pause3.5版本容器问题,先pull打标签,然后再推送到私有仓库
docker pull $mirror_source1/pause:$pause_version1
docker tag $mirror_source1/pause:$pause_version1 k8s.io/pause:$pause_version1
docker tag $mirror_source1/pause:$pause_version1 $harbor_address/pause:$pause_version1
docker push $harbor_address/pause:$pause_version1
ctr -n k8s.io image pull $harbor_address/pause:$pause_version1 --skip-verify
ctr -n k8s.io image tag $harbor_address/pause:$pause_version1 k8s.io/pause:$pause_version1
ctr -n k8s.io image tag $harbor_address/pause:$pause_version1 k8s.gcr.io/pause:$pause_version1
#4、解决pause3.7版本容器问题,先pull打标签,然后再推送到私有仓库
docker pull $mirror_source1/pause:$pause_version2
docker tag $mirror_source1/pause:$pause_version2 k8s.io/pause:$pause_version2
docker tag $mirror_source1/pause:$pause_version2 $harbor_address/pause:$pause_version2
docker push $harbor_address/pause:$pause_version2
ctr -n k8s.io image pull $harbor_address/pause:$pause_version2 --skip-verify
ctr -n k8s.io image tag $harbor_address/pause:$pause_version2 k8s.io/pause:$pause_version1
ctr -n k8s.io image tag $harbor_address/pause:$pause_version2 k8s.gcr.io/pause:$pause_version1
#5、解决corednsv1.8.6容器问题,先pull打标签,然后再推送到私有仓库
docker pull $mirror_source1/coredns:$coredns_version
docker tag $mirror_source1/coredns:$coredns_version coredns/coredns:$coredns_version
docker tag $mirror_source1/coredns:$coredns_version $harbor_address/coredns:$coredns_version
docker push $harbor_address/coredns:$coredns_version
ctr -n k8s.io image pull $harbor_address/coredns:$coredns_version --skip-verify
ctr -n k8s.io image tag $harbor_address/coredns:$pause_version2 coredns/coredns:$coredns_version
#6、解决etcd3.5.3-0容器问题,先pull打标签,然后再推送到私有仓库
docker pull $mirror_source1/etcd:$etcd_version1
docker tag $mirror_source1/etcd:$etcd_version1 k8s.io/etcd:$etcd_version1
docker tag $mirror_source1/etcd:$etcd_version1 $harbor_address/etcd:$etcd_version1
docker push $harbor_address/etcd:$etcd_version1
ctr -n k8s.io image pull $harbor_address/etcd:$etcd_version1 --skip-verify
ctr -n k8s.io image tag $harbor_address/etcd:$etcd_version1 k8s.io/etcd:$etcd_version1
ctr -n k8s.io image tag $harbor_address/etcd:$etcd_version1 k8s.gcr.io/etcd:$etcd_version1
#二、解决calico网络部署问题
#1、对于calico系列容器具有版本一致性,采用循环解决
calico_imgs=(
node
pod2daemon-flexvol
cni
kube-controllers
typha
)
for calico_img in ${calico_imgs[@]}
do
#(1)使用docker命令pull calico系列容器并打上tag并推送到私有仓库
docker pull calico/$calico_img:$calico_version
#(2)将从外网pull到的calico容器push到私有的harbor仓库
docker tag calico/$calico_img:$calico_version $harbor_project/calico/$calico_img:$calico_version
docker push $harbor_project/calico/$calico_img:$calico_version
#(3)使用ctr命令从私有仓库pull calico系列容器并打上tag便于部署识别
ctr -n docker.io image pull $harbor_project/calico/$calico_img:$calico_version --skip-verify
ctr -n docker.io image tag $harbor_project/calico/$calico_img:$calico_version docker.io/calico/$calico_img:$calico_version
done
#2、处理tigera_operator容器问题
docker pull quay.io/tigera/operator:$tigera_operator_version
docker tag quay.io/tigera/operator:$tigera_operator_version $harbor_project/tigera/operator:$tigera_operator_version
docker push $harbor_project/tigera/operator:$tigera_operator_version
ctr -n quay.io image pull $harbor_project/tigera/operator:$tigera_operator_version --skip-verify
ctr -n quay.io image tag $harbor_project/tigera/operator:$tigera_operator_version quay.io/tigera/operator:$tigera_operator_version
#三、解决kubernetes dashboard的问题
kube_ui_version=v2.6.1
kube_metrics_version=v1.0.8
docker pull kubernetesui/dashboard:$kube_ui_version
docker tag kubernetesui/dashboard:$kube_ui_version $harbor_project/kubernetesui/dashboard:$kube_ui_version
docker push $harbor_project/kubernetesui/dashboard:$kube_ui_version
ctr -n docker.io images pull $harbor_project/kubernetesui/dashboard:$kube_ui_version --skip-verify
ctr -n docker.io images tag $harbor_project/kubernetesui/dashboard:$kube_ui_version docker.io/kubernetesui/dashboard:$kube_ui_version
docker pull kubernetesui/metrics-scraper:$kube_metrics_version
docker tag kubernetesui/metrics-scraper:$kube_metrics_version $harbor_project/kubernetesui/metrics-scraper:$kube_metrics_version
docker push $harbor_project/kubernetesui/metrics-scraper:$kube_metrics_version
ctr -n docker.io images pull $harbor_project/kubernetesui/metrics-scraper:$kube_metrics_version --skip-verify
ctr -n docker.io images tag $harbor_project/kubernetesui/metrics-scraper:$kube_metrics_version docker.io/kubernetesui/metrics-scraper:$kube_metrics_version
需要注意的是主从节点都要执行该脚本。
7、默认镜像修改探索
以下设置并不成熟,供参考:
(1)在初始化的时候加上参数:
--pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.7;
(2)在kubeadm-flags中可以查看registry
cat /var/lib/kubelet/kubeadm-flags.env #查看环境变量的registry
8、修改时区
先执行命令:date看看是否时间日期显示的最后是UTC,如果是说明使用的是美国时区,需要修正,执行以下命令:
sudo timedatectl set-timezone Asia/Shanghai
然后再次执行date查看时间日期最后是否变成了CST。最后为了使得系统日志的时间戳也立即生效,需要执行一下命令重启rsyslog:
sudo systemctl restart rsyslog
9、设置内核参数
br_netfilter模块用于将桥接流量转发至iptables链。执行如下语句安装br_netfilter模块:
sudo apt-get install bridge-utils
sudo modprobe br_netfilter
执行
lsmod | grep br_netfilter
sudo sysctl -a | grep bridge
查看是否已经安装完毕。
图7、查看br_netfilter是否安装
需要注意的是重启之后可能需要重新执行sudo modprobe br_netfilter进行加载。
10、修改rp_filter
如果后期需要部署calico网络插件的话,需要rp_filter这个内核参数是0或者1,但是Ubuntu20.04上默认是2,需要修改/ etc/ sysctl.d / 10-network-security.conf文件,修改如下:
图8、修改rp_filter
然后执行 sudo sysctl --system使得配置生效。
11、安装kubeadm、kubelet、kubectl三个核心组件
这里首先要解决源的问题,之前的apt源使用了华为的源,所以这里也需要使用华为的kubenetes源来安装,执行如下命令:
#先安装部分组件
sudo apt-get install ca-certificates curl software-properties-common apt-transport-https
#获取gpg
curl -s https://repo.huaweicloud.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -
#在/etc/apt/sources.list.d目录下新建kubernetes.list文件,内容如下:
deb https://repo.huaweicloud.com/kubernetes/apt/ kubernetes-xenial main
#刷新软件列表
apt-get update
#开始安装组件
apt-get install kubelet kubeadm kubectl
安装的过程中如下一些问题:
(1)报缺少ebtables的依赖
kubelet : Depends: ebtables but it is not going to be installed
缺啥就装下:
apt-get install ebtables
(2)版本不兼容
kubelet : Depends: iptables (>= 1.4.21)
执行:apt-get upgrade iptables
又报如下问题:
iptables : Depends: libip4tc0 (= 1.6.1-2ubuntu2) but it is not going to be installed
Depends: libip6tc0 (= 1.6.1-2ubuntu2) but it is not going to be installed
Depends: libiptc0 (= 1.6.1-2ubuntu2) but it is not going to be installed
Depends: libxtables12 (= 1.6.1-2ubuntu2) but 1.8.4-3ubuntu2 is to be installed
执行:apt-get install libxtables12=1.6.1-2ubuntu2
# 这里报错更高版本的包已经装过了,这是一个坑点,千万不要卸载这个更高版本1.8.4-3ubuntu2的包,卸载会报废系统,直接安装1.6.1-2ubuntu2版本的包,然后递归向上更新即可。安装完成后再执行:apt-get upgrade iptables即可。
最后再执行:
apt-get install kubelet kubeadm kubectl
顺利完成kubenete核心组件的安装。
安装完这三个核心组建后执行:
apt-mark hold kubelet kubeadm kubectl
用于将三个组件的软件包标记为保留,以防止软件包被自动安装、升级或删除。以后需要升级的时候执行 apt-mark unhold 选项用于取消先前面的设置。
12、关闭swap
有说新版本的不需要关闭这个,实际情况是还是关掉好。
sudo swapoff -a
vi / etc/ fstab 注释掉swap那行
图9、关闭swap
13、配置NTP同步
apt install ntpdate
ntpdate ntp.ntsc.ac.cn
hwclock(查看时间)
14、关闭selinux和防火墙(可选)
setenforce 0 #关闭selinux
systemctl disable firewalld.service
三、构建集群
1、克隆虚拟机
至此,由于以上的过程需要在所有集群的节点上重复进行,所以可以先在一个虚拟机上安装以上过程,然后到这里开始对这个虚拟机进行克隆,这样免除在每一台服务器上进行以上操作了:
图10、克隆虚拟机
注意:务必使用创建完整克隆。
克隆完的虚拟机记得修改网络IP地址(修改/etc/netplan下的文件)、变更hostname(修改/etc/hostname,/etc/hosts 文件),检查克隆的虚拟机的mac地址和UUID(UUID号所在路径/sys/class/dmi/id/product_uuid)保证都是不相同的。最后执行netplan apply,然后重启服务器,保证集群中各节点网络是通的,访问宿主机网络是通的,访问互联网网络是通畅的。这样集群节点就都准备好了。
2、配置k8s集群master节点
由于本人部署的是k8s较新的版本1.24.4,因此此处不能按网上大多数方式执行如下命令:
sudo kubeadm init --pod-network-cidr 172.16.0.0/16 \
--image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \
--apiserver-advertise-address 172.20.20.200 \
--apiserver-bind-port 6443
使用以上命令行在1.22 版本以上的kubenetes上部署都会失败,没有试过。
本人采用的解决办法是使用配置文件方式进行集群的初始化:sudo kubeadm init --config kubeadm-config.yaml。首先执行kubeadm config print init-defaults 可以生成默认配置文档,在默认基础上修改符合自己要求的kubeadm-config.yaml文件,如下:
apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: abcdef.0123456789abcdef
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 10.122.128.58
controllerManager:
extraArgs:
"node-cidr-mask-size-ipv4": "23"
bindPort: 6443
nodeRegistration:
criSocket: unix:///var/run/containerd/containerd.sock
imagePullPolicy: IfNotPresent
name: master
taints: null
---
apiServer:
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: k8sCluster1
controllerManager: {}
dns: {}
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: 1.24.0
networking:
dnsDomain: cluster.local
serviceSubnet: 10.96.0.0/12
scheduler: {}
---
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
cgroupDriver: systemd
相对于默认的yaml文件主要修改了如下图所示红框内的内容:
图11、修改kubeadm-config.yaml配置文件
图12、主节点安装成功界面
看到上述图片所示界面表示master安装成功,紧接着接着按照上面的说明指示建立相应的文件夹:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
export KUBECONFIG=/etc/kubernetes/admin.conf
这样master节点配置完毕。
3、配置集群worker节点
worker节点的配置要简单很多,要将 worker 节点加入集群,执行如下命令即可:
kubeadm join 10.122.128.58:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:6d63ce3ab0e5eca2546bac5db05c9ec8bb8d98f0430abf127355b910413a5263
这条命令有有效期,过期后在master上执行如下命令重新获取:
kubeadm token create --print-join-command
在worker节点执行上面语句后,返回如下所示信息表示worker节点添加成功:
图13、worker节点安装成功界面
至此,集群部署完毕,执行如下命令查看集群状态:
图14、获取集群信息
图15、获取集群各节点状态
4、复用master节点虚拟机重新构建一个集群
因为家里网络和公司不一致,所以在家里也部署了一套集群,具体步骤如下:
1、先拷贝一个master节点虚拟机
2、在master节点上执行
kubectl delete nodes worker1
kubectl delete nodes worker2
3、执行kubeadm reset -f
4、删除$HOME/.kube文件夹
5、修改/ etc/ netplan下的00-installer-config.yaml文件中的IP地址与家里局域网段一致
6、修改/ etc / hosts文件中的ip地址
执行netplan apply使得网络生效,确认服务器已经加入到家里的局域网中
7、重新执行kubeadm init --config /home /zhaokaien / kubeadm-config.yaml
mkdir -p $HOME/.kube
cp -i /etc /kubenetes / admin.conf $HOME/ .kube /config
chown $(id -u):$(id -g) $HOME/.kube/config
export KUBECONFIG=/etc /kubenetes / admin.conf
具体步骤如下图:
图16、重新部署集群操作
8、重新克隆worker节点虚拟机,与master节点一样修改网络设置和hosts文件,执行netplan apply使网络生效
9、再将worker节点重新加入集群,在设置好网络的worker节点上执行:
kubeadm reset -f
再在master节点上执行:
kubeadm token create --print-join-command
最后在worker节点上执行:
kubeadm join 192.168.31.66:6443 --token hwhxck.w6xzsa1uarsrcucl --discovery-token-ca-cert-hash sha256:1a748992c52b902c705b2610d42158a7ccb817f2bbdb6c52d698648b3075873a
则完成新建集群的工作。
图17、重新部署集群成功
5、去除taint允许主节点部署pods
污点taint主要是用来标识k8s集群中哪些节点适合部署特定pod,哪些不适合部署特定pod,它与tolerent是一个相对的概念,如果需要去除主节点上的taint执行如下命令即可:
kubectl taint nodes --all node-role.kubernetes.io/master-
不去除污点,master节点的kube-controller-manager-master会报crashloopbackoff的问题。可以使用kubectl describe node master来查看master节点的污点设置。
不去除以下这个污点,master节点的kube-controller-manager-master会报ContainerCreating的异常
kubectl taint node master node.kubernetes.io/not-ready:NoSchedule-
类似的还可以使用以下命令去除如下污点:
kubectl taint node master node-role.kubernetes.io/control-plane:NoSchedule-
6、集群部署回退
执行部署的过程中,如果出现问题可以随时执行:kubeadm reset -f来进行回退部署。需要注意的是有两点,一是需要在主、从节点上都要执行该命令,二是注意及时手动清理主节点上的$HOME/.kube文件夹。
7、碰到的主要问题
(1)master执行完init后卡死,然后超时报异常
这种情况一般都是因为镜像下载问题导致的,具体表现为执行kubeadm init --config=kubeadm-config.yaml后,卡死在如下阶段:
[wait-control-plane] Waiting for the kubelet to boot up the control plane as static Pods from directory "/etc/kubernetes/manifests". This can take up to 4m0s
[kubelet-check] Initial timeout of 40s passed.
超过4m0s后,报错。通过journalctl -f -u containerd看容器引擎的日志,发现:
failed, error" error="failed to get sandbox image \"k8s.gcr.io/pause:3.6\": failed to pull image \"k8s.gcr.io/pause:3.6\": failed to pull and unpack image \"k8s.gcr.io/pause:3.6\": failed to resolve reference \"k8s.gcr.io/pause:3.6\": failed to do request: Head \"https://k8s.gcr.io/v2/pause/manifests/3.6\": dial tcp 108.177.125.82:443: i/o timeout"
Jul 05 19:08:30 k8s-testing01-190 containerd[13788]: time="2022-07-05T19:08:30.696324518 08:00" level=info msg="trying next host" error="failed to do request: Head \"https://k8s.gcr.io/v2/pause/manifests/3.6\": dial tcp 108.177.125.82:443: i/o timeout" host=k8s.gcr.io
(这里会无视kubelet的配置,如下指定了基础设置image并没用:--pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.7;kubeadm启动control plane还是会使用k8s.gcr.io/pause:3.5)
还会报找不到master node,仔细查看IP地址,hostname都没有问题。最后通过如下方式进行了解决,执行如下命令:
ctr -n k8s.io images tag registry.aliyuncs.com/google_containers/pause:3.7 k8s.gcr.io/pause:3.5
然后重新初始化:
kubeadm reset -f
kubeadm init --config /home/zhaokaien/kubeadm-config.yaml
解决办法参照的网址是:https://blog.csdn.net/avatar_2009/article/details/109601762
(2)Unable to connect to the server: x509: certificate signed by unknown authority (possibly because of "crypto/rsa: verification error" while trying to verify candidate authority certificate "kubernetes")
在部署过程中会频繁使用kubeadm reset -f对主、从节点进行重置,有时候会没有清理master上的$HOME/.kube文件夹,部署的时候程序也会清晰提示:
The reset process does not clean your kubeconfig files and you must remove them manually.
Please, check the contents of the $HOME/.kube/config file
如果忽略清理这个文件夹的话,会导致从节点加入到集群后无法访问master因此只需要在每次reset之后将master 节点上的该文件夹清理掉就可以了。
(3)The kubelet is unhealthy due to a misconfiguration of the node in some way (required cgroups disabled)
报这个错的时候:
The kubelet is unhealthy due to a misconfiguration of the node in some way (required cgroups disabled)
解决办法:在/ etc / docker / daemon.json文件中增加如下一行:
图18、修改docker的daemon.json文件
然后执行
systemctl daemon-reload
systemctl restart docker
执行 docker system info | grep -i driver查看driver是否已经由cgroups变成了systemd
图18、查看系统cgroup的driver
当然,很多时候init的时候卡在这里,报这个错并不是cgroup driver没有被设置成systemd,而是因为镜像下载到的原因,只要按照第二章第6节的操作解决镜像问题,也就解决了此问题。
(4)解决kube-proxy总是处于container-createing状态的问题
解决从节点上kube-proxy总是在kubectl get pods -n kube-system -o wide下显示的时候总是处于container-createing状态的问题:
cat /var/lib/kubelet/kubeadm-flags.env #查看环境变量的registry
图19、解决container-creating的问题-1
这种问题主要还是因为和外网不通(虽然配置了国内镜像源,但这个地方还是不能完全解决),不能访问k8s.gcr.io下载镜像所导致的问题,所以需要在所有节点执行如下命令:
ctr -n k8s.io i pull registry.aliyuncs.com/k8sxio/pause:3.7#下载国内镜像
ctr -n k8s.io i tag registry.aliyuncs.com/k8sxio/pause:3.7 k8s.gcr.io/pause:3.7#改名
ctr -n k8s.io i pull registry.aliyuncs.com/k8sxio/pause:3.5#下载国内镜像
ctr -n k8s.io i tag registry.aliyuncs.com/k8sxio/pause:3.5 k8s.gcr.io/pause:3.5#改名
ctr -n quay.io i tag tigera/operator:v1.28.0 quay.io/tigera/operator:v1.28.0
执行完后,很快就恢复了正常:
图20、解决container-creating的问题-2
(5)找不到主节点的报错:kubelet.go:2466] "Error getting node" err="node \"master\" not found"
首先检查本机的/ etc / hosts中的主机名和ip的配置是否有误,其次检查kubeadm-config.yaml文件中的advertise_ip是否外网IP,如是,改成内网试试,最后检查防火墙设置,在 / etc / sysctl.conf文件中添加如下内容:
图21、解决找不到主节点的问题
再执行sysctl -p
四、配置Calico网络插件
1、关于calico网络插件的理论知识
简而言之,calico插件主要作用就是是的k8s集群中的所有pod之间可以进行自由通信,其主要架构如下:
图22、calico架构图1
图23、calico架构图2
图24、calicoIPIP网络
图25、calicoBGP网络
很好的说明文档:
https://blog.frognew.com/2021/07/relearning-container-22.html
https://system51.github.io/2020/05/27/using-calico/
官网:https://www.tigera.io/project-calico/#
官方文档说明:
https://projectcalico.docs.tigera.io/networking/determine-best-networking
安装calico的必要条件:
https://projectcalico.docs.tigera.io/getting-started/kubernetes/requirements
2、calico部署的环境需求
我们部署使用的是calico3.24.1,这里就直接截取官方需求了,如下:
图26、安装calicoNODE必须条件
图27、安装calicoKubernetes必须条件
图28、安装calico应用层组件必须条件
3、使用tigera-operator的方式安装部署
calico的安装部署方式非常多,官方安装介绍首页:
https://projectcalico.docs.tigera.io/getting-started/kubernetes/
官方推荐采用tigera-operator方式进行安装,这个过程中主要踩坑的也是因为所需镜像都在国外,部署过程不能按照默认的配置自动下载镜像,所以导致过程中充满了坑。为了避免踩坑,需要先提前下载镜像并配置docker镜像源,以下内容也可以直接执行第二章第6节的脚本解决。
(1)准备镜像
先pull镜像:
docker pull calico/node:v3.24.1
docker pull calico/pod2daemon-flexvol:v3.24.1
docker pull calico/cni:v3.24.1
docker pull calico/kube-controllers:v3.24.1
docker pull calico/typha:v3.24.1
docker pull quay.io/tigera/operator:v1.28.0
再push到harbor仓库:
docker login 10.122.128.58 -u admin -p Harbor12345
docker tag calico/typha:v3.24.1 10.122.128.58/library/calico/typha:v3.24.1
docker push 10.122.128.58/library/calico/typha:v3.24.1
docker tag calico/kube-controllers:v3.24.1 10.122.128.58/library/calico/kube-controllers:v3.24.1
docker push 10.122.128.58/library/calico/kube-controllers:v3.24.1
docker tag calico/cni:v3.24.1 10.122.128.58/library/calico/cni:v3.24.1
docker push 10.122.128.58/library/calico/cni:v3.24.1
docker tag calico/pod2daemon-flexvol:v3.24.1 10.122.128.58/library/calico/pod2daemon-flexvol:v3.24.1
docker push 10.122.128.58/library/calico/pod2daemon-flexvol:v3.24.1
docker tag calico/node:v3.24.1 10.122.128.58/library/calico/node:v3.24.1
docker push 10.122.128.58/library/calico/node:v3.24.1
docker tag quay.io/tigera/operator:v1.28.0 10.122.128.58/library/tigera/operator:v1.28.0
docker push 10.122.128.58/library/tigera/operator:v1.28.0
以下代码无效,原因不明 加了docker就不行,可能是需要对docker转义
#docker tag calico/typha:v3.24.1 docker.io/calico/typha:v3.24.1
#docker tag calico/kube-controllers:v3.24.1 docker.io/calico/kube-controllers:v3.24.1
#docker tag calico/cni:v3.24.1 docker.io/calico/cni:v3.24.1
#docker tag calico/pod2daemon-flexvol:v3.24.1 docker.io/calico/pod2daemon-flexvol:v3.24.1
#docker tag calico/node:v3.24.1 docker.io/calico/node:v3.24.1
#docker tag 192.168.31.66/library/tigera/operator:v1.28.0 quay.io/tigera/operator:v1.28.0
最后在主节点使用ctr pull私有库镜像,并改标签名:
ctr -n docker.io images pull 192.168.31.66/library/calico/node:v3.24.1 --skip-verify
ctr -n docker.io images pull 192.168.31.66/library/calico/pod2daemon-flexvol:v3.24.1 --skip-verify
ctr -n docker.io images pull 192.168.31.66/library/calico/cni:v3.24.1 --skip-verify
ctr -n docker.io images pull 192.168.31.66/library/calico/kube-controllers:v3.24.1 --skip-verify
ctr -n docker.io images pull 192.168.31.66/library/calico/typha:v3.24.1 --skip-verify
ctr -n query.io images pull 192.168.31.66/library/tigera/operator:v1.28.0 --skip-verify
在从节点上执行类似操作:
编辑/etc/hosts,添加
192.168.31.66 master
ctr -n docker.io images pull -u admin:Harbor12345 192.168.31.66/library/calico/node:v3.24.1 --skip-verify
ctr -n docker.io images pull -u admin:Harbor12345 192.168.31.66/library/calico/pod2daemon-flexvol:v3.24.1 --skip-verify
ctr -n docker.io images pull -u admin:Harbor12345 192.168.31.66/library/calico/cni:v3.24.1 --skip-verify
ctr -n docker.io images pull -u admin:Harbor12345 192.168.31.66/library/calico/kube-controllers:v3.24.1 --skip-verify
ctr -n docker.io images pull -u admin:Harbor12345 192.168.31.66/library/calico/typha:v3.24.1 --skip-verify
ctr -n quay.io images pull -u admin:Harbor12345 192.168.31.66/library/tigera/operator:v1.28.0 --skip-verify
ctr -n docker.io i tag 192.168.31.66/library/calico/cni:v3.24.1 docker.io/calico/cni:v3.24.1
ctr -n docker.io i tag 192.168.31.66/library/calico/typha:v3.24.1 docker.io/calico/typha:v3.24.1
ctr -n docker.io i tag 192.168.31.66/library/calico/kube-controllers:v3.24.1 docker.io/calico/kube-controllers:v3.24.1
ctr -n docker.io i tag 192.168.31.66/library/calico/pod2daemon-flexvol:v3.24.1 docker.io/calico/pod2daemon-flexvol:v3.24.1
ctr -n docker.io i tag 192.168.31.66/library/calico/node:v3.24.1 docker.io/calico/node:v3.24.1
ctr -n quay.io i tag 192.168.31.66/library/tigera/operator:v1.28.0 quay.io/tigera/operator:v1.28.0
(2)使用tigera-operator安装部署
官方使用tigera-operator方式安装部署非常简单,直接先执行:
kubectl create -f https://projectcalico.docs.tigera.io/manifests/tigera-operator.yaml
图29、执行tigera-operator.yaml
kubectl create -f /home/zhaokaien/custom-resources.yaml
图30、执行custom-resources.yaml
上面的两个文件都可以从官方网站下载到,其中这两个文件需要进行如下一些修改才能执行:
修改tigera-operator.yaml文件
图31、修改tigera-operatoryaml
vi custom-resources.yaml
图32、修改custom-resources.yaml-1
图32、修改custom-resources.yaml-2
如果需要对初始化的网络配置进行修改,可以执行如下语句:
kubectl edit cm kubeadm-config -n kube-system
图33、修改kubeadm的初始化网络配置
vi /etc/kubernetes/manifests/kube-controller-manager.yaml
图33、修改kube-controller-manager.yaml文件
查看集群网络配置:
kubectl cluster-info dump | grep -m 1 cluster-cidr
图34、查看集群的cidr设置
终于看到了胜利的曙光
图35、集群配置成功
4、使用calico.yaml部署
第二种方式是使用官方的calico.yaml文件部署,先对calico.yaml文件进行修改如下:
图35、修改calico.yaml文件-1
图36、修改calico.yaml文件-2
然后执行kubectl create -f calico.yaml即可完成网络部署。
5、部署回退
执行过程发现有任何问题可以执行:
kubectl delete -f tigera-operator.yaml
kubectl delete -f customer-resources.yaml
或执行
kubectl delete -f calico.yaml
来分别对使用tigera-operator方式和使用calico.yaml方式进行部署的回退,然后再重新部署。
6、主要问题解决
(1)The CustomResourceDefinition "installations.operator.tigera.io" is invalid: metadata.annotations: Too long: must have at most 262144 bytes
这种情况主要发生在执行 kubectl apply -f 命令的过程中,实际上kubectl apply和kubectl create两个命令执行的效果是差不多的,建议优先使用kubectl create命令执行,要撤回kubectl apply / create -f的结果,执行:
kubectl delete -f https://projectcalico.docs.tigera.io/manifests/tigera-operator.yaml 即可。
尽量不要执行kubectl apply -f,因为有些情况下会报上述的错误:The CustomResourceDefinition "xxx" is invalid: metadata.annotations: Too long: must have at most 262144 bytes的异常,再去删除namespace就比较费劲。
(2)namespaces删除的时候一直报terminating的问题
解决办法如下:
1、执行kubectl get namespace -o json >tmp.json
2、编辑tmp.json, 将finalizers中的kubenetes清空
图37、修改tmp.json文件
3、在一个终端中启动一个临时的proxy
kubectl proxy
4、再开启一个终端,执行如下语句:
curl -k -H "Content-Type: application/json" -X PUT --data-binary @tmp.json http://127.0.0.1:8001/api/v1/namespaces/tigera-operator/finalize
图38、删除terminating的namespaces
5、再执行kubectl get namespace ,发现namespace已经删除了
删除terminating namespace的解决办法参考网址:https://blog.csdn.net/qq_31977125/article/details/120303165
(3)calico/node is not ready: BIRD is not ready: BGP not established with
如果直接执行calico.yaml文件,不做修改,则安装成功后calico-node 报错calico/node is not ready: BIRD is not ready: BGP not established with 报错的解决办法,修改如下:
图39、修改calico.yaml文件-3
图40、修改calico.yaml文件-4
(4)国外镜像无法下载的问题
解决国外镜像无法下载的问题参考如下两个网址:
https://www.yixuebiancheng.com/article/97518.html
https://blog.csdn.net/liuyanwuyu/article/details/119296259
7、其他参考网址
https://juejin.cn/post/6867846255884632078
https://www.cnblogs.com/khtt/p/16563088.html
https://www.modb.pro/db/456425
https://projectcalico.docs.tigera.io/reference/node/configuration
https://docs.projectcalico.org/getting-started/kubernetes/installation/config-options
https://www.cnblogs.com/leozhanggg/p/12930006.html
https://projectcalico.docs.tigera.io/getting-started/kubernetes/self-managed-onprem/onpremises
https://projectcalico.docs.tigera.io/getting-started/kubernetes/helm
https://projectcalico.docs.tigera.io/getting-started/kubernetes/
https://tinychen.com/20220508-k8s-03-deploy-k8s-with-calico/
https://blog.csdn.net/weixin_40248198/article/details/124798342
https://system51.github.io/2020/05/27/using-calico/
https://projectcalico.docs.tigera.io/networking/determine-best-networking
https://projectcalico.docs.tigera.io/getting-started/kubernetes/quickstart
https://zhuanlan.zhihu.com/p/138554103
https://blog.csdn.net/weixin_36338224/article/details/122532922
https://github.com/goharbor/harbor/releases/tag/v2.6.0
https://github.com/docker/compose
https://blog.csdn.net/weixin_41923467/article/details/122121370
https://xie.infoq.cn/article/6f277393176e42abdc284ce4d
https://blog.csdn.net/liuyanwuyu/article/details/119296259 重要
https://www.jianshu.com/p/b8a4c5ccc92d
https://www.learnfk.com/articles/C16301622.html
https://www.teanote.pub/archives/287
五、安装harbor v2.2.2私有仓库
1、部署方法
先参考网址:https://blog.csdn.net/u010533742/article/details/121522093内容将harbor的git clone到本地,并切换到版本v2.2.2:
mkdir -p /data
git clone https://github.com/goharbor/harbor.git
cd harbor
git checkout -b v2.2.2 v2.2.2
这一步里可能出现的主要问题是mac m1的情况下直接下载官网的安装包安装会失败,会报这样的问题:
WARNING: The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested
所以需要基于arm的支持。
2、配置harbor的https
为了配置harbor的https,还需要执行如下步骤:
mkdir /data/ssl
cd /data/ssl
openssl genrsa -out ca.key 3072
openssl req -new -x509 -days 3650 -key ca.key -out ca.pem
openssl genrsa -out harbor.key 3072
openssl req -new -key harbor.key -out harbor.csr
openssl x509 -req -in harbor.csr -CA ca.pem -CAkey ca.key -CAcreateserial -out harbor.pem -days 3650
openssl x509 -noout -text -in harbor.pem
从而生成如下文件:
图41、生成的harbor证书文件
这样harbor.yml文件修改的地方如下:
图42、修改harbor.yaml文件-1
图43、修改harbor.yaml文件-2
3、准备镜像
下载镜像的脚本 download _images.sh内容如下:
namespace=cocl666
version=v2.2.2
imgs=(
redis-photon
harbor-db
harbor-jobservice
harbor-log
nginx-photon
registry-photon
harbor-registryctl
notary-signer-photon
notary-server-photon
trivy-adapter-photon
chartmuseum-photon
harbor-exporter
prepare
harbor-portal
harbor-core
)
for img in ${imgs[@]}
do
docker pull $namespace/$img:$version
docker tag $namespace/$img:$version goharbor/$img:$version
done
docker pull $namespace/swagger:v0.21.0
docker tag $namespace/swagger:v0.21.0 goharbor/swagger:v0.21.0
docker save `docker images | grep $version | awk '{print $1":"$2}'` goharbor/swagger:v0.21.0 | gzip > harbor.$version.tar.gz
部署过程中可能会有部分镜像下载失败,如下:
error pulling image configuration: Get https://production.cloudflare.docker.com/registry-v2/docker/registry/v2/blobs/sha256/16/163245e857c91b0bbf1a8403624e70c97033701b3828ca080dda6c95acd6e482/data?verify=1662018912-DhMFuf4lWAnl7dOThEqWY4hWBCc=: dial tcp 104.18.122.25:443: i/o timeout
Error response from daemon: No such image: cocl666/harbor-core:v2.2.2
图44、重复执行直到所有镜像下载完成
只需要重新执行download_images.sh文件就可以,直到image下载成功后,就可以。
4、安装docker-compose
curl -L "https://github.com/docker/compose/releases/download/v2.10.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod x /usr/local/bin/docker-compose
docker-compose --version
5、开始安装harbor
执行./install.sh --with-chartmuseum --with-trivy
# --with-chartmuseum 启用helm仓库
# --with-trivy 使用trivy安全扫描工具
图45、安装harbor
安装成功后,执行docker-compose ps
图46、查看harbor安装情况
说明harbor运行正常。
在宿主机的浏览器里执行:http://10.122.128.58,就会弹出harbor的网络界面:
图47、harbor登录界面
输入admin/ Harbor12345(在harbor.yml中配置的默认管理密码,可以通过该文件修改),则可进入管理界面。
这个过程可能出现的一个问题是:docker login可以成功,但是页面访问的时候使用curl总是报:
SSL certificate problem: self signed certificate in certificate
其实这样已经是可以访问了,对于curl加上-k参数即可访问,对于浏览器主要是因为开了vpn所以访问不了,关闭VPN之后就正常了,如果有问题,可以重新生成证书,重启harbor即可。
6、docker配置harbor仓库
在/ etc/ docker/ daemon.json(如果没有新建即可)中添加如下内容,就可以配置docker的harbor仓库
图48、docker配置harbor私有仓库
{
"experimental": true,
"registry-mirrors": [
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com",
"https://p02uzmeg.mirror.aliyuncs.com"
],
"insecure-registries":["192.168.31.66"]
}
此处不配置会导致docker login 的时候报:
Error response from daemon: Get https://192.168.31.66/v2/: x509: cannot validate certificate for 192.168.31.66 because it doesn't contain any IP SANs
的异常。
#重启docker使配置生效
systemctl daemon-reload
systemctl restart docker
#尝试使用docker登录
docker login 10.122.128.58
docker login 10.122.128.58 -u admin -p Harbor12345
#尝试推送镜像到harbor仓库
docker push 10.122.128.58/library/test:1.0
图49、harbor私有仓库配置完成
出现上面界面说明harbor已完全配置成功。
7、harbor的重启操作
注意:以下命令只能在 /data /harbor /make 文件夹下执行:
docker-compose restart proxy
docker-compose down
./prepare
docker-compose up -d
harbor的其他具体使用手册如下:
https://goharbor.io/docs/2.0.0/install-config/configure-https/#verify-the-https-connection
命令行中harbor主要动过docker-compose来操作,其他操作相关命令还有:
docker-compose up -d
docker-compose top
docker-compose ps
docker-compose stop
docker-compose start #再次启动
docker-compose down #停用移除所有容器
docker-compose logs
8、将harbor配置成services
将harbor配置成service形式,添加配置文件 /etc/systemd/system/harbor.service
[Unit]
Description=Harbor
After=docker.service systemd-networkd.service systemd-resolved.service
Requires=docker.service
Documentation=http://github.com/vmware/harbor
[Service]
Type=simple
Restart=on-failure
RestartSec=5
ExecStart=/usr/local/bin/docker-compose -f /opt/harbor/docker-compose.yml up
ExecStop=/usr/local/bin/docker-compose -f /opt/harbor/docker-compose.yml down
[Install]
WantedBy=multi-user.target
9、其他参考网址
https://github.com/goharbor/harbor-arm
阿里云docker镜像地址:https://p02uzmeg.mirror.aliyuncs.com
https://www.dounaite.com/article/627a6991ac359fc913296ce7.html
官方下载地址:https://github.com/goharbor/harbor/releases
10、使用docker buildx重新编译harbor的尝试
因官方二进制版本的Harbar并不支持arm64架构,所以曾经尝试过使用docker buildx重新编译,但是过程很繁琐,参考网址如下,这里不做展开了:
https://blog.csdn.net/u014110320/article/details/124406628
https://github.com/docker/buildx/releases/tag/v0.9.1
https://waynerv.com/posts/building-multi-architecture-images-with-docker-buildx/#contents:builder-实例
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
图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}')
,免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com