K8s开篇 & kubeadm集群部署实战

8297 字
41 分钟
K8s开篇 & kubeadm集群部署实战
K8s开篇 & kubeadm集群部署实战

K8s开篇 & kubeadm集群部署实战#

[TOC]


概述#

什么是K8s#

📌 定义:Kubernetes(K8s)是一个开源的容器编排平台,核心作用是管理容器的生命周期、调度、部署、监控和维护

它的核心能力主要有三点:

  • 自动化部署与回滚:你可以声明应用的理想状态(比如运行10个实例),K8s会自动调整到该状态,并支持无中断的版本更新和问题回滚
  • 自愈与弹性伸缩:它能自动检测并重启失败的容器,也能根据CPU等指标,手动或自动地增加或减少容器实例数量
  • 服务发现与负载均衡:每个容器都会获得自己的IP,K8s内置DNS和负载均衡,确保服务间能稳定找到彼此

参考链接:https://kubernetes.io/zh-cn/

Tip

它脱胎于Google 15年的大规模生产运维经验,拥有强大的社区支持 最关键的是,它不绑定基础设施,你可以把它部署在物理机、虚拟机,或是私有云、公有云、混合云上,灵活性非常高

尤其是在公有云场景,基于K8S实现了二次开发产品,推出了一系列相关产品

工具特点
ACK(阿里云)托管 Kubernetes 服务,与阿里云产品深度集成,免运维控制平面,支持 GPU 实例、弹性伸缩等
CCE(华为云)华为云容器引擎,企业级高可用,与华为云基础设施深度集成,支持混合云/多云管理
TKE(腾讯云)腾讯云容器服务,无缝集成腾讯云产品,支持原生 K8s 以及 Serverless 容器(EKS)
EKS(AWS)AWS 托管 K8s 服务,免运维控制平面,与 AWS 生态(IAM、VPC、ELB 等)深度集成
UK8S(UCloud)UCloud 托管 K8s 服务,与 UCloud 云产品深度集成,支持混合云部署,性价比高

K8s架构#

Important

**Master(控制平面)**是整个集群的大脑,所有决策都从这里发出

etcd: Key-Value 数据库,存储集群全部数据

**Worker(工作节点)**是真正干活的地方

CNI: 负责Pod网络通信的网络插件接口

节点类型组件端口功能说明
Masterkube-apiserver6443集群唯一访问入口,提供 API 服务,供 kubectl、各组件及外部应用访问
kube-controller-manager10257维护集群期望状态(如副本数控制),通过 HTTPS 暴露监控指标
kube-scheduler10259负责 Pod 调度决策(决定Pod跑在哪个Worker上),通过 HTTPS 暴露监控指标
etcd2379客户端通信(API Server 读写集群数据)
2380etcd 集群内部节点间数据同步与选主
Workerkubelet10250管理 Pod 生命周期,定期上报节点状态,供 API Server 执行容器操作与采集指标
kube-proxy10256代理 Pod 请求,实现服务发现和负载均衡;此端口用于健康检查

kubernetes的单master架构设计
kubernetes的单master架构设计

生产环境版本选择#

Tip

生产环境不一定追新,选择你熟悉的版本即可,新版本可能移除老功能,公司环境往往是”老前辈”部署好的,接着用就行

运行时注意事项

  • K8s 1.11+ 支持 Docker 和 Containerd
  • K8s 1.23.17 是最后一个默认支持 Docker 的版本
  • K8s 1.24+ 已移除 dockershim,官方推荐使用 Containerd
  • 更高版本也能用 Docker,但不推荐,CNCF 测试表明 Containerd 性能更高

官网链接:https://kubernetes.io/zh-cn/releases/

Terminal window
'我们直接使用最新版'
- K8s 版本: 1.37(最新版)
- 容器运行时: Containerd v2.3.4

K8s网络类型#

Kubernetes的三种网段说明
Kubernetes的三种网段说明

我们的K8s集群规划

网络类型网段
物理机网络10.0.0.0/24
Pod网络10.100.0.0/16
Service网络10.200.0.0/16

K8s部署方式#

官方部署方式

🔹 kubeadm: 官方推荐的集群部署工具 🔹 二进制: 手动部署所有组件,灵活度高

第三方部署方式

工具核心定位特点
KubeSphere容器管理平台图形化界面,企业级功能(多租户、可观测性、DevOps等);底层 KubeKey(官方自研部署工具)
Kuboard容器管理平台图形化界面,轻量级,操作直观,侧重于资源可视化与管理;底层 kubeadm
Kubeasz集群部署工具二进制 + Ansible Playbook,社区驱动,专注于部署高可用生产级 Kubernetes 集群

其他

工具核心定位特点
minikube本地学习/开发工具单节点 K8s 集群,支持多种驱动(VirtualBox、Docker、Hyper-V 等),轻量易用,适合新手入门
kind本地学习/测试工具基于 Docker 容器的 K8s 集群,启动快、资源占用少,适合 CI/CD 测试和本地开发调试

环境准备及基础优化#

环境规划#

主机名IP地址操作系统硬件配置
Master10.0.0.13Ubuntu 24.04 LTS2c+,4G+,50G+
Worker0110.0.0.14Ubuntu 24.04 LTS2c+,4G+,50G+
Worker0210.0.0.15Ubuntu 24.04 LTS2c+,4G+,50G+
Note

部署K8s集群建议使用root用户操作,三台机器都需要执行优化步骤

基础优化与工具安装#

