k8s存储之Configmap&Secret

一.Configmap配置管理

(一)Configmap用于保存配置数据,以键值对形式存储。
configMap 资源提供了向 Pod 注入配置数据的方法,旨在让镜像和配置文件解耦,以便实现镜像的可移植性和可复用性。
(二)典型的使用场景
1.填充环境变量的值
2.设置容器内的命令行参数
3.填充卷的配置文件
(三)创建ConfigMap的方式有4种
1.使用字面值创建

kubectl create configmap my-config --from-literal=key1=config1 --from-literal=key2=config2
kubectl get cm
kubectl describe cm my-config
kubectl get cm my-config -o yaml

在这里插入图片描述

2.使用文件创建

kubectl create configmap my-config-2 --from-file=/etc/resolv.conf  #key的名称是文件名称,value的值是这个文件的内容
kubectl describe cm my-config-2 

在这里插入图片描述

3.使用目录创建

kubectl create configmap my-config-3 --from-file=test  #目录中的文件名为key,文件内容是value

在这里插入图片描述
在这里插入图片描述
4.编写configmap的yaml文件创建

vim cm1.yml
apiVersion: v1
kind: ConfigMap
metadata:
  name: cm1-config
data:
  db_host: "172.25.2.250"
  db_port: "3306"

kubectl apply -f cm1.yml
kubectl describe cm cm1-config

在这里插入图片描述
(四)使用configmap
1.通过环境变量的方式直接传递给pod
(1)重新定义cm1-config的key

vim pod1.yml
apiVersion: v1
kind: Pod
metadata:
  name: pod1
spec:
  containers:
    - name: pod1
      image: busyboxplus
      command: ["/bin/sh", "-c", "env"]
      env:
        - name: key1
          valueFrom:
            configMapKeyRef:
              name: cm1-config
              key: db_host
        - name: key2
          valueFrom:
            configMapKeyRef:
              name: cm1-config
              key: db_port
  restartPolicy: Never

kubectl apply -f pod1.yml
kubectl logs pod1 

在这里插入图片描述
在这里插入图片描述
(2)直接使用cm1-config

apiVersion: v1
kind: Pod
metadata:
  name: pod2
spec:
  containers:
    - name: pod2
      image: busyboxplus
      command: ["/bin/sh", "-c", "env"]
      #command: ["/bin/sh", "-c", "echo $(db_host) $(db_port)"]
      envFrom:
        - configMapRef:
            name: cm1-config
  restartPolicy: Never

在这里插入图片描述
2.通过在pod的命令行下运行的方式

command: ["/bin/sh", "-c", "echo $(db_host) $(db_port)"]

在这里插入图片描述
3.作为volume的方式挂载到pod内
(1)容器不需要重启

apiVersion: v1
kind: Pod
metadata:
  name: pod3
spec:
  containers:
    - name: pod3
      image: busyboxplus
      stdin: true
      tty: true
      volumeMounts:
      - name: config-volume
        mountPath: /config
  volumes:
    - name: config-volume
      configMap:
        name: cm1-config

在这里插入图片描述

# configmap热更新,Pod数据并不会实时更新,需要等待几秒
kubectl edit cm cm1-config
kubectl attach pod3 -it

在这里插入图片描述
在这里插入图片描述
(2)像nginx,http的端口修改,服务需要重启重载的,configmap热更新后,容器还要滚动更新

#a configmap创建
vim default.conf
 server {
    listen       8080;
    server_name  _;

    location / {
        root /usr/share/nginx/html;
        index  index.html index.htm;
    }
}

kubectl create configmap nginx-config --from-file=default.conf

在这里插入图片描述

#b  使用configmap
vim demo.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: demo
spec:
  replicas: 1
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: myapp:v1
        volumeMounts:
        - name: config-volume
          mountPath: /etc/nginx/conf.d
      volumes:
        - name: config-volume
          configMap:
            name: nginx-config

kubectl apply -f demo.yml

在这里插入图片描述

#c 热更新configmap
kubectl edit cm nginx-config
kubectl exec demo-7c9466878-nj5hv -- cat /etc/nginx/conf.d/default.conf

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#d 需要手动触发Pod滚动更新, 这样才能再次加载nginx.conf配置文件
每次通过修改“version/config”来触发Pod滚动更新,使用configmap挂载的env环境变量是不会更新的
kubectl patch deployments.apps demo --patch '{"spec": {"template": {"metadata": {"annotations": {"version/config": "2021022601"}}}}}'

