K8s开篇 & kubeadm集群部署实战

K8s开篇 & kubeadm集群部署实战
[TOC]
概述
什么是K8s
📌 定义:Kubernetes(K8s)是一个开源的容器编排平台,核心作用是管理容器的生命周期、调度、部署、监控和维护
它的核心能力主要有三点:
- 自动化部署与回滚:你可以声明应用的理想状态(比如运行10个实例),K8s会自动调整到该状态,并支持无中断的版本更新和问题回滚
- 自愈与弹性伸缩:它能自动检测并重启失败的容器,也能根据CPU等指标,手动或自动地增加或减少容器实例数量
- 服务发现与负载均衡:每个容器都会获得自己的IP,K8s内置DNS和负载均衡,确保服务间能稳定找到彼此
参考链接:https://kubernetes.io/zh-cn/
它脱胎于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架构
**Master(控制平面)**是整个集群的大脑,所有决策都从这里发出
etcd: Key-Value 数据库,存储集群全部数据
**Worker(工作节点)**是真正干活的地方
CNI: 负责Pod网络通信的网络插件接口
| 节点类型 | 组件 | 端口 | 功能说明 |
|---|---|---|---|
| Master | kube-apiserver | 6443 | 集群唯一访问入口,提供 API 服务,供 kubectl、各组件及外部应用访问 |
| kube-controller-manager | 10257 | 维护集群期望状态(如副本数控制),通过 HTTPS 暴露监控指标 | |
| kube-scheduler | 10259 | 负责 Pod 调度决策(决定Pod跑在哪个Worker上),通过 HTTPS 暴露监控指标 | |
| etcd | 2379 | 客户端通信(API Server 读写集群数据) | |
| 2380 | etcd 集群内部节点间数据同步与选主 | ||
| Worker | kubelet | 10250 | 管理 Pod 生命周期,定期上报节点状态,供 API Server 执行容器操作与采集指标 |
| kube-proxy | 10256 | 代理 Pod 请求,实现服务发现和负载均衡;此端口用于健康检查 |

生产环境版本选择
生产环境不一定追新,选择你熟悉的版本即可,新版本可能移除老功能,公司环境往往是”老前辈”部署好的,接着用就行
运行时注意事项
- K8s 1.11+ 支持 Docker 和 Containerd
- K8s 1.23.17 是最后一个默认支持 Docker 的版本
- K8s 1.24+ 已移除 dockershim,官方推荐使用 Containerd
- 更高版本也能用 Docker,但不推荐,CNCF 测试表明 Containerd 性能更高

官网链接:https://kubernetes.io/zh-cn/releases/
'我们直接使用最新版'- K8s 版本: 1.37(最新版)- 容器运行时: Containerd v2.3.4K8s网络类型

