10、kubernetes 核心技术-Secret、ConfigMap

一、Secret

Secret的主要作用就是加密数据,然后存在etcd里面,让Pod容器以挂载Volume方式进行访问
Secret 解决了密码、token、密钥等敏感数据的配置问题,而不需要把这些敏感数据暴露 到镜像或者 Pod Spec 中。Secret 可以以 Volume 或者环境变量的方式使用

场景:用户名 和 密码进行加密

一般场景的是对某个字符串进行base64编码 进行加密

[root@k8s-master ~]$ echo -n 'admin' | base64
YWRtaW4=

Secret 有三种类型

  • Service Account :用来访问 Kubernetes API,由 Kubernetes 自动创建,并且会自动挂 载到 Pod 的 /run/secrets/kubernetes.io/serviceaccount 目录中
  • Opaque : base64 编码格式的 Secret,用来存储密码、密钥等
  • kubernetes.io/dockerconfigjson :用来存储私有 docker registry 的认证信息

1.1 变量形式挂载到Pod

创建secret加密数据的yaml文件 secret.yaml

[root@k8s-master ~]$ cat > secret.yaml << EOF
apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
data:
  username: YWRtaW4=
  password: MWYyZDFlMmU2N2Rm
EOF

创建一个pod

[root@k8s-master ~]$ kubectl create -f secret.yaml


[root@k8s-master ~]$ kubectl get pods

[root@k8s-master ~]$ kubectl get secret
NAME                  TYPE                                  DATA   AGE
default-token-wqhjb   kubernetes.io/service-account-token   3      27h
mysecret              Opaque                                2      7m36s

创建一个 secret-val.yaml 文件

[root@k8s-master ~]$ cat > secret-val.yaml << EOF
apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: nginx
    image: nginx
    env:
      - name: SECRET_USERNAME
        valueFrom:   #挂载目录
          secretKeyRef:
            name: mysecret
            key: username
      - name: SECRET_PASSWORD
        valueFrom:
          secretKeyRef:   #名称
            name: mysecret
            key: password
EOF
[root@k8s-master ~]$ kubectl apply -f secret-val.yaml
NAME                     READY   STATUS      RESTARTS   AGE
ds-test-ljb52            1/1     Running     0          85m
mypod                    1/1     Running     0          15s

进入到容器内部

[root@k8s-master ~]$ kubectl exec -it mypod bash

然后就可以输出值,这就是以变量的形式挂载到容器中

# 输出用户
root@mypod:/# echo $SECRET_USERNAME
admin

# 输出密码
root@mypod:/# echo $SECRET_PASSWORD
1f2d1e2e67df

要删除这个Pod,就可以使用这个命令

[root@k8s-master ~]$ kubectl delete -f secret-val.yaml

1.2 数据卷形式挂载

创建一个 secret-vol.yaml 文件

[root@k8s-master ~]$ cat > secret-vol.yaml << EOF
apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: nginx
    image: nginx
    volumeMounts:   #挂载
    - name: foo
      mountPath: "/etc/foo"
      readOnly: true
  volumes:
  - name: foo
    secret:
      secretName: mysecret
EOF

创建Pod

# 根据配置创建容器
[root@k8s-master ~]$ kubectl apply -f secret-vol.yaml

# 进入容器
[root@k8s-master ~]$ kubectl exec -it mypod bash

# 查看
root@mypod:/# ls /etc/foo
password  username


二、ConfigMap

ConfigMap作用是存储不加密的数据到etcd中,让Pod以变量或数据卷Volume挂载到容器中

应用场景:配置文件

2.1 创建配置文件

创建一个配置文件 redis.properties

[root@k8s-master ~]$ kubectl delete Pod --all

[root@k8s-master ~]$ cat > redis.properties << EOF
redis.host=127.0.0.1
redis.port=6379
redis.password=123456
EOF

2.2 创建ConfigMap

[root@k8s-master ~]$ kubectl create configmap redis-config --from-file=redis.properties

查看详细信息

[root@k8s-master ~]$ kubectl get cm
NAME           DATA   AGE
redis-config   1      7m8s

[root@k8s-master ~]$ kubectl describe cm redis-config
Name:         redis-config
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
redis.properties:
----
redis.host=127.0.0.1
redis.port=6379
redis.password=123456

Events:  <none>

2.3 Volume数据卷形式挂载

创建一个 cm.yaml

[root@k8s-master ~]$ cat > cm.yaml << EOF
apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
    - name: busybox
      image: busybox
      command: [ "/bin/sh","-c","cat /etc/config/redis.properties" ]
      volumeMounts:
      - name: config-volume
        mountPath: /etc/config
  volumes:
    - name: config-volume
      configMap:
        name: redis-config
  restartPolicy: Never
EOF

使用该yaml创建pod

# 创建
[root@k8s-master ~]$ kubectl apply -f cm.yaml

# 查看
[root@k8s-master ~]$ kubectl get pods
NAME    READY   STATUS      RESTARTS   AGE
mypod   0/1     Completed   0          6m42s

最后通过命令就可以查看结果输出了

[root@k8s-master ~]$ kubectl logs mypod
redis.host=127.0.0.1
redis.port=6379
redis.password=123456

2.4 以变量的形式挂载Pod

创建一个myconfig.yaml文件,声明变量信息,然后以configmap创建

[root@k8s-master ~]$ cat > myconfig.yaml << EOF
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfig
  namespace: default
data:
  special.level: info
  special.type: hello
EOF

创建配置文件

# 创建pod
[root@k8s-master ~]$ kubectl apply -f myconfig.yaml

# 获取
[root@k8s-master ~]$ kubectl get cm

创建完该pod后,我们就需要在创建一个 config-var.yaml 来使用我们的配置信息

[root@k8s-master ~]$ cat > config-var.yaml << EOF
apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
    - name: busybox  #容器
      image: busybox
      command: [ "/bin/sh", "-c", "echo $(LEVEL) $(TYPE)" ]  #输出信息
      env:
        - name: LEVEL
          valueFrom:
            configMapKeyRef:
              name: myconfig   #挂载
              key: special.level
        - name: TYPE
          valueFrom:
            configMapKeyRef:
              name: myconfig
              key: special.type
  restartPolicy: Never
EOF

查看输出

[root@k8s-master ~]$ kubectl logs mypod
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值