K8S

zy123
2025-09-08 /  0 评论 /  0 点赞 /  1 阅读 /  1239 字
最近更新于 09-08

Kubernetes (K8S)

Kubernetes 是一个开源的容器编排平台,用于自动化部署、扩缩容(Pod 数量多了/少了自动调整)和自愈(坏掉的 Pod 会被自动重建)

基本架构

一个 Kubernetes 集群 (Cluster) = 控制平面 + 工作节点 的组合。要使用K8S,要先搭建集群,deployment.yamlservice.yaml 要提交到 K8S 集群,由它调度和运行。

控制平面 (Control Plane)

负责管理整个集群,不直接跑应用。

组件 作用 比喻
API Server 接收命令(kubectl)、提供统一接口 前台服务员
etcd 存储集群所有状态(配置、Pod 列表等) 账本/数据库
Scheduler 决定 Pod 跑在哪个 Node 上 领班
Controller Manager 保证实际状态符合预期(补 Pod、重建失败的 Pod) 经理

工作节点 (Worker Nodes)

实际跑应用容器。

组件 作用
Kubelet 负责跟 API Server 沟通,并启动/管理容器
容器运行时 运行容器(Docker、containerd)
Kube-Proxy 管理网络规则,实现 Service 的负载均衡
graph TD
    A[控制平面] --> B[Node 1]
    A --> C[Node 2]
    A --> D[Node 3]
    B --> E[Pod]
    B --> F[Pod]
    C --> G[Pod]
    D --> H[Pod]

K8S 核心概念

Pod

  • 最小运行单元,一个 Pod 里可以有 1 个或多个容器。
  • 共享网络和存储空间

Deployment

  • 管 Pod 的「副本数」和「版本」。
  • 支持滚动更新、回滚

Service

  • 提供稳定的网络入口(因为 Pod IP 会变)。
  • 负载均衡到一组 Pod。

ConfigMap & Secret

  • ConfigMap:存储配置信息(非敏感)。
  • Secret:存储敏感信息(密码、Token),会加密。

基本使用方式

Deployment(定义 Pod 模板 + 副本数)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 3   # 要 3 个 Pod
  selector:
    matchLabels:
      app: my-app
  template:     # Pod 模板
    metadata:
      labels:
        app: my-app  #给 Pod 打标签,Service 用 selector 找到这些 Pod 做负载均衡
    spec:
      containers:
      - name: my-app	#Pod名
        image: my-registry/my-app:v1  # ← 指向 CI 推送后的镜像(仓库/名称:标签)
        ports: 
        - containerPort: 8080  #容器对外提供服务的端口

Pod名可能是:my-app-6f7c9d7c5d-abcde,它里面的容器名:my-app

映射关系:

  • kind: Deployment → 创建一个「Pod 管理器」
  • replicas: 3 → 保证始终有 3 个 Pod
  • template → Pod 的样子(运行哪个镜像、开哪个端口)

Service(提供统一访问入口)

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: my-app   # 找到所有带 app=my-app 标签的 Pod
  ports:
    - port: 80        # Service 入口端口
      targetPort: 8080  # Pod 里容器的端口
  type: LoadBalancer  # 暴露给外部访问

映射关系:

  • selector → 绑定到 Deployment 创建的 Pod,根据 Pod 的标签(my-app)
  • ports → 用户访问 80 端口,会转发到 Pod 的 8080
  • type: LoadBalancer → 提供一个外部 IP 供用户访问

典型工作流程

sequenceDiagram
    开发者->>Git: 提交代码
    Git->>CI/CD: 触发构建
    CI/CD->>镜像仓库: 构建Docker镜像
    CI/CD->>K8S: kubectl apply
    K8S->>K8S: 创建/更新Pod
    K8S->>K8S: 健康检查
    K8S->>用户: 服务可用
sequenceDiagram
    开发者->>API Server: kubectl apply -f xxx.yaml
    API Server->>etcd: 写入期望状态
    API Server->>Scheduler: 请求调度
    Scheduler->>Node: 分配 Pod 到合适的节点
    Node->>Kubelet: 启动容器
    Controller Manager->>Cluster: 监控状态并修复
    Service->>用户: 提供统一访问入口

👉 过程总结:

  1. 提交 YAML → API Server 接收并存到 etcd。
  2. Scheduler 决定 Pod 去哪个 Node。
  3. Node 上的 Kubelet 把容器启动。
  4. Controller Manager 盯着数量,缺了就补。
  5. Service 统一出口,用户不用关心 Pod IP。

常用操作

前提是1:集群必须已经搭好(minikube/kind/k3s/云厂商的 K8S)。

2:kubectl 已经配置好 kubeconfig

3:镜像能拉取到

  • 如果是公有镜像(比如 Docker Hub),直接写就行。
  • 如果是私有仓库,需要配 imagePullSecrets
# 部署应用
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml

# 查看集群资源
kubectl get pods -o wide
kubectl get deployments
kubectl get services

# 扩缩容
kubectl scale deployment/my-app --replicas=5

# 滚动更新
kubectl set image deployment/my-app my-app=my-registry/my-app:v2

# 回滚
kubectl rollout undo deployment/my-app
© 版权声明
THE END
喜欢就支持一下吧
点赞 0 分享 收藏
评论 抢沙发
取消