Ubuntu部署K8S集群-图文并茂(超详细)

Ubuntu部署K8S集群

  • 1. 模版机系统环境准备
    • 1.1 安装Ubuntu
    • 1.2 设置静态IP地址
  • 2. 主机准备
    • 2.1 使用模板机创建主机
    • 2.2 主机配置
      • 2.2.1 修改静态IP
      • 2.2.2 修改主机名
      • 2.2.3 主机名-IP地址解析
      • 2.2.4 时间同步
      • 2.2.5 内核转发、网桥过滤配置
      • 2.2.6 安装ipset和ipvsadm
      • 2.2.7 关闭SWAP分区
  • 3. 容器运行时 Containerd 准备
    • 3.1 获取Containerd安装包
    • 3.2 安装 Containerd
    • 3.3 创建&修改配置文件
    • 3.4 启动Containerd&开机自启
  • 4. K8S集群部署
    • 4.1 软件源准备
    • 4.2 软件安装
    • 4.3 集群初始化
    • 4.4 准备kubectl配置文件
    • 4.5 添加工作节点到集群
  • 5. K8S集群网络插件 Calico
    • 5.1 operator
    • 5.2 自定义配置
    • 5.3 错误解答
  • 6. 部署Nginx测试验证K8S集群是否可用


创作不易,禁止转载抄袭!!!违者必究!!!

创作不易,禁止转载抄袭!!!违者必究!!!

创作不易,禁止转载抄袭!!!违者必究!!!


1. 模版机系统环境准备

1.1 安装Ubuntu

看这篇文章:
https://blog.csdn.net/weixin_52799373/article/details/139341024

根据上面的文章安装一个Ubuntu系统,确保系统:

  1. 安装后可以联网

安装完以后,登录系统,输入以下命令:

ping www.baidu.com

提示类似以下输出,则代表可联网:

在这里插入图片描述

注意:Ctrl+C退出 ping 命令。

  1. 可以使用SSH工具连接

在这里插入图片描述

  1. 已设置root密码

如果没有设置,请看上面文章的第5.1步骤

确保可以通过命令正常切换root用户:

su - root

在这里插入图片描述

1.2 设置静态IP地址

  1. 通过命令切换到root用户:
su - root

在这里插入图片描述

  1. 备份网络配置文件

执行以下命令,先备份一下配置文件:

cp /etc/netplan/00-installer-config.yaml /etc/netplan/00-installer-config.yaml.bak

在这里插入图片描述

  1. 修改配置文件
vim /etc/netplan/00-installer-config.yaml

将配置文件原有的内容删除,把下面的配置,复制到配置文件中:
(复制的时候一定要注意缩进!)

# 表示下面内容是关于网络配置的
network:# 表示所使用的网络配置格式版本是 2,表明这是使用 netplan 工具的配置格式版本version: 2# 指定了使用 networkd 作为网络管理后端。networkd 是 systemd 提供的网络管理服务renderer: networkd# 是一个键,表示该部分配置的是以太网接口ethernets:# 是具体的以太网接口的名称ens33:# 表示该接口不使用 DHCP 来获取 IPv4 地址,而是使用静态配置dhcp4: no# 列表中的项表示为该接口配置的静态 IP 地址addresses:# 是该接口的静态 IP 地址和子网掩码。/24 表示子网掩码是 255.255.255.0(这里/24是固定的,/24前面的静态IP改成自己的)- 192.168.57.141/24# 部分用于配置路由routes:# 默认路由,即没有更具体路由的流量- to: default# 网关(这个要去VMware看一下自己的网关是多少,改成自己的)via: 192.168.57.0# 配置 DNS 服务器nameservers:# 列表中的项表示要使用的 DNS 服务器地址,这里是三个DNS地址addresses: [119.29.29.29,114.114.114.114,8.8.8.8]

在这里插入图片描述

其中

  • addresses:要改成自己要设置的IP!!!,IP的前三段要跟网关一致。(可以改成目前系统的IP地址,也就是ssh连接所用的IP地址)
  • via :要改成自己的网关地址!!!下面的图片是告诉你怎么看的:

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

  1. 使配置生效

输入以下命令,使配置生效:

netplan apply

生效以后,再 ping 一下 www.baidu.com,看网络是否正常,如果正常则修改成功了:

在这里插入图片描述

2. 主机准备

2.1 使用模板机创建主机

这里我们直接通过上面的模板机克隆出三台机器即可

分别起名为:

  • k8s-master01
  • k8s-worker01
  • k8s-worker02

首先执行关机命令将模板机关机:

shutdown now

