在 Kubernetes (K8s) 中,配置(或资源)主要是指用于定义和管理集群内的各种组件和服务的 YAML 或 JSON 文件。这些配置文件定义了 Kubernetes 资源对象的行为和属性。Kubernetes 中有许多类型的配置对象,每个类型的配置都有不同的功能和目的。
下面是常见的 Kubernetes 配置类型及其作用:
1. Pod
-
定义:Pod 是 Kubernetes 中最小的调度单位,通常包含一个或多个容器,容器共享网络和存储资源。
-
用途:用于运行单个应用或一组紧密相关的应用容器。
示例配置:
apiVersion: v1 kind: Pod metadata:name: mypod spec:containers:- name: mycontainerimage: myimage:latest
2. Deployment
-
定义:Deployment 用于管理一组 Pod 的副本,提供声明式的应用部署方式,可以进行滚动更新、扩容、缩容等操作。
-
用途:用来管理 Pod 的生命周期,确保指定数量的 Pod 始终在运行。
示例配置:
apiVersion: apps/v1 kind: Deployment metadata:name: myapp-deployment spec:replicas: 3selector:matchLabels:app: myapptemplate:metadata:labels:app: myappspec:containers:- name: myappimage: myapp-image:latest
3. Service
-
定义:Service 是一个稳定的访问入口,用于暴露一组 Pod 的应用服务,提供负载均衡和发现机制。
-
用途:用于外部访问或集群内部服务发现,将请求流量路由到正确的 Pod。
示例配置:
apiVersion: v1 kind: Service metadata:name: myapp-service spec:selector:app: myappports:- protocol: TCPport: 80targetPort: 8080
4. Ingress
-
定义:Ingress 是用于管理外部 HTTP/HTTPS 访问到集群服务的 API 资源,提供 HTTP 路由和负载均衡。
-
用途:用于配置外部访问流量的路由规则,通常与 Ingress Controller 配合使用。
示例配置:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata:name: myapp-ingress spec:rules:- host: myapp.example.comhttp:paths:- path: /pathType: Prefixbackend:service:name: myapp-serviceport:number: 80
5. ConfigMap
-
定义:ConfigMap 用于存储非敏感的配置信息,可以供应用容器使用。
-
用途:用来保存环境变量、配置文件等配置信息,容器可以通过挂载方式访问这些配置信息。
示例配置:
apiVersion: v1 kind: ConfigMap metadata:name: myapp-config data:MYAPP_ENV: productionMYAPP_LOG_LEVEL: debug
6. Secret
-
定义:Secret 用于存储敏感信息,如密码、令牌或证书。
-
用途:用来保护敏感数据,并且可以通过加密的方式存储和管理。
示例配置:
apiVersion: v1 kind: Secret metadata:name: myapp-secret type: Opaque data:password: cGFzc3dvcmQ= # base64 encoded "password"
7. PersistentVolume (PV)
-
定义:PersistentVolume 是集群中的一个存储资源对象,代表集群中的一块持久化存储空间。
-
用途:用于为应用提供持久化存储,可以挂载到 Pod 中。
示例配置:
apiVersion: v1 kind: PersistentVolume metadata:name: myapp-pv spec:capacity:storage: 10GiaccessModes:- ReadWriteOncehostPath:path: /mnt/data/myapp
8. PersistentVolumeClaim (PVC)
-
定义:PersistentVolumeClaim 是对 PersistentVolume 的请求,用户通过 PVC 来申请特定容量和访问模式的存储。
-
用途:应用通过 PVC 来请求并使用存储资源。
示例配置:
apiVersion: v1 kind: PersistentVolumeClaim metadata:name: myapp-pvc spec:accessModes:- ReadWriteOnceresources:requests:storage: 10Gi
9. StatefulSet
-
定义:StatefulSet 用于管理有状态应用的部署,提供唯一的网络标识、稳定的存储和有序部署等特性。
-
用途:适用于数据库、缓存等需要持久化状态和顺序启动的应用。
示例配置:
apiVersion: apps/v1 kind: StatefulSet metadata:name: mydb-statefulset spec:serviceName: "mydb"replicas: 3selector:matchLabels:app: mydbtemplate:metadata:labels:app: mydbspec:containers:- name: mydbimage: mydb-image:latestvolumeMounts:- name: mydb-storagemountPath: /data/dbvolumeClaimTemplates:- metadata:name: mydb-storagespec:accessModes:- ReadWriteOnceresources:requests:storage: 10Gi
10. Job
-
定义:Job 用于管理批处理任务的执行,确保任务成功执行一次。
-
用途:适用于需要执行一次性任务(例如数据库迁移或定时任务)并确保任务完成的场景。
示例配置:
apiVersion: batch/v1 kind: Job metadata:name: myapp-job spec:template:spec:containers:- name: myapp-jobimage: myapp-job-image:latestrestartPolicy: Never
11. CronJob
-
定义:CronJob 用于定期调度执行 Job,类似于 Linux 系统中的 cron。
-
用途:适用于定时执行任务,如备份、日志清理等。
示例配置:
apiVersion: batch/v1 kind: CronJob metadata:name: myapp-cronjob spec:schedule: "0 0 * * *" # 每天午夜执行jobTemplate:spec:template:spec:containers:- name: myapp-cronjobimage: myapp-cronjob-image:latestrestartPolicy: OnFailure
12. ReplicaSet
-
定义:ReplicaSet 确保指定数量的 Pod 实例在集群中始终运行。
-
用途:通常与 Deployment 一起使用,来保证有指定数量的副本 Pod 持续运行。
示例配置:
apiVersion: apps/v1 kind: ReplicaSet metadata:name: myapp-replicaset spec:replicas: 3selector:matchLabels:app: myapptemplate:metadata:labels:app: myappspec:containers:- name: myappimage: myapp-image:latest
13. Namespace
-
定义:Namespace 用于在 Kubernetes 中将资源隔离成不同的命名空间,使得同一集群内的多个团队或项目能够共享资源而不干扰。
-
用途:将集群资源进行隔离,便于组织和管理。
示例配置:
apiVersion: v1 kind: Namespace metadata:name: myapp-namespace
总结
Kubernetes 提供了丰富的资源对象来支持应用的部署、管理、扩展、监控和存储等需求。每种资源对象都有其独特的功能,帮助你在集群中实现不同的场景。常见的配置类型包括:
- Pod、Deployment、ReplicaSet:用于管理应用的容器和副本。
- Service、Ingress:用于暴露应用和服务发现。
- ConfigMap、Secret:用于配置和管理敏感信息。
- **Persistent
Volume、PersistentVolumeClaim、StatefulSet**:用于持久化存储和有状态应用。
- Job、CronJob:用于执行批处理任务或定时任务。
- Namespace:用于资源隔离和组织。
这些配置文件通常使用 YAML 格式定义,并通过 kubectl
命令行工具应用到 Kubernetes 集群中。