Terminal window
`三台机器都要做优化`
1)关闭swap分区
swapoff -a && sysctl -w vm.swappiness=0 # 临时关闭
sed -ri '/^[^#]*swap/s@^@#@' /etc/fstab # 永久关闭,重启生效
'两者都要做,临时+永久'
2)确保MAC地址或product_uuid唯一
ifconfig enp1s0 | grep ether | awk '{print $2}'
cat /sys/class/dmi/id/product_uuid
'虚拟机克隆可能导致重复,需要检查'
3)检查网络互通
ping -W2 -c4 www.baidu.com
4)允许iptables检查桥接流量
cat <<EOF | tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF
'br_netfilter是内核模块,开机自动加载'
'sysctl参数统一在步骤6配置,这里不重复写'
5)检查端口占用
ss -tulnp | grep -E "6443|2379|2380|10250|10257|10259|10256"
# 参考serverless占用端口参考官网文档:https://kubernetes.io/zh-cn/docs/reference/networking/ports-and-protocols/
6)Linux内核优化
cat > /etc/sysctl.d/k8s.conf <<'EOF'
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv6.conf.all.disable_ipv6 = 1
fs.may_detach_mounts = 1
vm.overcommit_memory=1
vm.panic_on_oom=0
fs.inotify.max_user_watches=89100
fs.file-max=52706963
fs.nr_open=52706963
net.netfilter.nf_conntrack_max=2310720
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_intvl =15
net.ipv4.tcp_max_tw_buckets = 36000
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_max_orphans = 327680
net.ipv4.tcp_orphan_retries = 3
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.ip_conntrack_max = 65536
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_timestamps = 0
net.core.somaxconn = 16384
EOF
sysctl --system # 让内核参数立即生效
7)安装ipvsadm等相关工具
apt -y update && apt -y upgrade
apt -y install ipvsadm ipset sysstat conntrack
8)创建开机自动加载的模块配置文件
cat > /etc/modules-load.d/ipvs.conf << 'EOF'
ip_vs
ip_vs_lc
ip_vs_wlc
ip_vs_rr
ip_vs_wrr
ip_vs_lblc
ip_vs_lblcr
ip_vs_dh
ip_vs_sh
ip_vs_fo
ip_vs_nq
ip_vs_sed
ip_vs_ftp
ip_vs_sh
nf_conntrack
ip_tables
ip_set
xt_set
ipt_set
ipt_rpfilter
ipt_REJECT
ipip
EOF
9)安装containerd
unzip /tmp/autoinstall-containerd-v2.3.4.zip -d /server/scripts/
cd /server/scripts/autoinstall-containerd-v2.3.4/ && bash install-containerd.sh i
'脚本会自动: 下载二进制/配置systemd服务/开启SystemdCgroup/替换阿里云镜像源'
10)验证containerd安装
root@Master ~# ctr version | grep -i version
Version: v2.3.4
Go version: go1.26.5
Version: v2.3.4
root@Master ~# runc -v | grep -i version
runc version 1.5.1
✅️ containerd 和 runc 都安装成功
root@Master ~# ctr images ls
REF TYPE DIGEST SIZE PLATFORMS LABELS
`默认是 defautl 命名空间`
'K8s的命名空间为 k8s.io' # k8s的镜像都在这里面
root@Master ~# ctr -n k8s.io images ls
'必须指定命名空间(-n k8s.io)'
# 输出比较复杂!
11)安装crictl工具
# Kubernetes 专用,连 CRI socket,自动识别命名空间,输出简洁
root@Master ~# apt install -y cri-tools
Get:1 https://prod-cdn.packages.k8s.io/repositories/isv:/kubernetes:/core:/stable:/v1.37/deb cri-tools 1.37.0-1.1 [16.6 MB]
'看来源'
root@Master ~# cat <<EOF >/etc/crictl.yaml
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
EOF
root@Master ~# echo "source <(crictl completion bash)" >> ~/.bashrc
'Bash自动补全命令'
root@Master ~# source ~/.bashrc
root@Master ~# crictl --version
crictl version v1.37.0

安装kubeadm、kubelet、kubectl#

软件包作用
kubeadm初始化K8S集群的工具
kubelet静态Pod技术启动master组件以及Pod生命周期管理
kubectl与K8S集群通信的命令行工具
Important

kubeadm、kubelet、kubectl 三个组件所有节点都要安装(Master + Worker01 + Worker02)

kubeadm不会帮你安装kubelet或kubectl,需要确保三者版本一致,控制平面与kubelet可以相差一个次要版本,但kubelet版本不能超过API Server版本

参考链接: https://kubernetes.io/zh-cn/docs/tasks/tools/install-kubectl-linux/ https://kubernetes.io/zh-cn/blog/2023/08/15/pkgs-k8s-io-introduction/

Terminal window
1)所有节点配置软件源
apt-get install -y apt-transport-https
# 让 apt 支持从 HTTPS 源下载软件包
K8s_Version=v1.37
curl -fsSL https://pkgs.k8s.io/core:/stable:/${K8s_Version}/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/${K8s_Version}/deb/ /" | sudo tee /etc/apt/sources.list.d/kubernetes.list
apt-get -y update
2)查看支持的k8s版本
root@Master ~# apt-cache madison kubeadm
kubeadm | 1.37.0-1.1 | https://pkgs.k8s.io/core:/stable:/v1.37/deb Packages
3)所有节点安装最新版
apt-get -y install kubelet kubeadm kubectl
'不指定版本,默认安装最新版'
4)检查各组件版本
root@Master ~# kubeadm version
kubeadm version: &version.Info{Major:"1", Minor:"37", ... GitVersion:"v1.37.0", BuildDate:"2026-08-26T10:47:17Z", GoVersion:"go1.26.6" ...
root@Master ~# kubectl version
Client Version: v1.37.0
Kustomize Version: v5.8.1
The connection to the server localhost:8080 was refused - did you specify the right host or port?
# 这是正常的,因为集群还没初始化完成
root@Master ~# kubelet --version
Kubernetes v1.37.0
`另外三个节点也要进行验证`
✅️ 三个节点版本一致

时区优化及快照#

Terminal window
1)设置时区
root@Master ~# ls -lh /etc/localtime
lrwxrwxrwx 1 root root 33 Aug 31 21:00 /etc/localtime -> /usr/share/zoneinfo/Asia/Shanghai
# 如果没有,则执行以下命令
ln -svf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
root@Master ~# date -R
Tue, 01 Sep 2026 14:52:28 +0800
✅️ 时区已设置为东八区
2)验证CPU核心数
root@Master ~# lscpu | grep ^CPU\(s\)
CPU(s): 2
'2核满足K8s最低要求'
3)重启操作系统
reboot
4)验证加载的模块
lsmod | grep --color=auto -e ip_vs -e nf_conntrack
free -h
5)关机拍快照
init 0
'建议快照名称: k8s基础优化环境准备就绪'
jiuzhao@Ubuntu ~$ virsh snapshot-list Master
名称 生成时间 状态
--------------------------------------------------------------
init 2026-08-31 21:02:35 +0800 shutoff
K8s-environment-ready 2026-09-01 19:22:26 +0800 shutoff

K8s集群部署#

部署Master组件#

