当前位置: 首页 > ai >正文

K8S集群环境搭建

虚拟机镜像

ubuntu 2

虚拟机网络

虚拟网络–配置

nat模式

20250803132226

20250803132235

主机ip配置

20250803132528

宿主机ip配置

10.0.0.12 master 2c
10.0.0.15 node1
10.0.0.16 node2
10.0.0.17 node3
10.0.0.20 register


sudo vi /etc/netplan/00-installer-config.yaml  # 替换为实际文件名
sudo netplan apply
network:version: 2renderer: networkd  # 服务器版用 networkd;桌面版可改为 NetworkManagerethernets:ens33:  # 替换为你的网卡名称dhcp4: no  # 关闭 DHCPaddresses:- 10.0.0.15/24  # 静态 IP/子网掩码(CIDR 格式)routes:- to: defaultvia: 10.0.0.2  # 网关地址nameservers:addresses: [8.8.8.8, 8.8.4.4]  # DNS 服务器

虚拟机–局域网内–域名配置

10.0.0.12    kubernetes-master.sswang.com  kubernetes-master
10.0.0.15    kubernetes-node1.sswang.com  kubernetes-node1
10.0.0.16    kubernetes-node2.sswang.com  kubernetes-node2
10.0.0.17    kubernetes-node3.sswang.com  kubernetes-node3
10.0.0.20    kubernetes-register.sswang.com  kubernetes-register

密钥

ssh-keygen -t rsa
ssh-copy-id root@10.0.0.15
ssh-copy-id root@10.0.0.16
ssh-copy-id root@10.0.0.17
ssh-copy-id root@10.0.0.20

设置root用户密码: 如果root用户没有设置密码,需要设置一个密码: sudo passwd root

修改SSH配置文件: 编辑/etc/ssh/sshd_config文件,找到PermitRootLogin配置项,并将其修改为yessudo vim /etc/ssh/sshd_config 将以下内容: #PermitRootLogin prohibit-password 修改为: PermitRootLogin yes

systemctl restart ssh

主机名设置


hostnamectl set-hostname kubernetes-masterssh root@10.0.0.15 "hostnamectl set-hostname kubernetes-node1"ssh root@10.0.0.16 "hostnamectl set-hostname kubernetes-node2"ssh root@10.0.0.17 "hostnamectl set-hostname kubernetes-node3"ssh root@10.0.0.20 "hostnamectl set-hostname kubernetes-register"

swap分区禁用

Kubernetes 为什么要求禁用 Swap?

Kubernetes 的设计初衷是确保容器能够获得预期的资源(CPU、内存)。当节点上的内存不足时,操作系统会使用 Swap 空间将部分内存数据换出到磁盘上。然而,这种行为会导致以下问题:

  1. 性能下降:磁盘 I/O 速度远低于内存,使用 Swap 会显著降低应用程序性能。
  2. 资源调度不可预测:Kubernetes 调度器无法感知 Swap 的使用情况,它只能基于节点的实际物理内存进行调度决策。如果节点因为 Swap 而“看起来”有足够内存,但实际上物理内存不足,会导致容器性能急剧下降。
  3. 稳定性问题:当内存压力大时,频繁的 Swap 换入换出可能导致节点不稳定,甚至引发 OOM(Out-Of-Memory)问题。
  4. 资源统计不准确:kubelet 在报告节点资源使用情况时,无法准确反映 Swap 的使用,这会影响集群的自动伸缩(HPA/VPA)和资源配额管理。

# 临时禁用
swapoff -a# 永久禁用
sed -i 's/.*swap.*/#&/' /etc/fstab# 内核参数调整
cat >> /etc/sysctl.d/k8s.conf << EOF
vm.swappiness=0
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF## 创建自定义内核模块自动加载服务,开机自动加载systemd-modules-load服务,自动加载modules-load.d下的所有服务
sudo tee /etc/modules-load.d/br_netfilter.conf <<EOF
br_netfilter
EOFsudo tee /etc/modules-load.d/overlay.conf <<EOF
overlay
EOFsysctl -p /etc/sysctl.d/k8s.conf# 验证
free -h  # 应显示 Swap 行全为0

20250803144843

关闭swap分区后需要重启系统

20250803144246

for i in 15 16 17 20
do
scp /etc/fstab root@10.0.0.$i:/etc/fstab
scp /etc/sysctl.d/k8s.conf root@10.0.0.$i:/etc/sysctl.d/k8s.conf
scp /etc/modules-load.d/br_netfilter.conf root@10.0.0.$i:/etc/modules-load.d/br_netfilter.conf
scp /etc/modules-load.d/overlay.conf root@10.0.0.$i:/etc/modules-load.d/overlay.conf
ssh root@10.0.0.$i "systemctl restart systemd-modules-load"
ssh root@10.0.0.$i "sysctl -p /etc/sysctl.d/k8s.conf"
done

安装k8s (adm)

https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/

20250803110828

容器运行时环境

# 更新软件包索引
sudo apt update# 安装必要的依赖工具
sudo apt install -y \ca-certificates \curl \gnupg \lsb-release \software-properties-common

添加 Docker 官方 GPG 密钥

# 创建密钥存储目录
sudo install -m 0755 -d /etc/apt/keyrings# 下载并添加 Docker 的官方 GPG 密钥(使用阿里云镜像)
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg# 设置密钥文件权限
sudo chmod a+r /etc/apt/keyrings/docker.gpg

4. 添加 Docker 软件源

# 添加 Docker 软件源(使用阿里云镜像)
echo \"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

5. 安装 Docker Engine

# 更新软件包索引
sudo apt update# 安装 Docker CE、CLI 和 containerd
sudo apt install -y docker-ce docker-ce-cli containerd.io# 检查安装的版本
docker --version
docker compose version

其中containerd.io是docker-engine 所需要的服务

20250810153639

containerd.sock & Docker (dockerd.sock) 的区别

运行环境中的容器运行时接口两者依赖关系如下,所以两者都安装了。
20250810115415

核心作用
  1. 容器运行时接口(CRI):
  • 提供标准的 gRPC 接口,使 Kubernetes 能够管理容器生命周期
  • Kubernetes kubelet 通过这个 socket 与 containerd 通信
  1. 容器操作通道:
  • 创建/启动/停止/删除容器
  • 拉取容器镜像
  • 管理容器网络
  • 执行容器内命令
  1. 低级别容器管理:
  • 直接与 Linux 内核的容器功能交互(cgroups、namespaces)
  • 管理容器文件系统(通过快照机制)

