Kubernetes(K8s)基础知识与部署

一、Kubernetes 概述

Kubernetes(简称 K8s)是一个开源的容器编排平台,用于自动化容器的部署、扩展和管理。它由 Google 发起并捐赠给 Cloud Native Computing Foundation(CNCF),现已成为容器编排领域的事实标准。

官网:https://kubernetes.io/

二、应用部署方式对比

1. 传统部署

  • 方式:直接将应用程序部署在物理机上
  • 优点:简单,无需额外技术支持
  • 缺点
    • 无法定义资源使用边界,资源分配不合理
    • 程序间易相互影响,隔离性差

2. 虚拟化部署

  • 方式:在物理机上运行多台虚拟机,每个虚拟机为独立环境
  • 优点
    • 程序环境隔离,互不影响
    • 提供基础安全性保障
  • 缺点
    • 需额外运行操作系统,资源浪费严重
    • 性能开销较大

3. 容器化部署

  • 方式:共享操作系统内核,容器封装应用及依赖
  • 优点
    • 拥有独立文件系统、CPU、内存和进程空间
    • 资源占用低,与底层架构解耦
    • 可跨云服务商、跨 Linux 发行版部署
  • 挑战:容器编排问题(故障恢复、扩展、负载均衡等)

三、容器编排工具

解决容器化部署中的编排问题的主流工具:

  • Swarm:Docker 官方提供的轻量级编排工具
  • Mesos:Apache 开源的资源管控工具,需与 Marathon 配合使用
  • Kubernetes:Google 开源的功能全面的容器编排平台,生态最完善

四、Kubernetes 主要功能

Kubernetes 通过集群管理实现资源自动化,核心功能包括:

  1. 自我修复:容器崩溃后 1 秒内自动重启
  2. 弹性伸缩:根据需求自动调整容器数量
  3. 服务发现:服务间自动发现依赖关系
  4. 负载均衡:自动实现多容器实例的请求分发
  5. 版本回退:支持快速回滚到历史稳定版本
  6. 存储编排:根据容器需求自动创建存储卷

五、Kubernetes 核心组件

K8s 集群由控制节点(Master)工作节点(Node) 构成,各组件分工如下:

1. 控制节点(Master)

  • Apiserver:资源操作唯一入口,提供认证、授权及 API 注册
  • Scheduler:负责资源调度,选择合适 Node 运行 Pod
  • Controller-manager:维护集群状态(部署安排、故障检测、自动扩展等)
  • Etcd:集群数据存储中心,保存所有资源对象信息

2. 工作节点(Node)

  • Kubelet:维护容器生命周期,通过控制 Docker 实现容器的创建、更新和销毁
  • Docker:负责节点上容器的实际操作
  • Kube-proxy:实现 Pod 网络代理,提供负载均衡和服务暴露能力

组件调用流程(以 Nginx 部署为例)

  1. 集群启动后,Master 和 Node 信息自动存储到 Etcd
  2. Nginx 部署请求发送至 Master 的 Apiserver
  3. Apiserver 调用 Scheduler 确定部署的 Node 节点
  4. Apiserver 通过 Controller-manager 调度 Node 执行部署
  5. Node 节点的 Kubelet 通知 Docker 启动 Nginx 容器(运行在 Pod 中)
  6. 外部通过 Kube-proxy 访问 Nginx 服务

六、Kubernetes 核心概念

  • Master:集群控制节点,负责集群管控(至少 1 个)
  • Node:工作负载节点,接收 Master 调度并运行容器
  • Pod:K8s 最小操作单元,一个 Pod 可包含 1 个或多个容器
  • Controller:管理 Pod 的控制器,负责 Pod 的启动、停止和伸缩
  • Service:Pod 对外服务的统一入口,维护同一类 Pod 的访问
  • Label:标签,用于对 Pod 分类,同一类 Pod 拥有相同标签
  • Namespace:命名空间,实现 Pod 运行环境的隔离

七、Kubernetes 集群部署指南(基于 Rocky Linux 9.4)

1. 集群规划

采用 "1 主 2 从" 架构,节点信息如下:

主机名

IP 地址

角色

操作系统

硬件配置

核心作用

master

192.168.100.100

管理节点

Rocky Linux 9.4

2core/4G 内存 / 50G

运行控制平面组件(API Server、etcd、Controller Manager、Scheduler)

node01

192.168.100.110

工作节点

Rocky Linux 9.4

2core/4G 内存 / 50G

运行容器化应用,接受 Master 调度

node02

192.168.100.120

工作节点

Rocky Linux 9.4

2core/4G 内存 / 50G