Terminal window
1)使用kubeadm初始化master节点
root@Master ~# kubeadm init \
--kubernetes-version=v1.37.0 \
--cri-socket unix:///run/containerd/containerd.sock \
--image-repository registry.aliyuncs.com/google_containers \
--pod-network-cidr=10.100.0.0/16 \
--service-cidr=10.200.0.0/16 \
--service-dns-domain=kpyun.com
--cri-socket: # 指定容器运行时为containerd
--pod-network-cidr: # 指定Pod网段
--service-cidr: # 指定SVC网段
--service-dns-domain: # 指定service域名后缀,默认cluster.local
...
Your Kubernetes control-plane has initialized successfully!
...
Alternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 10.0.0.13:6443 --token 5s0wfu.yh9un8ziwctf73of \
--discovery-token-ca-cert-hash sha256:dab8cbe2ab8d06c980190fa3b4a65c33babfa658a97a06041ecf6130501d6748
阶段 (Phase)含义 (Description)
[preflight]运行一系列预检项来验证系统状态,并下载镜像
[certs]生成集群各组件所需的证书 → /etc/kubernetes/pki
[kubeconfig]生成 kubeconfig 配置文件 → /etc/kubernetes/ 连接 API Server 使用
[etcd]为本地 etcd 服务生成静态 Pod 清单文件
[control-plane]为控制平面组件生成静态 Pod 清单文件 → /etc/kubernetes/manifests
[kubelet-start]写入 kubelet 设置并启动 kubelet 服务
[wait-control-plane]等待控制平面组件(API Server、控制器管理器、调度器)启动并就绪
[upload-config]将 kubeadm 和 kubelet 的配置上传到集群的 ConfigMap 中
[upload-certs]将控制平面证书上传到集群的 Secret 中(可选)
[mark-control-plane]为当前节点打上控制平面 Master 标签和污点,防止普通工作负载调度到该节点上
[bootstrap-token]生成用于其他节点加入集群的 bootstrap token(默认 24h 有效)
[kubelet-finalize]在 TLS 引导后更新 kubelet 的相关设置
[addon]安装集群所需的附加组件,例如 CoreDNS 和 kube-proxy
[show-join-command]显示其他节点加入集群所需的命令
Terminal window
root@Master ~# crictl images
`后续再安装的时候,可以save导出为tar包,方便导入`
IMAGE TAG
registry.aliyuncs.com/google_containers/coredns v1.14.6
registry.aliyuncs.com/google_containers/etcd 3.7.0-0
registry.aliyuncs.com/google_containers/kube-apiserver v1.37.0
registry.aliyuncs.com/google_containers/kube-controller-manager v1.37.0
registry.aliyuncs.com/google_containers/kube-proxy v1.37.0
registry.aliyuncs.com/google_containers/kube-scheduler v1.37.0
registry.aliyuncs.com/google_containers/pause 3.10.2
3)拷贝授权文件,用于管理K8S集群
root@Master ~# mkdir -p $HOME/.kube
root@Master ~# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
root@Master ~# sudo chown $(id -u):$(id -g) $HOME/.kube/config
4)查看master组件是否正常工作
root@Master ~# kubectl get cs
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME STATUS MESSAGE ERROR
controller-manager Healthy ok
scheduler Healthy ok
etcd-0 Healthy ok
✅️ 三个组件都是Healthy
# ⚠️ 只能看 controller-manager、scheduler、etcd,看不到 apiserver 本身
# cs 这个 API 从 K8s 1.19 开始就标记为"已弃用",官方提示"以后可能移除"
5)查看工作节点
root@Master ~# kubectl get no
NAME STATUS ROLES AGE VERSION
master NotReady control-plane 2m29s v1.37.0
# ROLES 只显示 control-plane
'NotReady是正常的,还没装CNI网络插件'
root@Master ~# kubectl get no -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
master NotReady control-plane 2m54s v1.37.0 10.0.0.13 <none> Ubuntu 24.04.4 LTS 6.8.0-138-generic (amd64) containerd://2.3.4
6)master初始化失败的解决方案
'可能原因: swap未关 / CPU核心不够 / 镜像下载超时'
free -h # 检查swap
lscpu # 检查CPU
'重置环境重新初始化'
kubeadm reset -f
rm -rf /etc/kubernetes/ $HOME/.kube/
Warning

镜像导出/压缩的坑(多架构镜像)

  • ctr 能导入镜像,但导出会失败!因为拉取的多是多架构镜像(manifest list),ctr images export 要读所有架构的 layer,但本地只下了当前架构(amd64),就会报 content digest ... not found
  • 需要导出/压缩镜像时,用 Docker 环境(docker save/load),Docker 导出的 tar 是单架构的,没有这个坑
  • 从网上/U盘拿到的单架构 tar 包,用 ctr -n=k8s.io images import 导入完全没问题

部署Worker组件#

Terminal window
1)将worker节点加入master集群
'注意: 使用你自己master生成的token,不要照搬下面的'
root@Worker01 ~# kubeadm join 10.0.0.13:6443 --token 5s0wfu.yh9un8ziwctf73of \
--discovery-token-ca-cert-hash sha256:dab8cbe2ab8d06c980190fa3b4a65c33babfa658a97a06041ecf6130501d6748
root@Worker02 ~# kubeadm join 10.0.0.13:6443 --token 5s0wfu.yh9un8ziwctf73of \
--discovery-token-ca-cert-hash sha256:dab8cbe2ab8d06c980190fa3b4a65c33babfa658a97a06041ecf6130501d6748
2)验证worker节点是否加入成功
root@Worker01 ~# crictl images
IMAGE TAG
registry.aliyuncs.com/google_containers/kube-proxy v1.37.0
registry.aliyuncs.com/google_containers/pause 3.10.2
# kubeadm join 时,kubeadm 会预拉取 worker 节点必须的镜像,正好就是这两个
root@Master ~# kubectl get no
NAME STATUS ROLES AGE VERSION
master NotReady control-plane 37m v1.37.0
worker01 NotReady <none> 4m15s v1.37.0
worker02 NotReady <none> 4m11s v1.37.0
✅️ 三个节点都已加入集群
root@Master ~# kubectl get no -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
master NotReady control-plane 37m v1.37.0 10.0.0.13 <none> Ubuntu 24.04.4 LTS 6.8.0-138-generic (amd64) containerd://2.3.4
worker01 NotReady <none> 4m37s v1.37.0 10.0.0.14 <none> Ubuntu 24.04.4 LTS 6.8.0-138-generic (amd64) containerd://2.3.4
worker02 NotReady <none> 4m33s v1.37.0 10.0.0.15 <none> Ubuntu 24.04.4 LTS 6.8.0-138-generic (amd64) containerd://2.3.4
3)关机拍快照
# 可以删除无用的软件包后再关机拍快照
'建议快照名称: k8s未安装CNI插件'
jiuzhao@Ubuntu ~$ virsh snapshot-list Master
名称 生成时间 状态
--------------------------------------------------------------
Before-install-CNI 2026-09-01 23:45:34 +0800 shutoff
init 2026-08-31 21:02:35 +0800 shutoff
K8s-environment-ready 2026-09-01 22:57:43 +0800 shutoff

