Ubuntu 22.04.5 + kubeadm:Kubernetes v1.28.2集群部署企业实战

news2025/2/24 16:40:02

文章目录

    • Ubuntu 22.04.5 + kubeadm:Kubernetes v1.28.2集群部署企业实战
      • 一、环境准备
        • 1.1 机器规划
        • 1.2 环境配置
          • 1.2.1 设置主机名
          • 1.2.2 安装依赖工具
          • 1.2.3 配置时间同步
          • 1.2.4 关闭swap分区
          • 1.2.5 停止和禁用防火墙
          • 1.2.6 配置内核转发及网桥过滤
          • 1.2.7 安装配置ipset及ipvsadm
      • 二、安装容器运行时
        • 2.1 创建目录
        • 2.2 下载并导入 GPG 密钥环
        • 2.3 将容器仓库添加到`sources.list.d`文件中
        • 2.4 获得包的更新信息
        • 2.5 安装部署容器运行时
          • 2.5.1 查看可安装的容器运行时版本信息
          • 2.5.2 指定容器运行时版本进行安装
          • 2.5.3 生成Containerd的配置文件
          • 2.5.4 验证版本信息
        • 2.6 配置crictl客户端
      • 三、K8S集群部署
        • 3.1 K8S集群软件apt源准备
        • 3.2 安装k8s组件
          • 3.2.1 查看可用版本
          • 3.2.2 安装指定的版本
          • 3.2.3 检查kubeadm,kubelet,kubectl的安装情况
          • 3.2.4 锁定k8s软件版本
        • 3.3 K8S主节点集群初始化
          • 3.3.1 生成默认配置文件
          • 3.3.2 列举出需要拉取的镜像
          • 3.3.3 k8s集群的初始化
        • 3.4 worker节点设置环境变量
        • 3.5 K8S集群网络插件
          • 3.5.1 在线安装
          • 3.5.2 离线安装
            • 3.5.2.1 下载calico离线包
            • 3.5.2.2 将calico离线包解压
            • 3.5.2.3 查看需要的镜像内容
            • 3.5.2.4 查询containerd的命名空间
            • 3.5.2.5 将calico的离线镜像包导入命名空间中
            • 3.5.2.6 安装calico
            • 3.5.2.7 查看calico的部署情况
        • 3.6 worker节点加入到集群中
          • 3.6.1 worker节点重启containerd
          • 3.6.2 在k8s-master上获取加入集群的token值
          • 3.6.3 worker节点加入集群
          • 3.6.4 查看集群最终状态

Ubuntu 22.04.5 + kubeadm:Kubernetes v1.28.2集群部署企业实战

一、环境准备

1.1 机器规划

三台机器都是采用Ubuntu 22.04.5的版本,内核版本是5.15.0-125-generic,三台机器具体的分布如下:

角色主机名称IPkueernetes版本
masterk8s-master192.168.1.131v1.28.2
node1k8s-node1192.168.1.132v1.28.2
node2k8s-node2192.168.1.133v1.28.2

Docker Engine 没有实现 CRI, 而这是容器运行时在 Kubernetes 中工作所需要的。 为此,必须安装一个额外的服务 cri-dockerd。 cri-dockerd 是一个基于传统的内置 Docker 引擎支持的项目,它在 1.24 版本从 kubelet 中移除。

1.2 环境配置

**注意:**没明确标记的,各个节点分别执行。

确保每个节点上的MAC地址和product_uuid的唯一性。

  • 你可以使用命令ip linkifconfig -a 来获取网络接口的 MAC 地址
$ ip link
$ ifconfig -a
  1. k8s-master
superman@k8s-1:~$ ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
    link/ether 00:0c:29:1b:04:d1 brd ff:ff:ff:ff:ff:ff
    altname enp2s1
