Kubernetes(K8s)基础知识与部署
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 秒内自动重启
- 弹性伸缩:根据需求自动调整容器数量
- 服务发现:服务间自动发现依赖关系
- 负载均衡:自动实现多容器实例的请求分发
- 版本回退:支持快速回滚到历史稳定版本
- 存储编排:根据容器需求自动创建存储卷
五、Kubernetes 核心组件
K8s 集群由控制节点(Master) 和工作节点(Node) 构成,各组件分工如下:
1. 控制节点(Master)
- Apiserver:资源操作唯一入口,提供认证、授权及 API 注册
- Scheduler:负责资源调度,选择合适 Node 运行 Pod
- Controller-manager:维护集群状态(部署安排、故障检测、自动扩展等)
- Etcd:集群数据存储中心,保存所有资源对象信息
2. 工作节点(Node)
- Kubelet:维护容器生命周期,通过控制 Docker 实现容器的创建、更新和销毁
- Docker:负责节点上容器的实际操作
- Kube-proxy:实现 Pod 网络代理,提供负载均衡和服务暴露能力
组件调用流程(以 Nginx 部署为例)
- 集群启动后,Master 和 Node 信息自动存储到 Etcd
- Nginx 部署请求发送至 Master 的 Apiserver
- Apiserver 调用 Scheduler 确定部署的 Node 节点
- Apiserver 通过 Controller-manager 调度 Node 执行部署
- Node 节点的 Kubelet 通知 Docker 启动 Nginx 容器(运行在 Pod 中)
- 外部通过 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 node022.2 配置 hosts 文件
echo "192.168.100.100 master" >> /etc/hostsecho "192.168.100.110 node01" >> /etc/hostsecho "192.168.100.120 node02" >> /etc/hosts验证:执行ping master和ping node01测试连通性
2.3 关闭防火墙和 SELinux
# 关闭防火墙systemctl stop firewalld.servicesystemctl disable firewalld.service# 关闭SELinuxsetenforce 0sed -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 - \$basearchbaseurl=https://repo.huaweicloud.com/epel/\$releasever/Everything/\$basearch/enabled=1gpgcheck=1countme=1gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-\$releaseverEOF# 安装工具yum -y install vim bash-completion net-tools lrzszyum makecache2.5 时间同步
systemctl restart chronydsystemctl enable chronydhwclock -wtimedatectl # 验证时区为Asia/Shanghai2.6 修改最大打开文件数
cat >> /etc/security/limits.conf << EOF* soft nofile 65535* hard nofile 65535EOF生效:重新登录后执行ulimit -n验证输出 65535
2.7 修改内核参数
cat >> /etc/sysctl.conf << EOFnet.ipv4.tcp_syncookies = 1net.ipv4.tcp_max_tw_buckets = 20480net.ipv4.tcp_max_syn_backlog = 20480net.core.netdev_max_backlog = 262144net.ipv4.tcp_fin_timeout = 20EOFsysctl -p2.8 关闭 Swap
swapoff -ased -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 << EOFnet.bridge.bridge-nf-call-ip6tables = 1net.bridge.bridge-nf-call-iptables = 1net.ipv4.ip_forward = 1EOF# 加载模块modprobe br_netfilter && lsmod | grep br_netfilter# 生效配置sysctl -p /etc/sysctl.d/k8s.conf3. Docker 环境配置(所有节点)
3.1 配置阿里云 Docker 源
yum install -y yum-utilsyum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo3.2 安装指定版本 Docker
# 查看可用版本yum list docker-ce.x86_64 --showduplicates | sort -r# 安装25.0.5版本yum -y install docker-ce-25.0.5-1.el93.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"]}EOF3.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.servicewget -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.socket4.3 复制到其他节点(Master 执行)
# 复制到node01scp 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/# 复制到node02scp 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-reloadsystemctl 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=Kubernetesbaseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/rpm/enabled=1gpgcheck=1gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/rpm/repodata/repomd.xml.keyEOF5.2 安装 K8s 组件(所有节点)
yum install -y kubelet kubeadm kubectl
5.3 配置 kubelet Cgroup(所有节点)
cat > /etc/sysconfig/kubelet << EOFKUBELET_EXTRA_ARGS="--cgroup-driver=systemd"EOFsystemctl enable kubelet.service5.4 初始化 Master 节点(仅 Master 执行)
# 生成配置文件kubeadm config print init-defaults > kubeadm-config.yaml# 编辑配置文件(关键修改)cat > kubeadm-config.yaml << EOFapiVersion: kubeadm.k8s.io/v1beta3bootstrapTokens:- groups:- system:bootstrappers:kubeadm:default-node-tokentoken: abcdef.0123456789abcdefttl: 24h0m0susages:- signing- authenticationkind: InitConfigurationlocalAPIEndpoint:advertiseAddress: 192.168.100.60 # Master节点IPbindPort: 6443nodeRegistration:criSocket: unix:///var/run/cri-dockerd.sock # cri-docker端点imagePullPolicy: IfNotPresentname: master01 # Master主机名taints: null---apiServer:timeoutForControlPlane: 4m0sapiVersion: kubeadm.k8s.io/v1beta3certificatesDir: /etc/kubernetes/pkiclusterName: kubernetescontrollerManager: {}dns: {}etcd:local:dataDir: /var/lib/etcdimageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers # 阿里云镜像仓库kind: ClusterConfigurationkubernetesVersion: 1.28.0networking:dnsDomain: cluster.localserviceSubnet: 10.96.0.0/12scheduler: {}EOF# 初始化集群kubeadm init --config kubeadm-config.yaml --upload-certs5.5 配置 kubectl(仅 Master 执行)
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> /etc/profilesource /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 VERSIONmaster Ready control-plane 10m v1.28.0node01 Ready <none> 5m v1.28.0node02 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.1docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/calico/cni:v3.24.1docker 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 配置中包含,若仍失败可更换加速器地址);
- 替换镜像源为国内地址(如nginx:1.23替换为registry.cn-hangzhou.aliyuncs.com/library/nginx:1.23)。
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).db8.2 升级集群版本(谨慎操作)
- 先升级 Master 节点:kubeadm upgrade apply v1.28.x(x 为具体版本号);
- 再升级各 Node 节点:kubeadm upgrade node,并重启 kubelet。
8.3 清理无用资源
# 删除终止状态的Podkubectl delete pods --field-selector=status.phase=Succeeded -Akubectl delete pods --field-selector=status.phase=Failed -A# 清理未使用的镜像(Node节点)docker system prune -a -f10. 总结
Kubernetes 通过组件协同实现了容器的自动化管理,核心优势在于自愈能力、弹性伸缩和跨环境部署。本文基于 kubeadm 工具完成了 “1 主 2 从” 集群的部署,涵盖环境准备、组件安装、网络配置等关键步骤,并通过 Nginx 示例演示了基本操作。
后续学习可重点关注:
- 深入理解 Pod 生命周期与控制器(Deployment/StatefulSet/DaemonSet);
- 掌握 Service 与 Ingress 的网络转发机制;
- 学习配置管理(ConfigMap/Secret)和存储卷(PV/PVC)的使用;
- 了解集群监控(Prometheus+Grafana)和日志收集(EFK Stack)方案。
