K8S集群部署: 实战指南,助你轻松搭建容器编排平台

```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指南

```

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容