部署Flannel组件#

参考链接:https://kubernetes.io/zh-cn/docs/concepts/cluster-administration/addons/

Terminal window
1)下载Flannel官方清单【需要能够访问GitHub】
export http_proxy=http://10.0.0.1:7890
export https_proxy=http://10.0.0.1:7890
wget https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
unset http_proxy && unset https_proxy
2)修改Pod网段(使用官方清单时)
root@Master ~# grep 16 kube-flannel.yml
"Network": "10.244.0.0/16"
'默认是10.244网段,需要改成我们的10.100网段'
root@Master ~# sed -i '/16/s#244#100#' kube-flannel.yml
root@Master ~# grep 16 kube-flannel.yml
"Network": "10.100.0.0/16"
✅️ 网段已修改为10.100.0.0/16
3)修改yml文件中的镜像名称
root@Master ~# grep -i image kube-flannel.yml | sort | uniq -c
1 image: ghcr.io/flannel-io/flannel-cni-plugin:v1.9.1-flannel3
2 image: ghcr.io/flannel-io/flannel:v0.28.9
root@Master ~# sed -i '/flannel-cni-plugin:v1.9.1-flannel3/c\ image: docker.io/flannel/flannel-cni-plugin:v1.9.1-flannel3' kube-flannel.yml
'中间有8个空格,保持缩进'
root@Master ~# sed -i '/flannel:v0.28.9/c\ image: docker.io/flannel/flannel:0.28.9' kube-flannel.yml
root@Master ~# grep -i image kube-flannel.yml | sort | uniq -c
2 image: docker.io/flannel/flannel:0.28.9
1 image: docker.io/flannel/flannel-cni-plugin:v1.9.1-flannel3
4)提前拉取镜像
`找一个有docker环境的拉取镜像`
root@Ubuntu ~# docker pull docker.xuanyuan.run/flannel/flannel-cni-plugin:v1.9.1-flannel3; docker tag docker.xuanyuan.run/flannel/flannel-cni-plugin:v1.9.1-flannel3 flannel/flannel-cni-plugin:v1.9.1-flannel3; docker rmi docker.xuanyuan.run/flannel/flannel-cni-plugin:v1.9.1-flannel3
root@Ubuntu ~# docker pull docker.xuanyuan.run/flannel/flannel:0.28.9; docker tag docker.xuanyuan.run/flannel/flannel:0.28.9 flannel/flannel:0.28.9; docker rmi docker.xuanyuan.run/flannel/flannel:0.28.9
root@Ubuntu ~# docker images | grep flannel | awk '{print $1}'
flannel/flannel-cni-plugin:v1.9.1-flannel3
flannel/flannel:0.28.9
root@Ubuntu ~# docker save \
flannel/flannel-cni-plugin:v1.9.1-flannel3 \
flannel/flannel:0.28.9 \
| gzip > /home/jiuzhao/flannel-0.28.9.tar.gz
root@Ubuntu ~# exit
注销
jiuzhao@Ubuntu ~$ scp flannel-0.28.9.tar.gz root@Master:~
flannel-0.28.9.tar.gz 100% 33MB 148.2MB/s 00:00
jiuzhao@Ubuntu ~$ scp flannel-0.28.9.tar.gz root@Worker01:~
flannel-0.28.9.tar.gz 100% 33MB 138.2MB/s 00:00
jiuzhao@Ubuntu ~$ scp flannel-0.28.9.tar.gz root@Worker02:~
flannel-0.28.9.tar.gz 100% 33MB 146.7MB/s 00:00
5)导入镜像
root@Master ~# ctr -n k8s.io images import flannel-0.28.9.tar.gz
docker.io/flannel/flannel cni plugin:v1. saved
docker.io/flannel/flannel:0.28.9 saved
application/vnd.oci.image.index.v1+json sha256:6cc4a86de7119b194a31cd4c399262dcacde29494e4969668959074ecbbb4380
application/vnd.oci.image.index.v1+json sha256:d59edbe383a39783d35fae3c7abba5bc189dc8542963291296dbf9c3ded75ac8
Importing elapsed: 1.0 s total: 0.0 B (0.0 B/s)
`三台节点都要导入`
6)部署服务组件
root@Master ~# kubectl apply -f kube-flannel.yml
namespace/kube-flannel created
serviceaccount/flannel created
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
configmap/kube-flannel-cfg created
daemonset.apps/kube-flannel-ds created
✅️ Flannel组件全部创建成功
7)检查节点是否就绪
root@Master ~# kubectl get no
NAME STATUS ROLES AGE VERSION
master Ready control-plane 81m v1.37.0
worker01 Ready <none> 48m v1.37.0
worker02 Ready <none> 48m v1.37.0
✅️ 三个节点全部Ready,CNI网络插件生效了

验证CNI网络插件#

Terminal window
1)编辑资源清单
root@Master ~# vim network-cni-test.yaml
apiVersion: v1
kind: Pod
metadata:
name: xiuxian-v1
spec:
nodeName: worker01
containers:
- image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1
name: xiuxian
---
apiVersion: v1
kind: Pod
metadata:
name: xiuxian-v2
spec:
nodeName: worker02
containers:
- image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v2
name: xiuxian
root@Master ~# kubectl apply -f network-cni-test.yaml
pod/xiuxian-v1 created
pod/xiuxian-v2 created
3)访问测试
root@Master ~# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
xiuxian-v1 1/1 Running 0 12s 10.100.1.2 worker01
xiuxian-v2 1/1 Running 0 12s 10.100.2.2 worker02
'分配到不同节点的Pod,IP在Pod网段10.100.0.0/16内'
root@Master ~# curl 10.100.1.2
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>yinzhengjie apps v1</title>
...
</head>
<body>
<h1 style="color: green">凡人修仙传 v1 </h1>
...
</body>
</html>
✅️ Worker01上的Pod可以正常访问
root@Master ~# curl 10.100.2.2
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>yinzhengjie apps v2</title>
...
</head>
<body>
<h1 style="color: red">凡人修仙传 v2 </h1>
...
</body>
</html>
✅️ Worker02上的Pod可以正常访问
4)删除pod
root@Master ~# kubectl delete -f network-cni-test.yaml
pod "xiuxian-v1" deleted from default namespace
pod "xiuxian-v2" deleted from default namespace
'清理环境,还原干净状态'

kubectl自动补全#

