【K8S系列】Kubernetes 资源对象的 YAML 文件示例及其详细介绍

在 Kubernetes 中,YAML 文件用于定义各种资源对象的配置,包括 Pods、Deployments、Services 等。以下是一些常见 Kubernetes 资源对象的 YAML 文件示例及其详细介绍。

一、Pod

Pod 是 Kubernetes 中最基本的部署单位,通常包含一个或多个容器。

示例 YAML

yaml 复制代码
apiVersion: v1
kind: Pod
metadata:
  name: my-pod
  labels:
    app: my-app
spec:
  containers:
  - name: my-container
    image: nginx:latest
    ports:
    - containerPort: 80

解释

  • apiVersion: 定义资源的 API 版本。
  • kind: 资源类型,这里是 Pod。
  • metadata: 包含资源的元数据,如名称和标签。
  • spec : 资源的具体规格。
    • containers : 定义 Pod 中的容器列表。
      • name: 容器的名称。
      • image: 使用的容器镜像。
      • ports: 容器暴露的端口。

二、Deployment

Deployment 是用于管理 Pod 的高层抽象,支持版本控制和自动化更新。

示例 YAML

yaml 复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-container
        image: nginx:latest
        ports:
        - containerPort: 80

解释

  • apiVersion : 这里是 apps/v1,表明使用的 API 版本。
  • kind: 资源类型,这里是 Deployment。
  • metadata: 资源的名称。
  • spec : 资源的具体规格。
    • replicas: Pod 的副本数量。
    • selector: 用于选择管理的 Pod。
    • template: Pod 的模板,定义了 Pod 的元数据和规范。

三、Service

Service 用于定义 Pod 的访问策略,提供负载均衡。

示例 YAML

yaml 复制代码
apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  type: ClusterIP
  selector:
    app: my-app
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

解释

  • apiVersion: 资源的 API 版本。
  • kind: 资源类型,这里是 Service。
  • metadata: 资源名称。
  • spec : 资源的具体规格。
    • type: Service 的类型(如 ClusterIP、NodePort、LoadBalancer)。
    • selector: 用于选择与 Service 关联的 Pod。
    • ports : 定义服务的端口映射。
      • protocol: 使用的协议。
      • port: Service 的端口。
      • targetPort: Pod 的端口。

四、ConfigMap

ConfigMap 用于存储非机密的配置信息。

示例 YAML

yaml 复制代码
apiVersion: v1
kind: ConfigMap
metadata:
  name: my-config
data:
  DATABASE_URL: "mysql://user:password@hostname:3306/dbname"
  APP_MODE: "production"

解释

  • apiVersion: 资源的 API 版本。
  • kind: 资源类型,这里是 ConfigMap。
  • metadata: 资源名称。
  • data: 存储的键值对数据。

五、Secret

Secret 用于存储敏感信息,如密码和令牌。

示例 YAML

yaml 复制代码
apiVersion: v1
kind: Secret
metadata:
  name: my-secret
type: Opaque
data:
  password: cGFzc3dvcmQ=  # base64 编码的密码

解释

  • apiVersion: 资源的 API 版本。
  • kind: 资源类型,这里是 Secret。
  • metadata: 资源名称。
  • type : Secret 的类型,Opaque 是默认值。
  • data: 存储的键值对数据,值需要进行 base64 编码。

六、Ingress

Ingress 管理外部 HTTP/S 访问到服务。

示例 YAML

yaml 复制代码
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress
spec:
  rules:
  - host: my-app.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: my-service
            port:
              number: 80

解释

  • apiVersion: 使用的 API 版本。
  • kind: 资源类型,这里是 Ingress。
  • metadata: 资源名称。
  • spec : 资源的具体规格。
    • rules : 定义访问规则。
      • host: 访问的域名。
      • http : HTTP 路由规则。
        • paths: 路由路径和后端服务的映射。

七、综合示例

1. ConfigMap

首先,我们定义一个 ConfigMap 来存储应用的配置信息。

yaml 复制代码
apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  DATABASE_URL: "mysql://user:password@hostname:3306/dbname"
  APP_MODE: "production"

2. Secret

然后,我们定义一个 Secret 来存储敏感信息,如数据库密码。

yaml 复制代码
apiVersion: v1
kind: Secret
metadata:
  name: db-secret
type: Opaque
data:
  password: cGFzc3dvcmQ=  # base64 编码的密码

3. Deployment

接下来,定义一个 Deployment 来管理应用的 Pod,使用 ConfigMap 和 Secret。

yaml 复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
  labels:
    app: my-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-app-container
        image: my-app-image:latest
        ports:
        - containerPort: 8080
        env:
        - name: DATABASE_URL
          valueFrom:
            configMapKeyRef:
              name: app-config
              key: DATABASE_URL
        - name: DB_PASSWORD
          valueFrom:
            secretKeyRef:
              name: db-secret
              key: password

4. Service

定义一个 Service,以便其他 Pod 和外部访问可以通过稳定的 IP 和 DNS 名称访问应用。

yaml 复制代码
apiVersion: v1
kind: Service
metadata:
  name: my-app-service
spec:
  type: ClusterIP
  selector:
    app: my-app
  ports:
  - protocol: TCP
    port: 80
    targetPort: 8080

5. Ingress

最后,定义一个 Ingress,以便将外部 HTTP 请求路由到 Service。

yaml 复制代码
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-app-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: my-app.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: my-app-service
            port:
              number: 80

解释

ConfigMap

  • ConfigMap 用于存储应用的配置信息。这里定义了数据库连接字符串和应用模式。