我们的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地址 | 操作系统 | 硬件配置 |
|---|---|---|---|
| Master | 10.0.0.13 | Ubuntu 24.04 LTS | 2c+,4G+,50G+ |
| Worker01 | 10.0.0.14 | Ubuntu 24.04 LTS | 2c+,4G+,50G+ |
| Worker02 | 10.0.0.15 | Ubuntu 24.04 LTS | 2c+,4G+,50G+ |
部署K8s集群建议使用root用户操作,三台机器都需要执行优化步骤
基础优化与工具安装
`三台机器都要做优化`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.confbr_netfilterEOF'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 = 1net.bridge.bridge-nf-call-iptables = 1net.bridge.bridge-nf-call-ip6tables = 1net.ipv6.conf.all.disable_ipv6 = 1fs.may_detach_mounts = 1vm.overcommit_memory=1vm.panic_on_oom=0fs.inotify.max_user_watches=89100fs.file-max=52706963fs.nr_open=52706963net.netfilter.nf_conntrack_max=2310720net.ipv4.tcp_keepalive_time = 600net.ipv4.tcp_keepalive_probes = 3net.ipv4.tcp_keepalive_intvl =15net.ipv4.tcp_max_tw_buckets = 36000net.ipv4.tcp_tw_reuse = 1net.ipv4.tcp_max_orphans = 327680net.ipv4.tcp_orphan_retries = 3net.ipv4.tcp_syncookies = 1net.ipv4.tcp_max_syn_backlog = 16384net.ipv4.ip_conntrack_max = 65536net.ipv4.tcp_max_syn_backlog = 16384net.ipv4.tcp_timestamps = 0net.core.somaxconn = 16384EOF
sysctl --system # 让内核参数立即生效
7)安装ipvsadm等相关工具apt -y update && apt -y upgradeapt -y install ipvsadm ipset sysstat conntrack
8)创建开机自动加载的模块配置文件cat > /etc/modules-load.d/ipvs.conf << 'EOF'ip_vsip_vs_lcip_vs_wlcip_vs_rrip_vs_wrrip_vs_lblcip_vs_lblcrip_vs_dhip_vs_ship_vs_foip_vs_nqip_vs_sedip_vs_ftpip_vs_shnf_conntrackip_tablesip_setxt_setipt_setipt_rpfilteript_REJECTipipEOF
9)安装containerdunzip /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 versionrunc version 1.5.1✅️ containerd 和 runc 都安装成功
root@Master ~# ctr images lsREF 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-toolsGet: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.yamlruntime-endpoint: unix:///run/containerd/containerd.sockimage-endpoint: unix:///run/containerd/containerd.sockEOFroot@Master ~# echo "source <(crictl completion bash)" >> ~/.bashrc'Bash自动补全命令'root@Master ~# source ~/.bashrcroot@Master ~# crictl --versioncrictl version v1.37.0安装kubeadm、kubelet、kubectl
| 软件包 | 作用 |
|---|---|
| kubeadm | 初始化K8S集群的工具 |
| kubelet | 静态Pod技术启动master组件以及Pod生命周期管理 |
| kubectl | 与K8S集群通信的命令行工具 |
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/
1)所有节点配置软件源apt-get install -y apt-transport-https# 让 apt 支持从 HTTPS 源下载软件包K8s_Version=v1.37curl -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 versionkubeadm version: &version.Info{Major:"1", Minor:"37", ... GitVersion:"v1.37.0", BuildDate:"2026-08-26T10:47:17Z", GoVersion:"go1.26.6" ...
root@Master ~# kubectl versionClient Version: v1.37.0Kustomize Version: v5.8.1The connection to the server localhost:8080 was refused - did you specify the right host or port?# 这是正常的,因为集群还没初始化完成
root@Master ~# kubelet --versionKubernetes v1.37.0`另外三个节点也要进行验证`✅️ 三个节点版本一致时区优化及快照
1)设置时区root@Master ~# ls -lh /etc/localtimelrwxrwxrwx 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 -RTue, 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_conntrackfree -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 shutoffK8s集群部署
部署Master组件
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] | 显示其他节点加入集群所需的命令 |
root@Master ~# crictl images`后续再安装的时候,可以save导出为tar包,方便导入`IMAGE TAGregistry.aliyuncs.com/google_containers/coredns v1.14.6registry.aliyuncs.com/google_containers/etcd 3.7.0-0registry.aliyuncs.com/google_containers/kube-apiserver v1.37.0registry.aliyuncs.com/google_containers/kube-controller-manager v1.37.0registry.aliyuncs.com/google_containers/kube-proxy v1.37.0registry.aliyuncs.com/google_containers/kube-scheduler v1.37.0registry.aliyuncs.com/google_containers/pause 3.10.2
3)拷贝授权文件,用于管理K8S集群root@Master ~# mkdir -p $HOME/.kuberoot@Master ~# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configroot@Master ~# sudo chown $(id -u):$(id -g) $HOME/.kube/config
4)查看master组件是否正常工作root@Master ~# kubectl get csWarning: v1 ComponentStatus is deprecated in v1.19+NAME STATUS MESSAGE ERRORcontroller-manager Healthy okscheduler Healthy oketcd-0 Healthy ok✅️ 三个组件都是Healthy# ⚠️ 只能看 controller-manager、scheduler、etcd,看不到 apiserver 本身# cs 这个 API 从 K8s 1.19 开始就标记为"已弃用",官方提示"以后可能移除"
5)查看工作节点root@Master ~# kubectl get noNAME STATUS ROLES AGE VERSIONmaster NotReady control-plane 2m29s v1.37.0# ROLES 只显示 control-plane'NotReady是正常的,还没装CNI网络插件'
root@Master ~# kubectl get no -o wideNAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIMEmaster 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 # 检查swaplscpu # 检查CPU
'重置环境重新初始化'kubeadm reset -frm -rf /etc/kubernetes/ $HOME/.kube/镜像导出/压缩的坑(多架构镜像)
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组件
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 imagesIMAGE TAGregistry.aliyuncs.com/google_containers/kube-proxy v1.37.0registry.aliyuncs.com/google_containers/pause 3.10.2# kubeadm join 时,kubeadm 会预拉取 worker 节点必须的镜像,正好就是这两个
root@Master ~# kubectl get noNAME STATUS ROLES AGE VERSIONmaster NotReady control-plane 37m v1.37.0worker01 NotReady <none> 4m15s v1.37.0worker02 NotReady <none> 4m11s v1.37.0✅️ 三个节点都已加入集群
root@Master ~# kubectl get no -o wideNAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIMEmaster 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.4worker01 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.4worker02 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/
1)下载Flannel官方清单【需要能够访问GitHub】export http_proxy=http://10.0.0.1:7890export https_proxy=http://10.0.0.1:7890wget https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.ymlunset 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.ymlroot@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.9root@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.ymlroot@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-flannel3root@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.9root@Ubuntu ~# docker images | grep flannel | awk '{print $1}'flannel/flannel-cni-plugin:v1.9.1-flannel3flannel/flannel:0.28.9root@Ubuntu ~# docker save \ flannel/flannel-cni-plugin:v1.9.1-flannel3 \ flannel/flannel:0.28.9 \ | gzip > /home/jiuzhao/flannel-0.28.9.tar.gzroot@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:00jiuzhao@Ubuntu ~$ scp flannel-0.28.9.tar.gz root@Worker01:~flannel-0.28.9.tar.gz 100% 33MB 138.2MB/s 00:00jiuzhao@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.gzdocker.io/flannel/flannel cni plugin:v1. saveddocker.io/flannel/flannel:0.28.9 savedapplication/vnd.oci.image.index.v1+json sha256:6cc4a86de7119b194a31cd4c399262dcacde29494e4969668959074ecbbb4380application/vnd.oci.image.index.v1+json sha256:d59edbe383a39783d35fae3c7abba5bc189dc8542963291296dbf9c3ded75ac8Importing elapsed: 1.0 s total: 0.0 B (0.0 B/s)`三台节点都要导入`
6)部署服务组件root@Master ~# kubectl apply -f kube-flannel.ymlnamespace/kube-flannel createdserviceaccount/flannel createdclusterrole.rbac.authorization.k8s.io/flannel createdclusterrolebinding.rbac.authorization.k8s.io/flannel createdconfigmap/kube-flannel-cfg createddaemonset.apps/kube-flannel-ds created✅️ Flannel组件全部创建成功
7)检查节点是否就绪root@Master ~# kubectl get noNAME STATUS ROLES AGE VERSIONmaster Ready control-plane 81m v1.37.0worker01 Ready <none> 48m v1.37.0worker02 Ready <none> 48m v1.37.0✅️ 三个节点全部Ready,CNI网络插件生效了验证CNI网络插件
1)编辑资源清单root@Master ~# vim network-cni-test.yamlapiVersion: v1kind: Podmetadata: name: xiuxian-v1spec: nodeName: worker01 containers: - image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1 name: xiuxian---apiVersion: v1kind: Podmetadata: name: xiuxian-v2spec: nodeName: worker02 containers: - image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v2 name: xiuxian
root@Master ~# kubectl apply -f network-cni-test.yamlpod/xiuxian-v1 createdpod/xiuxian-v2 created
3)访问测试root@Master ~# kubectl get pods -o wideNAME READY STATUS RESTARTS AGE IP NODExiuxian-v1 1/1 Running 0 12s 10.100.1.2 worker01xiuxian-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)删除podroot@Master ~# kubectl delete -f network-cni-test.yamlpod "xiuxian-v1" deleted from default namespacepod "xiuxian-v2" deleted from default namespace'清理环境,还原干净状态'kubectl自动补全
1)添加环境变量root@Master ~# apt install -y bash-completion# 装 bash-completion 框架包root@Master ~# kubectl completion bash > ~/.kube/completion.bash.incroot@Master ~# echo source '$HOME/.kube/completion.bash.inc' >> ~/.bashrcroot@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 shutoffPod概述