然后到VMwar上,找到我们的模板机,右键 —— 管理 —— 克隆
(三台机器克隆过程一致,唯一的区别就是起名字那块)

下面看图操作:

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

这里我直接把克隆时三台不一样的地方截图了。只有名字和位置需要改一下:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

2.2 主机配置

2.2.1 修改静态IP

以下针对所有主机,每次执行操作都需要保证三台机器都执行了且没有错误。
(如果其中一台用模板机IP,只操作其余两台即可)

克隆完以后,我们要分别把刚刚克隆的三台机器开机,需要改一下静态IP地址
第一台 k8s-master01 可以不用改,我们直接用模板机的即可。
k8s-worker01k8s-worker02 需要改一下,不然三个主机IP一样会冲突。

温馨提示: su - root 切换root用户

vim /etc/netplan/00-installer-config.yaml

输入以上命令,编辑网络配置文件,修改截图部分,IP的第四段部分:(只要是别的虚机没用过的都可以,我这里主节点是131,两个node节点分别是132和133)

  • k8s-worker01
    在这里插入图片描述
  • k8s-worker02
    在这里插入图片描述

修改以后保存,然后输入以下命令使配置生效:

netplan apply

生效以后,再 ping 一下 www.baidu.com,看网络是否正常,如果正常则修改成功了:

  • k8s-worker01

    在这里插入图片描述

  • k8s-worker02

    在这里插入图片描述

改完以后我们就可以用远程工具连接这三台主机了:

在这里插入图片描述

2.2.2 修改主机名

以下针对所有主机,每次执行操作都需要保证三台机器都执行了且没有错误。

  • k8s-master01
hostnamectl set-hostname k8s-master01

在这里插入图片描述

  • k8s-worker01
hostnamectl set-hostname k8s-worker01

在这里插入图片描述

  • k8s-worker02
hostnamectl set-hostname k8s-worker02

在这里插入图片描述

最后我们重新切换一下 root 账户,让显示生效:

(这里我就不截图了,太简单了。)

先输入以下命令退出 root 账户:

exit

然后重新切换到 root 账户:

su - root

2.2.3 主机名-IP地址解析

以下针对所有主机,每次执行操作都需要保证三台机器都执行了且没有错误。

我们到 finalshell 中,在下方切换到 命令,然后最下面下拉框更改为 全部会话:(这样的话我们就可以直接将一条命令同步发送给三台主机了)

在这里插入图片描述

然后在 命令编辑器 输入以下命令后,点击 发送

cat >> /etc/hosts << EOF
192.168.57.131 k8s-mater01
192.168.57.132 k8s-worker01
192.168.57.133 k8s-worker02
EOF

在这里插入图片描述

执行完以后,我们可以验证一下是否添加成功:(三个主机都看一眼)

cat /etc/hosts

在这里插入图片描述

2.2.4 时间同步

以下针对所有主机,每次执行操作都需要保证三台机器都执行了且没有错误。

  1. 更换时区
timedatectl set-timezone Asia/Shanghai

在这里插入图片描述

  1. 安装ntpdate
apt-get install ntpdate

在这里插入图片描述

  1. 使用ntpdate命令同步时间
ntpdate time1.aliyun.com

在这里插入图片描述

  1. 通过计划任务实现同步时间
crontab -e

在这里插入图片描述

然后这里选择输入 2

在这里插入图片描述

然后在这个文件的最后一行加入下方的cron表达式:(每个主机都要加!!!)

0 */1 * * * ntpdate time1.aliyun.com
  • k8s-master01

    在这里插入图片描述

  • k8s-worker01

    在这里插入图片描述

  • k8s-worker02

    在这里插入图片描述

2.2.5 内核转发、网桥过滤配置

以下针对所有主机,每次执行操作都需要保证三台机器都执行了且没有错误。

配置依赖模块到 /etc/modules-load.d/k8s.conf ,后期可开机自动加载:

cat << EOF | tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

在这里插入图片描述

上面只是开机自动加载,但我们本次还需要用,所以使用下面两条命令进行启用:

modprobe overlay
modprobe br_netfilter

在这里插入图片描述

启用完以后,我们可以用下方命令查看是否成功:

lsmod | egrep "overlay"
lsmod | egrep "br_netfilter"

在这里插入图片描述

然后我们把网桥过滤和内核转发追加到 k8s.conf 文件中:

cat << EOF | tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF

在这里插入图片描述

最后我们加载内核参数:

sysctl --system

在这里插入图片描述

加载完成后,我们可以用下方命令看下内核的路由转发有没有成功打开:

sysctl -a | grep ip_forward

变成 1 了,说明成功了:

在这里插入图片描述

2.2.6 安装ipset和ipvsadm

