Kubernetes基础与部署实战
目录
- 一、背景
- 1.1 物理机时代的运维痛点
- 1.2 虚拟化技术带来的运维变革
- 1.3 容器化:运维工作的革命性变化
- 二、K8S的介绍
- 2.1 K8S架构图的理解
- 2.2 K8S是什么?
- 2.3 为什么需要Kubernetes?
- 2.4 K8S名词解释
- 2.5 Kubernetes Pod控制器类型
- 2.6 deploylment、rs、pod之间的关系
- 2.7 部署K8S前的环境准备
- 2.7.1 升级系统内核
- 2.7.2 部署规划
- 2.7.3 节点规划
- 2.7.4 修改主机名并解析DNS和主机
- 2.7.5 系统优化
- 2.7.6 安装Docker
- 2.8 K8S安装
- 2.8.1 安装 kubenetes yum 源
- 2.8.2 主节点操作(Master操作)
- 2.8.3 kube-flannel文件详解
一、背景
1.1 物理机时代的运维痛点
-
部署周期长:每次配置新服务器需手动安装OS、配置环境,经常需要2-3天才能交付
-
故障恢复困难:硬件故障后,重建环境需重复之前的手工操作,无法保证环境一致性
-
资源利用率低:我司服务器平均CPU利用率只有15%-20%,大量资源闲置但无法共享
-
运维成本高:每10台服务器至少需要1名专职运维,人力成本居高不下
1.2 虚拟化技术带来的运维变革
-
模板化部署:使用VMware模板,服务器部署时间从天级缩短到小时级
-
快照与迁移:故障处理可通过快照回滚,服务迁移不再受物理硬件限制
-
资源隔离与调度:不同应用间实现资源隔离,资源池化管理提升利用率
-
降低硬件投入:通过整合工作负载,硬件采购成本降低约40%
虚拟机的主要问题是每个VM都需要独立OS,导致资源占用仍然较高。
1.3 容器化:运维工作的革命性变化
-
镜像一致性:解决了"我这边正常,线上环境出问题"的困扰
-
资源利用率提升:相同硬件上可部署的服务数量比VM提升3-5倍
-
秒级启停:服务启动从分钟级缩短到秒级,大幅提升故障转移速度
-
CI/CD友好:与Jenkins等工具结合,实现自动化部署流水线
二、K8S的介绍
2.1 K8S架构图的理解
主节点(MasterNode)组件:
-
API Server:作为集群控制平面的前端,处理所有API请求
-
Controller Manager:负责集群状态管理和控制循环
-
Scheduler:负责Pod调度决策
-
etcd:分布式键值存储,保存集群所有配置数据
工作节点(WorkerNode)组件:
-
Kubelet:确保容器按照PodSpec运行
-
Kubeproxy:维护网络规则,实现服务转发
-
Pod:最小部署单元,包含一组容器
工作流程:
- 运维人员通过kubectl向API Server发送命令
- API Server验证请求并存储到etcd
- Controller Manager检测到状态变化并创建资源
- Scheduler决定Pod应该调度到哪个节点
- Kubelet接收指令并创建Pod
- 从Docker Registry拉取镜像运行容器
- Kubeproxy设置网络规则
- 外部用户通过服务访问应用
2.2 K8S是什么?
Kubernetes(简称k8s)本质上是一个开源的容器编排平台。它源于Google内部使用多年的Borg系统,目的是帮助运维工程师自动化部署、扩展和管理容器化应用。
从运维角度看,k8s就像是一个超级"管家",它接管了我们原本需要手动完成的大量工作 - 从应用部署、扩缩容、故障恢复到资源管理等。它让我们可以将多台服务器作为一个统一的资源池来使用。
2.3 为什么需要Kubernetes?
- 应用部署自动化:在传统环境中,我们常常需要手动部署应用,而k8s可以通过声明式配置实现全自动化部署
- 弹性伸缩能力:可以根据负载情况自动扩展或缩减应用实例数量
- 故障自愈功能:当容器崩溃时,k8s会自动重启或重新调度容器
- 统一资源调度:将集群的计算资源视为一个整体,提高资源利用率
- 服务发现和负载均衡:内置服务发现机制,无需额外配置复杂的负载均衡器
2.4 K8S名词解释
- Deployment:Kubernetes中用于声明式管理Pod和ReplicaSet的资源对象(相当于一个自动化管理员,告诉系统"我需要运行什么"而不是"怎么运行")
- ReplicaSet:确保指定数量的Pod副本在任何时间运行的下一代控制器(像一个复印机,不断确保你要求的Pod数量始终存在)
- Replication Controller:确保Pod副本数量始终符合预期的资源对象(就是个监工,保证工人数量永远达标)
- Namespace:Kubernetes集群内的虚拟分区,将资源分组隔离(相当于小区里的不同单元楼,各管各的资源)
- Container:轻量级、可移植、自包含的软件执行环境(就像装货的集装箱,把应用和依赖打包在一起)
- Node:Kubernetes集群中的工作机器,可以是物理机或虚拟机(就是干活的服务器,提供计算能力的实体机器)
- Services:定义一组Pod及访问策略的抽象(像前台接待,统一接收外部请求并转发给内部工作的Pod)
- Labels:附加到对象上的键值对(就是给资源贴的标签,方便分类和筛选)
- Pods:Kubernetes中最小的可部署计算单元(应用的包装盒,装着一个或多个容器)
2.5 Kubernetes Pod控制器类型
- Deployment:管理无状态应用的控制器,支持滚动更新和回滚(相当于应用的自动驾驶仪,负责平稳地更新和维护应用)
- StatefulSet:管理有状态应用的控制器,为Pod提供持久存储和固定网络标识(像是有编号的员工,每个都有固定工位和个人储物柜)
- DaemonSet:确保集群内每个节点上都运行特定的Pod(像小区保安,每栋楼都要配一个)
- Job/CronJob:运行一次性或定时任务的控制器(Job像临时工,做完就走;CronJob像定时闹钟,按时执行特定任务)
- ReplicaSet:维护Pod副本数量的控制器(复印机操作员,保证文件副本数量准确)
- HorizontalPodAutoscaler:根据负载自动调整Pod数量(智能调度员,客流量大时自动增加服务窗口)
- ConfigMap/Secret:配置管理控制器(ConfigMap是公开菜单,Secret是保险箱里的机密配方)
2.6 deploylment、rs、pod之间的关系
- Pod:Kubernetes中最小的可部署计算单元,包含一个或多个容器(相当于装应用的容器盒子,里面装着你的应用程序)
- ReplicaSet(RS):确保指定数量的Pod副本在任何时间运行的控制器(像工厂的车间主管,负责保证工人数量)
- Deployment:提供声明式更新和管理ReplicaSet的更高级控制器(相当于工厂经理,负责整体生产计划和升级策略)
Deployment管理ReplicaSet,ReplicaSet管理Pod,是一种层级关系。
当你创建Deployment时,它会自动创建ReplicaSet,而ReplicaSet会创建和管理Pod。
当你需要更新应用时,Deployment会创建新的ReplicaSet并逐步将流量从旧ReplicaSet转移到新的ReplicaSet,实现滚动更新。
简单说:Deployment管理ReplicaSet,ReplicaSet管理Pod,形成了三层控制关系。
2.7 部署K8S前的环境准备
2.7.1 升级系统内核
见CentOS 7 RPM更新内核到5.4
2.7.2 部署规划
版本规划
软件 | 版本 |
---|---|
centos | 7.5 版本及以上 |
docker | 19.03 及以上 |
kubernetse | V1.20.5及以上 |
flanner | V0.13.0及以上 |
2.7.3 节点规划
Hostname | IP | 内核版本 |
---|---|---|
k8s-master-01 | 10.0.0.231 | 5.0 以上 |
k8s-node-01 | 10.0.0.232 | 5.0 以上 |
k8s-node-02 | 10.0.0.233 | 5.0 以上 |
2.7.4 修改主机名并解析DNS和主机
三台都操作
# 修改主机名
hostnamectl set-hostname k8s-master-01
hostnamectl set-hostname k8s-node-01
hostnamectl set-hostname k8s-node-02
# 解析主机
vim /etc/hosts
10.0.0.231 k8s-master-01 m1
10.0.0.232 k8s-node-01 n1
10.0.0.233 k8s-node-02 n2# 添加 DNS 解析
vim /etc/resolv.conf
nameserver 223.5.5.5
nameserver 114.114.114.114
2.7.5 系统优化
三台都操作
# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld# 关闭selinux
# 临时关闭Selinux
setenforce 0 # 永久关闭selinux
vim /etc/sysconfig/selinux
SELINUX=disabled # 将此处改为disabled# 清空iptables规则
iptables -F #禁用swap交换分区
# 打开自动挂载的配置文件,将swap配置项注释掉
sed -ri '/^[^#]*swap/s@^@#@' /etc/fstab
swapoff -a # 确认输出的swap行如下(都为0)
free -h# 免密登录,master操作
rm -rf /root/.ssh/
ssh-keygen # 一直回车
cd /root/.ssh/
ll
# 两个子节点创建目录并将master的公钥复制到两个子节点
# 232:
rm -rf /root/.ssh
mkdir -p /root/.ssh
# 233:
rm -rf /root/.ssh
mkdir -p /root/.ssh
ssh-copy-id root@10.0.0.232
ssh-copy-id root@10.0.0.233# 测试
ssh root@10.0.0.232
ssh root@10.0.0.233# 同步集群时间,三台都操作
# 安装同步时间工具
yum install chrony -y
# 配置
vim /etc/chrony.conf
# 注释掉默认的server开头
server ntp1.aliyun.com iburst
server time.neu.edu.cn iburst
server time.nist.gov iburst
# 手动强制同步时间,系统时间完全同步
chronyc makestep
# 启动
systemctl start chronyd
systemctl enable chronyd
systemctl status chronyd
# 检查
chronyc tracking# 集群时间同步
crontab -e
# Timing synchronization time
0 */1 * * * /usr/sbin/ntpdate ntp1.aliyun.com &>/dev/null
# 检查定时任务是否添加成功
crontab -l# 新系统软件(排除内核)
yum update -y --exclud=kernel*# 安装基础常用软件
yum install wget expect vim net-tools ntp bash-completion ipvsadm ipset jq iptables conntrack sysstat libseccomp -y# yum安装ipvs
yum install -y conntrack-tools ipvsadm ipset conntrack libseccomp# 创建并编辑 /etc/sysconfig/modules/ipvs.modules 文件
cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
# 定义 IPVS 所需的模块列表
ipvs_modules="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 nf_conntrack"# 遍历模块列表,检查模块是否已加载,未加载则加载模块
for kernel_module in \${ipvs_modules}; do/sbin/modinfo -F filename \${kernel_module} > /dev/null 2>&1if [ \$? -eq 0 ]; then/sbin/modprobe \${kernel_module}fi
done
EOF# 修改文件权限,使其可执行
chmod 755 /etc/sysconfig/modules/ipvs.modules# 执行脚本以加载 IPVS 模块
bash /etc/sysconfig/modules/ipvs.modules# 验证模块是否加载成功
lsmod | grep ip_vs# 创建并编辑 /etc/sysctl.d/k8s.conf 文件
cat > /etc/sysctl.d/k8s.conf << EOF
# 启用 IP 转发
net.ipv4.ip_forward = 1# 启用 bridge 网桥的 IP 表和 iptables 规则
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1# 允许在 umount 时强制分离挂载点
fs.may_detach_mounts = 1# 允许虚拟内存超过物理内存
vm.overcommit_memory=1# 禁用 OOM(Out of Memory)杀手
vm.panic_on_oom=0# 增加用户观察文件描述符的数量
fs.inotify.max_user_watches=89100# 增加文件描述符的最大数量
fs.file-max=52706963# 增加打开文件的数量
fs.nr_open=52706963# 设置 TCP 连接的 keepalive 时间
net.ipv4.tcp_keepalive_time = 600# 启用 TCP 时间戳重用
net.ipv4.tcp_tw_reuse = 1# 设置 TCP 最大孤儿套接字数
net.ipv4.tcp_max_orphans = 327680# 设置 TCP 孤儿重传次数
net.ipv4.tcp_orphan_retries = 3# 启用 TCP 同步 cookie
net.ipv4.tcp_syncookies = 1# 设置 TCP 最大 SYN 背压日志数
net.ipv4.tcp_max_syn_backlog = 16384# 设置 IP 连接跟踪最大数量
net.ipv4.ip_conntrack_max = 65536# 设置 TCP 最大 SYN 背压日志数
net.ipv4.tcp_max_syn_backlog = 16384# 禁用 TCP 时间戳
net.ipv4.tcp_timestamps = 0# 设置核心文件的最大数量
net.core.somaxconn = 16384
EOF# 立即应用 sysctl 配置
sysctl --system
2.7.6 安装Docker
# 1) 卸载之前的 docker
# 卸载所有旧版本的 Docker 包
yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine -y# 2) 安装 docker 所需安装包
# 安装 yum-utils 和其他一些必要的包
yum install -y yum-utils \device-mapper-persistent-data \lvm2# 3) 安装 docker yum 源
# 安装依赖,下载 repo 文件,并把软件仓库地址替换为镜像站
yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo# 替换为清华的镜像
sed -i 's+https://download.docker.com+https://mirrors.tuna.tsinghua.edu.cn/docker-ce+' /etc/yum.repos.d/docker-ce.repo# 或者直接使用阿里云下载docker-ce镜像
wget -P /etc/yum.repos.d/ https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo# 清理缓存
yum clean all
yum makecache# 安装docker
yum install docker-ce -y# 开启以及自启查看docker相关服务
systemctl enable --now docker.service
systemctl status docker
rpm -qa | grep docker# 查看版本
docker version# 查看docker信息
docker info# 优化docker配置
vim /etc/docker/daemon.json
{"registry-mirrors": ["https://docker.1ms.run"]
}
# 重新加载配置并重启
systemctl daemon-reload
systemctl restart docker
systemctl status docker
docker info
2.8 K8S安装
2.8.1 安装 kubenetes yum 源
三台都操作
# 创建并编辑 /etc/yum.repos.d/kubernetes.repo 文件
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
# 指定 Kubernetes 软件包的仓库地址
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
# 禁用 GPG 检查
repo_gpgcheck=0
# 指定 GPG 密钥地址,用于验证软件包的签名
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF# 安装 kubelet、kubeadm 和 kubectl
# 查看可用版本
yum list --showduplicates kubeadm --disableexcludes=kubernetes# 安装特定版本
yum install -y kubelet-1.20.9 kubeadm-1.20.9 kubectl-1.20.9 --disableexcludes=kubernetes###############################################################################################
关于--disableexcludes=kubernetes参数
--disableexcludes=kubernetes参数是在使用yum安装Kubernetes组件时使用的一个重要选项,它的作用是:
禁用kubernetes软件源的排除列表
确保安装完整的kubernetes所需依赖,不会因为排除规则而跳过某些包
避免因依赖问题导致的安装失败或功能缺失
如果不使用该参数可能会导致:
部分依赖包被忽略安装
集群组件之间出现版本不兼容问题
系统自动更新时可能会更新到不兼容的版本
################################################################################################ 启动 kubelet 服务,并设置为开机自启
systemctl enable --now kubelet
systemctl status kubelet
2.8.2 主节点操作(Master操作)
- apiserver-advertise-address:apiserver监听地址
- control-plane-endpoint:控制平面的IP地址或DNS名称
- image-repository:镜像仓库,此处为国内阿里云镜像仓库加速下载
- service-cidr:为Service分配的IP地址段
- pod-network-cidr:为pod分配的IP地址段
# 初始化 master 节点(仅在master 节点上执行)
kubeadm init \
--image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \
--kubernetes-version=v1.20.9 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16
# 注释
############################################################################################
# 初始化 Kubernetes 主节点
kubeadm init \
# 指定从阿里云镜像仓库拉取所需镜像
--image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \
--kubernetes-version=v1.20.9 \ # 指定要安装的 Kubernetes 版本
--service-cidr=10.96.0.0/12 \ # 指定 Service 的 CIDR 网段,默认为 10.96.0.0/12
# 指定 Pod 的 CIDR 网段,与后续 CNI 插件配置相关,Flannel 通常使用 10.244.0.0/16
--pod-network-cidr=10.244.0.0/16
########################################################################################################################################################################################
# 成功显示:
Your Kubernetes control-plane has initialized successfully!To start using your cluster, you need to run the following as a regular user:mkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/configAlternatively, if you are the root user, you can run:export KUBECONFIG=/etc/kubernetes/admin.confYou 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.231:6443 --token 2c7dd0.ou672s7d8ltnw0wx \--discovery-token-ca-cert-hash sha256:601d4080331af07278deb66121aa5f8414276edd40a816e79d97cfe5eecfd9d9
############################################################################################# 初始化过程下载的容器镜像
[root@k8s-master-01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy v1.20.9 8dbf9a6aa186 3 years ago 99.7MB
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver v1.20.9 0d0d57e4f64c 3 years ago 122MB
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager v1.20.9 eb07fd4ad3b4 3 years ago 116MB
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler v1.20.9 295014c114b3 3 years ago 47.3MB
registry.cn-hangzhou.aliyuncs.com/google_containers/etcd 3.4.13-0 0369cf4303ff 4 years ago 253MB
registry.cn-hangzhou.aliyuncs.com/google_containers/coredns 1.7.0 bfe3a36ebd25 4 years ago 45.2MB
registry.cn-hangzhou.aliyuncs.com/google_containers/pause 3.2 80d28bedfe5d 5 years ago 683kB# 建立用户集群权限
## 非root用户运行kubectl,请执行以下命令
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config# 如果是root用户,则可以使用:
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
source ~/.bash_profile# 安装集群网络插件
wget https://ghfast.top/https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
kubectl apply -f kube-flannel.yml# 将worker节点假如集群
####### 两个工作节点(232、233)操作
kubeadm join 10.0.0.231:6443 --token 2c7dd0.ou672s7d8ltnw0wx \--discovery-token-ca-cert-hash sha256:601d4080331af07278deb66121aa5f8414276edd40a816e79d97cfe5eecfd9d9 # 检查集群状态,master操作
## 第一种方式
kubectl get pods
## 第二种方式
kubectl get pods -n kube-system# 此过程需要等上一两分钟
[root@k8s-master-01 ~]# kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-54d67798b7-6qk8l 1/1 Running 0 33m
coredns-54d67798b7-qxxff 1/1 Running 0 33m
etcd-k8s-master-01 1/1 Running 0 33m
kube-apiserver-k8s-master-01 1/1 Running 0 33m
kube-controller-manager-k8s-master-01 1/1 Running 0 33m
kube-proxy-2gpsd 1/1 Running 0 7m4s
kube-proxy-b7wlb 1/1 Running 0 7m4s
kube-proxy-shwgp 1/1 Running 0 33m
kube-scheduler-k8s-master-01 1/1 Running 0 33m
2.8.3 kube-flannel文件详解
官方文件解释
# Flannel网络插件部署配置文件
# 该文件用于在Kubernetes集群中部署Flannel网络解决方案
# Flannel是一个简单高效的容器网络解决方案,为Kubernetes提供容器间通信---
# 创建专用命名空间
# 命名空间用于隔离资源,这里创建kube-flannel命名空间来部署所有Flannel相关资源
kind: Namespace
apiVersion: v1
metadata:name: kube-flannel # 命名空间名称为kube-flannellabels:k8s-app: flannel # 添加标签,用于资源筛选和识别pod-security.kubernetes.io/enforce: privileged # 设置安全策略为特权模式,因为网络插件需要较高权限---
# 创建集群角色(ClusterRole)
# 集群角色定义了Flannel在集群范围内所需的权限
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:labels:k8s-app: flannel # 标签,用于标识这是Flannel的资源name: flannel # 角色名称为flannel
rules: # 权限规则定义
- apiGroups: # API组- "" # 空字符串表示核心API组resources:- pods # 允许访问pods资源verbs:- get # 允许获取pod信息的操作
- apiGroups:- ""resources:- nodes # 允许访问节点资源verbs:- get # 允许获取节点信息- list # 允许列出节点- watch # 允许监视节点变化
- apiGroups:- ""resources:- nodes/status # 允许访问节点状态verbs:- patch # 允许修补(更新)节点状态---
# 创建集群角色绑定(ClusterRoleBinding)
# 将上面创建的集群角色与服务账户绑定,赋予服务账户相应权限
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:labels:k8s-app: flannel # 标签name: flannel # 角色绑定名称
roleRef: # 角色引用,指定要绑定的角色apiGroup: rbac.authorization.k8s.iokind: ClusterRole # 类型为集群角色name: flannel # 引用名为flannel的集群角色
subjects: # 主体,指定角色绑定的对象
- kind: ServiceAccount # 类型为服务账户name: flannel # 服务账户名称为flannelnamespace: kube-flannel # 服务账户所在的命名空间---
# 创建服务账户(ServiceAccount)
# 服务账户用于Pod的身份认证和授权
apiVersion: v1
kind: ServiceAccount
metadata:labels:k8s-app: flannel # 标签name: flannel # 服务账户名称namespace: kube-flannel # 所在命名空间---
# 创建配置映射(ConfigMap)
# 配置映射用于存储Flannel的配置信息,可以被Pod挂载使用
kind: ConfigMap
apiVersion: v1
metadata:name: kube-flannel-cfg # 配置映射名称namespace: kube-flannel # 所在命名空间labels:tier: node # 标签,表明这是节点层级的资源k8s-app: flannelapp: flannel
data: # 配置数据cni-conf.json: | # CNI插件的配置文件{"name": "cbr0", # 网桥名称"cniVersion": "0.3.1", # CNI版本"plugins": [ # 插件列表{"type": "flannel", # 使用flannel插件"delegate": { # 委托配置"hairpinMode": true, # 启用发夹模式,允许容器访问自己暴露的服务"isDefaultGateway": true # 将flannel设置为默认网关}},{"type": "portmap", # 使用portmap插件,用于端口映射"capabilities": {"portMappings": true # 启用端口映射功能}}]}net-conf.json: | # Flannel网络配置{"Network": "10.244.0.0/16", # Pod网络的CIDR,定义可用IP范围"EnableNFTables": false, # 禁用NFTables,使用iptables"Backend": { # 后端配置"Type": "vxlan" # 使用VXLAN作为封装技术}}---
# 创建守护进程集(DaemonSet)
# 守护进程集确保所有(或部分)节点运行一个Pod副本,适合网络插件这类需要在每个节点运行的应用
apiVersion: apps/v1
kind: DaemonSet
metadata:name: kube-flannel-ds # 守护进程集名称namespace: kube-flannel # 所在命名空间labels:tier: node # 标签app: flannelk8s-app: flannel
spec:selector: # 选择器,用于选择要管理的PodmatchLabels:app: flanneltemplate: # Pod模板metadata:labels:tier: nodeapp: flannelspec:affinity: # 亲和性设置nodeAffinity: # 节点亲和性requiredDuringSchedulingIgnoredDuringExecution: # 调度时必须满足,运行时可忽略nodeSelectorTerms: # 节点选择条件- matchExpressions: # 匹配表达式- key: kubernetes.io/os # 键为操作系统类型operator: In # 操作符为"在...之中"values:- linux # 值为linux,表示只在Linux节点上运行hostNetwork: true # 使用主机网络priorityClassName: system-node-critical # 优先级为系统节点关键,确保优先调度和不被驱逐tolerations: # 容忍设置- operator: Exists # 存在操作符,表示容忍所有污点effect: NoSchedule # 效果为不调度,表示可以在设置了NoSchedule污点的节点上运行serviceAccountName: flannel # 使用的服务账户名称initContainers: # 初始化容器- name: install-cni-plugin # 安装CNI插件的容器image: ghcr.io/flannel-io/flannel-cni-plugin:v1.6.2-flannel1 # 使用的镜像command: # 执行的命令- cp # 复制命令args: # 命令参数- -f # 强制复制- /flannel # 源文件- /opt/cni/bin/flannel # 目标位置,CNI插件目录volumeMounts: # 卷挂载- name: cni-plugin # 挂载名为cni-plugin的卷mountPath: /opt/cni/bin # 挂载路径- name: install-cni # 安装CNI配置的容器image: ghcr.io/flannel-io/flannel:v0.26.7 # 使用的镜像command:- cpargs:- -f- /etc/kube-flannel/cni-conf.json # 源配置文件- /etc/cni/net.d/10-flannel.conflist # 目标位置,CNI配置目录volumeMounts:- name: cni # 挂载名为cni的卷mountPath: /etc/cni/net.d # 挂载路径- name: flannel-cfg # 挂载名为flannel-cfg的卷mountPath: /etc/kube-flannel/ # 挂载路径containers: # 主容器- name: kube-flannel # Flannel主容器image: ghcr.io/flannel-io/flannel:v0.26.7 # 使用的镜像command:- /opt/bin/flanneld # 执行flanneld守护进程args:- --ip-masq # 启用IP伪装- --kube-subnet-mgr # 使用Kubernetes子网管理器resources: # 资源请求requests:cpu: "100m" # 请求0.1核CPUmemory: "50Mi" # 请求50MB内存securityContext: # 安全上下文privileged: false # 不使用特权模式capabilities: # 容器能力add: ["NET_ADMIN", "NET_RAW"] # 添加网络管理和原始网络包处理能力env: # 环境变量- name: POD_NAME # Pod名称valueFrom:fieldRef:fieldPath: metadata.name # 从Pod元数据中获取名称- name: POD_NAMESPACE # Pod命名空间valueFrom:fieldRef:fieldPath: metadata.namespace # 从Pod元数据中获取命名空间- name: EVENT_QUEUE_DEPTHvalue: "5000" # 事件队列深度设置为5000volumeMounts: # 卷挂载- name: runmountPath: /run/flannel # 挂载运行目录- name: flannel-cfgmountPath: /etc/kube-flannel/ # 挂载配置目录- name: xtables-lockmountPath: /run/xtables.lock # 挂载xtables锁文件volumes: # 卷定义- name: run # 运行卷hostPath: # 主机路径path: /run/flannel # 主机上的路径- name: cni-plugin # CNI插件卷hostPath:path: /opt/cni/bin # 主机上的CNI插件目录- name: cni # CNI配置卷hostPath:path: /etc/cni/net.d # 主机上的CNI配置目录- name: flannel-cfg # Flannel配置卷configMap:name: kube-flannel-cfg # 使用名为kube-flannel-cfg的配置映射- name: xtables-lock # xtables锁卷hostPath:path: /run/xtables.lock # 主机上的xtables锁文件路径type: FileOrCreate # 类型为文件或创建