Kubernetes 基础与部署

Kubernetes 介绍

Kubernetes是什么

  • Kubernetes是Google在2014年开源的一个容器集群管理系统,Kubernetes简称K8S。
  • K8S用于容器化应用程序的部署,扩展和管理。
  • K8S提供了容器编排,资源调度,弹性伸缩,部署管理,服务发现等一系列功能。
  • Kubernetes目标是让部署容器化应用简单高效。

官方网站:http://www.kubernetes.io

Kubernetes的特性

  • 自我修复
    • 在节点故障时重新启动失败的容器,替换和重新部署,保证预期的副本数量;杀死健康检查失败的容器,并且在未准备好之前不会处理客户端请求,确保线上服务不中断。
  • 弹性伸缩
    • 使用命令、UI或者基于CPU使用情况自动快速扩容和缩容应用程序实例,保证应用业务高峰并发时的高可用性;业务低峰时回收资源,以最小成本运行服务。
  • 自动部署和回滚
    • K8S采用滚动更新策略更新应用,一次更新一个Pod,而不是同时删除所有Pod,如果更新过程中出现问题,将回滚更改,确保升级不受影响业务。
  • 服务发现和负载均衡
    • K8S为多个容器提供一个统一访问入口(内部IP地址和一个DNS名称),并且负载均衡关联的所有容器,使得用户无需考虑容器IP问题。
  • 机密和配置管
    • 理管理机密数据和应用程序配置,而不需要把敏感数据暴露在镜像里,提高敏感数据安全性。并可以将一些常用的配置存储在K8S中,方便应用程序使用。
  • 存储编排
    • 挂载外部存储系统,无论是来自本地存储,公有云(如AWS),还是网络存储(如NFS、GlusterFS、Ceph)都作为集群资源的一部分使用,极大提高存储使用灵活性。
  • 批处理
    • 供一次性任务,定时任务;满足批量数据处理和分析的场景。

Kubernetes 集群架构与组建

image-20250725160046797

image-20250725162134788

Kubernetes组件

Master组件
  • kube-apiserver
    • Kubernetes API,集群的统一入口,各组件协调者,以 RESTful API 提供接口 服务,所有对象资源的增删改查和监听操作都交给APIServer 处理后再提交给 Etcd 存储。
  • kube-controller-manager
    • 处理集群中常规后台任务,一个资源对应一个控制器,而 ControllerManager 就是负责管理这些控制器的。
  • kube-scheduler
    • 根据调度算法为新创建的 Pod 选择一个 Node 节点,可以任意部署,可以部署在 同一个节点上,也可以部署在不同的节点上。
  • etcd
    • 分布式键值存储系统。用于保存集群状态数据,比如 Pod、Service 等对象信息。
Node组件
  • kubelet
    • kubelet 是 Master 在 Node 节点上的 Agent,管理本机运行容器的生命周期,比如创建容器、Pod 挂载数据卷、下载 secret、获取容器和节点状态等工作。kubelet 将每 个 Pod 转换成一组容器。
  • kube-proxy
    • 在 Node 节点上实现 Pod 网络代理,维护网络规则和四层负载均衡工作。
  • docker或rocket
    • 容器引擎,运行容器。

Kubernetes核心概念

image-20250725162756171

单元作用

  • Pod

    • 最小部署单元
    • 一组容器的集合
    • 一个Pod中的容器共享网络命名空间
    • Pod是短暂的
  • Controllers

    • ReplicaSet:确保预期的Pod副本数量

    • Deployments:无状态应用部署

    • StatefulSet:有状态应用部署

    • DaemonSet:确保所有Node运行同一个Pod

    • Job:一次性任务

    • Cronjob:定时任务

      更高级层次对象,部署和管理Pod

  • Service

    • 防止Pod失联
    • 定义一组Pod的访问策略
  • Label

    • 标签,附加到某个资源上,用于关联对象、查询和筛选
  • Namespaces

    • 命名空间,将对象逻辑上隔离
  • Annotations

    • 注释

