• kubernetes之secret


    Secret解决了密码、token、密钥等敏感数据的配置问题,而不需要把这些敏感数据暴露到镜像或者Pod Spec中。Secret可以以Volume或者环境变量的方式使用。

    Secret类型:

    1. Opaque:base64编码格式的Secret,用来存储密码、密钥等;但数据也通过base64 –decode解码得到原始数据,所有加密性很弱。
    2. kubernetes.io/dockerconfigjson:用来存储私有docker registry的认证信息。
    3. kubernetes.io/service-account-token: 用于被serviceaccount引用。serviceaccout创建时Kubernetes会默认创建对应的secret。Pod如果使用了serviceaccount,对应的secret会自动挂载到Pod目录/run/secrets/kubernetes.io/serviceaccount中。
    1.Opaque Secret

    Opaque类型的数据是一个map类型,要求value是base64编码格式: 比如来创建一个用户名为:admin,密码为: 1f2d1e2e67df的Secret 对象,首先把这用户名和密码做base64编码,

    1
    2
    3
    4
    $ echo -n "admin" | base64
    YWRtaW4=
    $ echo -n "1f2d1e2e67df" | base64
    MWYyZDFlMmU2N2Rm

    然后就可以利用上面编码过后的数据来编写一个YAML文件:(secrets.yml)

    1
    2
    3
    4
    5
    6
    7
    8
    apiVersion: v1
    kind: Secret
    metadata:
    name: mysecret
    type: Opaque
    data:
    password: MWYyZDFlMmU2N2Rm
    username: YWRtaW4=

    同样的就可以使用kubectl命令来创建了: 创建secret:kubectl create -f secrets.yml。

    1
    2
    3
    4
    # kubectl get secret
    NAME TYPE DATA AGE
    default-token-xxx kubernetes.io/service-account-token 3 45d
    mysecret Opaque 2 7s

    注意:其中default-token-xxx为创建集群时默认创建的secret,被serviceacount/default引用。 可以使用describe命令查看详情,如果想看到Data里面的详细信息,可以输出成YAML文件进行查看

    如果是从文件创建secret,则可以用更简单的kubectl命令,比如创建tls的secret:

    1
    2
    3
    $ kubectl create secret generic helloworld-tls 
    --from-file=key.pem
    --from-file=cert.pem
    2.Opaque Secret的使用

    创建好secret之后,有两种方式来使用它:

    • 以Volume方式
    • 以环境变量方式
    • 以Volume方式挂载制定的key
    将Secret挂载到Volume中

    用一个Pod来验证下Volume挂载,创建一个Pod文件:(secret2-pod.yaml)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    apiVersion: v1
    kind: Pod
    metadata:
    labels:
    name: db
    name: db
    spec:
    volumes:
    - name: secrets
    secret:
    secretName: mysecret
    containers:
    - image: registry.martin.com:5000/my_project_id/pg:v1
    name: db
    volumeMounts:
    - name: secrets
    mountPath: "/etc/secrets"
    readOnly: true
    ports:
    - name: cp
    containerPort: 5432
    hostPort: 5432

    查看Pod中对应的信息:

    1
    2
    3
    4
    5
    6
    # ls /etc/secrets
    password username
    # cat /etc/secrets/username
    admin
    # cat /etc/secrets/password
    1f2d1e2e67df

    查看输出日志:

    1
    2
    3
    $ kubectl logs secret2-pod
    password
    username

    可以看到secret把两个key挂载成了两个对应的文件。

    将Secret导出到环境变量中
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
    name: wordpress-deployment
    spec:
    replicas: 2
    strategy:
    type: RollingUpdate
    template:
    metadata:
    labels:
    app: wordpress
    visualize: "true"
    spec:
    containers:
    - name: "wordpress"
    image: "wordpress"
    ports:
    - containerPort: 80
    env:
    - name: WORDPRESS_DB_USER
    valueFrom:
    secretKeyRef:
    name: mysecret
    key: username
    - name: WORDPRESS_DB_PASSWORD
    valueFrom:
    secretKeyRef:
    name: mysecret
    key: password

    主要上面环境变量中定义的secretKeyRef关键字,和configMapKeyRef比较类似,一个是从Secret对象中获取,一个是从ConfigMap对象中获取

    创建上面的Pod:

    1
    2
    $ kubectl create -f secret1-pod.yaml
    pod "secret1-pod" created

    然后查看Pod的日志输出:

    1
    2
    3
    $ kubectl logs secret1-pod
    USERNAME=admin
    PASSWORD=admin321

    可以看到有 USERNAME 和 PASSWORD 两个环境变量输出出来。

    将Secret挂载指定的key
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    apiVersion: v1
    kind: Pod
    metadata:
    labels:
    name: db
    name: db
    spec:
    volumes:
    - name: secrets
    secret:
    secretName: mysecret
    items:
    - key: password
    mode: 511
    path: tst/psd
    - key: username
    mode: 511
    path: tst/usr
    containers:
    containers:
    - image: nginx
    name: db
    volumeMounts:
    - name: secrets
    mountPath: "/etc/secrets"
    readOnly: true
    ports:
    - name: cp
    containerPort: 80
    hostPort: 5432

    可以直接用kubectl命令来创建用于docker registry认证的secret:

    1
    2
    $ kubectl create secret docker-registry myregistrykey --docker-server=DOCKER_REGISTRY_SERVER --docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL
    secret "myregistrykey" created.

    查看secret的内容:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    # kubectl get secret myregistrykey  -o yaml
    apiVersion: v1
    data:
    .dockercfg: eyJjY3IuY2NzLnRlbmNlbnR5dW4uY29tL3RlbmNlbnR5dW4iOnsidXNlcm5hbWUiOiIzMzIxMzM3OTk0IiwicGFzc3dvcmQiOiIxMjM0NTYuY29tIiwiZW1haWwiOiIzMzIxMzM3OTk0QHFxLmNvbSIsImF1dGgiOiJNek15TVRNek56azVORG94TWpNME5UWXVZMjl0In19
    kind: Secret
    metadata:
    creationTimestamp: 2017-08-04T02:06:05Z
    name: myregistrykey
    namespace: default
    resourceVersion: "1374279324"
    selfLink: /api/v1/namespaces/default/secrets/myregistrykey
    uid: 78f6a423-78b9-11e7-a70a-525400bc11f0
    type: kubernetes.io/dockercfg

    也可以直接读取~/.dockercfg的内容来创建:

    1
    2
    $ kubectl create secret docker-registry myregistrykey 
    --from-file="~/.docker/config.json"

    在创建Pod的时候,通过imagePullSecrets来引用刚创建的myregistrykey:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    apiVersion: v1
    kind: Pod
    metadata:
    name: foo
    spec:
    containers:
    - name: foo
    image: janedoe/awesomeapp:v1
    imagePullSecrets:
    - name: myregistrykey

    kubernetes.io/service-account-token: 用于被serviceaccount引用。serviceaccout创建时Kubernetes会默认创建对应的secret。Pod如果使用了serviceaccount,对应的secret会自动挂载到Pod的/run/secrets/kubernetes.io/serviceaccount目录中。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ kubectl run nginx --image nginx
    deployment "nginx" created
    $ kubectl get pods
    NAME READY STATUS RESTARTS AGE
    nginx-3137573019-md1u2 1/1 Running 0 13s
    $ kubectl exec nginx-3137573019-md1u2 ls /run/secrets/kubernetes.io/serviceaccount
    ca.crt
    namespace
    token
    Secret与ConfigMap对比

    相同点:

    • key/value的形式
    • 属于某个特定的namespace
    • 可以导出到环境变量
    • 可以通过目录/文件形式挂载(支持挂载所有key和部分key)

    不同点:

    • Secret可以被ServerAccount关联(使用)
    • Secret可以存储register的鉴权信息,用在ImagePullSecret参数中,用于拉取私有仓库的镜像
    • Secret支持Base64加密
    • Secret分为kubernetes.io/Service Account,kubernetes.io/dockerconfigjson,Opaque三种类型,Configmap不区分类型
    • Secret文件存储在tmpfs文件系统中,Pod删除后Secret文件也会对应的删除。

    实例配置:

    [root@test-master03 ~]# kubectl -n xitu-qa02 create secret generic apiclient02  --from-file=dingyu=apiclient_cert.p12
    secret/apiclient02 created
    
    
    
    root@test-master03 ~]# kubectl get secret  -n xitu-qa02 
    NAME                  TYPE                                  DATA   AGE
    
    apiclient02           Opaque                                1      22m
    

      

    阿里云k8s 保密字典信息

    阿里云k8s 应用里挂载 保密字典

  • 相关阅读:
    CSS3动画基本的转换和过渡
    学习进度(2016.4.3)
    敏捷开发方法综述
    学习进度(2016.3.27)
    数组问题(二)求环形数组子数组和的最大值
    数组问题(一)求子数组和的最大值
    学习进度(2016.3.20)
    程序设计之四则运算三
    学习进度(2016.3.13)
    Right-BICEP 测试四则运算二程序
  • 原文地址:https://www.cnblogs.com/weifeng1463/p/11419224.html
Copyright © 2020-2023  润新知