Secret

  • Secret 用于存储敏感信息。密码以 base64 编码的形式存储,以提供安全性。

Deployment

  • Deployment 定义了应用的 Pods。设置了副本数量为 3,以确保高可用性。
  • 使用 env 字段引用 ConfigMap 和 Secret 中的值。
    • DATABASE_URL 从 ConfigMap 中获取。
    • DB_PASSWORD 从 Secret 中获取。

Service

  • Service 将 Pods 暴露为一个网络服务,以便其他 Pods 或外部客户端可以通过服务名称访问应用。
  • Service 类型为 ClusterIP,表示只在集群内部可访问。

Ingress

  • Ingress 负责管理外部 HTTP/S 流量的路由。
  • 使用 rules 定义了基于主机名的路由规则。
  • 通过注解配置 NGINX Ingress 控制器的重写目标。

组合部署

将所有这些资源组合在一起后,您可以使用以下命令一次性创建它们(假设您将它们保存为 k8s-setup.yaml 文件):

bash 复制代码
kubectl apply -f k8s-setup.yaml

当然可以!在 Kubernetes 中,您可以通过在 Deployment 中添加 livenessProbereadinessProbe 来实现健康检查。此外,Kubernetes 默认会在 Pod 失败时自动重启容器,这是一种基本的自我修复机制。

八、 健康检查和自动重启机制完整 YAML 示例

以下是包含健康检查和自动重启机制的完整 YAML 示例:

yaml 复制代码
apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  DATABASE_URL: "mysql://user:password@hostname:3306/dbname"
  APP_MODE: "production"
---
apiVersion: v1
kind: Secret
metadata:
  name: db-secret
type: Opaque
data:
  password: cGFzc3dvcmQ=  # base64 编码的密码
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
  labels:
    app: my-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-app-container
        image: my-app-image:latest
        ports:
        - containerPort: 8080
        env:
        - name: DATABASE_URL
          valueFrom:
            configMapKeyRef:
              name: app-config
              key: DATABASE_URL
        - name: DB_PASSWORD
          valueFrom:
            secretKeyRef:
              name: db-secret
              key: password
        # 添加健康检查
        livenessProbe:
          httpGet:
            path: /health
            port: 8080
          initialDelaySeconds: 30
          periodSeconds: 10
        readinessProbe:
          httpGet:
            path: /ready
            port: 8080
          initialDelaySeconds: 15
          periodSeconds: 5
---
apiVersion: v1
kind: Service
metadata:
  name: my-app-service
spec:
  type: ClusterIP
  selector:
    app: my-app
  ports:
  - protocol: TCP
    port: 80
    targetPort: 8080
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-app-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: my-app.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: my-app-service
            port:
              number: 80

解释

1. Liveness Probe
  • livenessProbe :用于检查容器是否仍在运行。如果健康检查失败,Kubernetes 会自动重启该容器。
    • httpGet :使用 HTTP GET 请求检查容器的 /health 路径。
    • initialDelaySeconds:在容器启动后等待 30 秒后开始执行检查。
    • periodSeconds:每 10 秒执行一次健康检查。
2. Readiness Probe
  • readinessProbe :用于检查容器是否准备好接收流量。如果检查失败,Kubernetes 将不向该 Pod 发送流量。
    • httpGet :使用 HTTP GET 请求检查容器的 /ready 路径。
    • initialDelaySeconds:在容器启动后等待 15 秒后开始执行检查。
    • periodSeconds:每 5 秒执行一次准备检查。

自动重启机制

Kubernetes 默认会在容器状态为 CrashLoopBackOff 或其他失败状态时自动重启容器,因此不需要额外配置。

通过添加 liveness 和 readiness probes,可以增强应用在 Kubernetes 中的可靠性,确保只有健康的 Pod 接收流量,并在出现问题时自动重启容器。这使得应用在生产环境中更具韧性和稳定性。

总结

Kubernetes 的 YAML 文件用于定义和配置集群中的各种资源对象。了解这些资源及其配置方式是有效管理 Kubernetes 集群的基础。通过这些示例,可以创建和管理 Pods、Deployments、Services、ConfigMaps、Secrets 和 Ingress 等资源,以便构建和维护应用。

相关推荐
止语Lab1 小时前
好的 DX 不等于少写代码——三种语言的摩擦力设计课
后端
吃饱了得干活1 小时前
别再手动解析 LLM 输出了!LangChain 四种结构化输出方案对比
后端·python·langchain
程序员天天困1 小时前
Arthas trace 命令怎么用?一行定位最慢那行代码
jvm·后端
Huiturn1 小时前
GPT 5.6 连续编码 10 小时,纯 Python 啃下 Word 二进制格式——doc2docx 实现拆解
后端
用户298698530141 小时前
Python 实现 Excel 与 Markdown 互转的实用指南
后端·python·excel
用户77283104908401 小时前
krono-job:零侵入、单二进制交付的分布式任务调度平台(开源)
后端
Conan在掘金1 小时前
鸿蒙报错速查:Function lacks ending return statement,返回路径漏 return 就炸,根因 + 真解法
后端
人间凡尔赛2 小时前
AI-Native 云原生架构:2026 年从容器编排到智能体编排的范式革命
后端·云原生·架构
成为你的宁宁2 小时前
【K8s HPA 水平扩缩容】
kubernetes·hpa
IT_陈寒2 小时前
Vue的响应式让我加班到凌晨3点,原来问题出在这
前端·人工智能·后端