6. 配置国内镜像加速器

为了提高 Docker 镜像的下载速度,编辑 /etc/docker/daemon.json 配置文件,需要配置国内镜像加速器:

因为一些限制,所以能用的加速源不多,欢迎大家分享可用的加速源。这里加速源不一定能用。

# 创建 Docker 配置目录(如果不存在)
sudo mkdir -p /etc/docker# 编辑 daemon.json 配置文件
sudo tee /etc/docker/daemon.json > /dev/null << EOF
{"registry-mirrors": ["http://74f21445.m.daocloud.io","https://docker.xuanyuan.me","https://docker.1ms.run","https://registry.docker-cn.com","https://docker.mirrors.ustc.edu.cn","https://hub-mirror.c.163.com"],"dns": ["8.8.8.8", "8.8.4.4"],"log-driver": "json-file","log-opts": {"max-size": "10m","max-file": "3"},"storage-driver": "overlay2","insecure-registries": ["kubernetes-register.sswang.com:80"]
}
EOF# 重新加载 systemd 配置
sudo systemctl daemon-reload# 重启 Docker 服务使配置生效
sudo systemctl restart dockersystemctl status docker

7. 验证安装

# 运行测试容器
sudo docker run hello-world# 查看 Docker 信息
sudo docker info

8. 开机启动docker

sudo systemctl enable docker
sudo systemctl is-enabled docker  # 应返回 "enabled"
docker info | grep "Storage Driver"

9. docker compose 安装使用


# 检查是否已安装 Docker Compose
docker compose version# 如果未安装,手动安装
sudo apt install docker-compose-plugin# 或者使用 pip 安装(需要先安装 Python)
pip install docker-compose

10. 完全卸载docker

# 停止所有运行的容器
docker stop $(docker ps -aq)# 删除所有容器
docker rm $(docker ps -aq)# 删除所有镜像
docker rmi $(docker images -q)# 卸载 Docker 软件包
sudo apt purge docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin# 删除相关目录和文件
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
sudo rm -rf /etc/docker# 删除软件源配置
sudo rm /etc/apt/sources.list.d/docker.list
sudo rm /etc/apt/keyrings/docker.gpg# 清理用户组设置
sudo deluser $USER docker

11. 总

#!/bin/sh
set -ex# 更新软件包索引
sudo apt update# 安装必要的依赖工具
sudo apt install -y ca-certificates curl gnupg lsb-release software-properties-common# 创建密钥存储目录
sudo install -m 0755 -d /etc/apt/keyrings# 下载并添加 Docker 的官方 GPG 密钥(使用阿里云镜像)
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg# 设置密钥文件权限
sudo chmod a+r /etc/apt/keyrings/docker.gpg# 添加 Docker 软件源(使用阿里云镜像)
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null# 更新软件包索引
sudo apt update# 安装 Docker CE、CLI 和 containerd
sudo apt install -y docker-ce docker-ce-cli containerd.io# 检查安装的版本
docker --version
docker compose versionsudo systemctl enable docker
sudo systemctl is-enabled docker  # 应返回 "enabled"
docker info | grep "Storage Driver"sudo mkdir -p /etc/docker# 编辑 daemon.json 配置文件 registry主机(hub) 不需要
sudo tee /etc/docker/daemon.json > /dev/null << EOF
{"registry-mirrors": ["http://74f21445.m.daocloud.io","https://docker.xuanyuan.me","https://docker.1ms.run","https://registry.docker-cn.com","https://docker.mirrors.ustc.edu.cn","https://hub-mirror.c.163.com"],"dns": ["8.8.8.8", "8.8.4.4"],"log-driver": "json-file","log-opts": {"max-size": "10m","max-file": "3"},"storage-driver": "overlay2","insecure-registries": ["kubernetes-register.sswang.com:80"]
}
EOF# 重新加载 systemd 配置
sudo systemctl daemon-reload# 重启 Docker 服务使配置生效
sudo systemctl restart dockersystemctl status docker# 重新加载 systemd 配置
sudo systemctl daemon-reload# 重启 Docker 服务使配置生效
sudo systemctl restart dockersystemctl status dockersudo systemctl enable docker
sudo systemctl is-enabled docker  # 应返回 "enabled"
docker info | grep "Storage Driver"sudo docker run hello-world# 查看 Docker 信息
sudo docker info

cri环境操作

用于k8s运行时控制docker engine。

注意:所有主机操作

获取软件

mkdir /data/softs -p && cd /data/softs
wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.2/cri-dockerd-0.3.2.amd64.tgz# 解压软件
tar -xvf cri-dockerd-0.3.2.amd64.tgz
mv cri-dockerd/cri-dockerd /usr/local/bin/

设置开机启动cri-dockerd服务,配置socket

cat > /etc/systemd/system/cri-dockerd.service <<-EOF
[Unit]
Description=CRI Interface for Docker Application Container Engine
Documentation=https://docs.mirantis.com
After=network-online.target firewalld.service docker.service
Wants=network-online.target
[Service]
Type=notify
ExecStart=/usr/local/bin/cri-dockerd --pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.9 --network-plugin=cni --cni-conf-dir=/etc/cni/net.d --cni-bin-dir=/opt/cni/bin --container-runtime-endpoint=unix:///var/run/cri-dockerd.sock --cri-dockerd-root-directory=/var/lib/dockershim --docker-endpoint=unix:///var/run/docker.sock --cri-dockerd-root-directory=/var/lib/docker
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
StartLimitBurst=3
StartLimitInterval=60s
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
Delegate=yes
KillMode=process
[Install]
WantedBy=multi-user.target
EOF

此 systemd 服务文件用于配置 cri-dockerd 服务,主要包含:

  1. 定义服务在 docker 和网络服务之后启动
  2. 指定 cri-dockerd 的执行参数:
  • 使用阿里云镜像仓库的 pause 容器
  • 配置 CNI 网络插件路径
  • 设置容器运行时和 docker 的 unix socket 路径
  • 指定存储目录路径
  1. 配置服务重启策略和资源限制
  2. 设置系统启动时自动启用服务
cat > /etc/systemd/system/cri-dockerd.socket <<-EOF
[Unit]
Description=CRI Docker Socket for the API
PartOf=cri-docker.service[Socket]
ListenerStream=/var/run/cri-dockerd.sock
SocketMode=0660
SocketUser=root
SocketGroup=docker[Install]
WantedBy=sockets.target
EOF

20250803163334