Terminal window
1)添加环境变量
root@Master ~# apt install -y bash-completion
# 装 bash-completion 框架包
root@Master ~# kubectl completion bash > ~/.kube/completion.bash.inc
root@Master ~# echo source '$HOME/.kube/completion.bash.inc' >> ~/.bashrc
root@Master ~# source ~/.bashrc
`开启 /etc/bash.bashrc 的框架加载(关键!默认是注释掉的)`
root@Master ~# vim /etc/bash.bashrc
# enable bash completion in interactive shells
'⬆️ 说明注释(原本就是注释,保留)'
#if ! shopt -oq posix; then
# if [ -f /usr/share/bash-completion/bash_completion ]; then
# . /usr/share/bash-completion/bash_completion
# elif [ -f /etc/bash_completion ]; then
# . /etc/bash_completion
# fi
#fi
2)验证自动补全
root@Master ~# kubectl # 连续按2次tab键
annotate (Update the annotations on a resource)
api-resources (Print the supported API resources on the server)
api-versions (Print the supported API versions on the server, in the form of "group/version")
apply (Apply a configuration to a resource by file name or stdin)
✅️ 自动补全已生效
3)关机拍快照
'建议快照名称: k8s使用Flannel网络插件'
history -c # 清空内存中的历史
> ~/.bash_history # 清空历史文件
history -w # 立即将空历史写入文件(防止退出时重新写入)
jiuzhao@Ubuntu ~$ virsh snapshot-list Master
名称 生成时间 状态
--------------------------------------------------------------
Before-install-CNI 2026-09-01 23:45:34 +0800 shutoff
init 2026-08-31 21:02:35 +0800 shutoff
K8s-environment-ready 2026-09-01 22:57:43 +0800 shutoff
K8s-use-Flannel 2026-09-02 10:11:59 +0800 shutoff

Pod概述#

image-20260902110853999
Tip
  • Pod是K8S集群调度的最小单元,所谓最小单元就是不可拆分

  • Pod是一组容器的集合,类似豌豆荚和豌豆的关系

    • Pod 是”豌豆荚”,容器是”豌豆”
  • 同一 Pod 内的容器 共享IP(共享网络名称空间)

Pod的容器类型#

Pod(豌豆荚)

③ 业务层

② 初始化层(可选)

① 基础架构层

pause 容器

(共享网络/IP/命名空间)

init 容器

启动前预处理,仅执行一次

业务容器1

(nginx)

业务容器2

(alpine)

共享资源

网络/IP · 存储卷 · IPC

Pod(豌豆荚)

③ 业务层

② 初始化层(可选)

① 基础架构层

pause 容器

(共享网络/IP/命名空间)

init 容器

启动前预处理,仅执行一次

业务容器1

(nginx)

业务容器2

(alpine)

共享资源

网络/IP · 存储卷 · IPC

🔹 基础架构容器(pause) 为Pod提供基础Linux名称空间(ipc、net、time、user)共享,由kubelet自动维护,无需运维人员部署

🔹 初始化容器 可选容器,为业务容器做初始化工作,所有初始化容器执行完成后才执行业务容器,仅在Pod创建时执行一次,业务容器重启不影响它

🔹 业务容器 用户的实际业务,可以定义多个

Note

启动顺序: 基础架构容器 → 初始化容器 → 业务容器 用户只需关注初始化容器和业务容器


Pod基础命令#

Terminal window
root@Master ~# kubectl run --help
Create and run a particular image in a pod.
Examples: `实例`
# Start a nginx pod
kubectl run nginx --image=nginx
......
Options: `选项`
--image='':
The image for the container to run.
--port='':
The port that this container exposes.
......
Usage: `用法` '中间有个 -- 分割符' # 用来明确区分 kubectl 自己的参数和你要传给容器执行的命令及参数
kubectl run NAME --image=image [--env="key=value"] [--port=port] ... -- [COMMAND] [args...] [options]
# 要学会看帮助信息!
1)响应式管理Pod
# 创建时指定pod名称和镜像
root@Master ~# kubectl run c1 --image=registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1
pod/c1 created
2)查看pod信息
root@Master ~# kubectl get po
NAME READY STATUS RESTARTS AGE
c1 1/1 Running 0 25s
root@Master ~# kubectl get po -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
c1 1/1 Running 0 35s 10.100.2.3 worker02 <none> <none>
字段含义
NAMEPod 名称
READY准备就绪数/容器总数, 如 2/2 = 两个容器均已就绪
STATUSRunning / Pending / CrashLoopBackOff…
RESTARTS重启次数(删除容器重建的次数)
一个 Pod 内所有容器重启次数的累加和
重新基于镜像,创建一个新的容器,并非服务重启
AGE资源运行时长
IPPod 的 IP 地址
NODEPod 所在的节点名
Terminal window
root@Master ~# curl -s 10.100.2.3 | grep h1
<h1 style="color: green">凡人修仙传 v1 </h1>
✅️ c1返回正常,nginx服务可用
3)创建时修改pod的启动命令
root@Master ~# kubectl run c2 --image=registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1 -- sleep 300
'当你要传给容器执行的命令及参数,必须用 -- 分隔符区分 kubectl 自己的参数'
`Nginx容器默认执行 CMD 启动参数是 "nginx" "-g" "daemon off;" 改参数容易被 run 后的参数覆盖`
# c2启动后执行sleep 300而不是默认的 nginx -g daemon off;
root@Master ~# kubectl get po -o wide
NAME READY STATUS RESTARTS AGE IP NODE
c1 1/1 Running 0 35s 10.100.2.3 worker02
c2 1/1 Running 0 19s 10.100.1.3 worker01
root@Master ~# curl 10.100.1.3
curl: (7) Failed to connect to 10.100.1.3 port 80 after 0 ms: Couldn't connect to server
# ❌️ c2连接被拒绝,因为它的启动命令是sleep 300,没有Web服务
4)交互式执行命令
root@Master ~# kubectl exec -it c2 -- sh
/ # ps -ef
PID USER TIME COMMAND
1 root 0:00 sleep 300
7 root 0:00 sh
13 root 0:00 ps -ef
'c2里只有sleep进程,验证了启动命令'
root@Master ~# kubectl exec -it c1 -- sh
/ # ps -ef
PID USER TIME COMMAND
1 root 0:00 nginx: master process nginx -g daemon off;
32 nginx 0:00 nginx: worker process
33 nginx 0:00 nginx: worker process
34 root 0:00 sh
40 root 0:00 ps -ef
'c1里跑了nginx的master和worker进程'
5)非交互执行命令
root@Master ~# kubectl exec c1 -- ps -ef
PID USER TIME COMMAND
1 root 0:00 nginx: master process nginx -g daemon off;
32 nginx 0:00 nginx: worker process
33 nginx 0:00 nginx: worker process
41 root 0:00 ps -ef
root@Master ~# kubectl exec c2 -- ps -ef
PID USER TIME COMMAND
1 root 0:00 sleep 300
7 root 0:00 ps -ef
6)再次查看容器
root@Master ~# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE
c1 1/1 Running 0 7m1s
c2 1/1 Running 1 (92s ago) 6m33s
'c2重启了1次,因为sleep 300秒后进程退出,kubelet自动重建'
7)删除指定名称的pod
root@Master ~# kubectl delete po c1
pod "c1" deleted from default namespace
root@Master ~# kubectl get pods -o wide
NAME READY STATUS RESTARTS
c2 1/1 Running 3 (4m36s ago)
`kubelet 一直在自动重建` # c1已删除,只剩c2
8)删除所有pod
root@Master ~# kubectl delete pods --all
# 当前名称空间下的所有pod都删除掉!
pod "c2" deleted from default namespace
root@Master ~# kubectl get pods -o wide
No resources found in default namespace.
'环境已清空'

