在上一篇记录中,我已经学会了用Docker打包和运行单个容器。但随着应用规模的扩大,我需要统一管理多个服务。

Docker Compose可以管理单机上的多容器,但面对更大的需求,我需要一个更强大的容器编排平台也就是Kubernetes(简称K8s)

准备工作

Kubernetes简介

Kubernetes是一个生产级别的开源平台,它帮助你确保容器化应用在你想要的时间和地点运行

Docker解决了“如何打包”的问题,Kubernetes解决了如何管理成千上万个容器的问题。

核心概念

一个Kubernetes集群由Control Plane和Nodes组成

Control Plane负责全局决策(调度、响应事件等)

Nodes运行实际应用的机器,每个节点上都有容器运行时

关键组件:

Control Plane包含四个核心组件:

kube-apiserver 是集群的前端,所有操作都通过它处理

etcd 为集群的数据库,存储所有配置数据

kube-scheduler 负责把Pod分配到合适的节点上运行

kube-controller-manager 负责运行各种控制器

每个和Nodes上运行:

kubelet确保容器按预期运行

kube-proxy维护网络规则,实现服务通信(非必需)

容器运行时

核心抽象概念:

Pod是Kubernetes中最小的部署单元,一个Pod可以包含一个或多个紧密相关的容器。Deployment负责管理Pod的副本数、滚动更新和自我修复。Service则为Pod提供稳定的访问入口和负载均衡。

开始实践

本地环境搭建

使用Minikube

Minikube在本地运行单节点Kubernetes集群

启动集群(使用Docker驱动)

minikube start --driver=docker

检查集群状态

minikube status

使用Kind

Kind使用Docker容器作为节点运行Kubernetes,轻量且启动快,适合CI/CD测试场景。

kind create cluster --name my-cluster

安装kubectl

kubectl是与Kubernetes集群交互的命令行工具,所有节点都需要安装。

在Linux上安装:(centos)

cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo

[kubernetes]

name=Kubernetes

baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64

enabled=1

gpgcheck=1

repo_gpgcheck=1

gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg

EOF
yum install -y kubelet kubeadm kubectl
systemctl enable --now kubelet

部署应用

创建Deployment

用YAML文件定义应用部署(示例为Nginx):

# nginx-deployment.yaml

apiVersion: apps/v1

kind: Deployment

metadata:

  name: nginx-demo

spec:

  replicas: 3                      # 保持3个副本运行

  selector:

    matchLabels:

      app: nginx

  template:

    metadata:

      labels:

        app: nginx

    spec:

      containers:

      - name: nginx

        image: nginx:latest

        ports:

        - containerPort: 80

应用配置:

kubectl apply -f nginx-deployment.yaml

查看Pod状态

kubectl get pods

暴露服务

创建Service让外部可以访问:(yaml)

# nginx-service.yaml

apiVersion: v1

kind: Service

metadata:

  name: nginx-service

spec:

  selector:

    app: nginx

  ports:

    - protocol: TCP

      port: 80

      targetPort: 80

  type: LoadBalancer

kubectl apply -f nginx-service.yaml

获取访问地址

minikube service nginx-service

滚动更新

修改镜像版本,Kubernetes会自动滚动更新:

kubectl set image deployment/nginx-demo nginx=nginx:1.25
kubectl rollout status deployment/nginx-demo

进阶功能

自动伸缩

Horizontal Pod Autoscaler(HPA)可根据CPU使用率自动调整副本数:

kubectl autoscale deployment nginx-demo --cpu-percent=50 --min=2 --max=10

配置管理

ConfigMap存储非敏感配置,Secret存储敏感数据(密码、密钥等):

apiVersion: v1

kind: ConfigMap

metadata:

  name: app-config

data:

  DB_HOST: "mysql-service"

  LOG_LEVEL: "info"

持久化存储

通过PersistentVolumeClaim(PVC)为Pod挂载持久化存储:



apiVersion: v1

kind: PersistentVolumeClaim

metadata:

  name: my-pvc

spec:

  accessModes:

    - ReadWriteOnce

  resources:

    requests:

      storage: 1Gi

生产环境注意事项 Q&A

Q:生产环境部署Kubernetes,控制平面节点需要几个?

A:至少3个,实现高可用。同时建议将etcd集群单独部署(与控制平面分离),避免控制平面负载影响etcd性能。

Q:如何保障集群安全?

A:两个关键措施:一是启用RBAC权限控制,限制不同用户的访问范围;二是定期轮换集群证书(默认1年有效期,需在过期前更新)。

Q:节点规格如何规划?

A:根据实际负载合理配置,通常控制平面节点配置需高于工作节点(建议4核8GB起步),工作节点根据业务需求弹性调整。

Q:etcd数据需要备份吗?

A:必须定期备份。etcd存储了集群所有配置和状态数据,丢失将导致集群无法恢复。

Q:不想自己管理控制平面怎么办?

A:使用云厂商托管Kubernetes服务:腾讯云TKE、阿里云ACK、AWS EKS等,免去运维控制平面的工作。

推荐的下一步学习计划与建议

Helm:Kubernetes的包管理器,管理复杂应用部署