以下针对所有主机,每次执行操作都需要保证三台机器都执行了且没有错误。

首先安装 ipsetipvsadm

(我们后续使用一些负载均衡器的时候需要用到,这个配置是一定要做的)

apt-get install ipset ipvsadm

在这里插入图片描述

中间会让你输入一次 Y 确认,我们直接输入发送即可:

在这里插入图片描述

安装完成后,我们需要配置 ipvsadm 模块加载,添加需要加载的模块:(这样我们后续开机就可以自动加载了)

cat << EOF | tee /etc/modules-load.d/ipvs.conf
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack
EOF

在这里插入图片描述

上面只是开机自动加载,但我们本次还需要用,所以我们本次要用的话可以将生效命令放到一个脚本文件中,然后执行他:

cat << EOF | tee ipvs.sh
#!/bin/sh
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack
EOF

在这里插入图片描述

执行我们刚刚创建的脚本文件:

sh ipvs.sh

在这里插入图片描述

我们可以用以下命令查看是否已经加载:

lsmod | grep ip_vs

如下图所示,可以看到都加载进来了:

在这里插入图片描述

2.2.7 关闭SWAP分区

以下针对所有主机,每次执行操作都需要保证三台机器都执行了且没有错误。

虽然教程版本的k8s集群,也就是 1.28,说是可以使用node上的 SWAP 分区,但在初始化的时候还是会出现报错,所以,我们还是需要关闭 SWAP 分区。

永久关闭 SWAP 分区:(重启系统才会生效)

vim 打开 /etc/fstab

vim /etc/fstab

打开后找到 /swap.img none swap sw 0 0 这一行,给注释掉:(三台主机都需要操作)

  • k8s-master01

    在这里插入图片描述

  • k8s-worker01

    在这里插入图片描述

  • k8s-worker02

    在这里插入图片描述

上面的操作,我们重启系统才会生效,我们本次要用,但不想重启系统,所以可以先临时关闭 SWAP 分区:

swapoff -a

然后我们可以用以下命令,查看是否关闭成功:

free -m

这样就是关闭成功了:

在这里插入图片描述

3. 容器运行时 Containerd 准备

3.1 获取Containerd安装包

以下针对所有主机,每次执行操作都需要保证三台机器都执行了且没有错误。

执行以下命令下载安装包:(如果提示连接被拒绝之类的提示,这是由于GitHub在外网,请使用魔法上网,或者多试几次)

wget https://github.com/containerd/containerd/releases/download/v1.7.5/cri-containerd-1.7.5-linux-amd64.tar.gz

在这里插入图片描述

这里等待时间可能较长,请耐心等待下载完成,一定要确保三台主机都下载完了,再进行后续操作!!!

  • k8s-master01 下载完成

    在这里插入图片描述

  • k8s-worker01 下载完成

    在这里插入图片描述

  • k8s-worker02 下载完成

    在这里插入图片描述

3.2 安装 Containerd

以下针对所有主机,每次执行操作都需要保证三台机器都执行了且没有错误。

解压安装包到根目录(解压到根目录他就会自动归位了,不需要我们再去移动了):

tar xf cri-containerd-1.7.5-linux-amd64.tar.gz  -C /

在这里插入图片描述

其实解压完以后就相当于安装完了,我们可以随便输一个命令来验证一下:

containerd --version

在这里插入图片描述

3.3 创建&修改配置文件

以下针对所有主机,每次执行操作都需要保证三台机器都执行了且没有错误。

首先创建配置文件所在目录:

mkdir /etc/containerd

生成默认配置文件:(Containerd的配置文件使用TOML格式)

containerd config default > /etc/containerd/config.toml

在这里插入图片描述

然后使用以下命令查看有没有生成成功:

ls /etc/containerd

在这里插入图片描述

生成以后,我们需要对配置文件进行修改:

vim /etc/containerd/config.toml

要修改的地方有第65行、137行 (三台主机都需要改!)

首先是65行的 sanbox_image = "registry.k8s.io/pause:3.8" 改成 sanbox_image = "registry.k8s.io/pause:3.9"

然后是137行的 SystemdCgroup = false 改成 SystemdCgroup = true

  • k8s-master01

    在这里插入图片描述
    在这里插入图片描述

  • k8s-worker01

    在这里插入图片描述
    在这里插入图片描述

  • k8s-worker02

    在这里插入图片描述
    在这里插入图片描述

3.4 启动Containerd&开机自启

以下针对所有主机,每次执行操作都需要保证三台机器都执行了且没有错误。

执行以下命令,设置开机自启,并设置现在就启动:

--now 的意思就是现在启动