同步从节点

for i in 15 16 17 20
dossh root@10.0.0.$i "systemctl stop cri-dockerd &&  rm -rf /etc/systemd/system/cri-dockerd.socket && rm -rf /etc/systemd/system/cri-dockerd.service && rm -rf /data/softs/cri-dockerd/cri-dockerd"scp  /data/softs/cri-dockerd/cri-dockerd root@10.0.0.$i:/usr/local/binscp  /etc/systemd/system/cri-dockerd.socket root@10.0.0.$i:/etc/systemd/systemscp /etc/systemd/system/cri-dockerd.service root@10.0.0.$i:/etc/systemd/systemssh root@10.0.0.$i "systemctl daemon-reload && systemctl restart cri-dockerd && systemctl enable cri-dockerd"ssh root@10.0.0.$i "systemctl status cri-dockerd | grep Active"
done

harbor仓库

# 下载软、】
mkdir /data/{softs,server} -p && cd /data/softs
wget https://github.com/goharbor/harbor/releases/download/v2.5.0/harbor-offline-installer-v2.5.0.tgz# 解压软件
tar -zxvf harbor-offline-installer-v2.5.0.tgz -C /data/server/
cd /data/server/harbor/# 加载镜像 harbor 到docker中
docker load < harbor.v2.5.0.tar.gz
docker images# 备份配置
cp harbor.yml.tmpl harbor.ymlvi harbor.yml

20250803203144

./prepare # 基于harbor.yml 生成 docker-compose.yml等配置文件,用于生成harbor容器./install.sh # zhuanb

卸载安装的docker 镜像、容器

# 卸载容器镜像
docker images | awk '{print $3}' | grep -v "IMAGE" | xargs  docker rmi
# 卸载compose 配置(用于拉起容器的)
docker compose down -v

安装成功如下:

20250803221414

harbor 定制服务

/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
# 需要注意 harbor 的安装位置
ExecStart=/usr/bin/docker compose --file /data/server/harbor/docker-compose.yml up
ExecStop=/usr/bin/docker compose --file /data/server/harbor/docker-compose.yml down[Install]
WantedBy=multi-user.target

systemctl daemon-reload
systemctl start harbor
systemctl status harbor
systemctl enable harbor

20250803232352

配置用户名 deck1; 密码 a123678A

20250803232507

为harbor仓库提交镜像

  1. 镜像打标签
    • 必须携带harbor主机的地址
  2. 登录harbor
    docker login
  3. 提交镜像
    docker push
# 登录仓库
docker login kubernetes-register.sswang.com -u sswang#下载镜像
docker pull busyboxdocker tag busybox kubernetes-register.sswang.com/sswang/busybox:v0.1# 推送
docker push kubernetes-register.sswang.com/sswang/busybox:v0.1

测试过程遇到报错:

docker login kubernetes-register.sswang.com:80 -u sswang
Password:
Error response from daemon: Get "https://kubernetes-register.sswang.com:80/v2/": http: server gave HTTP response to HTTPS client

主要原因时,docker 默认强制访问镜像仓库都是使用https协议,同时上面harbor的https端口关闭,就需要docker强制harbor的访问允许http协议:

vi /etc/docker/daemon.json

{"insecure-registries": ["kubernetes-register.sswang.com:8080"]
}

对应每个节点都需要修改。
systemctl restart docker

for i in 15 16 17 20
doscp /etc/docker/daemon.json root@10.0.0.$i:/etc/docker/daemon.jsonssh root@10.0.0.$i "systemctl restart docker"
done
# 登录仓库
docker login kubernetes-register.sswang.com:80 -u sswang#下载镜像
docker pull busyboxdocker tag busybox kubernetes-register.sswang.com:80/sswang/busybox:v0.1# 推送
docker push kubernetes-register.sswang.com:80/sswang/busybox:v0.1

k8s集群初始化

  1. 软件源定制
  2. 安装软件
  3. 镜像获取
  4. 主节点初始化
  5. 工作节点集群

cat > /etc/yum.repos.d/kubernets.repo << EOF

由于ubuntu23+1 没有k8s的apt源,需要降级为xenial。

添加k8s的apt源。

sudo apt update
sudo apt install -y apt-transport-https ca-certificates curl gpgsudo mkdir -p /etc/apt/keyrings  # 目录可能不存在需新建 :cite[6]:cite[7]
sudo chmod 755 /etc/apt/keyrings  # 设置权限# 下载并转换GPG密钥 最新ubuntu2 弃用apt-key的方式配置 gpg密钥,采用下面的方式curl -fsSL https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | \
sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-aliyun-keyring.gpgecho "deb [signed-by=/etc/apt/keyrings/kubernetes-aliyun-keyring.gpg] https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main" >  /etc/apt/sources.list.d/kubernetes.listapt update # 更新源

除了registry安装软件

apt install kubeadm kubelet kubectl -y

apt update
apt install -y apt-transport-https ca-certificates curl gpgmkdir -p /etc/apt/keyrings  # 目录可能不存在需新建 :cite[6]:cite[7]
chmod 755 /etc/apt/keyrings  # 设置权限# 下载并转换GPG密钥 最新ubuntu2 弃用apt-key的方式配置 gpg密钥,采用下面的方式curl -fsSL https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | gpg --dearmor -o /etc/apt/keyrings/kubernetes-aliyun-keyring.gpgecho "deb [signed-by=/etc/apt/keyrings/kubernetes-aliyun-keyring.gpg] https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main" >  /etc/apt/sources.list.d/kubernetes.listapt update # 更新源apt install kubeadm kubelet kubectl -y

需要root权限运行。

其中 kubeadm 管理集群使用,kubectl管理集群资源对象,kubelet采集节点数据汇报给master

主节点初始化