同 node01,提供冗余能力

扩展说明

  • 生产环境建议 Master 节点升级至 4 核 8G 内存,工作节点配置根据应用需求调整
  • Rocky Linux 9.4 为 CentOS 兼容版本,支持 K8s 官方推荐内核

2. 操作系统准备(所有节点)

2.1 配置主机名称
# master节点

hostnamectl hostname master

# node01节点

hostnamectl hostname node01

# node02节点

hostnamectl hostname node02
2.2 配置 hosts 文件
echo "192.168.100.100 master" >> /etc/hosts

echo "192.168.100.110 node01" >> /etc/hosts

echo "192.168.100.120 node02" >> /etc/hosts

验证:执行ping master和ping node01测试连通性

2.3 关闭防火墙和 SELinux
# 关闭防火墙

systemctl stop firewalld.service

systemctl disable firewalld.service

# 关闭SELinux

setenforce 0

sed -i 's#SELINUX=enforcing#SELINUX=disabled#' /etc/selinux/config

验证:

  • 防火墙:systemctl status firewalld显示 "inactive (dead)"
  • SELinux:getenforce输出 "Permissive"(临时),重启后输出 "Disabled"(永久)
    2.4 配置国内镜像源
    # 配置阿里云系统源
    
    sed -e 's|^mirrorlist=|#mirrorlist=|g' \
    
    -e 's|^#baseurl=http://dl.rockylinux.org/$contentdir|baseurl=https://mirrors.aliyun.com/rockylinux|g' \
    
    -i.bak \
    
    /etc/yum.repos.d/rocky-*.repo
    
    # 配置EPEL源(华为云)
    
    cat > /etc/yum.repos.d/epel.repo << EOF
    
    [epel]
    
    name=Extra Packages for Enterprise Linux \$releasever - \$basearch
    
    baseurl=https://repo.huaweicloud.com/epel/\$releasever/Everything/\$basearch/
    
    enabled=1
    
    gpgcheck=1
    
    countme=1
    
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-\$releasever
    
    EOF
    
    # 安装工具
    
    yum -y install vim bash-completion net-tools lrzsz
    
    yum makecache
    2.5 时间同步
    systemctl restart chronyd
    
    systemctl enable chronyd
    
    hwclock -w
    
    timedatectl # 验证时区为Asia/Shanghai
    2.6 修改最大打开文件数
    cat >> /etc/security/limits.conf << EOF
    
    * soft nofile 65535
    
    * hard nofile 65535
    
    EOF

    生效:重新登录后执行ulimit -n验证输出 65535

    2.7 修改内核参数
    cat >> /etc/sysctl.conf << EOF
    
    net.ipv4.tcp_syncookies = 1
    
    net.ipv4.tcp_max_tw_buckets = 20480
    
    net.ipv4.tcp_max_syn_backlog = 20480
    
    net.core.netdev_max_backlog = 262144
    
    net.ipv4.tcp_fin_timeout = 20
    
    EOF
    
    sysctl -p
    2.8 关闭 Swap
    swapoff -a
    
    sed -ri 's/.*swap.*/#&/' /etc/fstab

    验证:free -m显示 Swap 总量为 0

    2.9 安装系统工具
    yum install -y gcc autoconf sysstat
    
    2.10 开启 Bridge 网桥过滤
    # 配置参数
    
    cat > /etc/sysctl.d/k8s.conf << EOF
    
    net.bridge.bridge-nf-call-ip6tables = 1
    
    net.bridge.bridge-nf-call-iptables = 1
    
    net.ipv4.ip_forward = 1
    
    EOF
    
    # 加载模块
    
    modprobe br_netfilter && lsmod | grep br_netfilter
    
    # 生效配置
    
    sysctl -p /etc/sysctl.d/k8s.conf

    3. Docker 环境配置(所有节点)

    3.1 配置阿里云 Docker 源
    yum install -y yum-utils
    
    yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    3.2 安装指定版本 Docker
    # 查看可用版本
    
    yum list docker-ce.x86_64 --showduplicates | sort -r
    
    # 安装25.0.5版本
    
    yum -y install docker-ce-25.0.5-1.el9
    3.3 配置 Docker Cgroup 驱动
    cat > /etc/docker/daemon.json << EOF
    
    {
    
    "registry-mirrors": [
    
    "https://docker.m.daocloud.io",
    
    "https://dockerproxy.com",
    
    "https://docker.mirrors.ustc.edu.cn",
    
    "https://docker.nju.edu.cn"
    
    ],
    
    "exec-opts": ["native.cgroupdriver=systemd"]
    
    }
    
    EOF
    3.4 启动 Docker
    systemctl enable docker --now
    

    验证:systemctl status docker显示 "active (running)"

    4. cri-docker 配置(所有节点)

    4.1 下载并解压 cri-docker(Master 节点先行)
    # 下载二进制包
    
    wget -c https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.9/cri-dockerd-0.3.9.amd64.tgz
    
    # 解压
    
    tar -xvf cri-dockerd-0.3.9.amd64.tgz --strip-components=1 -C /usr/local/bin/
    4.2 配置 systemd 服务(Master 节点先行)
    # 下载服务文件
    
    wget -O /etc/systemd/system/cri-docker.service https://raw.githubusercontent.com/Mirantis/cri-dockerd/master/packaging/systemd/cri-docker.service
    
    wget -O /etc/systemd/system/cri-docker.socket https://raw.githubusercontent.com/Mirantis/cri-dockerd/master/packaging/systemd/cri-docker.socket
    
    # 修改服务文件
    
    sed -i 's#ExecStart=.*#ExecStart=/usr/local/bin/cri-dockerd --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9 --container-runtime-endpoint=unix:///var/run/cri-dockerd.sock --cri-dockerd-root-directory=/var/lib/dockershim --cri-dockerd-root-directory=/var/lib/docker#' /etc/systemd/system/cri-docker.service
    
    # 修改socket文件
    
    sed -i 's#ListenStream=.*#ListenStream=/var/run/cri-dockerd.sock#' /etc/systemd/system/cri-docker.socket
    4.3 复制到其他节点(Master 执行)
    # 复制到node01
    
    scp cri-dockerd-0.3.9.amd64.tgz root@192.168.100.70:/root/
    
    scp /etc/systemd/system/cri-docker.s* root@192.168.100.70:/etc/systemd/system/
    
    # 复制到node02
    
    scp cri-dockerd-0.3.9.amd64.tgz root@192.168.100.80:/root/
    
    scp /etc/systemd/system/cri-docker.s* root@192.168.100.80:/etc/systemd/system/

    其他节点执行解压命令:tar -xvf cri-dockerd-0.3.9.amd64.tgz --strip-components=1 -C /usr/local/bin/

    4.4 启动 cri-docker(所有节点)
    systemctl daemon-reload
    
    systemctl enable cri-docker.service --now

    验证:systemctl status cri-docker显示 "active (running)"

    5. K8s 集群部署

    5.1 配置阿里云 K8s 源(所有节点)
    cat > /etc/yum.repos.d/k8s.repo << EOF
    
    [kubernetes]
    
    name=Kubernetes
    
    baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/rpm/
    
    enabled=1
    
    gpgcheck=1
    
    gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/rpm/repodata/repomd.xml.key
    
    EOF
    5.2 安装 K8s 组件(所有节点)
    yum install -y kubelet kubeadm kubectl
    
    5.3 配置 kubelet Cgroup(所有节点)
    cat > /etc/sysconfig/kubelet << EOF
    
    KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
    
    EOF
    
    systemctl enable kubelet.service
    5.4 初始化 Master 节点(仅 Master 执行)
    # 生成配置文件
    
    kubeadm config print init-defaults > kubeadm-config.yaml
    
    # 编辑配置文件(关键修改)
    
    cat > kubeadm-config.yaml << EOF
    
    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: 192.168.100.60 # Master节点IP
    
    bindPort: 6443
    
    nodeRegistration:
    
    criSocket: unix:///var/run/cri-dockerd.sock # cri-docker端点
    
    imagePullPolicy: IfNotPresent
    
    name: master01 # Master主机名
    
    taints: null
    
    ---
    
    apiServer:
    
    timeoutForControlPlane: 4m0s
    
    apiVersion: kubeadm.k8s.io/v1beta3
    
    certificatesDir: /etc/kubernetes/pki
    
    clusterName: kubernetes
    
    controllerManager: {}
    
    dns: {}
    
    etcd:
    
    local:
    
    dataDir: /var/lib/etcd
    
    imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers # 阿里云镜像仓库
    
    kind: ClusterConfiguration
    
    kubernetesVersion: 1.28.0
    
    networking:
    
    dnsDomain: cluster.local
    
    serviceSubnet: 10.96.0.0/12
    
    scheduler: {}
    
    EOF
    
    # 初始化集群
    
    kubeadm init --config kubeadm-config.yaml --upload-certs
    5.5 配置 kubectl(仅 Master 执行)
    echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> /etc/profile
    
    source /etc/profile

    验证:kubectl version显示客户端和服务端版本

    5.6 工作节点加入集群(node01 和 node02 执行)
    # 使用Master初始化输出的join命令,示例:
    
    kubeadm join 192.168.100.60:6443 --token abcdef.0123456789abcdef \
    
    --discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx \
    
    --cri-socket=unix:///var/run/cri-dockerd.sock

    若 token 过期,在 Master 执行:kubeadm token create --print-join-command重新生成

    5.7 部署 Calico 网络插件(仅 Master 执行)
    # 下载配置文件
    
    wget https://raw.githubusercontent.com/projectcalico/calico/v3.24.1/manifests/calico.yaml
    
    # 部署
    
    kubectl apply -f calico.yaml

    验证:kubectl get pods -n kube-system查看 Calico 组件运行状态

    6. 集群状态验证(Master 节点执行)

    6.1 检查节点状态
    kubectl get nodes
    
    • 正常输出示例(所有节点状态为Ready):
    NAME STATUS ROLES AGE VERSION
    
    master Ready control-plane 10m v1.28.0
    
    node01 Ready <none> 5m v1.28.0
    
    node02 Ready <none> 5m v1.28.0
    • 若节点状态为NotReady,等待 2-3 分钟(网络插件初始化需要时间),或通过kubectl describe node <节点名>排查原因。
    6.2 检查系统组件状态
    kubectl get pods -n kube-system
    
    • 核心组件(kube-apiserver、kube-controller-manager、kube-scheduler、etcd、calico-*)状态应为Running。
    • 若 Calico 相关 Pod 状态为Pending或ImagePullBackOff,执行以下命令手动拉取镜像(所有节点):
    docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/calico/node:v3.24.1
    
    docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/calico/cni:v3.24.1
    
    docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/calico/kube-controllers:v3.24.1

    拉取完成后,重启 Pod:kubectl delete pods -n kube-system <calico-pod-name>。

    7. 常见故障排查

    7.1 节点状态为 NotReady
    • 检查网络插件状态:kubectl get pods -n kube-system | grep calico,确保 Calico 正常运行;
    • 检查 kubelet 状态:systemctl status kubelet,查看日志:journalctl -u kubelet -f;
    • 检查容器运行时:systemctl status cri-docker,确保 Docker 和 cri-dockerd 正常。
    7.2 Pod 镜像拉取失败(ImagePullBackOff)
    • 手动拉取镜像:docker pull <镜像名>,验证镜像是否可访问;
    • 配置镜像仓库加速器(已在 Docker 配置中包含,若仍失败可更换加速器地址);
    7.3 节点无法加入集群(Unauthorized)
    • 重新生成 join 命令:在 Master 节点执行kubeadm token create --print-join-command;
    • 清理节点残留配置:在 Node 节点执行kubeadm reset -f --cri-socket=unix:///var/run/cri-dockerd.sock,再重新加入。

    8. 集群维护建议

    8.1 备份 etcd 数据(Master 节点)
    # 备份数据到/backup目录
    
    ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 \
    
    --cacert=/etc/kubernetes/pki/etcd/ca.crt \
    
    --cert=/etc/kubernetes/pki/apiserver-etcd-client.crt \
    
    --key=/etc/kubernetes/pki/apiserver-etcd-client.key \
    
    snapshot save /backup/etcd-snapshot-$(date +%Y%m%d).db
    8.2 升级集群版本(谨慎操作)
    • 先升级 Master 节点:kubeadm upgrade apply v1.28.x(x 为具体版本号);
    • 再升级各 Node 节点:kubeadm upgrade node,并重启 kubelet。
    8.3 清理无用资源
    # 删除终止状态的Pod
    
    kubectl delete pods --field-selector=status.phase=Succeeded -A
    
    kubectl delete pods --field-selector=status.phase=Failed -A
    
    # 清理未使用的镜像(Node节点)
    
    docker system prune -a -f

    10. 总结

    Kubernetes 通过组件协同实现了容器的自动化管理,核心优势在于自愈能力弹性伸缩跨环境部署。本文基于 kubeadm 工具完成了 “1 主 2 从” 集群的部署,涵盖环境准备、组件安装、网络配置等关键步骤,并通过 Nginx 示例演示了基本操作。

    后续学习可重点关注:

    • 深入理解 Pod 生命周期与控制器(Deployment/StatefulSet/DaemonSet);
    • 掌握 Service 与 Ingress 的网络转发机制;
    • 学习配置管理(ConfigMap/Secret)和存储卷(PV/PVC)的使用;
    • 了解集群监控(Prometheus+Grafana)和日志收集(EFK Stack)方案。

    更多推荐