0


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

在这里插入图片描述

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

一、Pod

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

示例 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

apiVersion: apps/v1
kind: Deployment
metadata:name: my-deployment
spec:replicas:3selector: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

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

解释

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

四、ConfigMap

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

示例 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

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

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 来存储应用的配置信息。

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

2. Secret

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

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

3. Deployment

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

apiVersion: apps/v1
kind: Deployment
metadata:name: my-app
  labels:app: my-app
spec:replicas:3selector:matchLabels:app: my-app
  template:metadata:labels:app: my-app
    spec:containers:-name: my-app-container
        image: my-app-image:latest
        ports:-containerPort:8080env:-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 名称访问应用。

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

5. Ingress

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

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

文件):

kubectl apply -f k8s-setup.yaml

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

八、 健康检查和自动重启机制完整 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:3selector:matchLabels:app: my-app
  template:metadata:labels:app: my-app
    spec:containers:-name: my-app-container
        image: my-app-image:latest
        ports:-containerPort:8080env:-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:8080initialDelaySeconds:30periodSeconds:10readinessProbe:httpGet:path: /ready
            port:8080initialDelaySeconds:15periodSeconds:5---apiVersion: v1
kind: Service
metadata:name: my-app-service
spec:type: ClusterIP
  selector:app: my-app
  ports:-protocol: TCP
    port:80targetPort: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 等资源,以便构建和维护应用。


本文转载自: https://blog.csdn.net/weixin_36755535/article/details/144377814
版权归原作者 颜淡慕潇 所有, 如有侵权,请联系我们删除。

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

还没有评论