基于标签管理Pod#

Note

标签是标识 K8s 集群资源的键值对,将来基于标签对这些资源进行分组、筛选和管理

Terminal window
1)创建测试pod
root@Master ~# kubectl run c1 --image=registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1
pod/c1 created
root@Master ~# kubectl run c2 --image=registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1
pod/c2 created
root@Master ~# kubectl run c3 --image=registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1
pod/c3 created
2)查看pod的标签
root@Master ~# kubectl get po --show-labels
--show-labels # 在最后一列显示所有标签
NAME READY STATUS RESTARTS AGE LABELS
c1 1/1 Running 0 3m14s run=c1
c2 1/1 Running 0 115s run=c2
c3 1/1 Running 0 111s run=c3
'默认标签是run=Pod名称'
3)为所有pod打标签
root@Master ~# kubectl label pod --all apps=xiuxian
pod/c1 labeled
pod/c2 labeled
pod/c3 labeled
root@Master ~# kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
c1 1/1 Running 0 5m45s apps=xiuxian,run=c1
c2 1/1 Running 0 4m26s apps=xiuxian,run=c2
c3 1/1 Running 0 4m22s apps=xiuxian,run=c3
✅️ 所有pod都加上了apps=xiuxian标签
4)为指定pod打标签
root@Master ~# kubectl label pod c1 version=v1
pod/c1 labeled
root@Master ~# kubectl label pod c2 school=kpyun class=Redhat
'多个键值 空格 隔开'
pod/c2 labeled
root@Master ~# kubectl get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
c1 1/1 Running 0 16m apps=xiuxian,run=c1,version=v1
c2 1/1 Running 0 15m apps=xiuxian,class=Redhat,run=c2,school=kpyun
c3 1/1 Running 0 15m apps=xiuxian,run=c3
5)基于标签过滤pod
-l # Label Selector(标签选择器),用于按标签过滤资源,只返回符合你指定条件的对象
运算符含义示例
= 或 ==等于(完全匹配)-l app=nginx → 只选 app=nginx 的资源
!=不等于(排除匹配)-l app!=nginx → 排除 app=nginx,选其他所有
in在集合中(多选一)-l "app in (nginx,redis)" → 选 app 为 nginx 或 redis 的资源
notin不在集合中(排除多个)-l "app notin (nginx,redis)" → 排除 nginx 和 redis,选其他所有
Tip

多个条件用逗号 , 分隔,表示必须同时满足(AND 逻辑):

Terminal window
root@Master ~# kubectl get pods -l school -o wide --show-labels
'只显示有school标签的pod,没有限定值' # 这些权限可以叠在一起使用
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES LABELS
c2 1/1 Running 0 23m 10.100.2.5 worker02 <none> <none> apps=xiuxian,class=Redhat,run=c2,school=kpyun
root@Master ~# kubectl get pods -l "run in (c1,c3)" -o wide --show-labels
'集合选择器: 显示run=c1或run=c3的pod'
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES LABELS
c1 1/1 Running 0 26m 10.100.1.4 worker01 <none> <none> apps=xiuxian,run=c1,version=v1
c3 1/1 Running 0 25m 10.100.1.5 worker01 <none> <none> apps=xiuxian,run=c3
root@Master ~# kubectl get pods -l class=Redhat,run=c2 --show-labels
NAME READY STATUS RESTARTS AGE LABELS
c2 1/1 Running 0 32m apps=xiuxian,class=Redhat,run=c2,school=kpyun
6)修改指定pod标签的值
root@Master ~# kubectl label pod c3 apps=kpyun --overwrite
pod/c3 labeled
'--overwrite 表示允许覆盖已存在的标签'
root@Master ~# kubectl get pod -l apps=kpyun --show-labels
NAME READY STATUS RESTARTS AGE LABELS
c3 1/1 Running 0 28m apps=kpyun,run=c3
✅️ apps标签已改为kpyun
7)删除标签
'减号删除法'
root@Master ~# kubectl label pod c3 apps-
pod/c3 unlabeled
# 键名后面加 "-" 即删除该标签
root@Master ~# kubectl get pod c3 --show-labels
NAME READY STATUS RESTARTS AGE LABELS
c3 1/1 Running 0 2m9s run=c3
✅️ apps标签已被删除
8)基于标签删除pod
root@Master ~# kubectl delete pods -l "run notin (c1,c3)"
pod "c2" deleted from default namespace
'删除所有 run 标签的值 不在 c1 和 c3 这个集合中的 Pod'
root@Master ~# kubectl delete pods -l version=v1
pod "c1" deleted from default namespace
'删除标签 version=v1 的pod'
root@Master ~# kubectl delete pods --all && kubectl get pods
pod "c3" deleted from default namespace
'所有pod已清空'
No resources found in default namespace.

K8s一切皆资源#

Important

Linux”一切皆文件”,K8s”一切皆资源”,K8s支持声明式和响应式两种管理方式

资源查看#

Terminal window
1)查看master组件
root@Master ~# kubectl get cs
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME STATUS MESSAGE ERROR
controller-manager Healthy ok
scheduler Healthy ok
etcd-0 Healthy ok
2)查看worker节点
root@Master ~# kubectl get no
NAME STATUS ROLES AGE VERSION
master Ready control-plane 12h v1.37.0
worker01 Ready <none> 11h v1.37.0
worker02 Ready <none> 11h v1.37.0
3)查看内置资源
root@Master ~# kubectl api-resources | wc -l
72
'K8s内置的资源类型'
root@Master ~# kubectl api-resources
NAME SHORTNAMES APIVERSION NAMESPACED KIND
bindings v1 true Binding
componentstatuses cs v1 false ComponentStatus
configmaps cm v1 true ConfigMap
endpoints ep v1 true Endpoints
events ev v1 true Event
limitranges limits v1 true LimitRange
namespaces ns v1 false Namespace
nodes no v1 false Node
...