在这里插入图片描述

二.Secret配置管理

(一)Secret 对象类型用来保存敏感信息,例如密码、OAuth 令牌和 ssh key.敏感信息放在 secret 中比放在 Pod 的定义或者容器镜像中来说更加安全和灵活。
(二)Pod 可以用两种方式使用 secret:
1.作为 volume 中的文件被挂载到 pod 中的一个或者多个容器里。
2.当 kubelet 为 pod 拉取镜像时使用。
(三)Secret的类型:
1.Service Account:Kubernetes 自动创建包含访问 API 凭据的 secret,并自动修改 pod 以使用此类型的 secret。
2.Opaque:使用base64编码存储信息,可以通过base64 --decode解码获得原始数据,因此安全性弱。
3.kubernetes.io/dockerconfigjson:用于存储docker registry的认证信息

kubectl get sa
kubectl describe sa default
kubectl get secrets  #每个namespace下有一个名为default的默认的ServiceAccount对象
kubectl describe pod demo-7c9466878-nj5hv   #ServiceAccount里有一个名为Tokens的可以作为Volume一样被Mount到Pod里的Secret,当Pod启动时这个Secret会被自动Mount到Pod的指定目录下,用来协助完成Pod中的进程访问API Server时的身份鉴权过程
kubectl exec demo-7c9466878-nj5hv -- ls /var/run/secrets/kubernetes.io/serviceaccount  #serviceaccout 创建时 Kubernetes 会默认创建对应的 secret.对应的 secret 会自动挂载到 Pod 的 /run/secrets/kubernetes.io/serviceaccount 目录中

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(四)创建
1.从文件中创建Secret

echo -n 'admin' > ./username.txt
echo -n 'westos' > ./password.txt
kubectl create secret generic db-user-pass --from-file=./username.txt --from-file=./password.txt  #如果密码具有特殊字符,则需要使用 \ 字符对其进行转义
kubectl get secrets

kubectl get secrets db-user-pass -o yaml  #默认情况下 kubectl get和kubectl describe 为了安全是不会显示密码的内容,可以通过该方式查看

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
2.yaml文件

vim mysecret.yaml
apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
data:
  username: YWRtaW4=
  password: d2VzdG9z

kubectl get secrets

在这里插入图片描述
(五)将Secret挂载到Volume中
1.直接挂载

apiVersion: v1
kind: Pod
metadata:
  name: mysecret
spec:
  containers:
  - name: demo
    image: myapp:v1
    volumeMounts:
    - name: secrets
      mountPath: "/secret"
      readOnly: true
  volumes:
  - name: secrets
    secret:
      secretName: mysecret
      #items:  #下面的2
      #- key: username
      #  path: my-group/my-username

在这里插入图片描述
2.向指定路径映射 secret 密钥
在这里插入图片描述
3.将Secret设置为环境变量

apiVersion: v1
kind: Pod
metadata:
  name: secret-env
spec:
  containers:
  - name: nginx
    image: myapp:v1
    env:
      - name: SECRET_USERNAME
        valueFrom:
          secretKeyRef:
            name: mysecret
            key: username
      - name: SECRET_PASSWORD
        valueFrom:
          secretKeyRef:
            name: mysecret
            key: password

kubectl apply -f env.yml
kubectl get pod
kubectl exec secret-env -- env  #环境变量读取Secret很方便,但无法支撑Secret动态更新

在这里插入图片描述
4.私有仓库认证
在这里插入图片描述

apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
    - name: myapp
      image: reg.westos.org/test/myapp:v1
  imagePullSecrets:
    - name: myregistrykey

在这里插入图片描述
在这里插入图片描述

# 创建私有仓库认证secret
kubectl create secret docker-registry myregistrykey --docker-server=reg.westos.org --docker-username=admin --docker-password=westos [email protected]  #kubernetes.io/dockerconfigjson用于存储docker registry的认证信息

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

# 查看认证信息
kubectl get secrets myregistrykey -o yaml| less
echo eyJhdXRocyI6eyJyZWcud2VzdG9zLm9yZyI6eyJ1c2VybmFtZSI6ImFkbWluIiwicGFzc3dvcmQiOiJ3ZXN0b3MiLCJlbWFpbCI6InNlcnZlckB0ZXN0Lm9yZyIsImF1dGgiOiJZV1J0YVc0NmQyVnpkRzl6In19fQ== | base64 -d

在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_49564346/article/details/114121553