标签搜索

Kubemetes存储(元数据)

cicaba
2025-07-14 / 0 评论 / 2 阅读 / 正在检测是否收录...

存储分类

元数据
◆configMap:用于保存配置数据(明文)
◆Secret:用于保存敏感性数据(编码)
◆Downward API:容器在运行时从 Kubernetes API服务器获取有关它们自身的信息

真实数据
◆Volume:用于存储临时或者持久性数据
◆PersistentVolume:申请制的持久化存储

configMap:

  1. 通过文件创建:kubectl create configmap --from-file=file.suffix
    如果文件中以key=value,那么文件名将作为key,,文件内容将作为value。
    kubectl create configmap --from-file=file.suffix 可作为环境变量。
  2. 通过命令创建:kubectl create configmap literal-config --from-literal=name=dave --from-literal=password=pass
    以key=value的形式创建。

在pad中使用configMap作为环境变量:
方法 1:envFrom(一次性导入所有键值):

apiVersion: v1
kind: Pod
metadata:
  name: demo-pod
spec:
  containers:
    - name: demo-container
      image: nginx
      envFrom:
        - configMapRef:
            name: my-config

方法 2:env(按键导入)

apiVersion: v1
kind: Pod
metadata:
  name: demo-pod
spec:
  containers:
    - name: demo-container
      image: nginx
      env:
        - name: APP_MODE
          valueFrom:
            configMapKeyRef:
              name: my-config
              key: APP_MODE

在 Pod 中以Volume挂载ConfigMap,会将configMap中的key作为文件名,value作为文件内容。

---
apiVersion: v1
kind: Pod
metadata:
  name: configmap-volume-pod
spec:
  containers:
    - name: my-container
      image: busybox
      command: ["sleep", "3600"]
      volumeMounts:
        - name: config-volume
          mountPath: /etc/config  # 挂载路径
  volumes:
    - name: config-volume
      configMap:
        name: my-config

configMap更新不会触发pad更新,可以通过修改pod annotations的方式强制触发更新。

kubectl patch deployment nginx-test --patch '{"spec": {"template":{"metadata":{"annotations":{"version/config":"66666666"}}}}}'

更新 ConfigMap 后:
使用该 ConfigMap 挂载的 Env 不会同步更新
使用该 ConfigMap 挂载的 Volume 中的数据需要一段时间(实测大概10秒)才能同步更新
环境变量是 Pod 启动时 从 ConfigMap 读取一次的,之后不会变。
所以必须 重建 Pod 才能重新读取最新值。
滚动更新(无论是 patch annotation 还是 kubectl rollout restart)都会让 Deployment 逐个替换 Pod,新的 Pod 会拿到更新后的环境变量值。

Secret

Secret在使用时需要进行bash64编码,因为 Pod 使用 Secret 挂载成环境变量或文件卷时,Kubelet 会自动进行 Base64 解码,容器内部拿到的就是原始值。

# 编码
echo -n "admin" | base64
# 解码
echo -n "YWRtaW4=" | base64 --decode

Kubernetes 通过仅仅将 Secret 分发到需要访问 Secret 的 Pod 所在的机器节点来保障其安全性。
Secret 只会存储在节点的内存中,永不写入物理存储,这样从节点删除 secret 时就不需要擦除磁盘数据。

创建:

apiVersion: v1
kind: Secret
metadata:
  name: my-secret
type: Opaque
data:
  username: YWRtaW4=     # "admin" 的 Base64
  password: cGFzc3dvcmQ= # "password" 的 Base64

环境变量使用:

env:
- name: USER_NAME
  valueFrom:
    secretKeyRef:
      name: my-secret
      key: username

文件使用:

volumes:
- name: secret-volume
  secret:
    secretName: my-secret

containers:
- name: app
  volumeMounts:
  - name: secret-volume
    mountPath: "/etc/secret"

当你在 Pod 里用 Secret(或 ConfigMap)以 subPath 方式挂载时:

  • 它在容器启动时,会将对应文件从临时目录 拷贝到容器文件系统的指定位置,而不是做一个动态挂载。
  • 拷贝过去的文件与原来的 Secret 文件没有链接关系,所以 Secret 更新时,subPath 挂载的内容不会自动刷新。

