Kubernetes 配置、存储、角色与访问控制
一、配置管理(Config)
1. ConfigMap
-
作用:存储非敏感的配置数据(如环境变量、命令行参数、配置文件)。
-
使用场景:应用配置(如数据库URL、日志级别)、动态参数注入。
-
创建方式:
apiVersion: v1 kind: ConfigMap metadata: name: app-config data: log_level: "info" config.json: | { "db_url": "mysql://db:3306" }
-
使用方式:
-
环境变量注入:
envFrom: - configMapRef: name: app-config
-
挂载为Volume:
volumes: - name: config-volume configMap: name: app-config
-
2. Secret
-
作用:存储敏感数据(如密码、令牌、密钥),Base64编码(非加密)。
-
类型:
Opaque
(通用)、docker-registry
、tls
等。 -
示例:
apiVersion: v1 kind: Secret metadata: name: db-secret type: Opaque data: username: YWRtaW4= # base64编码 password: MWYyZDFlMmU=
-
使用方式:
-
环境变量:
env: - name: DB_PASSWORD valueFrom: secretKeyRef: name: db-secret key: password
-
Volume挂载:
volumes: - name: secret-volume secret: secretName: db-secret
-
总结:
- ConfigMap:非敏感配置,支持动态更新(需Pod重启或使用Sidecar监听)。
- Secret:敏感数据,Base64编码,需结合RBAC控制访问权限。
二、存储管理(Storage)
1. Volume
- 作用:为Pod提供临时或持久化存储,生命周期与Pod一致。
- 常见类型:
emptyDir
:临时目录,Pod删除时数据丢失。hostPath
:挂载节点文件系统(仅单节点测试用)。nfs
、cephfs
:网络存储。
2. PersistentVolume (PV) & PersistentVolumeClaim (PVC)
-
PV:集群级别的存储资源(如NFS、EBS、Azure Disk)。
apiVersion: v1 kind: PersistentVolume metadata: name: pv-nfs spec: capacity: storage: 10Gi accessModes: - ReadWriteMany nfs: path: /data server: nfs-server
-
PVC:用户对PV的请求,绑定到Pod。
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-app spec: accessModes: - ReadWriteMany resources: requests: storage: 5Gi
-
Pod中使用PVC:
volumes: - name: data-volume persistentVolumeClaim: claimName: pvc-app
3. StorageClass
-
作用:动态创建PV(按需分配存储)。
-
示例(AWS EBS):
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: ebs-sc provisioner: kubernetes.io/aws-ebs parameters: type: gp2
总结:
- 临时存储:
emptyDir
、hostPath
。 - 持久化存储:PV/PVC(静态)或StorageClass(动态)。
- 最佳实践:使用PVC抽象存储细节,避免Pod直接依赖PV。
三、角色与访问控制(RBAC)
1. 核心概念
- Role:命名空间内的权限规则。
- ClusterRole:集群范围的权限规则。
- RoleBinding:将Role绑定到用户/组/ServiceAccount(命名空间内)。
- ClusterRoleBinding:将ClusterRole绑定到全局实体。
区分集群级别还是命令空间级别的方法:
- 看 Kind:
- 带
Cluster
前缀的(如ClusterRole
)是集群级别。 - 不带前缀的(如
Role
)是命名空间级别。
- 带
- 看 YAML:
- 有
metadata.namespace
字段 → 命名空间级别。 - 无
namespace
字段 → 集群级别。
- 有
- 看权限:
- 如果规则中包含
nodes
、pv
等集群资源 → 必须用ClusterRole
。
- 如果规则中包含
2. 示例
-
定义Role:
apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: namespace: default name: pod-reader rules: - apiGroups: [""] resources: ["pods"] verbs: ["get", "watch", "list"]
-
绑定到ServiceAccount:
apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: read-pods namespace: default subjects: - kind: ServiceAccount name: app-sa namespace: default roleRef: kind: Role name: pod-reader apiGroup: rbac.authorization.k8s.io
3. 常用命令
- 检查权限:
kubectl auth can-i create pods --as=system:serviceaccount:default:app-sa
总结:
- 最小权限原则:仅授予必要的权限。
- ServiceAccount:为Pod分配身份,结合RBAC控制访问。
四、对比与关联
类别 | 核心资源 | 关键点 |
---|---|---|
配置 | ConfigMap, Secret | 区分敏感/非敏感数据,支持动态注入 |
存储 | PV/PVC, StorageClass | 解耦Pod与存储细节,支持动态供给 |
角色 | Role, RoleBinding | 遵循最小权限,通过ServiceAccount绑定 |
评论需开启科学上网!