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

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:最小部署单元,包含一组容器

工作流程:

  1. 运维人员通过kubectl向API Server发送命令
  2. API Server验证请求并存储到etcd
  3. Controller Manager检测到状态变化并创建资源
  4. Scheduler决定Pod应该调度到哪个节点
  5. Kubelet接收指令并创建Pod
  6. 从Docker Registry拉取镜像运行容器
  7. Kubeproxy设置网络规则
  8. 外部用户通过服务访问应用

2.2 K8S是什么?

Kubernetes(简称k8s)本质上是一个开源的容器编排平台。它源于Google内部使用多年的Borg系统,目的是帮助运维工程师自动化部署、扩展和管理容器化应用。

从运维角度看,k8s就像是一个超级"管家",它接管了我们原本需要手动完成的大量工作 - 从应用部署、扩缩容、故障恢复到资源管理等。它让我们可以将多台服务器作为一个统一的资源池来使用。

2.3 为什么需要Kubernetes?

  1. 应用部署自动化:在传统环境中,我们常常需要手动部署应用,而k8s可以通过声明式配置实现全自动化部署
  2. 弹性伸缩能力:可以根据负载情况自动扩展或缩减应用实例数量
  3. 故障自愈功能:当容器崩溃时,k8s会自动重启或重新调度容器
  4. 统一资源调度:将集群的计算资源视为一个整体,提高资源利用率
  5. 服务发现和负载均衡:内置服务发现机制,无需额外配置复杂的负载均衡器

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 部署规划

版本规划

软件版本
centos7.5 版本及以上
docker19.03 及以上
kubernetseV1.20.5及以上
flannerV0.13.0及以上

2.7.3 节点规划

HostnameIP内核版本
k8s-master-0110.0.0.2315.0 以上
k8s-node-0110.0.0.2325.0 以上
k8s-node-0210.0.0.2335.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  # 类型为文件或创建
http://www.xdnf.cn/news/2798.html

相关文章:

  • shell(3)
  • windows中无法关闭mysql57服务
  • 深度学习近十年的汇总
  • 复习Vue136~180
  • HarmonyOS SDK助力鸿蒙版今日水印相机,真实地址防护再升级
  • n 卡编码
  • 高级java每日一道面试题-2025年4月28日-基础篇[反射篇]-反射操作中,`invoke()`方法的作用是什么?
  • 基于【低代码+AI智能体】开发智能考试系统
  • Python-Part2-集合、字典与推导式
  • 基于docker部署mssqlserver : mcr.microsoft.com/mssqlserver:2022-latest
  • 第十八节:开放性问题-Vue生态未来趋势
  • kubernetes常用命令 k8s指令大全
  • 【205】Python3 实现整数和IP地址字符串互相转换
  • 【读书笔记】机器行为与具身智能
  • pywinauto操作Windows应用
  • VUE3:封装一个评论回复组件
  • 【环境配置】Mac电脑安装运行R语言教程 2025年
  • 如何评价 DeepSeek 的 DeepSeek-V3 模型?
  • 【优选算法 | 二分查找】二分查找算法解析:如何通过二段性优化搜索效率
  • Python项目-支持自然语言处理
  • Docker和K8s面试题
  • Nacos 3.0 上线 MCP Registry,支持 MCP 服务注册到发现全流程管理
  • 从零开始学习车联网相关知识-学习计划
  • YUM/DNF管理工具
  • 蓝桥杯2025年第十六届省赛真题-可分解的正整数
  • 使用Optional优雅处理Null检查
  • 赋能航天教育:高校卫星仿真教学实验平台解决方案
  • Github两种鉴权模式PAT与SSH
  • CMU-15445(1)——环境搭建
  • python上测试neo4j库