一、核心架构:大脑与肌肉的分工

Kubernetes集群采用经典的主从架构,您可以将其理解为一个高效的现代化公司。

  • 控制平面:公司的“大脑”

    它负责做出所有决策,管理集群的期望状态,通常由一个或多个Master节点组成。核心组件包括:

    • kube-apiserver:集群的统一入口。所有内部组件、用户指令(kubectl)都必须通过它来与集群交互,它负责认证、授权和校验请求。

    • etcd:集群的配置数据库。一个高可用的键值存储,持久化保存着整个集群的所有关键数据(如有哪些Pod、Service等),是集群状态的唯一真相源。

    • kube-scheduler调度专员。监视新创建的Pod,并根据资源需求、策略等,为它们选择一个最合适的工作节点运行。

    • kube-controller-manager运维监控中心。内部运行着多种控制器(如Node Controller, Deployment Controller),持续对比“当前状态”与“期望状态”,发现偏差(如Pod副本数不足)就驱动集群恢复到期望状态。

    • cloud-controller-manager:与特定云服务商(如AWS、阿里云)交互的接口人,用于管理负载均衡器、存储卷等云资源。

  • 工作节点:公司的“肌肉”

    它们负责执行“大脑”下达的任务,是实际运行业务容器的地方,也称为Worker节点Node。每个节点上运行着:

    • kubelet:节点的现场管理员。负责与kube-apiserver保持通信,管理本节点上Pod的生命周期(创建、停止容器等),并报告节点和Pod的状态。

    • kube-proxy:节点的网络代理。维护节点上的网络规则,实现Service的负载均衡,让Pod之间、外部与Pod之间能够网络通信。

    • 容器运行时容器引擎。负责真正从镜像运行起容器,例如containerdCRI-O

工作节点上最核心的组件就是 kubelet,当然还有底层的容器运行时,比如 Docker,其中 kubelet 就是主要来实现和底层的容器运行时进行通信的,这个通信的过程也被 Kubernetes 抽象成了一个 CRI(Container Runtime Interface)的远程调用接口,这个接口里面定义了容器运行时的所有标准操作,比如创建容器、删除容器等等。所以对于 Kubernetes 来说他根本不关心你部署的到底是什么容器运行时,只要你这个容器运行时可以实现 CRI 接口就可以被 Kubernetes 来管理。

二、核心概念与资源:您需要管理的对象

在Kubernetes中,一切都被抽象为资源,您通过编写YAML或JSON文件(称为“清单”)来声明这些资源的期望状态。

资源类型角色与作用运维关注点
Pod最小的可部署单元,像一个“信封”,包含一个或多个紧密关联、共享资源的容器通常不直接部署裸Pod,而是通过控制器管理
Deployment无状态应用的管家。定义Pod的副本数、更新策略(滚动更新),并提供一键回滚能力,是最常用的控制器滚动更新策略、健康检查、资源限制
StatefulSet有状态应用(如MySQL、Redis集群)的管家。为Pod提供稳定的标识符、有序部署和独立的持久化存储顺序性、稳定的网络标识、持久卷绑定
DaemonSet确保每个节点(或符合条件的节点)都运行一个Pod副本,常用于日志收集(如Fluentd)、节点监控(如Node Exporter)节点亲和性、资源消耗
Service服务的稳定访问入口。为一组功能相同的Pod(通常由Deployment管理)提供一个固定的虚拟IP(ClusterIP)和DNS名,并负责负载均衡类型(ClusterIP/NodePort/LoadBalancer)、服务发现
ConfigMap & Secret实现配置与程序分离。ConfigMap存储普通配置(如配置文件),Secret存储敏感信息(如密码)。它们可以被挂载到Pod中作为文件或环境变量使用ConfigMap/Secret的更新与热加载、Secret的加密
PersistentVolume (PV) & PersistentVolumeClaim (PVC)持久化存储方案。PV是管理员准备的存储资源,PVC是Pod对存储的申请。Pod通过PVC使用PV,从而实现数据持久化存储类别(StorageClass)、访问模式、回收策略
Namespace集群内部的虚拟隔离空间。用于将集群资源分配给不同的租户、环境(如dev, prod)或项目,实现逻辑隔离资源配额(ResourceQuota)、网络策略

三、常用kubectl命令

功能

命令示例

说明
应用配置kubectl apply -f nginx-deployment.yaml创建或更新资源

查看资源​

kubectl get pods -n <namespace>查看Pod列表

kubectl get deployments,svc

同时查看Deployment和Service
排查问题kubectl describe pod <pod-name>查看Pod的详细事件和状态
kubectl logs <pod-name> -c <container-name>查看容器日志
kubectl exec -it <pod-name> -- /bin/sh进入容器内部调试
管理发布kubectl rollout status deployment/nginx-deployment查看滚动更新状态
kubectl rollout undo deployment/nginx-deployment回滚到上一个版本

四、资源配置实战:从YAML到命令

编写YAML清单:一个简单的Deployment示例,它部署了一个Nginx应用,并包含了ConfigMap和Secret的使用雏形。

# 定义一个ConfigMap,存储nginx配置
apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-config
data:
  nginx.conf: |
    server {
        listen 80;
        server_name localhost;
        location / {
            root /usr/share/nginx/html;
            index index.html;
        }
    }
---
# 定义一个Secret,存储一个密码(示例,实际需用base64编码)
apiVersion: v1
kind: Secret
metadata:
  name: my-secret
type: Opaque
data:
  # 示例密码 "123456",实际命令:echo -n "123456" | base64
  password: MTIzNDU2
---
# 部署应用的核心:Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3  # 期望维持3个Pod副本
  selector:
    matchLabels:
      app: nginx
  template:  # 这里定义Pod模板
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx-container
        image: nginx:1.25
        ports:
        - containerPort: 80
        # 将ConfigMap中的配置作为文件挂载到容器内
        volumeMounts:
        - name: config-volume
          mountPath: /etc/nginx/conf.d/
        # 将Secret中的密码作为环境变量注入
        env:
        - name: SECRET_PASSWORD
          valueFrom:
            secretKeyRef:
              name: my-secret
              key: password
      volumes:
      - name: config-volume
        configMap:
          name: nginx-config
---
# 创建一个Service,暴露Nginx服务供集群内部访问
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx  # 选择标签为app=nginx的Pod
  ports:
    - protocol: TCP
      port: 80  # Service的端口
      targetPort: 80  # Pod的端口
  type: ClusterIP

更多推荐