```html
K8S集群部署: 实战指南,助你轻松搭建容器编排平台
在现代云原生应用开发中,Kubernetes(K8S)作为领先的容器编排平台(Container Orchestration Platform),已成为管理和自动化容器化应用的事实标准。掌握高效的K8S集群部署技能,是开发者和运维工程师构建弹性、可扩展基础设施的关键。本指南将提供一套清晰、可复现的K8S集群部署实战流程,涵盖从环境准备到应用部署的全过程,结合具体代码示例和行业最佳实践,帮助我们在生产或开发测试环境中快速搭建稳定可靠的容器编排平台。
一、理解Kubernetes核心架构与部署目标
在开始K8S集群部署前,深入理解其核心组件是至关重要的。一个标准的Kubernetes集群由控制平面(Control Plane)和工作节点(Worker Nodes)组成。
1.1 控制平面(Control Plane)核心组件
- API Server:集群操作的唯一入口,RESTful API服务端。
- etcd:分布式键值存储,持久化保存集群所有配置数据与状态。
- Scheduler:负责将新创建的Pods调度到合适的Node上运行。
- Controller Manager:运行控制器进程(如Node Controller, Replication Controller),确保集群状态与期望一致。
Cloud Controller Manager(若部署在云上):集成云服务商特定控制逻辑(如负载均衡器、存储卷)。
1.2 工作节点(Worker Node)组件
- kubelet:节点上的代理,负责与管理平面通信并管理本节点Pod的生命周期。
kube-proxy:维护节点网络规则,实现Service的虚拟IP和负载均衡。
容器运行时(Container Runtime):如containerd或Docker Engine,负责运行容器。
本次K8S集群部署的目标是建立一个高可用(至少3个控制平面节点)、支持自动扩缩容、具备网络策略和持久化存储能力的生产就绪集群。根据CNCF 2023年度调查报告,超过70%的Kubernetes用户选择自建集群或混合云部署,掌握核心部署技能具有极高价值。
二、部署前的环境准备与系统配置
成功的K8S集群部署始于严谨的环境准备。我们以3台控制平面节点和2台工作节点为例(Ubuntu 22.04 LTS)。
2.1 基础设施要求
- 操作系统:兼容Linux发行版(推荐Ubuntu 22.04/CentOS 7.9+)
-
硬件配置:
- 控制平面节点:2vCPU+, 4GB RAM+, 20GB Disk+
- 工作节点:根据应用需求调整(建议4vCPU+, 8GB RAM+)
-
网络要求:
- 唯一主机名、MAC地址和product_uuid
- 禁用Swap分区(
swapoff -a并注释掉/etc/fstab中的swap行) - 节点间网络互通(建议万兆内网)
2.2 配置系统内核参数与容器运行时
在所有节点执行以下命令,加载内核模块并配置sysctl参数:
# 加载内核模块
sudo modprobe overlay
sudo modprobe br_netfilter
# 设置必需的sysctl参数
cat <
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
sudo sysctl --system
# 安装containerd作为容器运行时
sudo apt-get update
sudo apt-get install -y containerd
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
sudo systemctl restart containerd
2.3 安装kubeadm, kubelet和kubectl
# 添加Kubernetes APT仓库
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.29/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.29/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
# 安装指定版本(以1.29.2为例)
sudo apt-get update
sudo apt-get install -y kubelet=1.29.2-1.1 kubeadm=1.29.2-1.1 kubectl=1.29.2-1.1
sudo apt-mark hold kubelet kubeadm kubectl
三、部署高可用Kubernetes控制平面
控制平面是集群的"大脑",高可用部署是生产环境的核心要求。
3.1 初始化第一个控制平面节点
在首个控制节点(如k8s-master-01)执行初始化:
sudo kubeadm init \
--control-plane-endpoint "LOAD_BALANCER_DNS:6443" \ # 指向负载均衡器
--upload-certs \
--pod-network-cidr=192.168.0.0/16 \ # 与后续CNI插件匹配
--apiserver-advertise-address=192.168.1.101 \ # 节点内网IP
--kubernetes-version v1.29.2
# 成功后会输出加入集群的命令,保存备用
mkdir -p HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf HOME/.kube/config
sudo chown (id -u):(id -g) HOME/.kube/config
3.2 添加额外的控制平面节点
使用初始化时生成的命令,在k8s-master-02和k8s-master-03上执行:
# 示例命令格式(实际以初始化输出为准)
kubeadm join LOAD_BALANCER_DNS:6443 \
--token \
--discovery-token-ca-cert-hash sha256: \
--control-plane \
--certificate-key
此时,我们拥有了一个由3节点组成的高可用控制平面。通过kubectl get nodes -o wide可验证状态。
3.3 部署负载均衡器(HAProxy/Keepalived)
为API Server提供高可用访问点(在3个控制节点前部署):
# HAProxy配置示例 (/etc/haproxy/haproxy.cfg)
frontend k8s-api
bind *:6443
mode tcp
option tcplog
default_backend k8s-api-backend
backend k8s-api-backend
mode tcp
balance roundrobin
server k8s-master-01 192.168.1.101:6443 check
server k8s-master-02 192.168.1.102:6443 check
server k8s-master-03 192.168.1.103:6443 check
四、添加工作节点与网络插件配置
工作节点承载实际应用负载,网络插件实现Pod间通信。
4.1 将工作节点加入集群
在每个工作节点(k8s-worker-01, k8s-worker-02)上执行:
# 使用初始化时生成的worker加入命令
kubeadm join LOAD_BALANCER_DNS:6443 \
--token \
--discovery-token-ca-cert-hash sha256:
加入后,在控制平面执行kubectl get nodes应看到所有节点状态为Ready。
4.2 安装Calico网络插件
Calico提供高性能网络和网络策略支持:
kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/calico.yaml
# 验证安装
kubectl get pods -n kube-system -l k8s-app=calico-node
安装后,Pod应获得192.168.0.0/16网段的IP,并能跨节点通信。
4.3 验证集群网络状态
# 部署测试应用
kubectl create deployment nginx-test --image=nginx:1.25
kubectl expose deployment nginx-test --port=80 --type=NodePort
# 获取服务访问端口
kubectl get svc nginx-test
# 跨节点访问测试
curl http://<任一节点IP>:
五、配置持久化存储与动态卷供应
容器文件系统是临时的,持久化存储对数据库、日志等场景必不可少。
5.1 部署NFS Subdir External Provisioner
使用NFS服务器提供动态存储卷:
helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/
helm install nfs-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner \
--set nfs.server=192.168.1.200 \
--set nfs.path=/data/nfs
5.2 创建StorageClass
# sc-nfs.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: nfs-storage
provisioner: cluster.local/nfs-provisioner
parameters:
archiveOnDelete: "false"
应用配置:kubectl apply -f sc-nfs.yaml
5.3 测试动态卷创建
# pvc-test.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: test-pvc
spec:
storageClassName: nfs-storage
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
# 创建PVC并验证
kubectl apply -f pvc-test.yaml
kubectl get pvc
六、部署应用与集群运维要点
完成基础集群搭建后,部署应用并了解关键运维操作至关重要。
6.1 使用Deployment和Service部署应用
# web-app.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-app
spec:
replicas: 3
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: web-container
image: nginx:1.25
ports:
- containerPort: 80
volumeMounts:
- name: config-vol
mountPath: /etc/nginx/conf.d
volumes:
- name: config-vol
configMap:
name: nginx-config
---
apiVersion: v1
kind: Service
metadata:
name: web-service
spec:
selector:
app: web
ports:
- protocol: TCP
port: 80
targetPort: 80
type: LoadBalancer # 云环境可自动创建外部LB
6.2 关键运维操作
节点维护:
kubectl drain --ignore-daemonsets (排空节点)
kubectl uncordon (恢复调度)
集群升级:
sudo apt update
sudo apt install kubeadm=1.29.3-00
sudo kubeadm upgrade plan
sudo kubeadm upgrade apply v1.29.3
kubectl drain --ignore-daemonsets
sudo apt install kubelet=1.29.3-00 kubectl=1.29.3-00
sudo systemctl restart kubelet
kubectl uncordon
日志与监控:部署Prometheus + Grafana + Loki栈
6.3 备份与恢复etcd
定期备份etcd是灾难恢复的核心:
# 备份
ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key \
snapshot save /backup/etcd-snapshot-(date +%Y%m%d).db
# 恢复(需先停止kube-apiserver)
ETCDCTL_API=3 etcdctl snapshot restore /backup/etcd-snapshot.db \
--data-dir /var/lib/etcd-restore
# 修改etcd manifest指向新数据目录后重启服务
通过遵循本指南,我们已完成一个高可用、具备网络策略和持久化存储能力的生产级Kubernetes集群部署。Kubernetes生态庞大,持续学习Ingress控制器(如Nginx Ingress)、服务网格(如Istio)、安全策略(RBAC, Pod Security)等进阶主题,将帮助我们更好地驾驭这个强大的容器编排平台。
技术标签: #Kubernetes部署 #容器编排平台 #K8S集群搭建 #云原生技术 #容器化运维 #DevOps实践 #高可用集群 #Calico网络 #持久化存储 #kubeadm指南
```