Kubectl 资源字段#

字段核心作用西游类比(辅助记忆)运维实战建议(重点)
NAME (资源全称)唯一标识 操作时精准定位目标“身份证全名” 如:斗战胜佛·孙悟空写脚本或YAML时必须用全称,简称只在命令行交互时图省事用
SHORTNAMES (资源简称)快捷操作 减少日常kubectl打字量“绰号” 如:泼猴、大圣常用必记:po(Pod), svc(Service), cm(ConfigMap), ns(Namespace), no(Node)
APIVERSION (API版本)功能特性开关 决定你能用哪些新字段“修炼境界” 石猴(v1) → 齐天大圣(v1beta1) → 斗战胜佛(v2)极其重要:v1是稳定版(生产可用),alpha/beta是试验品
NAMESPACED (作用域)权限/隔离边界 决定资源是否受Namespace隔离“小区住户 vs 身份证号” true=小区住户(A栋可以有张三,B栋也可以有张三,互不干扰); false=身份证号(全国唯一,没有北京版和上海版之分)排查故障第一步:true的资源忘了加-n空间,会报NotFound;false的资源(如Node)加了空间也没用
KIND (资源类型)资源模板定义 描述“是什么类型”“物种基因” 如:通臂猿猴(定义了猴子长什么样)KIND + NAME 联合使用:kubectl get KIND 查所有该类资源;kubectl get KIND NAME 查具体某一个

K8s常用资源#

🚢 工作负载

资源名称简称描述重要度
podspo一组容器的集合,所有容器默认共享网络名称空间⭐⭐⭐⭐⭐
replicationcontrollersrc副本控制器,已弃用,由ReplicaSet替代⭐
replicasetsrs副本集,比rc更轻量、功能更丰富⭐⭐
deploymentsdeploy部署控制器,支持滚动更新和回滚,底层控制rs⭐⭐⭐⭐⭐
statefulsetssts状态控制器,为每个Pod提供稳定的网络标识和持久化存储⭐⭐⭐⭐
daemonsetsds守护进程控制器,每个Worker节点运行一个Pod(如日志收集、监控agent)⭐⭐⭐⭐⭐
jobs无一次性控制器,运行完成后退出的Pod控制器,适合批处理任务⭐⭐
cronjobscj周期性控制器,基于cron表达式定时触发Job⭐⭐⭐
horizontalpodautoscalershpa基于CPU/内存等指标自动扩缩Pod副本数⭐⭐⭐

🔗 网络

资源名称简称描述重要度
servicessvc服务,为Pod提供稳定的虚拟IP和四层(TCP/UDP)负载均衡⭐⭐⭐⭐⭐
ingressesing七层(HTTP/HTTPS)路由,底层调用svc实现域名映射⭐⭐⭐⭐⭐
endpointsep存储Service后端Pod的IP⭐⭐
endpointslices无Endpoints的扩展,支持大规模端点(>1000)⭐⭐⭐
networkpoliciesnp控制Pod进出站网络流量的安全策略,类似Pod防火墙⭐⭐⭐

📦 存储

资源名称简称描述重要度
persistentvolumespv存储卷,关联后端存储系统(NFS/Ceph/云盘等)⭐⭐
persistentvolumeclaimspvc存储卷声明,自动关联pv或sc⭐⭐⭐⭐⭐
storageclassessc存储类,动态供给存储,自动创建pv⭐⭐⭐⭐⭐

⚙️ 配置 && 安全

资源名称简称描述重要度
configmapscm存储应用配置信息(非敏感数据),以键值对挂载到Pod⭐⭐⭐⭐⭐
secrets无以base64编码存储敏感数据(非加密),挂载到Pod⭐⭐⭐⭐⭐
serviceaccountssa为Pod提供访问API Server的身份凭证⭐⭐⭐⭐
roles无定义namespace内的操作权限(如get/watch/list)⭐⭐⭐
clusterroles无定义集群范围的操作权限⭐⭐⭐
rolebindings无将Role授予用户/SA(namespace内生效)⭐⭐⭐
clusterrolebindings无将ClusterRole授予用户/SA(集群全局生效)⭐⭐⭐⭐

🧱 集群管理

资源名称简称描述重要度
namespacesns资源隔离边界,多租户场景必备⭐⭐⭐⭐⭐
nodesno集群中的工作机器,运行Pod的宿主机⭐⭐⭐⭐⭐
componentstatusescs查看Master组件(etcd/scheduler/controller-manager)健康状态⭐⭐⭐⭐⭐
eventsev记录集群内资源的状态变更和异常信息⭐⭐
limitrangeslimits限制namespace内容器/Pod的资源上下限(CPU/内存)⭐
resourcequotasquota限制namespace整体资源使用总量⭐

资源管理方式#

对比项命令式(响应式)声明式
类比Docker命令行docker-compose
操作方式kubectl run/delete/edit 等直接指令YAML + kubectl apply -f
重复执行❌ 非幂等,第二次可能报错(如 AlreadyExists)✅ 幂等,重复执行输出 unchanged 不报错
变更生效指令立即执行修改YAML后重新apply,触发调和
适用场景临时调试、快速验证生产环境、版本管理、GitOps
生产推荐❌ 仅限临时操作✅ 必选
  • 命令式:告诉系统「做这个动作」—— 执行指令,不检查状态,重复执行可能失败

  • 声明式:告诉系统「我要这个状态」—— 描述期望,系统自动调和,重复执行永远安全

  • create 是命令式操作:动词是”创建”,资源已存在时,这个指令就失效了

  • apply 是声明式操作:动词是”应用/调和”,资源已存在时就对比差异,无差异则不变,有差异则更新

Tip

实际工作中两种方式搭配使用:日常调试用命令式快速验证,生产环境用声明式管理资源 但核心原则是——生产环境必须声明式

Caution

⚠️ 响应式标签是临时的(Pod 删除重建后丢失) 声明式标签写在 YAML 中才是持久的 ✅️

声明式管理Pod#

资源描述的五个维度#

Terminal window
apiVersion: v1 # ① 资源API版本号
kind: Pod # ② 资源类型
metadata: # ③ 元数据信息(名称/标签/命名空间/注解)
name: my-pod
labels:
class: kpyun
app: nginx
spec: # ④ 期望运行状态(用户定义)
containers:
- image: nginx:latest
name: nginx
status: # ⑤ 实际运行状态(K8S自动维护)
phase: Running
Tip