-
Pod是K8S集群调度的最小单元,所谓最小单元就是不可拆分
-
Pod是一组容器的集合,类似豌豆荚和豌豆的关系
- Pod 是”豌豆荚”,容器是”豌豆”
-
同一 Pod 内的容器 共享IP(共享网络名称空间)
Pod的容器类型
🔹 基础架构容器(pause) 为Pod提供基础Linux名称空间(ipc、net、time、user)共享,由kubelet自动维护,无需运维人员部署
🔹 初始化容器 可选容器,为业务容器做初始化工作,所有初始化容器执行完成后才执行业务容器,仅在Pod创建时执行一次,业务容器重启不影响它
🔹 业务容器 用户的实际业务,可以定义多个
启动顺序: 基础架构容器 → 初始化容器 → 业务容器 用户只需关注初始化容器和业务容器
Pod基础命令
root@Master ~# kubectl run --helpCreate 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:v1pod/c1 created
2)查看pod信息root@Master ~# kubectl get poNAME READY STATUS RESTARTS AGEc1 1/1 Running 0 25sroot@Master ~# kubectl get po -o wideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATESc1 1/1 Running 0 35s 10.100.2.3 worker02 <none> <none>| 字段 | 含义 |
|---|---|
| NAME | Pod 名称 |
| READY | 准备就绪数/容器总数, 如 2/2 = 两个容器均已就绪 |
| STATUS | Running / Pending / CrashLoopBackOff… |
| RESTARTS | 重启次数(删除容器重建的次数) 一个 Pod 内所有容器重启次数的累加和 重新基于镜像,创建一个新的容器,并非服务重启 |
| AGE | 资源运行时长 |
| IP | Pod 的 IP 地址 |
| NODE | Pod 所在的节点名 |
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 wideNAME READY STATUS RESTARTS AGE IP NODEc1 1/1 Running 0 35s 10.100.2.3 worker02c2 1/1 Running 0 19s 10.100.1.3 worker01
root@Master ~# curl 10.100.1.3curl: (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 -efPID 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 -efPID 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 -efPID 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 -efPID USER TIME COMMAND 1 root 0:00 sleep 300 7 root 0:00 ps -ef
6)再次查看容器root@Master ~# kubectl get pods -o wideNAME READY STATUS RESTARTS AGEc1 1/1 Running 0 7m1sc2 1/1 Running 1 (92s ago) 6m33s'c2重启了1次,因为sleep 300秒后进程退出,kubelet自动重建'
7)删除指定名称的podroot@Master ~# kubectl delete po c1pod "c1" deleted from default namespace
root@Master ~# kubectl get pods -o wideNAME READY STATUS RESTARTSc2 1/1 Running 3 (4m36s ago)`kubelet 一直在自动重建` # c1已删除,只剩c2
8)删除所有podroot@Master ~# kubectl delete pods --all# 当前名称空间下的所有pod都删除掉!pod "c2" deleted from default namespace
root@Master ~# kubectl get pods -o wideNo resources found in default namespace.'环境已清空'基于标签管理Pod
标签是标识 K8s 集群资源的键值对,将来基于标签对这些资源进行分组、筛选和管理
1)创建测试podroot@Master ~# kubectl run c1 --image=registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1pod/c1 createdroot@Master ~# kubectl run c2 --image=registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1pod/c2 createdroot@Master ~# kubectl run c3 --image=registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1pod/c3 created
2)查看pod的标签root@Master ~# kubectl get po --show-labels--show-labels # 在最后一列显示所有标签NAME READY STATUS RESTARTS AGE LABELSc1 1/1 Running 0 3m14s run=c1c2 1/1 Running 0 115s run=c2c3 1/1 Running 0 111s run=c3'默认标签是run=Pod名称'
3)为所有pod打标签root@Master ~# kubectl label pod --all apps=xiuxianpod/c1 labeledpod/c2 labeledpod/c3 labeledroot@Master ~# kubectl get pods --show-labelsNAME READY STATUS RESTARTS AGE LABELSc1 1/1 Running 0 5m45s apps=xiuxian,run=c1c2 1/1 Running 0 4m26s apps=xiuxian,run=c2c3 1/1 Running 0 4m22s apps=xiuxian,run=c3✅️ 所有pod都加上了apps=xiuxian标签
4)为指定pod打标签root@Master ~# kubectl label pod c1 version=v1pod/c1 labeledroot@Master ~# kubectl label pod c2 school=kpyun class=Redhat'多个键值 空格 隔开'pod/c2 labeledroot@Master ~# kubectl get pod --show-labelsNAME READY STATUS RESTARTS AGE LABELSc1 1/1 Running 0 16m apps=xiuxian,run=c1,version=v1c2 1/1 Running 0 15m apps=xiuxian,class=Redhat,run=c2,school=kpyunc3 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,选其他所有 |
多个条件用逗号 , 分隔,表示必须同时满足(AND 逻辑):
root@Master ~# kubectl get pods -l school -o wide --show-labels'只显示有school标签的pod,没有限定值' # 这些权限可以叠在一起使用NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES LABELSc2 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 LABELSc1 1/1 Running 0 26m 10.100.1.4 worker01 <none> <none> apps=xiuxian,run=c1,version=v1c3 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-labelsNAME READY STATUS RESTARTS AGE LABELSc2 1/1 Running 0 32m apps=xiuxian,class=Redhat,run=c2,school=kpyun
6)修改指定pod标签的值root@Master ~# kubectl label pod c3 apps=kpyun --overwritepod/c3 labeled'--overwrite 表示允许覆盖已存在的标签'root@Master ~# kubectl get pod -l apps=kpyun --show-labelsNAME READY STATUS RESTARTS AGE LABELSc3 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-labelsNAME READY STATUS RESTARTS AGE LABELSc3 1/1 Running 0 2m9s run=c3✅️ apps标签已被删除
8)基于标签删除podroot@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=v1pod "c1" deleted from default namespace'删除标签 version=v1 的pod'
root@Master ~# kubectl delete pods --all && kubectl get podspod "c3" deleted from default namespace'所有pod已清空'No resources found in default namespace.K8s一切皆资源
Linux”一切皆文件”,K8s”一切皆资源”,K8s支持声明式和响应式两种管理方式
资源查看
1)查看master组件root@Master ~# kubectl get csWarning: v1 ComponentStatus is deprecated in v1.19+NAME STATUS MESSAGE ERRORcontroller-manager Healthy okscheduler Healthy oketcd-0 Healthy ok
2)查看worker节点root@Master ~# kubectl get noNAME STATUS ROLES AGE VERSIONmaster Ready control-plane 12h v1.37.0worker01 Ready <none> 11h v1.37.0worker02 Ready <none> 11h v1.37.0
3)查看内置资源root@Master ~# kubectl api-resources | wc -l72'K8s内置的资源类型'
root@Master ~# kubectl api-resourcesNAME SHORTNAMES APIVERSION NAMESPACED KINDbindings v1 true Bindingcomponentstatuses cs v1 false ComponentStatusconfigmaps cm v1 true ConfigMapendpoints ep v1 true Endpointsevents ev v1 true Eventlimitranges limits v1 true LimitRangenamespaces ns v1 false Namespacenodes 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常用资源
🚢 工作负载
| 资源名称 | 简称 | 描述 | 重要度 |
|---|---|---|---|
| pods | po | 一组容器的集合,所有容器默认共享网络名称空间 | ⭐⭐⭐⭐⭐ |
| replicationcontrollers | rc | 副本控制器,已弃用,由ReplicaSet替代 | ⭐ |
| replicasets | rs | 副本集,比rc更轻量、功能更丰富 | ⭐⭐ |
| deployments | deploy | 部署控制器,支持滚动更新和回滚,底层控制rs | ⭐⭐⭐⭐⭐ |
| statefulsets | sts | 状态控制器,为每个Pod提供稳定的网络标识和持久化存储 | ⭐⭐⭐⭐ |
| daemonsets | ds | 守护进程控制器,每个Worker节点运行一个Pod(如日志收集、监控agent) | ⭐⭐⭐⭐⭐ |
| jobs | 无 | 一次性控制器,运行完成后退出的Pod控制器,适合批处理任务 | ⭐⭐ |
| cronjobs | cj | 周期性控制器,基于cron表达式定时触发Job | ⭐⭐⭐ |
| horizontalpodautoscalers | hpa | 基于CPU/内存等指标自动扩缩Pod副本数 | ⭐⭐⭐ |
🔗 网络
| 资源名称 | 简称 | 描述 | 重要度 |
|---|---|---|---|
| services | svc | 服务,为Pod提供稳定的虚拟IP和四层(TCP/UDP)负载均衡 | ⭐⭐⭐⭐⭐ |
| ingresses | ing | 七层(HTTP/HTTPS)路由,底层调用svc实现域名映射 | ⭐⭐⭐⭐⭐ |
| endpoints | ep | 存储Service后端Pod的IP | ⭐⭐ |
| endpointslices | 无 | Endpoints的扩展,支持大规模端点(>1000) | ⭐⭐⭐ |
| networkpolicies | np | 控制Pod进出站网络流量的安全策略,类似Pod防火墙 | ⭐⭐⭐ |
📦 存储
| 资源名称 | 简称 | 描述 | 重要度 |
|---|---|---|---|
| persistentvolumes | pv | 存储卷,关联后端存储系统(NFS/Ceph/云盘等) | ⭐⭐ |
| persistentvolumeclaims | pvc | 存储卷声明,自动关联pv或sc | ⭐⭐⭐⭐⭐ |
| storageclasses | sc | 存储类,动态供给存储,自动创建pv | ⭐⭐⭐⭐⭐ |
⚙️ 配置 && 安全
| 资源名称 | 简称 | 描述 | 重要度 |
|---|---|---|---|
| configmaps | cm | 存储应用配置信息(非敏感数据),以键值对挂载到Pod | ⭐⭐⭐⭐⭐ |
| secrets | 无 | 以base64编码存储敏感数据(非加密),挂载到Pod | ⭐⭐⭐⭐⭐ |
| serviceaccounts | sa | 为Pod提供访问API Server的身份凭证 | ⭐⭐⭐⭐ |
| roles | 无 | 定义namespace内的操作权限(如get/watch/list) | ⭐⭐⭐ |
| clusterroles | 无 | 定义集群范围的操作权限 | ⭐⭐⭐ |
| rolebindings | 无 | 将Role授予用户/SA(namespace内生效) | ⭐⭐⭐ |
| clusterrolebindings | 无 | 将ClusterRole授予用户/SA(集群全局生效) | ⭐⭐⭐⭐ |
🧱 集群管理
| 资源名称 | 简称 | 描述 | 重要度 |
|---|---|---|---|
| namespaces | ns | 资源隔离边界,多租户场景必备 | ⭐⭐⭐⭐⭐ |
| nodes | no | 集群中的工作机器,运行Pod的宿主机 | ⭐⭐⭐⭐⭐ |
| componentstatuses | cs | 查看Master组件(etcd/scheduler/controller-manager)健康状态 | ⭐⭐⭐⭐⭐ |
| events | ev | 记录集群内资源的状态变更和异常信息 | ⭐⭐ |
| limitranges | limits | 限制namespace内容器/Pod的资源上下限(CPU/内存) | ⭐ |
| resourcequotas | quota | 限制namespace整体资源使用总量 | ⭐ |
资源管理方式
| 对比项 | 命令式(响应式) | 声明式 |
|---|---|---|
| 类比 | Docker命令行 | docker-compose |
| 操作方式 | kubectl run/delete/edit 等直接指令 | YAML + kubectl apply -f |
| 重复执行 | ❌ 非幂等,第二次可能报错(如 AlreadyExists) | ✅ 幂等,重复执行输出 unchanged 不报错 |
| 变更生效 | 指令立即执行 | 修改YAML后重新apply,触发调和 |
| 适用场景 | 临时调试、快速验证 | 生产环境、版本管理、GitOps |
| 生产推荐 | ❌ 仅限临时操作 | ✅ 必选 |
-
命令式:告诉系统「做这个动作」—— 执行指令,不检查状态,重复执行可能失败
-
声明式:告诉系统「我要这个状态」—— 描述期望,系统自动调和,重复执行永远安全
-
create是命令式操作:动词是”创建”,资源已存在时,这个指令就失效了 -
apply是声明式操作:动词是”应用/调和”,资源已存在时就对比差异,无差异则不变,有差异则更新
实际工作中两种方式搭配使用:日常调试用命令式快速验证,生产环境用声明式管理资源 但核心原则是——生产环境必须声明式
⚠️ 响应式标签是临时的(Pod 删除重建后丢失) 声明式标签写在 YAML 中才是持久的 ✅️
声明式管理Pod
资源描述的五个维度
apiVersion: v1 # ① 资源API版本号kind: Pod # ② 资源类型metadata: # ③ 元数据信息(名称/标签/命名空间/注解) name: my-pod labels: class: kpyun app: nginxspec: # ④ 期望运行状态(用户定义) containers: - image: nginx:latest name: nginxstatus: # ⑤ 实际运行状态(K8S自动维护) phase: Runningcontainers带s,image不带s,containers下要加-符号
声明式管理Pod实战
1)创建工作目录root@Master ~# mkdir -p /k8s/pods && cd /k8s/pods
2)编写资源清单root@Master pods# vim 01-pods-xiuxian.yamlapiVersion: v1kind: Podmetadata: name: xixi labels: apps: xiuxian school: kpyun class: Redhatspec: containers: - name: c1 image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1
3)创建资源root@Master pods# kubectl apply -f 01-pods-xiuxian.yamlpod/xixi createdroot@Master pods# kubectl get pods -o wide --show-labelsNAME READY STATUS RESTARTS AGE IP NODE LABELSxixi 1/1 Running 0 16s 10.100.1.7 worker01 apps=xiuxian,class=Redhat,school=kpyunroot@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.yamlpod/xixi unchanged --> `未更改`# 输出 unchanged,不报错 ✅ 这就是声明式的幂等性# ❌️ create命令 资源已存在会报错 --> 生产推荐用apply
4)修改资源'修改了标签和镜像版本'root@Master pods# vim 01-pods-xiuxian.yamlapiVersion: v1kind: Podmetadata: name: xixi labels: #apps: xiuxian #school: kpyun #class: Redhat version: v2spec: containers: - name: c1 # image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1 image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v2root@Master pods# kubectl apply -f 01-pods-xiuxian.yamlpod/xixi configured'apply可以更新已有资源,create不行'root@Master pods# kubectl get pods -o wide --show-labelsNAME READY STATUS RESTARTS AGE IP NODE LABELSxixi 1/1 Running 1 (63s ago) 8m17s 10.100.1.8 worker01 version=v2root@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.yamlNAME READY STATUS RESTARTS AGExixi 1/1 Running 1 (3m49s ago) 11m
6)删除集群资源'配置文件还在,需要时随时 apply -f 重新创建'root@Master pods# kubectl delete -f 01-pods-xiuxian.yamlpod "xixi" deleted
7)指定多容器Podjiuzhao@Ubuntu ~$ sudo docker save alpine:3.20 > alpine-3.20.tar.gzjiuzhao@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.yamlapiVersion: v1kind: Podmetadata: name: xixi labels: school: kpyunspec: 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.yamlpod/xixi createdroot@Master pods# kubectl get po -o wideNAME READY STATUS RESTARTS AGE IP NODExixi 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.10root@Master pods# kubectl exec xixi -c alpine -- ifconfig | awk 'NR==2{print $2}'addr:10.100.1.10`xixi 是一个多容器Pod(2个容器),它们共享同一个网络命名空间,因此IP地址相同`文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!















