存储分类
元数据
◆configMap:用于保存配置数据(明文)
◆Secret:用于保存敏感性数据(编码)
◆Downward API:容器在运行时从 Kubernetes API服务器获取有关它们自身的信息
真实数据
◆Volume:用于存储临时或者持久性数据
◆PersistentVolume:申请制的持久化存储
configMap:
- 通过文件创建:kubectl create configmap
--from-file=file.suffix
如果文件中以key=value,那么文件名将作为key,,文件内容将作为value。
kubectl create configmap--from-file=file.suffix 可作为环境变量。 - 通过命令创建: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-configconfigMap更新不会触发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 --decodeKubernetes 通过仅仅将 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: trueDownward 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: NeverKubernetes 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)