containers带s,image不带s,containers下要加-符号

声明式管理Pod实战#

Terminal window
1)创建工作目录
root@Master ~# mkdir -p /k8s/pods && cd /k8s/pods
2)编写资源清单
root@Master pods# vim 01-pods-xiuxian.yaml
apiVersion: v1
kind: Pod
metadata:
name: xixi
labels:
apps: xiuxian
school: kpyun
class: Redhat
spec:
containers:
- name: c1
image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1
3)创建资源
root@Master pods# kubectl apply -f 01-pods-xiuxian.yaml
pod/xixi created
root@Master pods# kubectl get pods -o wide --show-labels
NAME READY STATUS RESTARTS AGE IP NODE LABELS
xixi 1/1 Running 0 16s 10.100.1.7 worker01 apps=xiuxian,class=Redhat,school=kpyun
root@Master pods# curl -s 10.100.1.7 | grep h1
<h1 style="color: green">凡人修仙传 v1 </h1>
✅️ Pod创建成功且可访问
root@Master pods# kubectl apply -f 01-pods-xiuxian.yaml
pod/xixi unchanged --> `未更改`
# 输出 unchanged,不报错 ✅ 这就是声明式的幂等性
# ❌️ create命令 资源已存在会报错 --> 生产推荐用apply
4)修改资源
'修改了标签和镜像版本'
root@Master pods# vim 01-pods-xiuxian.yaml
apiVersion: v1
kind: Pod
metadata:
name: xixi
labels:
#apps: xiuxian
#school: kpyun
#class: Redhat
version: v2
spec:
containers:
- name: c1
# image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1
image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v2
root@Master pods# kubectl apply -f 01-pods-xiuxian.yaml
pod/xixi configured
'apply可以更新已有资源,create不行'
root@Master pods# kubectl get pods -o wide --show-labels
NAME READY STATUS RESTARTS AGE IP NODE LABELS
xixi 1/1 Running 1 (63s ago) 8m17s 10.100.1.8 worker01 version=v2
root@Master pods# curl -s 10.100.1.8 | grep h1
<h1 style="color: red">凡人修仙传 v2 </h1>
✅️ Pod已更新到v2版本
5)对照配置查看
'以YAML为基准,查看该配置文件定义的资源状态'
root@Master pods# kubectl get -f 01-pods-xiuxian.yaml
NAME READY STATUS RESTARTS AGE
xixi 1/1 Running 1 (3m49s ago) 11m
6)删除集群资源
'配置文件还在,需要时随时 apply -f 重新创建'
root@Master pods# kubectl delete -f 01-pods-xiuxian.yaml
pod "xixi" deleted
7)指定多容器Pod
jiuzhao@Ubuntu ~$ sudo docker save alpine:3.20 > alpine-3.20.tar.gz
jiuzhao@Ubuntu ~$ scp alpine-3.20.tar.gz Master:/tmp/
jiuzhao@Ubuntu ~$ scp alpine-3.20.tar.gz Worker01:/tmp/
jiuzhao@Ubuntu ~$ scp alpine-3.20.tar.gz Worker02:/tmp/
` ctr -n k8s.io images import /tmp/alpine-3.20.tar.gz `
'三台都要导入镜像'
root@Master pods# vim 01-pods-xiuxian.yaml
apiVersion: v1
kind: Pod
metadata:
name: xixi
labels:
school: kpyun
spec:
nodeName: worker01 # 指定Pod调度到哪个节点
containers:
- name: c1
image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1
- name: alpine
image: docker.io/library/alpine:3.20
stdin: true # 相当于给容器挂了一个"等待输入的终端",alpine容器不会主动退出
root@Master pods# kubectl apply -f 01-pods-xiuxian.yaml
pod/xixi created
root@Master pods# kubectl get po -o wide
NAME READY STATUS RESTARTS AGE IP NODE
xixi 2/2 Running 0 3m14s 10.100.1.10 worker01
# ✅️ READY 2/2 表示两个容器都就绪
# ✅ 两个容器共享同一个IP(网络命名空间共享)
8)非交互式执行命令
-c, --container # 指定容器名称(多容器Pod时必须指定)
'-c 参数让你精准选择要操作的容器'
root@Master pods# kubectl exec xixi -c c1 -- ifconfig | awk 'NR==2{print $2}'
addr:10.100.1.10
root@Master pods# kubectl exec xixi -c alpine -- ifconfig | awk 'NR==2{print $2}'
addr:10.100.1.10
`xixi 是一个多容器Pod(2个容器),它们共享同一个网络命名空间,因此IP地址相同`

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

相关文章智能推荐
1
K8s故障排查 & 控制器与Service实战
Kubernetes故障排查三板斧describe/logs/exec与command&args,容器三种状态与pause基础架构容器,env环境变量部署WordPress,Deployment副本控制与滚动更新回滚,Service四类型ClusterIP/NodePort/LoadBalancer/ExternalName,kube-proxy+iptables底层实现,名称空间,CoreDNS服务发现与跨ns解析,deploy+svc部署WordPress及跨名称空间连库实战
2
Prometheus 告警 && etcd 集群实战
Prometheus监控Alertmanager 告警路由/模板/静默/抑制 + 钉钉插件,etcd 3.7 TLS 高可用集群部署/备份恢复/Prometheus 监控,复用既有 kpyun CA 体系
3
Prometheus存储实战 && HTTPS认证 && 黑盒监控
Prometheus监控VictoriaMetrics单机部署+remote_write远端存储,Prometheus启用HTTPS+Basic Auth认证,node-exporter黑白名单,标签管理(relabel/metric_relabel),blackbox-exporter HTTP/ICMP/TCP黑盒探测,Grafana存储迁移到MySQL
4
Prometheus自定义监控 && 服务发现 && 联邦模式
Prometheus监控部署 pushgateway 实现短期任务/自定义指标的推送式监控(API 推送删除、honor_labels、TCP 12 状态、丢包率脚本),用 Go + client_golang 开发自定义 exporter(静态编译零依赖),落地 file_sd 与 consul 服务发现(consul 2.0.3 集群 + consul_exporter),最后用 3 台 Prometheus server 搭建联邦模式实现分布式采集汇总
5
Go语言开篇
Go语言Go 1.26.6 环境安装与环境变量配置,对比系统安装与家目录安装两种方式,含 GOROOT/GOPATH 概念与 GOPROXY 配置
Profile Image of the Author
久棹
不是先学好了再干,而是先干起来再学习,干中学!
分类
站点统计
文章
115
分类
15
标签
272
总字数
306,562
运行时长
0 天
最后活动
0 天前
文章目录