#!/bin/sh
set -e
# 执行当前脚本前事先修改 # 执行当前脚本前事先修改docker
# 增加 "insecure-registries": ["kubernetes-register.sswang.com:8080"] 关闭dcoker强制https认证,允许http认证kubeadm config images list --kubernetes-version=stable-1.28 | awk -F "/" '{print $NF}' | while read -r i
doecho "========================= Processing image: $i ======================="docker pull registry.aliyuncs.com/google_containers/"$i"docker tag registry.aliyuncs.com/google_containers/"$i" kubernetes-register.sswang.com:80/google_containers/"$i"docker push kubernetes-register.sswang.com:80/google_containers/"$i"docker rmi registry.aliyuncs.com/google_containers/"$i"
doneecho "=============== kubeadm deinit ================"kubeadm reset --cri-socket=unix:///var/run/cri-dockerd.sock
rm -rf /etc/kubernetes/manifests/kube-apiserver.yaml
rm -rf  /etc/kubernetes/manifests/kube-controller-manager.yaml
rm -rf  /etc/kubernetes/manifests/kube-scheduler.yaml
rm -rf  /etc/kubernetes/manifests/etcd.yaml
rm -rf /var/lib/etcd/*
systemctl stop kubelet.serviceecho "=============== kubeadm reinit ================"
kubeadm init --kubernetes-version=stable-1.28 \--apiserver-advertise-address=10.0.0.12 \--image-repository kubernetes-register.sswang.com:80/google_containers \--service-cidr=10.96.0.0/12 \--pod-network-cidr=10.244.0.0/16 \--ignore-preflight-errors=Swap \--cri-socket=unix://var/run/cri-dockerd.sock

成功init出现如下打印:

20250810101350

第一次init时候,提示kubectl get nodes不可用,需要安装flannel网络插件(cni),实现集群内pod ip自动配置。

20250810101622

kubeadm 重新init和join

worker节点加入

kubeadm join 10.0.0.12:6443 --token 5hrqp9.6txic7syufaq6m45 \--discovery-token-ca-cert-hash sha256:c582dde5f2c96a5983a3deaa213dd9da2cc21b4aba86a83bfd970e83b30a773f \--cri-socket=unix://var/run/cri-dockerd.sock
# 重新加入
kubeadm reset --cri-socket=unix:///var/run/cri-dockerd.sock
rm -rf /etc/kubernetes/kubelet.conf 
systemctl stop kubelet.service

20250810155838

for i in 15 16 17
dossh root@10.0.0.$i "kubeadm reset --cri-socket=unix:///var/run/cri-dockerd.sock && rm -rf /etc/kubernetes/kubelet.conf && systemctl stop kubelet.service"ssh root@10.0.0.$i "kubeadm join 10.0.0.12:6443 --token 5hrqp9.6txic7syufaq6m45 --discovery-token-ca-cert-hash sha256:c582dde5f2c96a5983a3deaa213dd9da2cc21b4aba86a83bfd970e83b30a773f --cri-socket=unix://var/run/cri-dockerd.sock"
done

20250810160628

收尾动作

kubectl查询节点状态
kubectl get nodes
E0810 08:10:22.871003  138234 memcache.go:265] couldn't get current server API group list: Get "http://localhost:8080/api?timeout=32s": dial tcp 127.0.0.1:8080: connect: connection refused
E0810 08:10:22.879808  138234 memcache.go:265] couldn't get current server API group list: Get "http://localhost:8080/api?timeout=32s": dial tcp 127.0.0.1:8080: connect: connection refused
E0810 08:10:22.880954  138234 memcache.go:265] couldn't get current server API group list: Get "http://localhost:8080/api?timeout=32s": dial tcp 127.0.0.1:8080: connect: connection refused
E0810 08:10:22.885680  138234 memcache.go:265] couldn't get current server API group list: Get "http://localhost:8080/api?timeout=32s": dial tcp 127.0.0.1:8080: connect: connection refused
E0810 08:10:22.887605  138234 memcache.go:265] couldn't get current server API group list: Get "http://localhost:8080/api?timeout=32s": dial tcp 127.0.0.1:8080: connect: connection refused
The connection to the server localhost:8080 was refused - did you specify the right host or port?

在 Kubernetes 中,kubectl 默认使用 $HOME/.kube/config 文件来获取集群的 API 服务器地址和凭证。如果这个文件不存在,或者配置不正确kubectl 可能会回退到尝试连接本地地址(localhost:8080),这在大多数情况下是不正确的,除非你在 API 服务器本机上运行并配置了非安全端口。

mkdir -p $HOME/.kube# 2. 复制管理员配置文件
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config# 3. 设置权限
sudo chown $(id -u):$(id -g) $HOME/.kube/config
从节点配置 API服务访问凭证

当从节点加入到主节点后,会自动生成/etc/kubernetes/kubelet.conf,用于访问API server,以访问集群的资源,包括下面的flannel资源。若是没配置这一步骤,会有调度到从节点上安装不了容器镜像,访问不了外网。

就是查询整个集群的状态都不可行,原因是没有安装flannel。

kubectl --server https://<MASTER_IP>:6443 get pods -A

for i in 15 16 17
do# 1. 检查是否存在 kubeconfig 文件ssh root@10.0.0.$i "ls -l /etc/kubernetes/kubelet.conf && mkdir -p  $HOME/.kube"#  2. 设置 KUBECONFIG 环境变量ssh root@10.0.0.$i "sudo cp /etc/kubernetes/kubelet.conf $HOME/.kube/config"ssh root@10.0.0.$i "sudo chown $(id -u):$(id -g) $HOME/.kube/config"# 3. 验证配置ssh root@10.0.0.$i "kubectl config view"
done

20250810161557

命令补全
sudo tee -a /etc/zsh/zshrc << 'EOF'
# Kubernetes 增强提示符
# export PS1='[\[\e[31m\]\u\[\e[33m\]@\[\e[36m\]\h \[\e[32m\]\w \[\e[35m\]($(kubectl config current-context))\[\e[37m\]]\$\[\e[m\] '# Kubernetes 命令补全
if command -v kubectl &> /dev/null; thensource <(kubectl completion zsh)
fiif command -v kubeadm &> /dev/null; thensource <(kubeadm completion zsh)
fi
EOFsource /etc/zsh/zshrcfor i in 15 16 17
do
scp /etc/zsh/zshrc root@10.0.0.$i:/etc/zsh/zshrc
ssh root@10.0.0.$i "source /etc/zsh/zshrc"
done
网络 flannel

Kubernetes 强制要求所有容器必须满足以下网络条件:

  • Pod 间通信:所有 Pod 可以直接相互通信,无需 NAT
  • 节点-Pod 通信:所有节点可以直接与所有 Pod 通信
  • Pod-外部通信:Pod 可以直接访问集群外部资源

这些要求由 CNI (Container Network Interface) 插件实现,而 Flannel 就是这样一个 CNI 插件。

mkdir /data/kubernetes/network/flannel -p
cd  /data/kubernetes/network/flannel# 部署网络插件
wget https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
cp kube-flannel.yml{,.bak}# 替换其中用到的镜像,同样下载下来上传到私有的容器镜像,yml配置为私有的。grep image: kube-flannel.yml | awk -F '/' '{print $NF}' | while read -r i
doecho "========================= Processing image: $i ======================="docker pull ghcr.io/flannel-io/"$i"docker tag ghcr.io/flannel-io/"$i" kubernetes-register.sswang.com:80/google_containers/"$i"docker push kubernetes-register.sswang.com:80/google_containers/"$i"docker rmi ghcr.io/flannel-io/"$i"sed -i "s/ghcr.io\/flannel-io\/$i/kubernetes-register.sswang.com:80\/google_containers\/$i/g" kube-flannel.yml
done
grep image: kube-flannel.yml

kubectl apply -f kube-flannel.yml

20250810174854

  1. 如果从节点的$HOME/.kube/config没配置,从节点也访问不了APIserver,就访问不了整个集群的资源,比如flannel,就会出现如下报错。

Warning FailedCreatePodSandBox 2m kubelet Failed to create pod sandbox: rpc error: code = Unknown desc = failed to set up sandbox container “ffa87c44a8e173a5402639400f1384cef014b220e4a8fbcf9c8d192b86d6e992” network for pod “net-test”: networkPlugin cni failed to set up pod “net-test_default” network: plugin type=“flannel” failed (add): loadFlannelSubnetEnv failed: open /run/flannel/subnet.env: no such file or directory
Warning FailedCreatePodSandBox 119s kubelet Failed to create pod sandbox: rpc error: code = Unknown desc = failed to set up sandbox container "6498cc1374611109a8be2eb324fb8ef6adc499eb9c71

for i in 15 16 17
dossh root@10.0.0.$i "mkdir -p /data/kubernetes/network/flannel"scp /data/kubernetes/network/flannel/kube-flannel.yml root@10.0.0.$i:/data/kubernetes/network/flannel/kube-flannel.ymlssh root@10.0.0.$i "kubectl apply -f /data/kubernetes/network/flannel/kube-flannel.yml"
done
开机自启动

kubelet
cri-dockerd
docker

最终结果

20250817153735

验证

验证pod部署,网络
apiVersion: apps/v1
kind: Deployment
metadata:name: cluster-testlabels:app: cluster-testtest: "true"
spec:replicas: 2strategy:type: RollingUpdaterollingUpdate:maxSurge: 1maxUnavailable: 0selector:matchLabels:app: cluster-testtemplate:metadata:labels:app: cluster-testspec:containers:- name: webimage: nginx:1.25.4ports:- containerPort: 80resources:requests:cpu: "10m"memory: "32Mi"limits:cpu: "100m"memory: "64Mi"readinessProbe:httpGet:path: /port: 80initialDelaySeconds: 5periodSeconds: 5livenessProbe:httpGet:path: /port: 80initialDelaySeconds: 15periodSeconds: 20env:- name: TEST_ENVvalue: "cluster-test"volumeMounts:- name: test-volumemountPath: /usr/share/nginx/html/testvolumes:- name: test-volumeemptyDir: {}
# kubectl get pods -l app=cluster-test -o wide
NAME           READY   UP-TO-DATE   AVAILABLE   AGE
cluster-test   2/2     2            2           30s

ImagePullBackOff(镜像拉取失败)
FailedScheduling(调度失败)
CrashLoopBackOff(容器崩溃)

service访问测试
# test-service.yaml
apiVersion: v1
kind: Service
metadata:name: cluster-test-svc
spec:selector:app: cluster-testports:- protocol: TCPport: 80targetPort: 80type: NodePort
# 获取服务访问信息
NODE_PORT=$(kubectl get svc cluster-test-svc -o jsonpath='{.spec.ports[0].nodePort}')
NODE_IP=$(kubectl get nodes -o jsonpath='{.items[0].status.addresses[?(@.type=="InternalIP")].address}')# 宿主机测试访问
curl -I http://$NODE_IP:$NODE_PORT

20250817165205

跨节点访问测试
# 获取所有节点IP
kubectl get nodes -o jsonpath='{range .items[*]}{.status.addresses[?(@.type=="InternalIP")].address}{"\n"}{end}' > nodes.txt# 测试每个节点访问
while read ip; doecho "Testing $ip..."curl -s --connect-timeout 3 -o /dev/null -w "%{http_code}" http://$ip:$NODE_PORTecho
done < nodes.txt
环境变量验证
kubectl exec $(kubectl get pod -l app=cluster-test -o jsonpath='{.items[0].metadata.name}') -- printenv TEST_ENV
# 期望有输出
文件系统测试
# 写入测试
kubectl exec $(kubectl get pod -l app=cluster-test -o jsonpath='{.items[0].metadata.name}') -- sh -c "echo 'K8s test' > /usr/share/nginx/html/test/file.txt"# 读取验证
kubectl exec $(kubectl get pod -l app=cluster-test -o jsonpath='{.items[0].metadata.name}') -- cat /usr/share/nginx/html/test/file.txt
滚动更新测试
# 触发滚动更新
kubectl set image deployment/cluster-test web=nginx:1.25.4-alpine# 监控更新过程
kubectl rollout status deployment/cluster-test
自动扩缩容
# 安装 metrics-server
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml# 创建 HPA
kubectl autoscale deployment cluster-test --cpu-percent=50 --min=2 --max=5# 生成负载
kubectl run load-generator --image=busybox --restart=Never -- /bin/sh -c "while true; do wget -q -O- http://cluster-test-svc; done"# 监控扩缩
watch kubectl get hpa cluster-test

静态 Pod 与镜像 Pod

静态 Pod (Static Pod): 静态 Pod 是由节点上的 kubelet 直接管理的 Pod,完全不经过 Kubernetes API 服务器。kubelet 通过监控特定目录中的 Pod 定义文件(通常是 /etc/kubernetes/manifests)来自动创建和维护这些 Pod。

镜像 Pod: 是 Kubernetes API 服务器中静态 Pod 的只读镜像表示。当 kubelet 创建静态 Pod 时,它会在 API 服务器中自动创建对应的镜像 Pod 对象。

20250817160057
ox:v0.1


测试过程遇到报错:```bash
docker login kubernetes-register.sswang.com:80 -u sswang
Password:
Error response from daemon: Get "https://kubernetes-register.sswang.com:80/v2/": http: server gave HTTP response to HTTPS client

主要原因时,docker 默认强制访问镜像仓库都是使用https协议,同时上面harbor的https端口关闭,就需要docker强制harbor的访问允许http协议:

vi /etc/docker/daemon.json

{"insecure-registries": ["kubernetes-register.sswang.com:8080"]
}

对应每个节点都需要修改。
systemctl restart docker

for i in 15 16 17 20
doscp /etc/docker/daemon.json root@10.0.0.$i:/etc/docker/daemon.jsonssh root@10.0.0.$i "systemctl restart docker"
done
# 登录仓库
docker login kubernetes-register.sswang.com:80 -u sswang#下载镜像
docker pull busyboxdocker tag busybox kubernetes-register.sswang.com:80/sswang/busybox:v0.1# 推送
docker push kubernetes-register.sswang.com:80/sswang/busybox:v0.1

k8s集群初始化

  1. 软件源定制
  2. 安装软件
  3. 镜像获取
  4. 主节点初始化
  5. 工作节点集群

cat > /etc/yum.repos.d/kubernets.repo << EOF

由于ubuntu23+1 没有k8s的apt源,需要降级为xenial。

添加k8s的apt源。

sudo apt update
sudo apt install -y apt-transport-https ca-certificates curl gpgsudo mkdir -p /etc/apt/keyrings  # 目录可能不存在需新建 :cite[6]:cite[7]
sudo chmod 755 /etc/apt/keyrings  # 设置权限# 下载并转换GPG密钥 最新ubuntu2 弃用apt-key的方式配置 gpg密钥,采用下面的方式curl -fsSL https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | \
sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-aliyun-keyring.gpgecho "deb [signed-by=/etc/apt/keyrings/kubernetes-aliyun-keyring.gpg] https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main" >  /etc/apt/sources.list.d/kubernetes.listapt update # 更新源

除了registry安装软件

apt install kubeadm kubelet kubectl -y

apt update
apt install -y apt-transport-https ca-certificates curl gpgmkdir -p /etc/apt/keyrings  # 目录可能不存在需新建 :cite[6]:cite[7]
chmod 755 /etc/apt/keyrings  # 设置权限# 下载并转换GPG密钥 最新ubuntu2 弃用apt-key的方式配置 gpg密钥,采用下面的方式curl -fsSL https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | gpg --dearmor -o /etc/apt/keyrings/kubernetes-aliyun-keyring.gpgecho "deb [signed-by=/etc/apt/keyrings/kubernetes-aliyun-keyring.gpg] https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main" >  /etc/apt/sources.list.d/kubernetes.listapt update # 更新源apt install kubeadm kubelet kubectl -y

需要root权限运行。

其中 kubeadm 管理集群使用,kubectl管理集群资源对象,kubelet采集节点数据汇报给master

主节点初始化

#!/bin/sh
set -e
# 执行当前脚本前事先修改 # 执行当前脚本前事先修改docker
# 增加 "insecure-registries": ["kubernetes-register.sswang.com:8080"] 关闭dcoker强制https认证,允许http认证kubeadm config images list --kubernetes-version=stable-1.28 | awk -F "/" '{print $NF}' | while read -r i
doecho "========================= Processing image: $i ======================="docker pull registry.aliyuncs.com/google_containers/"$i"docker tag registry.aliyuncs.com/google_containers/"$i" kubernetes-register.sswang.com:80/google_containers/"$i"docker push kubernetes-register.sswang.com:80/google_containers/"$i"docker rmi registry.aliyuncs.com/google_containers/"$i"
doneecho "=============== kubeadm deinit ================"kubeadm reset --cri-socket=unix:///var/run/cri-dockerd.sock
rm -rf /etc/kubernetes/manifests/kube-apiserver.yaml
rm -rf  /etc/kubernetes/manifests/kube-controller-manager.yaml
rm -rf  /etc/kubernetes/manifests/kube-scheduler.yaml
rm -rf  /etc/kubernetes/manifests/etcd.yaml
rm -rf /var/lib/etcd/*
systemctl stop kubelet.serviceecho "=============== kubeadm reinit ================"
kubeadm init --kubernetes-version=stable-1.28 \--apiserver-advertise-address=10.0.0.12 \--image-repository kubernetes-register.sswang.com:80/google_containers \--service-cidr=10.96.0.0/12 \--pod-network-cidr=10.244.0.0/16 \--ignore-preflight-errors=Swap \--cri-socket=unix://var/run/cri-dockerd.sock
  • kubeadm config images list
    • 这条命令用于列出当前版本的kubeadm所需的镜像列表。这些镜像是Kubernetes各个组件的容器镜像,如kube-apiserver、kube-controller-manager等。
  • images=$(...):这行命令首先使用kubeadm config images list指定Kubernetes版本为1.27.3,然后通过awk命令处理输出的镜像列表。awk命令以/为分隔符,取每行的最后一个字段(即镜像名),然后将这些镜像名存入变量images
  • 循环for i in ${images}:对每个镜像名进行处理。
    • docker pull ...从阿里云的镜像仓库拉取镜像(因为国内访问官方镜像较慢,所以使用阿里云的镜像源)。
    • docker tag ...给拉取下来的镜像打标签,改成私有的镜像仓库地址(registry主机部署的harbor仓库google_containers)
    • docker push ...:将打好标签的镜像推送到私有的镜像仓库。
    • docker rmi ...:删除本地从阿里云拉取的镜像(因为已经推送到私有仓库,本地可以删除以节省空间)。

方便后面启动kubernetes所需容器时候拉取镜像的速度。

  • kubeadm init:初始化Kubernetes master节点。
    • --kubernetes-version=stable-1.28:指定Kubernetes版本。
    • --apiserver-advertise-address=10.0.0.12:指定API server的广播地址,这里是master节点的IP地址。
    • --image-repository ...:指定镜像仓库地址,这里使用之前我们推送镜像的私有仓库地址,这样kubeadm就会从这个仓库拉取镜像。
    • --service-cidr=10.96.0.0/12:指定Service的IP地址范围(可自定义)。
    • --pod-network-cidr=10.244.0.0/16:指定Pod的IP地址范围,这里使用的CIDR是Flannel网络插件默认的网段(可自定义)。
    • --ignore-preflight-errors=Swap:忽略Swap交换分区的错误(Kubernetes要求关闭Swap,但这里忽略该错误继续安装)。
    • --cri-socket=unix://var/run/cri-dockerd.sock:指定容器运行时接口(CRI)的套接字路径,这里指向cri-dockerd,因为从Kubernetes 1.24开始不再内置支持Docker,需要额外安装cri-dockerd适配器。cri-dockerd控制docker-engine

成功init出现如下打印:

20250810101350

第一次init时候,提示kubectl get nodes不可用,需要

20250810101622

kubeadm 重新init和join

worker节点加入

kubeadm join 10.0.0.12:6443 --token 5hrqp9.6txic7syufaq6m45 \--discovery-token-ca-cert-hash sha256:c582dde5f2c96a5983a3deaa213dd9da2cc21b4aba86a83bfd970e83b30a773f \--cri-socket=unix://var/run/cri-dockerd.sock
# 重新加入
kubeadm reset --cri-socket=unix:///var/run/cri-dockerd.sock
rm -rf /etc/kubernetes/kubelet.conf 
systemctl stop kubelet.service

20250810155838

for i in 15 16 17
dossh root@10.0.0.$i "kubeadm reset --cri-socket=unix:///var/run/cri-dockerd.sock && rm -rf /etc/kubernetes/kubelet.conf && systemctl stop kubelet.service"ssh root@10.0.0.$i "kubeadm join 10.0.0.12:6443 --token 5hrqp9.6txic7syufaq6m45 --discovery-token-ca-cert-hash sha256:c582dde5f2c96a5983a3deaa213dd9da2cc21b4aba86a83bfd970e83b30a773f --cri-socket=unix://var/run/cri-dockerd.sock"
done

20250810160628

收尾动作

kubectl查询节点状态
kubectl get nodes
E0810 08:10:22.871003  138234 memcache.go:265] couldn't get current server API group list: Get "http://localhost:8080/api?timeout=32s": dial tcp 127.0.0.1:8080: connect: connection refused
E0810 08:10:22.879808  138234 memcache.go:265] couldn't get current server API group list: Get "http://localhost:8080/api?timeout=32s": dial tcp 127.0.0.1:8080: connect: connection refused
E0810 08:10:22.880954  138234 memcache.go:265] couldn't get current server API group list: Get "http://localhost:8080/api?timeout=32s": dial tcp 127.0.0.1:8080: connect: connection refused
E0810 08:10:22.885680  138234 memcache.go:265] couldn't get current server API group list: Get "http://localhost:8080/api?timeout=32s": dial tcp 127.0.0.1:8080: connect: connection refused
E0810 08:10:22.887605  138234 memcache.go:265] couldn't get current server API group list: Get "http://localhost:8080/api?timeout=32s": dial tcp 127.0.0.1:8080: connect: connection refused
The connection to the server localhost:8080 was refused - did you specify the right host or port?

在 Kubernetes 中,kubectl 默认使用 $HOME/.kube/config 文件来获取集群的 API 服务器地址和凭证。如果这个文件不存在,或者配置不正确kubectl 可能会回退到尝试连接本地地址(localhost:8080),这在大多数情况下是不正确的,除非你在 API 服务器本机上运行并配置了非安全端口。

mkdir -p $HOME/.kube# 2. 复制管理员配置文件
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config# 3. 设置权限
sudo chown $(id -u):$(id -g) $HOME/.kube/config
从节点配置 API服务访问凭证

当从节点加入到主节点后,会自动生成/etc/kubernetes/kubelet.conf,用于访问API server,以访问集群的资源,包括下面的flannel资源。若是没配置这一步骤,会有调度到从节点上安装不了容器镜像,访问不了外网。

就是查询整个集群的状态都不可行,没有flannel也不可以。

kubectl --server https://<MASTER_IP>:6443 get pods -A

for i in 15 16 17
do# 1. 检查是否存在 kubeconfig 文件ssh root@10.0.0.$i "ls -l /etc/kubernetes/kubelet.conf && mkdir -p  $HOME/.kube"#  2. 设置 KUBECONFIG 环境变量ssh root@10.0.0.$i "sudo cp /etc/kubernetes/kubelet.conf $HOME/.kube/config"ssh root@10.0.0.$i "sudo chown $(id -u):$(id -g) $HOME/.kube/config"# 3. 验证配置ssh root@10.0.0.$i "kubectl config view"
done

20250810161557

命令补全
sudo tee -a /etc/zsh/zshrc << 'EOF'
# Kubernetes 增强提示符
# export PS1='[\[\e[31m\]\u\[\e[33m\]@\[\e[36m\]\h \[\e[32m\]\w \[\e[35m\]($(kubectl config current-context))\[\e[37m\]]\$\[\e[m\] '# Kubernetes 命令补全
if command -v kubectl &> /dev/null; thensource <(kubectl completion zsh)
fiif command -v kubeadm &> /dev/null; thensource <(kubeadm completion zsh)
fi
EOFsource /etc/zsh/zshrcfor i in 15 16 17
do
scp /etc/zsh/zshrc root@10.0.0.$i:/etc/zsh/zshrc
ssh root@10.0.0.$i "source /etc/zsh/zshrc"
done
网络 flannel

Kubernetes 强制要求所有容器必须满足以下网络条件:

  • Pod 间通信:所有 Pod 可以直接相互通信,无需 NAT
  • 节点-Pod 通信:所有节点可以直接与所有 Pod 通信
  • Pod-外部通信:Pod 可以直接访问集群外部资源

这些要求由 CNI (Container Network Interface) 插件实现,而 Flannel 就是这样一个 CNI 插件。

mkdir /data/kubernetes/network/flannel -p
cd  /data/kubernetes/network/flannel# 部署网络插件
wget https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
cp kube-flannel.yml{,.bak}# 替换其中用到的镜像,同样下载下来上传到私有的容器镜像,yml配置为私有的。grep image: kube-flannel.yml | awk -F '/' '{print $NF}' | while read -r i
doecho "========================= Processing image: $i ======================="docker pull ghcr.io/flannel-io/"$i"docker tag ghcr.io/flannel-io/"$i" kubernetes-register.sswang.com:80/google_containers/"$i"docker push kubernetes-register.sswang.com:80/google_containers/"$i"docker rmi ghcr.io/flannel-io/"$i"sed -i "s/ghcr.io\/flannel-io\/$i/kubernetes-register.sswang.com:80\/google_containers\/$i/g" kube-flannel.yml
done
grep image: kube-flannel.yml

kubectl apply -f kube-flannel.yml

20250810174854

  1. 如果从节点的$HOME/.kube/config没配置,从节点也访问不了APIserver,就访问不了整个集群的资源,比如flannel,就会出现如下报错。

Warning FailedCreatePodSandBox 2m kubelet Failed to create pod sandbox: rpc error: code = Unknown desc = failed to set up sandbox container “ffa87c44a8e173a5402639400f1384cef014b220e4a8fbcf9c8d192b86d6e992” network for pod “net-test”: networkPlugin cni failed to set up pod “net-test_default” network: plugin type=“flannel” failed (add): loadFlannelSubnetEnv failed: open /run/flannel/subnet.env: no such file or directory
Warning FailedCreatePodSandBox 119s kubelet Failed to create pod sandbox: rpc error: code = Unknown desc = failed to set up sandbox container "6498cc1374611109a8be2eb324fb8ef6adc499eb9c71

for i in 15 16 17
dossh root@10.0.0.$i "mkdir -p /data/kubernetes/network/flannel"scp /data/kubernetes/network/flannel/kube-flannel.yml root@10.0.0.$i:/data/kubernetes/network/flannel/kube-flannel.ymlssh root@10.0.0.$i "kubectl apply -f /data/kubernetes/network/flannel/kube-flannel.yml"
done
开机自启动

kubelet
cri-dockerd
docker

最终成果

20250817153735

验证pod部署,网络
apiVersion: apps/v1
kind: Deployment
metadata:name: cluster-testlabels:app: cluster-testtest: "true"
spec:replicas: 2strategy:type: RollingUpdaterollingUpdate:maxSurge: 1maxUnavailable: 0selector:matchLabels:app: cluster-testtemplate:metadata:labels:app: cluster-testspec:containers:- name: webimage: nginx:1.25.4ports:- containerPort: 80resources:requests:cpu: "10m"memory: "32Mi"limits:cpu: "100m"memory: "64Mi"readinessProbe:httpGet:path: /port: 80initialDelaySeconds: 5periodSeconds: 5livenessProbe:httpGet:path: /port: 80initialDelaySeconds: 15periodSeconds: 20env:- name: TEST_ENVvalue: "cluster-test"volumeMounts:- name: test-volumemountPath: /usr/share/nginx/html/testvolumes:- name: test-volumeemptyDir: {}
# kubectl get pods -l app=cluster-test -o wide
NAME           READY   UP-TO-DATE   AVAILABLE   AGE
cluster-test   2/2     2            2           30s

ImagePullBackOff(镜像拉取失败)
FailedScheduling(调度失败)
CrashLoopBackOff(容器崩溃)

service访问测试
# test-service.yaml
apiVersion: v1
kind: Service
metadata:name: cluster-test-svc
spec:selector:app: cluster-testports:- protocol: TCPport: 80targetPort: 80type: NodePort
# 获取服务访问信息
NODE_PORT=$(kubectl get svc cluster-test-svc -o jsonpath='{.spec.ports[0].nodePort}')
NODE_IP=$(kubectl get nodes -o jsonpath='{.items[0].status.addresses[?(@.type=="InternalIP")].address}')# 宿主机测试访问
curl -I http://$NODE_IP:$NODE_PORT

20250817165205

跨节点访问测试
# 获取所有节点IP
kubectl get nodes -o jsonpath='{range .items[*]}{.status.addresses[?(@.type=="InternalIP")].address}{"\n"}{end}' > nodes.txt# 测试每个节点访问
while read ip; doecho "Testing $ip..."curl -s --connect-timeout 3 -o /dev/null -w "%{http_code}" http://$ip:$NODE_PORTecho
done < nodes.txt
环境变量验证
kubectl exec $(kubectl get pod -l app=cluster-test -o jsonpath='{.items[0].metadata.name}') -- printenv TEST_ENV
# 期望有输出
文件系统测试
# 写入测试
kubectl exec $(kubectl get pod -l app=cluster-test -o jsonpath='{.items[0].metadata.name}') -- sh -c "echo 'K8s test' > /usr/share/nginx/html/test/file.txt"# 读取验证
kubectl exec $(kubectl get pod -l app=cluster-test -o jsonpath='{.items[0].metadata.name}') -- cat /usr/share/nginx/html/test/file.txt
滚动更新测试
# 触发滚动更新
kubectl set image deployment/cluster-test web=nginx:1.25.4-alpine# 监控更新过程
kubectl rollout status deployment/cluster-test
自动扩缩容
# 安装 metrics-server
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml# 创建 HPA
kubectl autoscale deployment cluster-test --cpu-percent=50 --min=2 --max=5# 生成负载
kubectl run load-generator --image=busybox --restart=Never -- /bin/sh -c "while true; do wget -q -O- http://cluster-test-svc; done"# 监控扩缩
watch kubectl get hpa cluster-test
http://www.xdnf.cn/news/17979.html

相关文章:

  • 【LeetCode 热题 100】(八)二叉树
  • 数据结构——栈和队列oj练习
  • 深度解析 Spring Bean 生命周期
  • 【网络安全】Webshell的绕过——绕过动态检测引擎WAF-缓存绕过(Hash碰撞)
  • 《P4180 [BJWC2010] 严格次小生成树》
  • MySQL 插入数据提示字段超出范围?一招解决 DECIMAL 类型踩坑
  • 安卓11 12系统修改定制化_____修改运营商版本安装特定应用时的默认规则
  • 机器学习相关算法:回溯算法 贪心算法 回归算法(线性回归) 算法超参数 多项式时间 朴素贝叶斯分类算法
  • 一文速通Python并行计算:14 Python异步编程-协程的管理和调度
  • C语言:文件操作详解
  • 后量子密码算法SLH-DSA介绍及开源代码实现
  • Java8~Java21重要新特性
  • C++ 最短路Dijkstra
  • CodeBuddy IDE深度体验:AI驱动的全栈开发新时代
  • Maven下载和配置-IDEA使用
  • 【算法】——力扣hot100常用算法技巧
  • 使用IntersectionObserver实现页面右侧运营位区域固定,和页面列表数据分页加载
  • JetPack系列教程(七):Palette——让你的APP色彩“飞”起来!
  • 【大语言模型 02】多头注意力深度剖析:为什么需要多个头
  • 后量子密码算法ML-DSA介绍及开源代码实现
  • 【DL学习笔记】常用数据集总结
  • 微服务架构实战指南:从单体应用到云原生的蜕变之路
  • 56. 合并区间
  • 【Java基础面试题】数据类型
  • PAT乙级_1085 PAT单位排行_Python_AC解法_含疑难点
  • C语言(11)—— 数组(超绝详细总结)
  • C++基础——内存管理
  • QT基础入门
  • Tomcat Server 组件原理
  • 肖臻《区块链技术与应用》第23-26讲 - The DAO事件、BEC事件、反思和总结