理论+实操:k8S配置参数管理——secret与configmap


secret 安全配置参数

configmap 配置文件参数

一:secret概述

加密数据并存放在etcd中,让pod的容器以挂载volume方式访问

应用场景:凭据,身份令牌

官方文档:https://kubernetes.io/docs/concepts/configuration/secret/

Secret 对象类型用来保存敏感信息,例如密码、OAuth 令牌和 ssh key。 将这些信息放在 secret 中比放在 Pod 的定义或者 容器镜像 中来说更加安全和灵活

Secret 是一种包含少量敏感信息例如密码、token 或 key 的对象。这样的信息可能会被放在 Pod spec 中或者镜像中;将其放在一个 secret 对象中可以更好地控制它的用途,并降低意外暴露的风险。

1.1 创建secret的方法

用户可以创建 secret,同时系统也创建了一些 secret。

  • 内置secret

Service Account 使用 API 凭证自动创建和附加 secret

Kubernetes 自动创建包含访问 API 凭据的 secret,并自动修改您的 pod 以使用此类型的 secret。这样可以安全地访问apiserver

  • 创建您自己的sercet

使用 kubectl 创建 Secret

比如有些pod需要访问数据库,这些pod需要使用的用户名和密码可以放到本地宿主机的文件里

资源参数写入到etcd中

如果有多个pod资源,都可以与一个secret建立关系

1.2 使用secret的方法

要使用 secret,pod 需要引用 secret。

  • Pod 可以用两种方式使用 secret:

作为 volume 中的文件被挂载到 pod 中的一个或者多个容器里;

当 kubelet 为 pod 拉取镜像时使用。

二:创建Secret

2.1 基于文件创建

[root@master1 ~]# kubectl create secret --help
Create a secret using specified subcommand.

Available Commands:
  docker-registry 创建一个用于Docker注册表的秘密
  generic         从本地文件、目录或文字值创建一个秘密
  tls             创建一个TLS秘密

Usage:
  kubectl create secret [flags] [options]

Use "kubectl <command> --help" for more information about a given command.
Use "kubectl options" for a list of global command-line options (applies to all commands).

-n 转行符

注意: 特殊字符(例如 $, \*! )需要转义。 如果您使用的密码具有特殊字符,则需要使用 \\ 字符对其进行转义。 例如,如果您的实际密码是 S!B\*d$zDsb ,则应通过以下方式执行命令: kubectl create secret generic dev-db-secret --from-literal=username=devuser --from-literal=password=S\!B\\*d\$zDsb 您无需从文件中转义密码中的特殊字符( --from-file )。

[root@master1 ~]# echo -n 'gsy' > /root/username.txt
[root@master1 ~]# echo -n 'gsy123' > /root/password.txt
[root@master1 ~]# kubectl create secret generic db-user-pass --from-file=/root/username.txt --from-file=/root/password.txt
secret/db-user-pass created
[root@master1 ~]# kubectl get secret
NAME                  TYPE                                  DATA   AGE
db-user-pass          Opaque                                2      10s
default-token-qm9rm   kubernetes.io/service-account-token   3      17d
[root@master1 ~]# kubectl describe secret db-user-pass
Name:         db-user-pass
Namespace:    default
Labels:       <none>
Annotations:  <none>

Type:  Opaque

Data
====
password.txt:  6 bytes
username.txt:  3 bytes

2.2 基于参数手动创建

参数首先要进行base64编码

[root@master1 ~]# echo -n 'gsy' | base64
Z3N5
[root@master1 ~]# echo -n 'gsy123' | base64
Z3N5MTIz

2.2.1 编辑yaml文件

[root@master1 ~]# vim secret.yaml
apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
data:
  username: Z3N5
  password: Z3N5MTIz
[root@master1 ~]# kubectl create -f secret.yaml 
secret/mysecret created
[root@master1 ~]# kubectl get secret
NAME                  TYPE                                  DATA   AGE
db-user-pass          Opaque                                2      15m
default-token-qm9rm   kubernetes.io/service-account-token   3      17d
mysecret              Opaque                                2      4s
[root@master1 ~]# kubectl describe secret mysecret
Name:         mysecret
Namespace:    default
Labels:       <none>
Annotations:  <none>

Type:  Opaque

Data
====
password:  6 bytes
username:  3 bytes

2.3 总结

第一种,使用参数文件,使用secret中的变量导入到pod中

[root@master1 ~]#  kubectl get secret mysecret -o yaml
apiVersion: v1
data:
  password: Z3N5MTIz
  username: Z3N5
kind: Secret
metadata:
  creationTimestamp: 2020-05-17T07:02:12Z
  name: mysecret
  namespace: default
  resourceVersion: "1022741"
  selfLink: /api/v1/namespaces/default/secrets/mysecret
  uid: 55036ebf-980c-11ea-a668-000c29db840b
type: Opaque

注意:通过对内容进行序列化后,生成一个后缀作为 Secrets 的名称。这样可以确保每次修改内容时都会生成一个新的 Secret。