Kubeadm-docker 环境部署

前置环境部署

主机配置

没有特殊说明所有操作均需要在所有节点执行

配置主机名及域名解析
CPU 内存 硬盘 IP 主机名 软件
4核 4G 200G 10.1.8.100 master docker
4核 4G 200G 10.1.8.101 node1 docker
4核 4G 200G 10.1.8.102 node2 docker
# 配置主机名
[root@master ~]# hostnamectl set-hostname master
[root@node1 ~]# hostnamectl set-hostname node1
[root@node2 ~]# hostnamectl set-hostname node2

# 所有节点配置域名解析
[root@master ~]# cat /etc/hosts
10.1.8.100 master
10.1.8.101 node1
10.1.8.102 node2
[root@master ~]# for i in {101..102};do scp /etc/hosts root@10.1.8.$i:/etc/hosts;done


安装环境依赖包
# 所有节点安装环境依赖包
[root@master ~]# yum -y install vim lrzsz unzip wget net-tools tree bash-completion conntrack ntpdate ntp ipvsadm ipset iptables curl sysstat libseccomp git psmisc telnet unzip gcc gcc-c++ make
类别 软件包 核心功能
文件操作 vim,lrzsz,unzip 编辑/上传下载/解压ZIP
网络管理 net-tools,ipvsadm 网络配置/IPVS 负载均衡
系统监控 sysstat,psmisc 性能监控/进程管理
开发编译 gcc,make 代理编译/自动化构建
安全防护 iptables,libseccomp 防护后墙/容器系统调用限制
关闭系统防护
# 所有节点关闭防火墙和内核安全机制
[root@master ~]# systemctl disable firewalld --now
[root@master ~]# sed -i 's/enforcing/disabled/g' /etc/selinux/config
[root@master ~]# setenforce 0


# 关闭swap
# 启用swap分区会对系统的性能产生非常负面的影响,因此kubernetes要求每个节点都要禁用swap分区
[root@master ~]# cat /etc/fstab
#UUID=fc66384c-bb89-4fa4-977a-5f6f13df7e0e swap                    swap    defaults        0 0
[root@master ~]# swapoff -a

# 关闭NetworkManager
[root@master ~]# systemctl disable NetworkManager --now


调整系统内核参数
# 调整系统内核参数
[root@master ~]# cat >> /etc/sysctl.d/kubernetes.conf << EOF
# 开启Linux内核的网络桥接功能,同时启用iptables和ip6tables的网络包过滤功能,用于在网络桥接时进行网络包过滤
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
# 开启路由转发,转发IPv4的数据包
net.ipv4.ip_forward=1
# 尽可能避免使用交换分区,提升k8s性能
vm.swappiness=0
# 不检查物理内存是否够用
vm.overcommit_memory=1
# 使配置立即生效
EOF
[root@master ~]# sysctl --system



# 调整Linux资源限制(可选)
# 设置一个进程可以打开的最大文件句柄数
[root@master ~]# ulimit -SHn 65535
# 在Linux系统中,默认情况下一个进程可以打开的最大文件句柄数是1024
[root@master ~]# cat >> /etc/security/limits.conf <<EOF
# 为所有用户设置文件描述符软限制
* soft nofile 655360
# 为所有用户设置文件描述符硬限制
* hard nofile 131072
# 为所有用户设置进程数软限制
* soft nproc 655350
# 为所有用户设置进程数硬限制
* hard nproc 655350
# 为所有用户设置内存锁定软限制为无限制
* soft memlock unlimited
# 为所有用户设置内存锁定硬限制为无限制
* hard memlock unlimited
EOF
配置时间同步
[root@master ~]# yum -y install chrony
[root@master ~]# systemctl restart chronyd
# 列出 Chrony 守护进程当前配置和使用的
[root@master ~]# chronyc sources -v
# 将硬件时钟的时间同步到系统时钟
[root@master ~]# hwclock -s 
配置IPVS功能
[root@master ~]# cat >> /etc/modules-load.d/ipvs.conf <<EOF
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack_ipv4
ip_tables
ip_set
xt_set
ipt_set
ipt_rpfilter
ipt_REJECT
ipip
overlay
br_netfilter
EOF