superman@k8s-1:~$ 
superman@k8s-1:~$ ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.131  netmask 255.255.255.0  broadcast 192.168.1.255
        inet6 fe80::20c:29ff:fe1b:4d1  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:1b:04:d1  txqueuelen 1000  (Ethernet)
        RX packets 12685  bytes 17472224 (17.4 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 2530  bytes 328873 (328.8 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 216  bytes 20866 (20.8 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 216  bytes 20866 (20.8 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

superman@k8s-1:~$ 
  1. k8s-node1
superman@k8s-2:~$ ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
    link/ether 00:0c:29:22:09:61 brd ff:ff:ff:ff:ff:ff
    altname enp2s1
superman@k8s-2:~$ 
superman@k8s-2:~$ ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.132  netmask 255.255.255.0  broadcast 192.168.1.255
        inet6 fe80::20c:29ff:fe22:961  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:22:09:61  txqueuelen 1000  (Ethernet)
        RX packets 1214  bytes 264472 (264.4 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 789  bytes 171947 (171.9 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 114  bytes 9286 (9.2 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 114  bytes 9286 (9.2 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

superman@k8s-2:~$ 
  1. k8s-node2
superman@k8s-3:~$ ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
    link/ether 00:0c:29:18:0e:66 brd ff:ff:ff:ff:ff:ff
    altname enp2s1
superman@k8s-3:~$ 
superman@k8s-3:~$ ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.133  netmask 255.255.255.0  broadcast 192.168.1.255
        inet6 fe80::20c:29ff:fe18:e66  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:18:0e:66  txqueuelen 1000  (Ethernet)
        RX packets 1022  bytes 244438 (244.4 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 699  bytes 158343 (158.3 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 112  bytes 9142 (9.1 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 112  bytes 9142 (9.1 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

superman@k8s-3:~$
  • 可以使用 sudo cat /sys/class/dmi/id/product_uuid 命令对product_uuid校验
$ sudo cat /sys/class/dmi/id/product_uuid
  1. k8s-master
superman@k8s-1:~$ sudo cat /sys/class/dmi/id/product_uuid
[sudo] password for superman: 
85474d56-6677-3e77-346a-6373051b04d1
superman@k8s-1:~$ 
  1. k8s-node1
superman@k8s-2:~$ sudo cat /sys/class/dmi/id/product_uuid
[sudo] password for superman: 
e4ec4d56-6812-0bd6-420a-11f183220961
superman@k8s-2:~$ 
  1. k8s-node2
superman@k8s-3:~$ sudo cat /sys/class/dmi/id/product_uuid
[sudo] password for superman: 
1edf4d56-159d-4571-32c5-248052180e66
superman@k8s-3:~$ 

一般来讲,硬件设备会拥有唯一的地址,但是有些虚拟机的地址可能会重复。 Kubernetes 使用这些值来唯一确定集群中的节点。 如果这些值在每个节点上不唯一,可能会导致安装失败。

1.2.1 设置主机名

根据机器的规划,分布设置三台主机名为k8s-master、k8s-node1和k8s-node2,目的是为了方便识别。

  1. k8s-master
$ sudo hostnamectl set-hostname k8s-master && bash
  1. k8s-node1
$ sudo hostnamectl set-hostname k8s-node1 && bash
  1. k8s-node2
$ sudo hostnamectl set-hostname k8s-node2 && bash
1.2.2 安装依赖工具
$ sudo apt install -qq -y vim iputils-ping net-tools ntpdate unzip lrzsz apt-transport-https
1.2.3 配置时间同步

安装完Ubuntu系统时,系统的时区是有问题的,我们需要对系统的时区进行修改。

$ sudo timedatectl set-timezone Asia/Shanghai

执行如下命令进行时间校对:

$ sudo ntpdate time1.aliyun.com

并且,通过计划任务实现时间同步。如下命令是每一个小时向阿里云时间服务器进行校对时间。

$ sudo crontab -e

添加如下内容:

0 */1 * * * ntpdate time1.aliyun.com
1.2.4 关闭swap分区
  1. 临时关闭
$ sudo swapoff -a
  1. 永久关闭
$ sudo sed -ri 's/.*swap.*/#&/' /etc/fstab
1.2.5 停止和禁用防火墙
$ sudo systemctl disable --now ufw
1.2.6 配置内核转发及网桥过滤
  1. 添加配置文件
$ sudo -i
# cat >> /etc/modules-load.d/k8s.conf <<EOF
overlay
br_netfilter
EOF
  1. 加载模块
# modprobe overlay
# modprobe br_netfilter
  1. 添加网桥过滤及内核转发配置文件
# cat >>/etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables  = 1
net.ipv4.ip_forward                 = 1
EOF
# sysctl --system
1.2.7 安装配置ipset及ipvsadm
  1. 安装
# apt -y install ipset ipvsadm
  1. 配置ipvsadm需要的模块
# cat >> /etc/modules-load.d/ipvs.conf <<EOF
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack
EOF
  1. 加载ipvsadm需要的模块
# cat << EOF | tee ipvs.sh
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack
EOF
# sh ipvs.sh
# exit

二、安装容器运行时

**注意:**所有节点执行,以k8s-master操作为例。

2.1 创建目录
$ sudo mkdir -p /etc/apt/keyrings
2.2 下载并导入 GPG 密钥环
$ sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
2.3 将容器仓库添加到sources.list.d文件中
$ sudo echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list
2.4 获得包的更新信息
$ sudo apt -qq update
2.5 安装部署容器运行时
2.5.1 查看可安装的容器运行时版本信息
$ apt-cache madison containerd.io

image-20241120160050537

2.5.2 指定容器运行时版本进行安装

**注意:**安装指定版本的containerd,可以不指定版本就是最新的版本。

$ sudo apt install -qq -y containerd.io=1.7.23-1
2.5.3 生成Containerd的配置文件
$ sudo -i
# containerd config default > /etc/containerd/config.toml
# sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
# sed -i 's#sandbox_image = "registry.k8s.io/pause:3.8"#sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"#g' /etc/containerd/config.toml
# systemctl daemon-reload
# systemctl restart containerd
# exit
2.5.4 验证版本信息
$ sudo containerd --veriosn

image-20241119220911017

2.6 配置crictl客户端
$ sudo -i
# cat > /etc/crictl.yaml <<EOF
runtime-endpoint: unix:///var/run/containerd/containerd.sock
image-endpoint: unix:///var/run/containerd/containerd.sock
timeout: 0
debug: false
pull-image-on-create: false
EOF
# exit

三、K8S集群部署

3.1 K8S集群软件apt源准备

使用阿里云镜像源,执行如下命令:

$ sudo curl -fsSL https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add
$ sudo echo "deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list

添加完源件源后,执行下面命令进行更新源:

$ sudo apt-get update

执行完后可能会报如下警告,原因是因为公钥的问题,可以忽略。

image-20241117090653770

3.2 安装k8s组件
3.2.1 查看可用版本

运行 apt list -a kubeadm或者’apt-cache madison kubeadm’ 查看可用版本, 当前我们使用的版本是 1.28.2-00

通过以下命令查看可以安装的软件列表,查询到最新版本是1.28.2的版本。

$ sudo apt list -a kubeadm

image-20241117091021513

$ sudo apt-cache madison kubeadm

image-20241117091324042

3.2.2 安装指定的版本

本案例以安装最新版本是1.28.2为例。执行如下命令进行安装:

$ sudo apt install -y kubeadm=1.28.2-00 kubelet=1.28.2-00 kubectl=1.28.2-00
3.2.3 检查kubeadm,kubelet,kubectl的安装情况

如果都能获取到版本号,说明安装成功。

  1. 查看kubeadm版本
$ kubeadm version
  1. 查看kubelet版本
$ kubelet --version
  1. 查看kubectl版本
$ kubectl version --client
3.2.4 锁定k8s软件版本

防止k8s软件自动升级,通过以下命令进行锁定版本。

$ sudo apt-mark hold kubelet kubeadm kubectl
3.3 K8S主节点集群初始化

**注意:**只在k8s-master节点操作。

3.3.1 生成默认配置文件

通过如下命令生成一个默认的配置文件:

$ kubeadm config print init-defaults > /home/superman/kubeadm-init.yaml

执行完上述的命令会在对应的目录下生成一个kubeadm-init.yaml文件,需要对这个文件的一些参数进行修改。

$ vim /home/superman/kubeadm-init.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: 192.168.1.131    ---修改了master IP地址
  bindPort: 6443
nodeRegistration:
  criSocket: unix:///var/run/containerd/containerd.sock
  imagePullPolicy: IfNotPresent
  name: k8s-master    ---修改了master节点主机名称
  taints: null
---
apiServer:
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers   ---修改了镜像源地址
kind: ClusterConfiguration
kubernetesVersion: 1.28.2   ---修改了版本信息
networking:
  dnsDomain: cluster.local
  podSubnet: 10.244.0.0/16   ---添加了Pod网段信息
  serviceSubnet: 10.96.0.0/12
scheduler: {}
cgroupDriver: systemd
3.3.2 列举出需要拉取的镜像

可以通过以下命令列举出需要拉取的镜像。

$ sudo kubeadm config images list --config /home/superman/kubeadm-init.yaml

image-20241117145809258

可以提前把需求的镜像拉取下来,通过下面命令进行拉取:

$ sudo kubeadm config images pull --config /home/superman/kubeadm-init.yaml

image-20241117161733142

3.3.3 k8s集群的初始化

拉取成功之后,通过下面的命令进行k8s集群的初始化。

$ sudo kubeadm init --config=/home/superman/kubeadm-init.yaml --v=6

有时因网络等原因会异常,继续执行kubeadm init会报如下错误:

I1117 18:12:22.787732    6632 checks.go:243] validating the existence and emptiness of directory /var/lib/etcd
[preflight] Some fatal errors occurred:
        [ERROR Port-6443]: Port 6443 is in use
        [ERROR Port-10259]: Port 10259 is in use
        [ERROR Port-10257]: Port 10257 is in use
        [ERROR FileAvailable--etc-kubernetes-manifests-kube-apiserver.yaml]: /etc/kubernetes/manifests/kube-apiserver.yaml already exists
        [ERROR FileAvailable--etc-kubernetes-manifests-kube-controller-manager.yaml]: /etc/kubernetes/manifests/kube-controller-manager.yaml already exists
        [ERROR FileAvailable--etc-kubernetes-manifests-kube-scheduler.yaml]: /etc/kubernetes/manifests/kube-scheduler.yaml already exists
        [ERROR FileAvailable--etc-kubernetes-manifests-etcd.yaml]: /etc/kubernetes/manifests/etcd.yaml already exists
        [ERROR Port-10250]: Port 10250 is in use
        [ERROR Port-2379]: Port 2379 is in use
        [ERROR Port-2380]: Port 2380 is in use
        [ERROR DirAvailable--var-lib-etcd]: /var/lib/etcd is not empty
[preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`
error execution phase preflight
k8s.io/kubernetes/cmd/kubeadm/app/cmd/phases/workflow.(*Runner).Run.func1
        cmd/kubeadm/app/cmd/phases/workflow/runner.go:260
k8s.io/kubernetes/cmd/kubeadm/app/cmd/phases/workflow.(*Runner).visitAll
        cmd/kubeadm/app/cmd/phases/workflow/runner.go:446
k8s.io/kubernetes/cmd/kubeadm/app/cmd/phases/workflow.(*Runner).Run
        cmd/kubeadm/app/cmd/phases/workflow/runner.go:232
k8s.io/kubernetes/cmd/kubeadm/app/cmd.newCmdInit.func1
        cmd/kubeadm/app/cmd/init.go:111
github.com/spf13/cobra.(*Command).execute
        vendor/github.com/spf13/cobra/command.go:940
github.com/spf13/cobra.(*Command).ExecuteC
        vendor/github.com/spf13/cobra/command.go:1068
github.com/spf13/cobra.(*Command).Execute
        vendor/github.com/spf13/cobra/command.go:992
k8s.io/kubernetes/cmd/kubeadm/app.Run
        cmd/kubeadm/app/kubeadm.go:50
main.main
        cmd/kubeadm/kubeadm.go:25
runtime.main
        /usr/local/go/src/runtime/proc.go:250
runtime.goexit
        /usr/local/go/src/runtime/asm_amd64.s:1598
superman@k8s-master:~$ 

这是因为前面已经执行过一次kubeadm init了。这个时候需要加个参数来忽略到这些:–ignore-preflight-errors=all

$ sudo kubeadm init --config=/home/superman/kubeadm-init.yaml --v=6 --ignore-preflight-errors=all

出现以下信息,代表k8s初始成功了。

image-20241122125622097

按照上述的提示,进行如下的操作:

$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
$ echo "KUBECONFIG=$HOME/.kube/config" >> .bash_profile
$ source .bash_profile
$ sudo -i
# mkdir -p $HOME/.kube
# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# echo "KUBECONFIG=$HOME/.kube/config" >> .bash_profile
# scp /etc/kubernetes/admin.conf superman@192.168.1.132:/home/superman/config
# scp /etc/kubernetes/admin.conf superman@192.168.1.133:/home/superman/config
# exit

执行上述的命令,就可以通过kubectl进行查看k8s集群的状态信息。

$ kubectl get cs

image-20241122132430147

3.4 worker节点设置环境变量
$ mkdir $HOME/.kube
$ cp config $HOME/.kube
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
$ echo "KUBECONFIG=$HOME/.kube/config" >> .bash_profile
$ source .bash_profile
$ sudo -i
# mkdir -p $HOME/.kube
# cp -i /home/superman/.kube/config $HOME/.kube/config
# echo "KUBECONFIG=$HOME/.kube/config" >> .bash_profile
# source .bash_profile
# exit
3.5 K8S集群网络插件

在安装到calico网络组件的时候或多或少都会因为国内外网络的问题一直卡在pull镜像的阶段无法完成安装,本案例通过离线方式安装Calico网络插件。

**注意:**所有节点均需安装,以k8s-master节点为例;其它节点参照执行。

3.5.1 在线安装

如果能科学上网的可以考虑在线安装,详细安装步骤可以查阅官方文档,找到Quickstart for Calico on Kubernetes中的Install Calico,如下图

image-20241122132927063

3.5.2 离线安装
3.5.2.1 下载calico离线包

首先去github全局搜索calico,点击进入项目,在Releases下下载自己需要的calico版本的离线包(本案例3.27版本为例)。项目下载地址如下:

$ wget https://github.com/projectcalico/calico/releases/download/v3.29.0/release-v3.29.0.tgz
3.5.2.2 将calico离线包解压

在线下载或者把下载的文件上传服务器并进行解压,如下:

$ tar xzf release-v3.29.0.tgz
$ cd release-v3.29.0/
$ ls
bin  images  manifests
$
3.5.2.3 查看需要的镜像内容

然后,进入到manifests文件夹,查看calico.yml文件,查看需要的镜像内容,如下:

$ cd manifests/
$ ls
alp                      calico-typha.yaml          crds.yaml                ocp-tigera-operator-no-resource-loading.yaml
apiserver.yaml           calico-vxlan.yaml          csi-driver.yaml          operator-crds.yaml
calico-bpf.yaml          calico-windows-bgp.yaml    custom-resources.yaml    README.md
calicoctl-etcd.yaml      calico-windows-vxlan.yaml  flannel-migration        tigera-operator.yaml
calicoctl.yaml           calico.yaml                generate.sh              windows-kube-proxy.yaml
calico-etcd.yaml         canal-etcd.yaml            grafana-dashboards.yaml
calico-policy-only.yaml  canal.yaml                 ocp
$ cat calico.yaml |grep image:
          image: docker.io/calico/cni:v3.29.0
          image: docker.io/calico/cni:v3.29.0
          image: docker.io/calico/node:v3.29.0
          image: docker.io/calico/node:v3.29.0
          image: docker.io/calico/kube-controllers:v3.29.0
$ 

image-20241122140214602

这里显示安装calico需要三个镜像,去解压的离线包imgaes文件夹中找到对应的三个离线镜像包文件,这里对应的分别是calico-cni.tar,calico-kube-controllers.tar和calico-node.tar三个离线包,将这三个离线镜像上传至服务器。

3.5.2.4 查询containerd的命名空间

可以使用ctr namespace ls命令查看containerd的命名空间。k8s的命名空间为k8s.io

$ sudo ctr namespace ls
[sudo] password for superman: 
NAME   LABELS 
k8s.io        
$ 

image-20241122140054231

3.5.2.5 将calico的离线镜像包导入命名空间中

使用containerd的导入镜像命令将calico的离线镜像包导入到k8s的命名空间中

$ cd ../images/
$ ls
calico-cni.tar       calico-flannel-migration-controller.tar  calico-node.tar        calico-typha.tar
calico-dikastes.tar  calico-kube-controllers.tar              calico-pod2daemon.tar
$ sudo ctr -n k8s.io images import calico-cni.tar
$ sudo ctr -n k8s.io images import calico-kube-controllers.tar
$ sudo ctr -n k8s.io images import calico-node.tar

image-20241122142443816

3.5.2.6 安装calico

进入到manifests/文件夹中,执行如下命令,安装calico。

$ cd ../manifests/
$ kubectl create -f calico.yaml

image-20241122140429519

3.5.2.7 查看calico的部署情况

执行完上述的命令后,即可完成calico的部署。如下:

$ kubectl get pod -A

image-20241122142351648

3.6 worker节点加入到集群中
3.6.1 worker节点重启containerd

执行之前请先重启containerd。

$ sudo systemctl daemon-reload && systemctl restart containerd
3.6.2 在k8s-master上获取加入集群的token值

在k8s-master上通过如下命令,获取加入集群的token值。

$ kubeadm token create --print-join-command

执行成功后,会出现如下信息,复制如下输出信息在需求加入集群的node节点上执行。

superman@k8s-master:~$ kubeadm token create --print-join-command
kubeadm join 192.168.1.131:6443 --token 8kn91z.eu6z06sfp1kuv7c7 --discovery-token-ca-cert-hash sha256:c5beee3314d5cb394fd509988d2c1462af247a0371b64c0f2a1776d82167550b 
superman@k8s-master:~$ 

image-20241122144514311

3.6.3 worker节点加入集群

k8s-node1节点加入集群

$ sudo kubeadm join 192.168.1.131:6443 --token 8kn91z.eu6z06sfp1kuv7c7 --discovery-token-ca-cert-hash sha256:c5beee3314d5cb394fd509988d2c1462af247a0371b64c0f2a1776d82167550b 

如果执行完命令后,出现如下信息,表示已经加入成功。

image-20241122144431616

也可以通过在master节点上执行如下命令查看是否加入成功。

$ kubectl get node

image-20241122144633793

由于还没安装网络插件的原因,所以,节点显示NotReady状态。

k8s-node2节点参照上面执行。

3.6.4 查看集群最终状态
$ kubectl get node
$ kubectl get pods -A

image-20241122152507222

原文链接:https://mp.weixin.qq.com/s/zxyeHs7YXm0h3XIezTKDuQ

👍 点赞,你的认可是我创作的动力!

⭐️ 收藏,你的青睐是我努力的方向!

✏️ 评论,你的意见是我进步的财富!

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2254735.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mac环境下brew安装LNMP

安装不同版本PHP 在Mac环境下同时运行多个版本的PHP&#xff0c;同Linux环境一样&#xff0c;都是将后台运行的php-fpm设置为不同的端口号&#xff0c;下面将已php7.2 和 php7.4为例 添加 tap 目的&#xff1a;homebrew仅保留最近的php版本&#xff0c;可能没有你需要的版本…

【Python网络爬虫笔记】8- (BeautifulSoup)抓取电影天堂2024年最新电影,并保存所有电影名称和链接

目录 一. BeautifulSoup的作用二. 核心方法介绍2.1 构造函数2.2 find()方法2.3 find_all()方法2.4 select()方法 三. 网络爬虫中使用BeautifulSoup四、案例爬取结果 一. BeautifulSoup的作用 解析HTML/XML文档&#xff1a;它可以将复杂的HTML或XML文本转换为易于操作的树形结构…

解决LED显示屏水波纹的方法

在拍摄LED显示屏时&#xff0c;水波纹和扫描线的出现常常让人误以为是显示屏质量问题&#xff0c;但实际上这些现象往往与拍摄角度和焦距有关。本文将探讨水波纹的成因&#xff0c;并提供一些有效的解决方法。 1. 水波纹与扫描线现象的区别 水波纹通常呈现无规则的弧形扩散状态…

【MySQL — 数据库基础】深入理解数据库服务与数据库关系、MySQL连接创建、客户端工具及架构解析

目录 1. 数据库服务&#xff06;数据库&#xff06;表之间的关系 1.1 复习 my.ini 1.2 MYSQL服务基于mysqld启动而启动 1.3 数据库服务的具体含义 1.4 数据库服务&数据库&表之间的关系 2. 客户端工具 2.1 客户端连接MySQL服务器 2.2 客…

记录关于阿里云智能媒体预览pdf文件的问题

pdf仅支持预览&#xff0c;不支持编辑&#xff0c;需要将权限设置成只读。 readonly参数一定要传&#xff0c;不能不传&#xff01;&#xff01;&#xff01;&#xff01; readonly的设置一定要用示例提供的方法&#xff01;&#xff01;&#xff01;&#xff01; 用WebofficeP…

FlyHttp 的设计思想:前端 API 自动化构建工具

FlyHttp的相关文章&#xff1a; FlyHttp 的诞生&#xff1a;从认识各种网络请求开始 FlyHttp 的设计思想&#xff1a;前端 API 自动化构建工具 FlyHttp 的使用&#xff1a;如何高效使用 FlyHttp&#xff0c;支持 JS、TS 项目 FlyHttp 的最佳实践&#xff1a;加速项目级 API…

WHLUG丨deepin、华中科技大学开放原子开源俱乐部、 RustSBI 和清华大学开源操作系统训练营共话开源新生代成长之路

2024年11月30日下午&#xff0c;由 deepin&#xff08;深度&#xff09;社区联合华中科技大学开放原子开源俱乐部、 RustSBI 开源社区和清华大学开源操作系统训练营共同举办的WHLUG&#xff08;武汉Linux用户组&#xff09;线下沙龙在华中科技大学成功举办。 本次活动聚集了50余…

K8S离线部署Nacos集群【Oracle作外部数据源】

一、前言 由于公司的要求下要使Nacos集群以Oracle作为外部数据源&#xff0c;前期咱们已经阐述了如何在本地搭建&#xff08;Nacos集群搭建【Oracle作外部数据源】&#xff09;&#xff0c;本次将带领大家在k8s上部署Nacos集群并以Oracle作为外部数据源。 二、软件包 nacos-f…

MperReduce学习笔记下

自定义InputFormat合并小文件 案例需求 无论hdfs还是mapreduce&#xff0c;对于小文件都有损效率&#xff0c;实践中&#xff0c;又难免面临处理大量小文件的场景&#xff0c;此时&#xff0c;就需要有相应解决方案。 案例分析 小文件的优化无非以下几种方式&#xff1a; …

Junit5 单元测试入门

基础知识 常用注解含义 Test&#xff1a;标记一个方法为测试方法BeforeEach&#xff1a;标记的方法会在每个测试方法执行前执行AfterEach&#xff1a;标记的方法会在每个测试方法执行后执行BeforeAll&#xff1a;标记的方法会在所有测试方法执行前执行一次AfterAll&#xff1…

【CSS in Depth 2 精译_065】第四部分:CSS 视觉增强技术 + 第 11 章 颜色与对比概述 + 11.1 通过对比进行交流

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第四部分 视觉增强技术 ✔️【第 11 章 颜色与对比】 ✔️ 11.1 通过对比进行交流 ✔️ 11.1.1 模式的建立 ✔️11.1.2 还原设计稿 ✔️ 11.2 颜色的定义 文章目录 第四部分 视觉增强技术 Visual e…

Java项目实战II基于微信小程序的作品集展示(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、核心代码 五、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 随着移动互联网技术的飞速…

基于rpcapd与wireshark的远程实时抓包的方法

基于rpcapd与wireshark的远程实时抓包的方法 服务端安装wireshark侧设置 嵌入式设备或服务器上没有图形界面&#xff0c;通常使用tcpdump抓包保存为pcap文件后&#xff0c;导出到本地使用wireshark打开分析&#xff0c;rpcapd可与wireshark配合提供一种远程实时抓包的方案&…

记录一个Flutter 3.24单元测试点击事件bug

哈喽&#xff0c;我是老刘 这两天发现一个Flutter 3.24版本的单元测试的一个小bug&#xff0c;提醒大家注意一下。 老刘自己写代码十多年了&#xff0c;写Flutter也6年多了&#xff0c;没想到前两天在一个小小的BottomNavigationBar 组件上翻了车。 给大家分享一下事件的经过。…

JVM 类加载器有哪些?双亲委派机制的作用是什么?如何自定义类加载器?

类加载器分类 大家好&#xff0c;我是码哥&#xff0c;可以叫我靓仔&#xff0c;《Redis 高手心法》畅销书作者。 先回顾下&#xff0c;在 Java 中&#xff0c;类的初始化分为几个阶段: 加载、链接&#xff08;包括验证、准备和解析&#xff09;和 初始化。 而 类加载器&#x…

视频监控汇聚平台Liveweb视频安防监控实时视频监控系统操作方案

Liveweb国标GB28181视频平台是一种基于国标GB/T28181协议的安防视频流媒体能力平台。它支持多种视频功能&#xff0c;包括实时监控直播、录像、检索与回看、语音对讲、云存储、告警以及平台级联等功能。该平台部署简单、可扩展性强&#xff0c;支持全终端、全平台分发接入的视频…

Docker-Compose环境变量

Docker-Compose环境变量 背景配置文件修改docker-compose.yml在服务内部使用环境变量重新构建容器补充 背景 现状是通过Docker-Compose配置管理系统的各个容器服务、因为是微服务架构所以配置文件很多、但是例如数据库、redis、kafka等配置都是同一份但是需要在多个配置文件做…

cocotb pytest

打印python中的print &#xff0c; 应该使用 pytest -s pytest --junitxmltest_report.xml --htmlreport.html

openEuler yum 设置国内镜像

查看openEuler系统信息 cat /etc/os-release可以看到详细系统版本如下 NAME"openEuler" VERSION"24.09" ID"openEuler" VERSION_ID"24.09" PRETTY_NAME"openEuler 24.09" ANSI_COLOR"0;31"系统使用的版本是24.0…

电脑鼠标箭头一直闪烁怎么回事?原因及解决方法

电脑鼠标箭头不停闪烁&#xff0c;很多用户都曾遇到过&#xff0c;就是点击也无法点击&#xff0c;只能看到箭头一直闪动。造成这种故障的原因有很多&#xff0c;可能是硬件、软件或系统的问题。本文将介绍电脑鼠标箭头不停闪烁的可能原因和相应的解决方法&#xff0c;帮助大家…