Kubernetes(K8s)基础知识与部署
一、Kubernetes 概述
Kubernetes(简称 K8s)是一个开源的容器编排平台,用于自动化容器的部署、扩展和管理。它由 Google 发起并捐赠给 Cloud Native Computing Foundation(CNCF),现已成为容器编排领域的事实标准。
二、应用部署方式对比
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 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 配置中包含,若仍失败可更换加速器地址);
- 替换镜像源为国内地址(如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).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)方案。