备注:解码方法

[root@master1 ~]# echo 'Z3N5' | base64 --decode
gsy[root@master1 ~]#

三:使用secret

  • Secret 可以作为数据卷被挂载,

  • 或作为环境变量 暴露出来以供 pod 中的容器使用。

它们也可以被系统的其他部分使用,而不直接暴露在 pod 内。 例如,它们可以保存凭据,系统的其他部分应该用它来代表您与外部系统进行交互。

3.1 作为环境变量暴露出来

key: username赋值给SECRET_USERNAME

key: password 赋值给SECRET_PASSWORD

gsy[root@master1 ~]# vim secret-env.yaml
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
  • exec进入测试env
[root@master1 ~]# kubectl apply -f secret-env.yaml 
pod/mypod created
[root@master1 ~]# kubectl get pods -w
NAME                                READY   STATUS    RESTARTS   AGE
dns-test                            1/1     Running   0          4h16m
mypod                               1/1     Running   0          9s
[root@master1 ~]# kubectl exec -it mypod bash
root@mypod:/# echo $SECRET_USERNAME
gsy
root@mypod:/# echo $SECRET_PASSWORD
gsy123
root@mypod:/# exit
exit

3.2 以volume的形式挂载到pod的某个目录下

[root@master1 ~]# vim secret-volume.yaml
apiVersion: v1
kind: Pod
metadata:
  name: mypod-1
spec:
  containers:
  - name: nginx
    image: nginx
    volumeMounts:
    - name: foo
      mountPath: "/etc/foo"	#容器内挂载路径
      readOnly: true
  volumes:
  - name: foo
    secret:
      secretName: mysecret
[root@master1 ~]# kubectl create -f secret-volume.yaml 
pod/mypod-1 created
[root@master1 ~]# kubectl exec -it mypod-1 bash
root@mypod-1:/# cd /etc/foo
root@mypod-1:/etc/foo# ls
password  username
root@mypod-1:/etc/foo# cat password 
gsy123root@mypod-1:/etc/foo# cat username 
gsyroot@mypod-1:/etc/foo# ll
bash: ll: command not found
root@mypod-1:/etc/foo# ls -l
total 0
lrwxrwxrwx. 1 root root 15 May 17 07:24 password -> ..data/password
lrwxrwxrwx. 1 root root 15 May 17 07:24 username -> ..data/username

四:configmap

与secret类似,区别在于configmap保存的是不需要加密配置的信息

应用场景:应用配置

4.1 创建方式

  • kubectl、编写yaml文件

  • 变量参数形式

4.2 使用kubectl创建

[root@master1 ~]# vim redis.txt
redis.host=127.0.0.1
redis.port=6379
redis.password=123456

常见configmap资源

[root@master1 ~]# kubectl create configmap redis-config --from-file=redis.txt
configmap/redis-config created

查看资源

[root@master1 ~]# kubectl get configmap
NAME           DATA   AGE
redis-config   1      30s

查看描述信息

configmap可以简写成cm

[root@master1 ~]# kubectl describe configmap redis-config
Name:         redis-config
Namespace:    default
Labels:       <none>
Annotations:  <none>

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

Events:  <none>

configmap的这种方式是松耦合处理,这种处理方式可以减轻运维压力

简化分工

4.3 创建yaml文件

[root@master1 ~]# vim cm.yaml
apiVersion: v1
kind: Pod
metadata:
  name: mypod-cm
spec:
  containers:
    - name: busybox
      image: busybox
      command: [ "/bin/sh","-c","cat /etc/config/redis.txt" ]
      volumeMounts:
      - name: config-volume
        mountPath: /etc/config
  volumes:
    - name: config-volume
      configMap:
        name: redis-config
  restartPolicy: Never
[root@master1 ~]# kubectl apply -f cm.yaml 
pod/mypod-cm created
[root@master1 ~]# kubectl get pods
NAME                                READY   STATUS              RESTARTS   AGE
dns-test                            1/1     Running             0          4h57m
mypod                               1/1     Running             0          41m
mypod-1                             1/1     Running             0          32m
mypod-cm                            0/1     ContainerCreating   0          14s

查看验证结果

[root@master1 ~]# kubectl logs mypod-cm
redis.host=127.0.0.1
redis.port=6379
redis.password=123456
[root@master1 ~]# 

4.4 使用变量参数形式

创建configmap资源

[root@master1 ~]# vim myconfig.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfig
  namespace: default
data:
  special.level: info
  special.type: hello
[root@master1 ~]# kubectl create -f myconfig.yaml 
configmap/myconfig created
[root@master1 ~]# kubectl get cm
NAME           DATA   AGE
myconfig       2      19s
redis-config   1      23m

创建测试pod,测试pod中输出configmap变量参数

[root@master1 ~]# vim ceshicmpod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: ceshicmpod
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
[root@master1 ~]# kubectl apply -f ceshicmpod.yaml 
pod/ceshicmpod created

查看变量输出结果

[root@master1 ~]# kubectl logs ceshicmpod
info hello
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章