# 重启服务
[root@master ~]# systemctl restart systemd-modules-load
# 查看内核模块
[root@master ~]# lsmod | grep -e ip_vs -e nf_conntrack_ipv4
ip_vs_sh               12688  0 
ip_vs_wrr              12697  0 
ip_vs_rr               12600  0 
ip_vs                 141092  6 ip_vs_rr,ip_vs_sh,ip_vs_wrr
nf_conntrack_ipv4      15053  2 
nf_defrag_ipv4         12729  1 nf_conntrack_ipv4
nf_conntrack          133387  6 ip_vs,nf_nat,nf_nat_ipv4,xt_conntrack,nf_nat_masquerade_ipv4,nf_conntrack_ipv4
libcrc32c              12644  4 xfs,ip_vs,nf_nat,nf_conntrack
  • IPVS 核心模块
    • ip_vs :IPVS 负载均衡基础模块
    • ip_vs_rr :轮询(Round Robin)调度算法
    • ip_vs_wrr :加权轮询(Weighted RR)调度算
    • ip_vs_sh :源地址哈希(Source Hashing)调度算法
  • 网络连接与过滤
    • nf_conntrack_ipv4 :IPv4 连接跟踪(NAT/防火墙依赖,新内核中内核版本 ≥4.19 时合并至 nf_conntrack )
    • ip_tables :iptables 基础框架
    • ipt_REJECT :实现数据包拒绝(REJECT 动作)
  • IP集合管理
    • ip_set :IP 地址集合管理
    • xt_set & ipt_set :iptables 与 IP 集合的扩展匹配
  • 网络隧道与桥接
    • ipip :IP-over-IP 隧道协议
    • overlay :Overlay 网络支持(如 Docker 跨主机网络)
    • br_netfilter :桥接网络流量过滤(需配合 net.bridge.bridge-nf-call-iptables=1 参数)
  • 反向路径过滤
    • ipt_rpfilter :反向路径验证(防 IP 欺骗)

典型应用场景

  • Kubernetes 节点初始化:IPVS 模式 kube-proxy 依赖这些模
  • 负载均衡服务器:启用 IPVS 调度算法
  • 容器网络配置:Overlay 和桥接模块支持
Docker-ce 环境
前置环境部署

说明:

  • yum-utils 提供了 yum-config-manager
  • device mapper 存储驱动程序需要 device-mapper-persistent-data 和 lvm2
  • Device Mapper 是 Linux2.6 内核中支持逻辑卷管理的通用设备映射机制,它为实现用于存储资源管理的块设备驱动提供了一个高度模块化的内核架构。
# 基础环境安装
[root@master ~]# yum install -y yum-utils device-mapper-persistent-data lvm2