Kubernetes 给不可变的 ConfigMap 和 Secret 提供了一种可选配置,可以设置各个 Secret 和ConfigMap 为不可变的。对于大量使用 configmap 的集群(至少有成千上万各不相同的 configmap 供Pod 挂载),禁止变更它们的数据有下列好处:

  • 防止意外(或非预期的)更新导致应用程序中断
  • 通过将 configmap 标记为不可变来关闭 kube-apiserver 对其的监视,从而显著降低 kube-apiserver的负载,提升集群性能。
immutable: true

Downward API

Downward API 是 Kubernetes 中的一个功能,它允许容器在运行时从 Kubernetes API 服务器获取有关它们自身的信息。这些信息可以作为容器内部的环境变量或文件注入到容器中,以便容器可以获取有关其运行环境的各种信息,如 Pod 名称、命名空间、标签等。提供容器元数据、动态配置、与K8S集成。
以环境变量提供元数据

apiVersion: v1
kind: Pod
metadata:
  name: downward-api-env-example
spec:
  containers:
  - name: my-container
    image: nginx
    env:
    - name: POD_NAME
      valueFrom:
        fieldRef:
          fieldPath: metadata.name
    - name: POD_NAMESPACE
      valueFrom:
        fieldRef:
          fieldPath: metadata.namespace
    - name: POD_IP
      valueFrom:
        fieldRef:
          fieldPath: status.podIP
    - name: CPU_REQUEST
      valueFrom:
        resourceFieldRef:
          resource: requests.cpu
    - name: CPU_LIMIT
      valueFrom:
        resourceFieldRef:
          resource: limits.cpu
    - name: MEMORY_REQUEST
      valueFrom:
        resourceFieldRef:
          resource: requests.memory
    - name: MEMORY_LIMIT
      valueFrom:
        resourceFieldRef:
          resource: limits.memory
  restartPolicy: Never

以文件形式提供:

apiVersion: v1
kind: Pod
metadata:
  name: downward-api-volume-example
spec:
  containers:
  - name: my-container
    image: nginx
    resources:
      limits:
        cpu: "1"
        memory: "512Mi"
      requests:
        cpu: "0.5"
        memory: "256Mi"
    volumeMounts:
    - name: downward-api-volume
      mountPath: /etc/podinfo
  volumes:
  - name: downward-api-volume
    downwardAPI:
      items:
      - path: "annotations"
        fieldRef:
          fieldPath: metadata.annotations
      - path: "labels"
        fieldRef:
          fieldPath: metadata.labels
      - path: "name"
        fieldRef:
          fieldPath: metadata.name
      - path: "namespace"
        fieldRef:
          fieldPath: metadata.namespace
      - path: "uid"
        fieldRef:
          fieldPath: metadata.uid
      - path: "cpuRequest"
        resourceFieldRef:
          containerName: my-container
          resource: requests.cpu
      - path: "memoryRequest"
        resourceFieldRef:
          containerName: my-container
          resource: requests.memory
      - path: "cpuLimit"
        resourceFieldRef:
          containerName: my-container
          resource: limits.cpu
      - path: "memoryLimit"
        resourceFieldRef:
          containerName: my-container
          resource: limits.memory
  restartPolicy: Never

Kubernetes API

[root@k8s-master01 apiServer]# cat 1.RBAC.yaml 
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: test-api-cluster-admin-binding
subjects:
- kind: ServiceAccount
  name: test-api
  namespace: default
roleRef:
  kind: ClusterRole
  name: cluster-admin
  apiGroup: rbac.authorization.k8s.io


[root@k8s-master01 apiServer]# cat 2.pod.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: curl
spec:
  serviceAccountName: test-api
  containers:
  - name: main
    image: tutum/curl
    command: ["sleep", "9999"]


root@curl:/# TOKEN=$( cat /var/run/secrets/kubernetes.io/serviceaccount/token )
root@curl:/# CAPATH="/var/run/secrets/kubernetes.io/serviceaccount/ca.crt"
root@curl:/# NS=$( cat /var/run/secrets/kubernetes.io/serviceaccount/namespace )
root@curl:/# curl -H "Authorization: Bearer $TOKEN" --cacert $CAPATH https://kubernetes/api/v1/namespaces/$NS/pods

获取Api文档

kubectl proxy --port=8080
curl localhost:8080/openapi/v2 > k8s-swagger.json
docker run \
 --rm \
 -d \
 -p 80:8080 \
 -e SWAGGER_JSON=/k8s-swagger.json \
 -v $(pwd)/k8s-swagger.json:/k8s-swagger.json \
 swaggerapi/swagger-ui
0

评论 (0)

取消