在 Kubernetes 中,YAML 文件用于定义各种资源对象的配置,包括 Pods、Deployments、Services 等。以下是一些常见 Kubernetes 资源对象的 YAML 文件示例及其详细介绍。
一、Pod
Pod 是 Kubernetes 中最基本的部署单位,通常包含一个或多个容器。
示例 YAML
apiVersion: v1
kind: Pod
metadata:name: my-podlabels:app: my-app
spec:containers:- name: my-containerimage: nginx:latestports:- containerPort: 80
解释
- apiVersion: 定义资源的 API 版本。
- kind: 资源类型,这里是 Pod。
- metadata: 包含资源的元数据,如名称和标签。
- spec: 资源的具体规格。
- containers: 定义 Pod 中的容器列表。
- name: 容器的名称。
- image: 使用的容器镜像。
- ports: 容器暴露的端口。
- containers: 定义 Pod 中的容器列表。
二、Deployment
Deployment 是用于管理 Pod 的高层抽象,支持版本控制和自动化更新。
示例 YAML
apiVersion: apps/v1
kind: Deployment
metadata:name: my-deployment
spec:replicas: 3selector:matchLabels:app: my-apptemplate:metadata:labels:app: my-appspec:containers:- name: my-containerimage: nginx:latestports:- 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: ClusterIPselector:app: my-appports:- protocol: TCPport: 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.comhttp:paths:- path: /pathType: Prefixbackend:service:name: my-serviceport:number: 80
解释
- apiVersion: 使用的 API 版本。
- kind: 资源类型,这里是 Ingress。
- metadata: 资源名称。
- spec: 资源的具体规格。
- rules: 定义访问规则。
- host: 访问的域名。
- http: HTTP 路由规则。
- paths: 路由路径和后端服务的映射。
- rules: 定义访问规则。
七、综合示例
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-applabels:app: my-app
spec:replicas: 3selector:matchLabels:app: my-apptemplate:metadata:labels:app: my-appspec:containers:- name: my-app-containerimage: my-app-image:latestports:- containerPort: 8080env:- name: DATABASE_URLvalueFrom:configMapKeyRef:name: app-configkey: DATABASE_URL- name: DB_PASSWORDvalueFrom:secretKeyRef:name: db-secretkey: password
4. Service
定义一个 Service,以便其他 Pod 和外部访问可以通过稳定的 IP 和 DNS 名称访问应用。
apiVersion: v1
kind: Service
metadata:name: my-app-service
spec:type: ClusterIPselector:app: my-appports:- protocol: TCPport: 80targetPort: 8080
5. Ingress
最后,定义一个 Ingress,以便将外部 HTTP 请求路由到 Service。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: my-app-ingressannotations:nginx.ingress.kubernetes.io/rewrite-target: /
spec:rules:- host: my-app.example.comhttp:paths:- path: /pathType: Prefixbackend:service:name: my-app-serviceport: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 中添加 livenessProbe 和 readinessProbe 来实现健康检查。此外,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-applabels:app: my-app
spec:replicas: 3selector:matchLabels:app: my-apptemplate:metadata:labels:app: my-appspec:containers:- name: my-app-containerimage: my-app-image:latestports:- containerPort: 8080env:- name: DATABASE_URLvalueFrom:configMapKeyRef:name: app-configkey: DATABASE_URL- name: DB_PASSWORDvalueFrom:secretKeyRef:name: db-secretkey: password# 添加健康检查livenessProbe:httpGet:path: /healthport: 8080initialDelaySeconds: 30periodSeconds: 10readinessProbe:httpGet:path: /readyport: 8080initialDelaySeconds: 15periodSeconds: 5
---
apiVersion: v1
kind: Service
metadata:name: my-app-service
spec:type: ClusterIPselector:app: my-appports:- protocol: TCPport: 80targetPort: 8080
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: my-app-ingressannotations:nginx.ingress.kubernetes.io/rewrite-target: /
spec:rules:- host: my-app.example.comhttp:paths:- path: /pathType: Prefixbackend:service:name: my-app-serviceport:number: 80
解释
1. Liveness Probe
- livenessProbe:用于检查容器是否仍在运行。如果健康检查失败,Kubernetes 会自动重启该容器。
- httpGet:使用 HTTP GET 请求检查容器的
/health
路径。 - initialDelaySeconds:在容器启动后等待 30 秒后开始执行检查。
- periodSeconds:每 10 秒执行一次健康检查。
- httpGet:使用 HTTP GET 请求检查容器的
2. Readiness Probe
- readinessProbe:用于检查容器是否准备好接收流量。如果检查失败,Kubernetes 将不向该 Pod 发送流量。
- httpGet:使用 HTTP GET 请求检查容器的
/ready
路径。 - initialDelaySeconds:在容器启动后等待 15 秒后开始执行检查。
- periodSeconds:每 5 秒执行一次准备检查。
- httpGet:使用 HTTP GET 请求检查容器的
自动重启机制
Kubernetes 默认会在容器状态为 CrashLoopBackOff
或其他失败状态时自动重启容器,因此不需要额外配置。
通过添加 liveness 和 readiness probes,可以增强应用在 Kubernetes 中的可靠性,确保只有健康的 Pod 接收流量,并在出现问题时自动重启容器。这使得应用在生产环境中更具韧性和稳定性。
总结
Kubernetes 的 YAML 文件用于定义和配置集群中的各种资源对象。了解这些资源及其配置方式是有效管理 Kubernetes 集群的基础。通过这些示例,可以创建和管理 Pods、Deployments、Services、ConfigMaps、Secrets 和 Ingress 等资源,以便构建和维护应用。