安装 docker
# 安装docker
# 使用阿里云镜像
[root@node3 ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 安装docker-ce
[root@master ~]# yum install -y docker-ce
# 启动服务
[root@master ~]# systemctl enable --now docker
配置镜像加速及cgroup
# 配置镜像加速及cgroup
# exec-opts:修改 cgroup 方式,使 cri-docker 可以通过 systemd 调用docker
[root@master ~]# cat > /etc/docker/daemon.json << EOF
{
"registry-mirrors": [
"https://05vz3np5.mirror.aliyuncs.com",
"https://do.nark.eu.org",
"https://dc.j8.work",
"https://docker.m.daocloud.io",
"https://dockerproxy.com",
"https://docker.mirrors.ustc.edu.cn",
"https://docker.nju.edu.cn",
"https://registry.docker-cn.com",
"https://hub-mirror.c.163.com",
"https://hub.uuuadc.top",
"https://docker.anyhub.us.kg",
"https://dockerhub.jobcher.com",
"https://dockerhub.icu",
"https://docker.ckyl.me",
"https://docker.awsl9527.cn",
"https://mirror.baidubce.com",
"https://docker.1panel.live"
],
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
# 重启服务
[root@master ~]# systemctl daemon-reload
[root@master ~]# systemctl restart docker
配置防火墙
# 增强安全功能临时关闭
[root@master ~]# setenforce 0
# 增强安全功能永久关闭
[root@master ~]# vim /etc/selinux/config
SELINUX=disabled
# 防火墙转发规则清空
[root@master ~]# iptables -F
# 防火墙NAT规则清空
[root@master ~]# iptables -t nat -F
Cri-Docker 环境

作用:cri-dockerd 的主要作用是为 Docker Engine 提供一个符合Kubernetes CRI(ContainerRuntime Interface)标准的接口,使 Docker 能继续作 Kubernetes 的容器运行时(ContainerRuntime),尤其是在 Kubernetes1.24版本后,官方移除对原生 Docker 支持(dockershim)之后。

  • github项目地址

image-20250728114404165

image-20250728114428504

# 使用linux下载
[root@master ~]# wget https://github.com/mirantis/cridockerd/releases/download/v0.3.4/cri-dockerd-0.3.4-3.e17.x86_64.rpm
# 安装 rpm 包
[root@master ~]# rpm -ivh cri-dockerd-0.3.4-3.el7.x86_64.rpm


# 编辑服务配置文件
# 编辑第10行,中间添加 --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9
[root@master ~]# cat /usr/lib/systemd/system/cri-docker.service
ExecStart=/usr/bin/cri-dockerd --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9 --container-runtime-endpoint fd://

# 启动服务
[root@master ~]# systemctl daemon-reload
[root@master ~]# systemctl enable cri-docker.service --now

Kubernetes 集群部署

没有特殊说明所有操作均需要在所有节点执行

软件安装
Yum源安装
[root@master ~]# cat > /etc/yum.repos.d/kubernetes.repo <<EOF
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gp
EOF
软件安装
# 查看可安装的版本
[root@master ~]# yum list kubeadm.x86_64 --showduplicates | sort -r

# 安装1.28版本
[root@master ~]# yum install -y kubeadm-1.28.0-0 kubelet-1.28.0-0 kubectl-1.28.0-0
kubelet配置

强制指定 kubelet 使用 systemd 作为 cgroup 驱动,确保与 Docker 或其他容器运行时保持一致将 kube-proxy 的代理模式设置为 ipvs ,替代默认的 iptables ,提升大规模集群的网络性能

# 设置配置文件
# KUBELET_EXTRA_ARGS="--cgroup-driver=systemd":强制使用cgroup启动方式为systemd
# KUBE_PROXY_MODE="ipvs":代理模式为ipvs
[root@master ~]# cat > /etc/sysconfig/kubelet << EOF
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"
EOF
# 没有产生对应文件,先设置开机自启动,不要开启服务
[root@master ~]# systemctl daemon-reload
[root@master ~]# systemctl enable kubelet.service
集群初始化
  • 注意:只在master节点操作
# 查看可使用镜像
# --kubernetes-version:指定版本
# --image-repository=registry.aliyuncs.com/goole_container:指定仓库
[root@master ~]# kubeadm config images list --kubernetes-version=v1.28.0 --image-repository=registry.aliyuncs.com/goole_container
registry.aliyuncs.com/goole_container/kube-apiserver:v1.28.0
registry.aliyuncs.com/goole_container/kube-controller-manager:v1.28.0
registry.aliyuncs.com/goole_container/kube-scheduler:v1.28.0
registry.aliyuncs.com/goole_container/kube-proxy:v1.28.0
registry.aliyuncs.com/goole_container/pause:3.9
registry.aliyuncs.com/goole_container/etcd:3.5.9-0
registry.aliyuncs.com/goole_container/coredns:v1.10.1

# 下载镜像
# --cri-socket:指定运行时
# --kubernetes-version:指定版本
# --image-repository:指定仓库
[root@master ~]# kubeadm config images pull --cri-socket=unix:///var/run/cri-dockerd.sock --kubernetes-version=v1.28.0 --image-repository=registry.aliyuncs.com/google_containers

# 查看已下载的镜像
[root@master ~]# docker images
REPOSITORY                                                        TAG       IMAGE ID       CREATED         SIZE
registry.aliyuncs.com/google_containers/kube-apiserver            v1.28.0   bb5e0dde9054   23 months ago   126MB
registry.aliyuncs.com/google_containers/kube-controller-manager   v1.28.0   4be79c38a4ba   23 months ago   122MB
registry.aliyuncs.com/google_containers/kube-scheduler            v1.28.0   f6f496300a2a   23 months ago   60.1MB
registry.aliyuncs.com/google_containers/kube-proxy                v1.28.0   ea1030da44aa   23 months ago   73.1MB
registry.aliyuncs.com/google_containers/etcd                      3.5.9-0   73deb9a3f702   2 years ago     294MB
registry.aliyuncs.com/google_containers/coredns                   v1.10.1   ead0a4a53df8   2 years ago     53.6MB
registry.aliyuncs.com/google_containers/pause                     3.9       e6f181688397   2 years ago     744kB


方式一:使用命令创建初始化集群配置文件(推荐)

# 生成初始化配置文件模版
[root@master ~]# kubeadm config print init-defaults > kubeadm-init.yaml
# 修改初始化配置文件
[root@master ~]# cat kubeadm-init.yaml
apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups: 
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  # 生命周期
  ttl: 24h0m0s 
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
# 指定本地的节点
  advertiseAddress: 10.1.8.100
# 指定监听端口
  bindPort: 6443
nodeRegistration:
# 指定运行时
  criSocket: unix:///var/run/cri-dockerd.sock
# 镜像拉取策略
  imagePullPolicy: IfNotPresent
# 改为主机名
  name: master
# 污点设置,不在 master 上创建资源,NoSchedule:不进行调度
  taints: 
  - effect: NoSchedule
    key: node-role.kubernetes.io/control-plane
---
apiServer:
  timeoutForControlPlane: 4m0s
# api 版本
apiVersion: kubeadm.k8s.io/v1beta3
# 证书
certificatesDir: /etc/kubernetes/pki
# 集群名称
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
  local:
    dataDir: /var/lib/etcd
# 指定镜像仓库
imageRepository: registry.aliyuncs.com/google_containers
# 指定类型
kind: ClusterConfiguration
# 指定 k8s 版本
kubernetesVersion: 1.28.0
networking:
  dnsDomain: cluster.local
# 指定 service 网段
  serviceSubnet: 10.96.0.0/12
# 指定pod网段
  podSubnet: 10.244.0.0/16
# 创建资源
scheduler: {} 
---
# 创建 ipvs 资源,做负载均衡
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs
---
# 创建 systemd 资源,使kubelet cgroup驱动为systemd
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd

# 初始化完成指定配置文件,上传证书并生成日志文件
[root@master ~]# kubeadm init --config=kubeadm-init.yaml --upload-certs | tee kubeadm-init.log





# 如果出错需要把前面的步骤以及配置文件逐步排查确保没有错误
# 排查完成删除生成的配置文件重新执行
[root@master ~]# rm -f /etc/kubernetes/manifests/*
[root@master ~]# rm -rf /var/lib/etcd/*
# 如果报端口占用过滤出端口pid使用kill命令杀死端口进程再重新执行初始化命令即可

方式二:命令初始化(可选)

# --apiserver-advertise-address 集群通告地址
# --image-repository 指定阿里云镜像仓库地址
# --kubernetes-version K8s版本,与软件包版本一致
# --pod-network-cidr Pod网络的范围,与下面部署的CNI网络组件yaml中保持一致(可以修改)
# --service-cidr 集群内部虚拟网络,Pod统一访问入口
# --upload-certs 将控制节点的证书上传到kubeadm-certs Secret中,可添加多个控制节点
# --cri-socket 指定容器运行时
[root@master ~]# kubeadm init \
--apiserver-advertise-address=10.1.8.100 \
--image-repository=registry.aliyuncs.com/google_containers \
--kubernetes-version=v1.28.0 \
--cri-socket=unix:///var/run/cri-dockerd.sock \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.96.0.0/12 \
--upload-certs | tee kubeadm-init.log
配置kubectl工具

根据初始化成功后的提示进行配置

Kubectl 是一个用于操作Kubernetes集群的命令行工具。

kubectl 在 $HOME/.kube 目录中查找一个名为 config 的配置文件。可以通过设置 KUBECONFIG 环境变量或设置 --kubeconfig 参数来指定其它 kubeconfig 文件。

在Kubernetes集群中,admin.conf 文件是用于配置kubectl工具访问Kubernetes集群的客户端配置文件。该文件包含了连接到Kubernetes集群所需的认证信息、集群信息和上下文信息。

# 创建用户的kube目录
[root@master ~]# mkdir -p $HOME/.kube
# 复制访问配置文件到用户kube目录
[root@master ~]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# 赋予权限
# $(id -u):获取当前用户的uid
# $(id -g):获取当前用户的组id
[root@master ~]# chown $(id -u):$(id -g) $HOME/.kube/config
# 导出 KUBECONFIG等于访问配置文件优化操作
[root@master ~]# export KUBECONFIG=/etc/kubernetes/admin.conf
# 使配置永久生效
[root@master ~]# echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile

# 检查核心组件控制平面的健康状态
[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 

Node工作节点加入集群

  • 以下操作只在node节点操作
  • 执行master上后查看 kubeadm-init.log,查找一下命令在node节点上执行

image-20250728163524519

[root@node1~2 ~]# kubeadm join 10.1.8.100:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:fd4cefa15607ff230fdd6fc56faff1759e0557ccb96c8d5b78a26c15350aa0b2 \
--cri-socket unix:///var/run/cri-dockerd.sock

# 主节点查看
[root@master ~]# kubectl get nodes
NAME     STATUS     ROLES           AGE    VERSION
master   NotReady   control-plane   78m    v1.28.0
node1    NotReady   <none>          51m    v1.28.0
node2    NotReady   <none>          106s   v1.28.0

网络CNI组件部署

  • 只在master节点部署
简介
[root@master ~]# kubectl get nodes
NAME     STATUS     ROLES           AGE     VERSION
master   NotReady   control-plane   85m     v1.28.0
node1    NotReady   <none>          58m     v1.28.0
node2    NotReady   <none>          9m10s   v1.28.0
  • 此时coredns中一直没有IP地址,主要原因缺少网络组建
# 查看 node 节点地址
# get pods 获取pods 
# -n kube-system:k8s获取命名空间
# -o wide 获取详细信息
[root@master ~]# kubectl get pods -n kube-system -o wide
  • kubernetes集群CNI网络组件图

f2e2ad43796781d197fd0091197aff57

  • kubernetes集群的网络是比较复杂的,不是集群内部实现的,为了更方便的使用集群,因此,使用第三方的cni网络插件(Container Network Interface )。cni是容器网络接口,作用是实现容器跨主机网络通信。pod的ip地址段,也称为cidr。

  • kubernetes支持多种网络插件,比如flannel、calico、canal等,任选一种即可,本次选择 Calico。calico是一个纯三层的网络解决方案,为容器提供多node间的访问通信,calico将每一个node节点都当做为一个路由器(router),每个pod都是虚拟路由器下的的终端,各节点通过BGP(Border GatewayProtocol) 边界网关协议学习并在node节点生成路由规则,从而将不同node节点上的pod连接起来进行通信,是目前Kubernetes主流的网络方案。

**官方下载地址:**https://docs.tigera.io/calico

image-20250728164941027

Github访问地址:https://github.com/projectcalico/calico

image-20250728165011022

部署calico
# 下载Calico
[root@master ~]# wget --no-check-certificate
https://docs.tigera.io/archive/v3.25/manifests/calico.yaml

# 修改Calico文件
[root@master ~]# vim calico.yaml
# 找到4601行,去掉注释并修改
- name: CALICO_IPV4POOL_CIDR
value: "10.244.0.0/16"


# 部署Calico
[root@master ~]# kubectl apply -f calico.yaml
# 验证检查集群状态,全部Running即代表完成
[root@master ~]# kubectl get pods -A
NAMESPACE     NAME                                       READY   STATUS    RESTARTS      AGE
kube-system   calico-kube-controllers-658d97c59c-8l8gg   1/1     Running   0             5m39s
kube-system   calico-node-gshr2                          1/1     Running   0             5m39s
kube-system   calico-node-lw4n2                          1/1     Running   0             5m39s
kube-system   calico-node-p8chk                          1/1     Running   0             5m39s
kube-system   coredns-66f779496c-hnfmz                   1/1     Running   0             18h
kube-system   coredns-66f779496c-wkr8r                   1/1     Running   0             18h
kube-system   etcd-master                                1/1     Running   2 (16h ago)   18h
kube-system   kube-apiserver-master                      1/1     Running   1 (16h ago)   18h
kube-system   kube-controller-manager-master             1/1     Running   2 (16h ago)   18h
kube-system   kube-proxy-hxdhz                           1/1     Running   1 (32m ago)   16h
kube-system   kube-proxy-rw8jl                           1/1     Running   0             17h
kube-system   kube-proxy-vslb4                           1/1     Running   1 (16h ago)   18h
kube-system   kube-scheduler-master                      1/1     Running   1 (16h ago)   18h


# 使用以下命令可以查找一直不Running的原因 pod后跟kube名称
[root@master ~]# kubectl describe pod kube-proxy-rw8jl -n kube-system

# 查看集群状态
[root@master ~]# kubectl get nodes
NAME     STATUS   ROLES           AGE   VERSION
master   Ready    control-plane   18h   v1.28.0
node1    Ready    <none>          18h   v1.28.0
node2    Ready    <none>          17h   v1.28.0

# 如果创建资源calico组件一直不能running,出现住的状态使用以下代码
[root@master ~]# kubectl rollout restart daemonset calico-node -n kube-system 

/etc/kubernetes/manifests/目录下存放Kubernetes集群中各个组件的Pod配置文件。

通常会包含以下几个重要的配置文件:

# etcd.yaml:用于部署和管理etcd集群的配置文件
# kube-apiserver.yaml:用于部署和管理Kubernetes API服务器的配置文件
# kube-controller-manager.yaml:用于部署和管理Kubernetes控制器管理器的配置文件
# kube-scheduler.yaml:用于部署和管理Kubernetes调度器的配置文件
[root@master ~]# ls /etc/kubernetes/manifests/
etcd.yaml            kube-controller-manager.yaml
kube-apiserver.yaml  kube-scheduler.yaml
  • 如果长时间等待都没有全部Runnding,可所有节点升级内核
# 如果长时间等待可以升级内核,所有节点升级
[root@master ~]# yum update -y kernel && reboot
# 重新应用calico文件
[root@master ~]# kubectl delete -f calico.yaml
[root@master ~]# kubectl apply -f calico.yaml
  • 完整清除并重新安装 Calico 的步骤:

# 1. 删除 Calico 部署和相关资源
kubectl delete -f calico.yaml

# 2. 强制删除残留资源(确保所有 Calico 相关对象被清除)
kubectl delete crd bgpconfigurations.crd.projectcalico.org
kubectl delete crd bgppeers.crd.projectcalico.org
kubectl delete crd blockaffinities.crd.projectcalico.org
kubectl delete crd caliconodestatuses.crd.projectcalico.org
kubectl delete crd clusterinformations.crd.projectcalico.org
kubectl delete crd felixconfigurations.crd.projectcalico.org
kubectl delete crd globalnetworkpolicies.crd.projectcalico.org
kubectl delete crd globalnetworksets.crd.projectcalico.org
kubectl delete crd hostendpoints.crd.projectcalico.org
kubectl delete crd ipamblocks.crd.projectcalico.org
kubectl delete crd ipamconfigs.crd.projectcalico.org
kubectl delete crd ipamhandles.crd.projectcalico.org
kubectl delete crd ippools.crd.projectcalico.org
kubectl delete crd ipreservations.crd.projectcalico.org
kubectl delete crd kubecontrollersconfigurations.crd.projectcalico.org
kubectl delete crd networkpolicies.crd.projectcalico.org
kubectl delete crd networksets.crd.projectcalico.org

# 3. 删除 Calico 创建的命名空间(如果存在)
kubectl delete namespace calico-system

# 4. 清理节点上的 Calico 残留文件和配置(在所有节点上执行)
sudo rm -rf /etc/cni/net.d/10-calico.conflist
sudo rm -rf /etc/cni/net.d/calico-kubeconfig
sudo rm -rf /var/run/calico
sudo rm -rf /var/lib/calico
sudo rm -rf /opt/cni/bin/calico*
sudo rm -rf /opt/cni/bin/fv*

# 5. 重启 kubelet 服务(在所有节点上执行)
sudo systemctl restart kubelet

# 6. 等待系统稳定(约 30 秒)
sleep 30

# 7. 下载最新版 calico.yaml(或使用你本地的文件)
curl -O -L https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/calico.yaml

# 8. (可选) 修改 calico.yaml 以适配你的环境:
#    - 如果使用其他 CIDR,修改 CALICO_IPV4POOL_CIDR
#    - 如果需要 IPIP 模式,检查 ipipMode 设置
#    - 如果需要 VXLAN 模式,设置 vxlanMode: "Always"

# 9. 重新安装 Calico
kubectl apply -f calico.yaml

# 10. 监控安装进度
watch kubectl get pods -n kube-system
监控安装进度的关键命令:

# 实时查看 Pod 状态变化
watch kubectl get pods -A -o wide

# 查看 Calico 节点初始化进度
kubectl get pods -n 

优化命令补全操作

[root@master ~]# yum install bash-completion -y
[root@master ~]# source /usr/share/bash-completion/bash_completion

# 永久生效设置
[root@master ~]# echo "source <(kubectl completion bash)" >> ~/.bashrc
[root@master ~]# source ~/.bashrc

测试 K8S 功能

# 创建nginx,副本数为3
# delopyment:部署应用 --image:指定镜像,--replicas:指定副本数
[root@master ~]# kubectl create deployment nginx --image=nginx --replicas=3
deployment.apps/nginx created
# 公开服务
# expose:公开资源为服务  depolyment:指定应用 --port:指定pod暴露端口 --target-port:指定目标端口 
# --type:指定访问类型 NodePort:通过节点ip访问
[root@master ~]# kubectl expose deployment nginx --port=80 --target-port=80 --type=NodePort


# 查看创建状态
[root@master ~]# kubectl get pod,svc
NAME                         READY   STATUS    RESTARTS   AGE
pod/nginx-7854ff8877-7jrpr   1/1     Running   0          16m
pod/nginx-7854ff8877-knj7q   1/1     Running   0          16m
pod/nginx-7854ff8877-n565z   1/1     Running   0          16m

NAME                 TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
service/kubernetes   ClusterIP   10.96.0.1      <none>        443/TCP        19h
service/nginx        NodePort    10.109.39.88   <none>        80:31807/TCP   2m37s

  • 页面进行访问

image-20250729105848239

image-20250729105822326

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