2. Kubernetes 基础回顾:Pod、Deployment、Service、Namespace 核心概念与 YAML 声明式配置
在深入 Argo CD 与镜像供应链安全之前,必须牢固掌握 Kubernetes 的四大核心抽象:Pod、Deployment、Service 和 Namespace。它们是所有工作负载与网络策略的基石,也是 Argo CD 进行应用编排与同步的直接操作对象。本节将围绕这四个概念,结合 YAML 声明式配置,建立后续章节所需的统一语境。
2.1 核心概念速览
| 概念 | 作用层级 | 核心职责 | 生命周期 |
|---|---|---|---|
| Pod | 工作负载最小单元 | 运行一个或多个容器,共享网络/IP 与存储卷 | 临时性,可被销毁重建 |
| Deployment | 工作负载控制器 | 声明式管理 Pod 副本、滚动更新、回滚 | 持久,通过 ReplicaSet 驱动 |
| Service | 网络抽象层 | 提供稳定的虚拟 IP 与 DNS,负载均衡到 Pod | 持久,与 Pod 解耦 |
| Namespace | 多租户隔离边界 | 资源分组、权限隔离、配额管理 | 持久,逻辑划分 |
2.2 Pod:不可变的最小部署单元
Pod 是 Kubernetes 中可创建和管理的、最小的可部署计算单元。一个 Pod 可以包含一个或多个容器,这些容器共享同一个网络命名空间、IP 地址和存储卷。在镜像供应链安全场景中,Pod 的 image 字段是安全扫描与策略准入的直接目标。
apiVersion: v1
kind: Pod
metadata:
name: secure-app-pod
labels:
app: secure-app
version: v1.0.0
spec:
containers:
- name: app
image: registry.example.com/secure-app:1.0.0
ports:
- containerPort: 8080
resources:
requests:
memory: "256Mi"
cpu: "250m"
limits:
memory: "512Mi"
cpu: "500m"
securityContext:
runAsNonRoot: true
allowPrivilegeEscalation: false
imagePullSecrets:
- name: regcred
securityContext,禁止特权容器。Argo CD 可以通过配置策略(如 Cilium NetworkPolicy 或 OPA Gatekeeper)强制校验这些字段。
2.3 Deployment:声明式副本管理与滚动更新
Deployment 是 Kubernetes 中最常用的工作负载控制器。它通过 ReplicaSet 管理 Pod 的期望副本数,并支持声明式的滚动更新、暂停、恢复与回滚。Argo CD 在同步 Deployment 时,会直接比对 Git 仓库中的 YAML 与集群中的实时状态,自动触发更新。
apiVersion: apps/v1
kind: Deployment
metadata:
name: secure-app-deployment
labels:
app: secure-app
spec:
replicas: 3
selector:
matchLabels:
app: secure-app
template:
metadata:
labels:
app: secure-app
version: v1.0.0
spec:
containers:
- name: app
image: registry.example.com/secure-app:1.0.0
ports:
- containerPort: 8080
livenessProbe:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 5
periodSeconds: 10
readinessProbe:
httpGet:
path: /ready
port: 8080
initialDelaySeconds: 3
periodSeconds: 5
imagePullSecrets:
- name: regcred
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
maxSurge: 1
spec.template.spec.containers[].image 是镜像供应链安全策略的核心校验字段。Argo CD 可以通过 PreSync 钩子或外部准入控制器(如 Kyverno)在同步前验证镜像签名与漏洞等级。
2.4 Service:稳定的网络访问入口
Service 为一组动态变化的 Pod 提供稳定的网络端点。它通过标签选择器绑定 Pod,并提供 ClusterIP(集群内访问)、NodePort(节点端口映射)、LoadBalancer(云负载均衡)三种主要类型。在微服务架构中,Service 是服务间通信的 DNS 名称基础。
apiVersion: v1
kind: Service
metadata:
name: secure-app-service
labels:
app: secure-app
spec:
type: ClusterIP
selector:
app: secure-app
ports:
- protocol: TCP
port: 80
targetPort: 8080
name: http
2.5 Namespace:多租户隔离与资源配额
Namespace 是 Kubernetes 实现多租户隔离的核心机制。它将集群内的资源划分为逻辑分组,每个 Namespace 拥有独立的资源配额(ResourceQuota)、权限控制(RBAC)和网络策略作用域。在镜像供应链安全场景中,通常为不同环境(dev、staging、prod)或不同团队分配独立的 Namespace。
apiVersion: v1
kind: Namespace
metadata:
name: production
labels:
environment: prod
team: platform
---
apiVersion: v1
kind: ResourceQuota
metadata:
name: prod-quota
namespace: production
spec:
hard:
requests.cpu: "10"
requests.memory: "20Gi"
limits.cpu: "20"
limits.memory: "40Gi"
pods: "50"
PodSecurityPolicy 或 Pod Security Admission,禁止特权容器与 hostPath 挂载。Argo CD 可以通过 ApplicationSet 为每个 Namespace 自动生成对应的安全策略 YAML。
2.6 四者协作关系:YAML 声明式配置全景
下图展示了 Pod、Deployment、Service 与 Namespace 在集群中的协作关系。Argo CD 通过 Git 仓库中的 YAML 文件,统一管理这四个层次的资源声明。
2.7 YAML 声明式配置最佳实践
- 版本化与标签化: 所有资源必须包含
app、version、environment标签,便于 Argo CD 的 ApplicationSet 进行动态选择。 - 资源配额显式声明: 每个 Deployment 必须设置
resources.requests与resources.limits,避免资源争抢与安全风险。 - 镜像地址不可变: 使用包含完整 registry 路径与 digest(SHA256)的镜像地址,确保供应链可追溯。
- 安全上下文下沉: 在 Pod 级别设置
securityContext,而非依赖集群默认值。 - Namespace 隔离: 不同环境使用不同 Namespace,并通过 ResourceQuota 与 NetworkPolicy 实施边界。