systemctl enable --now containerd

在这里插入图片描述

然后执行以下命令验证一下是否三台主机都已启动:

systemctl status containerd
  • k8s-master01 已启动

    在这里插入图片描述

  • k8s-worker01 已启动
    在这里插入图片描述

  • k8s-worker02 已启动
    在这里插入图片描述

温馨提示:Ctrl+Z 可退出查看状态。

4. K8S集群部署

4.1 软件源准备

以下针对所有主机,每次执行操作都需要保证三台机器都执行了且没有错误。

使用阿里云提供的软件源:

echo "deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list

在这里插入图片描述

然后我们验证一下是否添加成功了:

ls /etc/apt/sources.list.d

在这里插入图片描述

确定三台主机都成功了以后,我们更新软件源:

apt-get update

执行完以后会提示如下图所示的错误,这个主要是因为没有公钥,缺少 GPG 的key导致的:

在这里插入图片描述

所以,我们需要将公钥添加至服务器:

B53DC80D13EDEF05 部分以你显示的为准)

apt-key adv --recv-keys --keyserver keyserver.ubuntu.com B53DC80D13EDEF05

在这里插入图片描述

导入完成以后,我们再重新执行以下命令就可以了:

apt-get update

在这里插入图片描述

4.2 软件安装

以下针对所有主机,每次执行操作都需要保证三台机器都执行了且没有错误。

我们要使用 kubeadm 对我们的集群进行初始化,所以要先安装必要的软件:

apt-get install kubeadm=1.28.1-00  kubelet=1.28.1-00 kubectl=1.28.1-00

我这里以1.28.1版本为例,上面的命令就是指定版本安装。如果你们要安装最新版,将版本号去掉即可,那下面的命令可以查看支持的版本:

apt-cache madison kubeadm
apt-cache madison kubelet
apt-cache madison kubectl

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

确定好自己要安装的版本后,执行安装命令:

在这里插入图片描述

然后安装过程中会提示你输入 Y

(下载过程可能会比较慢,耐心等待三台主机都下载完!一定要确保三台都下载完,再进行后续操作)

在这里插入图片描述

安装完成以后,我们分别执行以下命令,验证一下是不是安装成功了:

(要确保三台主机都成功了)

kubeadm version
kubelet --version
kubectl version
  • k8s-master01 已成功安装
    在这里插入图片描述
  • k8s-worker01 已成功安装
    在这里插入图片描述
  • k8s-worker02 已成功安装
    在这里插入图片描述

确定三台主机都已安装完以后,我们需要锁定版本,防止软件更新对 k8s 集群造成一定影响:

apt-mark hold kubeadm kubelet kubectl

在这里插入图片描述

4.3 集群初始化

以下仅针对 master节点 的主机,也就是只需要在 master节点 的主机上操作。如需在其他主机操作,我会特别说明。

首先我们需要创建 kubeadm 配置文件:

这条命令的意思就是将配置打印到 kubeadm-config.yaml 文件中

kubeadm config print init-defaults > kubeadm-config.yaml

然后使用 ls 命令查看是否生成成功:

在这里插入图片描述

确认生成成功以后,我们开始编辑这个配置文件:

vim kubeadm-config.yaml
  • 修改IP地址

    在这里插入图片描述

  • 修改名称

    在这里插入图片描述

  • criSocket 我们用的就是 Containerd 可以不用动,你们可以按需修改。

  • imageRepository 可以修改为 registry.aliyuncs.com/google_containers 阿里云镜像仓库,也可以默认,都可以。

    在这里插入图片描述
    如果更改了镜像地址,那么还需要同步修改 /etc/containerd/config.toml 文件:

    vim /etc/containerd/config.toml
    

    (三台主机都需要修改这个文件,我这里只截图了一个)

    在这里插入图片描述

    修改完以后,要分别执行以下命令重新启动 containerdkubelet

    systemctl restart containerd
    systemctl restart kubelet
    

    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

  • kubernetesVersion 修改为我们当前的版本 1.28.1

    在这里插入图片描述

  • networking 中的 dnsDomain,可以默认,也可以改成你们公司的域名,但不要跟其他人出现重叠。(学习的话无所谓了)

  • networking 中的 serviceSubnet 后面加上 podSubnet: 10.244.0.0/16

    在这里插入图片描述

  • 在配置文件最后加入以下配置:

    ---
    kind: KubeletConfiguration
    apiVersion: kubelet.config.k8s.io/v1beta1
    cgroupDriver: systemd
    

    在这里插入图片描述

最后保存即可

修改保存完以后,我们需要对我们 k8s 中所使用的一些镜像进行提前下载:

(这一步取决于你的网速,网速快下载的也就快,网速慢要等待的时间就越长)

  • --image-repository 的意思是从阿里云的镜像仓库下载(我发现走官方镜像太慢了,所以指定阿里云的仓库了)
  • --kubernetes-version 的意思是指定版本(如果你需要最新版可以把这个去掉执行)
kubeadm config images pull --image-repository=registry.aliyuncs.com/google_containers --kubernetes-version v1.28.1

(只对master节点操作)

在这里插入图片描述

做完上面的操作以后,我们就可以对 k8s 集群初始化了:

这个过程需要费点时间,耐心等待即可。

kubeadm init --config kubeadm-config.yaml

(只对master节点操作)

最后出现 initialized successfully 就代表初始化成功了:

在这里插入图片描述

4.4 准备kubectl配置文件

以下仅针对 master节点 的主机,也就是只需要在 master节点 的主机上操作。如需在其他主机操作,我会特别说明。

在这里插入图片描述

其实很简单,我们只需要把上面输出内容里提供的命令执行一下即可:

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

然后我们可以使用以下命令查看节点信息了:

kubectl get nodes

在这里插入图片描述

4.5 添加工作节点到集群

我们只需要将之前的输出内容中的命令复制到两个工作节点运行即可:
在这里插入图片描述

(你不要复制我的,自己往上面的输出内容中找!!)

kubeadm join 192.168.57.131:6443 --token abcdef.0123456789abcdef \--discovery-token-ca-cert-hash sha256:258af31f0ec6869ff04aede2ce13a852d4a113ba60aa5efb3e32256eedc211cd 
  • k8s-worker01
    在这里插入图片描述

  • k8s-worker02

    在这里插入图片描述

然后我们可以通过以下命令进行验证是否添加成功:

kubectl get nodes

可以看到已经添加成功了:

在这里插入图片描述

到这里呢,虽然工作节点也加入成功了,但其实也只是初始化成功了,但还不能用,状态还是 NotReady 状态,我们继续往下看。

5. K8S集群网络插件 Calico

我们这里使用的是 Calico ,下面是几个插件的区别:

  • Flannel 是个小规模集群
  • Calico 既适合小规模也适合大规模,部署也比较容易
  • Cilium 对内核的版本要求较高,内核版本必须要达到6.3以上

5.1 operator

执行以下命令进行安装:

(如果需要安装其他版本请访问:https://projectcalico.docs.tigera.io/about/about-calico)

在这里插入图片描述

kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/tigera-operator.yaml

在这里插入图片描述

创建完成以后我们可以执行以下命令看下 tigera-operator 是不是已经存在了:

kubectl get ns

在这里插入图片描述

然后看一下我们的pod是不是 Runing 状态了,如果不是后续操作就无法进行了:

kubectl get pods -n tigera-operator

在这里插入图片描述

5.2 自定义配置

这里包括要分配的网段、所使用的模式等等,但这里因为我们的集群规模比较小,只要改一下网段即可。

先执行以下命令下载:

(如果需要安装其他版本请访问:https://projectcalico.docs.tigera.io/about/about-calico)

wget https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/custom-resources.yaml

在这里插入图片描述

下载以后,首先我们进行网段修改,也就是文件的第13行:

这里就是改成咱们集群初始化的时候指定的网段

vim custom-resources.yaml

在这里插入图片描述

修改完以后,我们要先去手动拉取以下镜像。(三台主机都要拉!!)

这个没办法,我们有堵无形的墙。手动拉一下镜像吧。。(三台主机都要拉!!)

使用 ctr 命令来拉取所用到的镜像,后面的版本好记得改成你自己安装的 calico 版号。(三台主机都要拉!!)

其中 docker.anyhub.us.kg 是一些国内大佬搞得映射(加速),下载速度非常快,如果这个地址不能用了,请访问下方链接查看最新地址:

https://github.com/DaoCloud/public-image-mirror/issues/2328

在这里插入图片描述

(三台主机都要拉!!)

ctr image pull docker.anyhub.us.kg/calico/cni:v3.26.1
ctr image pull docker.anyhub.us.kg/calico/pod2daemon-flexvol:v3.26.1
ctr image pull docker.anyhub.us.kg/calico/node:v3.26.1
ctr image pull docker.anyhub.us.kg/calico/kube-controllers:v3.26.1
ctr image pull docker.anyhub.us.kg/calico/typha:v3.26.1
ctr image pull docker.anyhub.us.kg/calico/node-driver-registrar:v3.26.1
ctr image pull docker.anyhub.us.kg/calico/csi:v3.26.1

(三台主机都要拉!!我这里只截图了master的主机,全截太多了!!)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

下载完成以后,我们可以通过 ctr image list命令查看镜像列表:

在这里插入图片描述

(一定要确定三台主机都拉下来了!!) 确定上面 7个镜像 都已经下载了,我们给 custom-resources.yaml 应用一下:

kubectl create -f custom-resources.yaml

在这里插入图片描述

执行完以后,我们再执行以下命令,就能看到 calico-system 命名空间了:

kubectl get ns

在这里插入图片描述

然后我们等待大约2-3分钟的时间,再通过以下命令来查看一下pod的状态:

kubectl get pods -n calico-system

然后就可以看到 ,所有的 pod 都是 Runing 状态了:

在这里插入图片描述

然后我们再运行查看节点信息的命令,就会发现状态已经变成 Ready 状态了:

kubectl get nodes

在这里插入图片描述

5.3 错误解答

如果出现 Init:ErrImagePull 或者 Init:ImagePullBackOf,那就是上面我提到的7个镜像没拉下来!

在这里插入图片描述

解决方法:把缺失的镜像重新拉一下!

(三台主机都要拉!!)

ctr image pull docker.anyhub.us.kg/calico/cni:v3.26.1
ctr image pull docker.anyhub.us.kg/calico/pod2daemon-flexvol:v3.26.1
ctr image pull docker.anyhub.us.kg/calico/node:v3.26.1
ctr image pull docker.anyhub.us.kg/calico/kube-controllers:v3.26.1
ctr image pull docker.anyhub.us.kg/calico/typha:v3.26.1
ctr image pull docker.anyhub.us.kg/calico/node-driver-registrar:v3.26.1
ctr image pull docker.anyhub.us.kg/calico/csi:v3.26.1

(三台主机都要拉!!我这里只截图了master的主机,全截太多了!!)

下载完成以后,我们可以通过 ctr image list命令查看镜像列表:

在这里插入图片描述

确定上面7个镜像都有了以后,我们需要删除所有有问题的 pod,也就是上面状态为 Init:ErrImagePull Init:ImagePullBackOfpod,以上图为例,我举几个栗子:

kubectl delete pod calico-node-6sd4p -n calico-system
kubectl delete pod calico-node-pxbrf -n calico-system
kubectl delete pod calico-node-tmcdm -n calico-system

确定所有有问题的pod都删除以后,我们等待个2-3分钟再执行以下命令

kubectl get pods -n calico-system

然后就可以看到 ,所有的 pod 都是 Runing 状态了

在这里插入图片描述

6. 部署Nginx测试验证K8S集群是否可用

上面我们已经部署完了K8S集群,那到底能不能用呢?下面我们就来部署一个简单的 Nginx 来测试一下。

首先我们来创建一个 NginxDeployment

vim nginx-deployment.yaml

复制下面的配置到 nginx-deployment.yaml (注意缩进!!!),保存退出即可:

---
apiVersion: apps/v1
kind: Deployment
metadata:name: nginxweb # 部署的名称
spec:replicas: 2  # 设置副本数量为2selector:matchLabels:app: nginxweb1 # 用于选择匹配的Pod标签template:metadata:labels:app: nginxweb1 # Pod的标签spec:containers:- name: nginxwebc # 容器名称image: nginx:latest # 镜像拉取地址,使用最新的nginx镜像imagePullPolicy: IfNotPresent # 镜像拉取策略,如果本地没有就拉取ports:- containerPort: 80 # 容器内部监听的端口
---
apiVersion: v1
kind: Service
metadata:name: nginxweb-service # 服务的名称
spec:externalTrafficPolicy: Cluster # 外部流量策略设置为集群selector:app: nginxweb1 # 用于选择匹配的Pod标签ports:- protocol: TCP # 使用TCP协议port: 80 # 服务暴露的端口targetPort: 80 # Pod中容器的端口nodePort: 30080 # 在每个Node上分配的端口,用于外部访问type: NodePort # 服务类型,使用NodePort

在这里插入图片描述

然后咱们再使用以下命令应用一下:

kubectl apply -f nginx-deployment.yaml

在这里插入图片描述

应用以后,我们等待个几分钟然后通过以下命令来查看以下是否已经生成了 pod,并且是否已经处于 Runing 状态了 :

kubectl get pods

在这里插入图片描述

同时也会为生成的 pod 创建对应的 service,我们可以通过以下命令查看:

service 就是我们通过 service的ip地址或者service名称对我们pod进行访问的方法,防止我们pod出现故障以后,我们没办法再找到这个pod

kubectl get service

在这里插入图片描述

除了在k8s集群内通过service访问外,我们还可以在k8s集群外通过我们k8s集群的任意一个节点的IP地址加上他的30080端口(nginx-deployment.yaml文件中定义的)访问。

下面我们就直接对pod进行访问测试,首先要获取对应的IP地址:

kubectl get pods -o wide

在这里插入图片描述

获取到IP地址以后,我们就可以直接通过 curl 命令进行访问:

curl http://10.244.69.203
curl http://10.244.79.71

我们可以看到已经出现了我们熟悉的 Welcome to nginx!

在这里插入图片描述

然后我们再对service进行访问测试,一样是要先获取对应的IP地址:

kubectl get service

在这里插入图片描述

获取到IP地址以后,我们同样通过 curl 命令进行访问:

curl http://10.99.247.80

也是出现了我们熟悉的 Welcome to nginx!,没有问题:

在这里插入图片描述

但通过service访问,具体访问的是哪个节点呢?这就取决于我们service在调度的过程中的访问策略了,他具有负载均衡的能力。

最后,我们再验证一下从k8s集群外进行访问,首先打开我们物理机(也就是本机电脑)的浏览器,然后输入我们各个节点的ip加上30080端口,进行测试访问:

在这里插入图片描述

到此,结束。

帮到你的话,请点赞、收藏、关注!谢谢啦!

B站搜索:七维大脑
抖音搜索:七维大脑
公众号搜索:肥猫PLUS

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

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

相关文章

pnpm install安装失败

ERR_PNPM_META_FETCH_FAIL GET https://registry.npmjs.org/commitlint%2Fcli: request to https://registry.npmjs.org/commitlint%2Fcli failed, reason: connect ETIMEDOUT 2606:4700::6810:123:443 1. 检查网络连接 确保你的网络连接正常并且没有被防火墙或代理服务器阻止…

【docker 部署springboot项目】

一、docker安装 1.检查Linux内核版本高于3.10才可安装 uname -r 2. 卸载旧版本 sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine 3. 使用docker仓库进行安装 安装所需的软…

java代理模式之JDK动态代理

目录 什么是动态代理&#xff1f; 动态代理的两种方式&#xff1f; jdk动态代理&#xff1b; cglib静态代理 为什么需要代理&#xff1f; 1、原有功能增强 2、降低耦合 JDK动态代理代码实例&#xff1a; 实体类&#xff1a; 持久层接口实现类&#xff08;使用jdbc进行…

【2024】VsCode + Latex + Linux(Ubuntu) + wsl环境下配置教程 | 包含 中文配置,和 格式化处理

前言 本篇教程是针对WSL下的Ubuntu操作系统的配置教程&#xff0c;它和一般的Linux环境下的配置有所不同&#xff0c;并且和Windows环境下的也有所不同。 本篇博客编写参考了 官方文档&#xff08;Tex&#xff09; 和 插件官方&#xff08;Texlive Workshop&#xff09; 文档…

动手学RAG:Part1 什么是RAG?

1、大模型的幻觉问题、时效性问题、数据安全问题 2、大模型的结构和参数数量导致对其修改、微调和重新训练变得很困难 3、基于知识的问答&#xff0c;依赖于信息抽取

Logback日志异步打印接入指南,输出自定义业务数据

背景 随着应用的请求量上升&#xff0c;日志输出量也会成线性比例的上升&#xff0c;给磁盘IO带来压力与性能瓶颈。应用也遇到了线程池满&#xff0c;是因为大量线程卡在输出日志。为了缓解日志同步打印&#xff0c;会采取异步打印日志。这样会引起日志中的追踪id丢失&#xf…

2024 HNCTF PWN(close ezpwn idea what beauty)

文章目录 closeezpwn代码利用exp idea代码exp whatexp beauty libc 2.35IDA中文乱码解决代码思路exp close int __fastcall main(int argc, const char **argv, const char **envp) {puts("**********************************");puts("* Welcome to the H…

kubernetes k8s Deployment 控制器配置管理 k8s 红蓝部署 金丝雀发布

目录 1、Deployment控制器&#xff1a;概念、原理解读 1.1 Deployment概述 1.2 Deployment工作原理&#xff1a;如何管理rs和Pod&#xff1f; 2、Deployment资源清单文件编写技巧 3、Deployment使用案例&#xff1a;创建一个web站点 4、Deployment管理pod&#xff1a;扩…

数字化装备场革新:智能装备采集设备问世!

数字化装备场建设是一项跨学科的综合工程&#xff0c;它不仅涵盖了网络布线的整合、系统框架的构建&#xff0c;还包含了各类硬件设备的配置等丰富多样的内容。该工程的关键环节主要包括对装备场所的出入口进行现代化升级、完善车库车辆定位与管理体系&#xff0c;以及部署一体…

Maven学习——Maven的下载、安装与配置(详细攻略!)

目录 前言 1.下载与安装 2.配置Maven的环境变量 3.配置Maven的本地仓库 4. 配置Maven的镜像远程仓库 前言 我在之前写了一篇博客&#xff0c;是介绍Maven的基本概念和下载安装&#xff0c;但是由于篇幅过长&#xff0c;Maven的下载与安装写的并不详细&#x1f436;&#x…

kaggle 量化交易 比赛

作者: Raoul Malm 描述: 本笔记本演示了如何使用 TensorFlow 中的循环神经网络预测不同股票的未来价格。实现了带有基本单元、LSTM 或 GRU 单元的循环神经网络。 大纲: [库和设置][分析数据][操作数据][建模和验证数据][预测]参考: https://www.kaggle.com/benjibb/lstm-st…

图片压缩python

linux粘贴文本格式错乱&#xff1a; vi/vim :set paste然后再 insert &#xff0c;粘贴 centos安装pillow图像处理库&#xff1a; 引用&#xff1a;https://blog.csdn.net/newbieLCQ/article/details/125345335 linux赋予执行权限&#xff1a; # 创建文件 touch comperss.p…

C++解决:书本信息储存

书本信息储存 暂无标签 时间限制&#xff1a;C/C 1000MS&#xff0c;其他语言 2000MS 内存限制&#xff1a;C/C 256MB&#xff0c;其他语言 512MB 难度&#xff1a;简单 描述 创建一个储存书本信息的结构体&#xff0c;包括书号&#xff0c;名称&#xff0c;作者&#xff0…

日本IT-SE职位一览与未来职业发展路径规划

日本IT-SE 工作内容特点&#xff1a; 1. 软件开发&#xff1a;SE的主要任务是编写、测试和维护&#xff0c;以满足客户需求。他们需要使用多种编程语言和开发工具来完成任务。 2. 需求分析&#xff1a;SE负责与客户沟通&#xff0c;理解他们的需求&#xff0c;并将其转化为可…

给你的博客添加数据统计功能

20.数据统计 我们可以给博客添加统计功能&#xff0c;这里以百度统计和谷歌统计为例。 ‍ 百度统计 ‍ 添加网站 登陆百度统计后台&#xff1a;百度统计——一站式智能数据分析与应用平台&#xff0c;并登录&#xff0c;然后进入产品&#xff1a; ‍ 在使用设置–网站列…

Windows命令行(CMD)中,tasklist | findstr(搜索并显示包含特定字符串的进程信息)

文章目录 示例注意事项示例&#xff1a;使用 /FI 选项过滤进程 在Windows命令行&#xff08;CMD&#xff09;中&#xff0c; tasklist 命令用于显示当前运行的进程列表&#xff0c;而 findstr 命令则用于搜索字符串。当你将 tasklist 命令的输出通过管道&#xff08; |&…

单片机设计_自行车码表(AT89C51, LCD1602, DS1302,霍尔传感器)

想要更多项目私wo!!! 一、电路设计 系统采用51单片机LCD1602液晶DS1302时钟模块霍尔传感器电机按键模块蜂鸣器报警模块设计而成。 产品自带单片机上电复位电路、手动复位电路&#xff08;复位按键&#xff09;、晶振电路&#xff08;给单片机提供时钟周期&#xff09;。 …

OpenCV下的无标定校正(stereoRectifyUncalibrated)

OpenCV下的无标定校正(stereoRectifyUncalibrated) 文章目录 1. 杂话2. 无标定校正2.1 先看代码2.2 一点解释2.3 findFundamentalMat参数2.4 stereoRectifyUncalibrated参数 3. 矫正结果 1. 杂话 咱们在之前的帖子里面讲了一些比较常规的标定和校正OpenCV下的单目标定&#xff…

紫外测熔融实验结果温度和abs作折线图和求一阶导最大值

import numpy as np import pandas as pd from pyecharts.charts import Line from pyecharts import options as opts from matplotlib import pyplot as plt import xlrd # 读取 csv 文件 data pd.read_excel(F:/LJX/lc8.xls)# 假设 csv 文件中有两列数据&#xff1a;x 和 y…

iOS——编译链接

编译连接的过程 预处理编译汇编链接 预处理 clang -E main.m -o main.i“#define"删除并展开对应宏定义。处理所有的条件预编译指令。如#if/#ifdef/#else/#endif。”#include/#import"包含的文件递归插入到此处。删除所有的注释"//或/**/"。添加行号和文…