【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 等资源,以便构建和维护应用。

相关推荐
栗豆包2 小时前
w179基于Java Web的流浪宠物管理系统的设计与实现
java·开发语言·spring boot·后端·spring·宠物
伟大的python程序员2 小时前
thinkphp6+swoole使用rabbitMq队列
后端·rabbitmq·swoole
组合缺一2 小时前
无耳科技 Solon v3.0.7 发布(2025农历新年版)
java·后端·科技·solon
QQ_7781329743 小时前
Elasticsearch中的度量聚合:深度解析与实战应用
elasticsearch·kubernetes
_Eden_4 小时前
Ansible入门学习之基础元素介绍
linux·学习·云原生
蔚一5 小时前
安装最小化的CentOS7后,执行yum命令报错Could not resolve host mirrorlist.centos.org; 未知的错误
java·linux·spring boot·后端·centos·intellij idea
羊小猪~~5 小时前
MYSQL学习笔记(五):单行函数(字符串、数学、日期时间、条件判断、信息、加密、进制转换函数)讲解
数据库·笔记·后端·sql·学习·mysql·考研
羊小猪~~6 小时前
MYSQL学习笔记(六):聚合函数、sql语句执行原理简要分析
java·数据库·c++·后端·sql·mysql·考研
十二同学啊6 小时前
Spring Boot WebMvcConfigurer:定制你的 Web 应用
前端·spring boot·后端
007php00713 小时前
在系统重构中的工作计划与总结
大数据·开发语言·人工智能·后端·重构·aigc·php