k8s学习(十二) 使用secret

ConfigMap是用来存储一些非安全的配置信息,如果涉及到一些安全相关的数据的话用ConfigMap就非常不妥了,
因为ConfigMap明文存储的,这个时候使用Secret,Secret用来保存敏感信息,例如密码、OAuth 令牌和 ssh key等等,
将这些信息放在Secret中比放在Pod的定义中或者docker镜像中来说更加安全和灵活。
Secret有三种类型:
Opaque:base64 编码格式的 Secret,用来存储密码、密钥等;但数据也可以通过base64 –decode解码得到原始数据,所有加密性很弱。
kubernetes.io/dockerconfigjson:用来存储私有docker registry的认证信息。
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编码格式。

比如我们来创建一个用户名为 zhangsan,密码为 zhangsan 的 Secret 对象,
首先我们先把这用户名和密码做 base64 编码

[root@k8s-node1 k8s]# echo -n "zhangsan" | base64
emhhbmdzYW4=

创建secret-opaque.yaml文件

apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
data:
  username: emhhbmdzYW4=
  password: emhhbmdzYW4=
[root@k8s-node1 k8s]# kubectl create -f secret-opaque.yaml 
secret/mysecret created

查看secret

[root@k8s-node1 k8s]# kubectl get secret
NAME                                     TYPE                                  DATA   AGE
cluster-admin-dashboard-sa-token-hld8l   kubernetes.io/service-account-token   3      11d
default-token-7c9dp                      kubernetes.io/service-account-token   3      11d
myregistrykey6                           kubernetes.io/dockerconfigjson        1      7d5h
mysecret                                 Opaque                                2      35s

[root@k8s-node1 k8s]# kubectl describe secret mysecret
Name:         mysecret
Namespace:    default
Labels:       <none>
Annotations:  <none>

Type:  Opaque

Data
====
password:  8 bytes
username:  8 bytes

使用环境变量引用secret
yaml文件:

apiVersion: v1
kind: Pod
metadata:
  name: secret-opaque-env-pod
spec:
  containers:
  - name: secret-opaque-env-pod
    image: busybox
    command: [ "/bin/sh", "-c", "env" ]
    env:
    - name: USERNAME
      valueFrom:
        secretKeyRef:
          name: mysecret
          key: username
    - name: PASSWORD
      valueFrom:
        secretKeyRef:
          name: mysecret
          key: password
kubectl create -f test-secret-opaque-env-pod.yaml
[root@k8s-node1 k8s]# kubectl logs secret-opaque-env-pod
KUBE_NODE_SERVICE_PORT_8080_TCP_PROTO=tcp
KUBE_NODE_HPA_DEMO_SERVICE_PORT=tcp://10.97.179.242:8080
KUBERNETES_SERVICE_PORT=443
KUBERNETES_PORT=tcp://10.96.0.1:443
KUBE_NODE_HPA_DEMO_SERVICE_SERVICE_PORT=8080
KUBE_NODE_SERVICE_PORT=tcp://10.96.77.110:8080
KUBE_NODE_SERVICE_SERVICE_PORT=8080
HOSTNAME=secret-opaque-env-pod
SHLVL=1
KUBE_NODE_HPA_DEMO_SERVICE_PORT_8080_TCP=tcp://10.97.179.242:8080
HOME=/root
KUBE_NODE_SERVICE_PORT_8080_TCP=tcp://10.96.77.110:8080
USERNAME=zhangsan
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
KUBE_NODE_HPA_DEMO_SERVICE_PORT_8080_TCP_ADDR=10.97.179.242
KUBE_NODE_HPA_DEMO_SERVICE_SERVICE_HOST=10.97.179.242
KUBERNETES_SERVICE_HOST=10.96.0.1
PWD=/
PASSWORD=zhangsan
KUBE_NODE_SERVICE_SERVICE_HOST=10.96.77.110
KUBE_NODE_SERVICE_PORT_8080_TCP_ADDR=10.96.77.110
KUBE_NODE_HPA_DEMO_SERVICE_PORT_8080_TCP_PORT=8080
KUBE_NODE_HPA_DEMO_SERVICE_PORT_8080_TCP_PROTO=tcp
KUBE_NODE_SERVICE_PORT_8080_TCP_PORT=8080

使用volume挂载引用secret

编辑yaml

apiVersion: v1
kind: Pod
metadata:
  name: secret-opaque-volume
spec:
  containers:
  - name: secret2
    image: busybox
    command: ["/bin/sh", "-c", "ls /etc/secrets"]
    volumeMounts:
    - name: secrets
      mountPath: /etc/secrets
  volumes:
  - name: secrets
    secret:
     secretName: mysecret
kubectl create -f test-secret-opaque-volume.yaml

查看日志

[root@k8s-node1 k8s]# kubectl logs secret-opaque-volume
password
username

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

2、kubernetes.io/dockerconfigjson
用来docker registry认证,直接使用kubectl create命令创建即可,如下:

[root@k8s-node1 k8s]# kubectl create secret docker-registry dockersecret --docker-server=172.16.10.190 --docker-username=admin --docker-password=admin123 --docker-email=admin@example.org
secret/dockersecret created

查看secret

[root@k8s-node1 k8s]# kubectl get secret
NAME                                     TYPE                                  DATA   AGE
cluster-admin-dashboard-sa-token-hld8l   kubernetes.io/service-account-token   3      11d
default-token-7c9dp                      kubernetes.io/service-account-token   3      11d
dockersecret                             kubernetes.io/dockerconfigjson        1      21s
myregistrykey6                           kubernetes.io/dockerconfigjson        1      7d5h
mysecret                                 Opaque                                2      23m

[root@k8s-node1 k8s]# kubectl describe secret dockersecret
Name:         dockersecret
Namespace:    default
Labels:       <none>
Annotations:  <none>

Type:  kubernetes.io/dockerconfigjson

Data
====
.dockerconfigjson:  128 bytes

[root@k8s-node1 k8s]# kubectl get secret dockersecret -o yaml
apiVersion: v1
data:
  .dockerconfigjson: eyJhdXRocyI6eyIxNzIuMTYuMTAuMTkwIjp7InVzZXJuYW1lIjoiYWRtaW4iLCJwYXNzd29yZCI6ImFkbWluMTIzIiwiZW1haWwiOiJhZG1pbkBleGFtcGxlLm9yZyIsImF1dGgiOiJZV1J0YVc0NllXUnRhVzR4TWpNPSJ9fX0=
kind: Secret
metadata:
  creationTimestamp: "2019-09-02T06:59:49Z"
  name: dockersecret
  namespace: default
  resourceVersion: "1527270"
  selfLink: /api/v1/namespaces/default/secrets/dockersecret
  uid: 84eeeea8-34c7-432a-ac4c-a6c277b7fbc6
type: kubernetes.io/dockerconfigjson

查看上面的数据的base64解码

[root@k8s-node1 k8s]# echo eyJhdXRocyI6eyIxNzIuMTYuMTAuMTkwIjp7InVzZXJuYW1lIjoiYWRtaW4iLCJwYXNzd29yZCI6ImFkbWluMTIzIiwiZW1haWwiOiJhZG1pbkBleGFtcGxlLm9yZyIsImF1dGgiOiJZV1J0YVc0NllXUnRhVzR4TWpNPSJ9fX0= | base64 -d
{"auths":{"172.16.10.190":{"username":"admin","password":"admin123","email":"admin@example.org","auth":"YWRtaW46YWRtaW4xMjM="}}}[root@k8s-node1 k8s]#

3、kubernetes.io/service-account-token
另外一种Secret类型就是kubernetes.io/service-account-token,用于被serviceaccount引用。serviceaccout 创建时 Kubernetes 会默认创建对应的 secret。Pod 如果使用了 serviceaccount,对应的secret会自动挂载到Pod的/run/secrets/kubernetes.io/serviceaccount目录中。
部署dashboard时使用过这种方式

创建一个cluster-admin角色的service account , 和一个clusterrolebinding, 以便访问所有的k8s资源

kubectl create serviceaccount cluster-admin-dashboard-sa
 
kubectl create clusterrolebinding cluster-admin-dashboard-sa \
  --clusterrole=cluster-admin \
  --serviceaccount=default:cluster-admin-dashboard-sa

获取token

[root@k8s-node1 tmp]# kubectl get secret | grep cluster-admin-dashboard-sa
cluster-admin-dashboard-sa-token-hld8l   kubernetes.io/service-account-token   3      45m

root@k8s-node1 tmp]# kubectl describe secrets/cluster-admin-dashboard-sa-token-hld8l
Name:         cluster-admin-dashboard-sa-token-hld8l
Namespace:    default
Labels:       <none>
Annotations:  kubernetes.io/service-account.name: cluster-admin-dashboard-sa
              kubernetes.io/service-account.uid: 80ba693e-d03f-4087-a200-d3ab69f89f3f

Type:  kubernetes.io/service-account-token

Data
====
ca.crt:     1025 bytes
namespace:  7 bytes
token:      eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6ImNsdXN0ZXItYWRtaW4tZGFzaGJvYXJkLXNhLXRva2VuLWhsZDhsIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImNsdXN0ZXItYWRtaW4tZGFzaGJvYXJkLXNhIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiODBiYTY5M2UtZDAzZi00MDg3LWEyMDAtZDNhYjY5Zjg5ZjNmIiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50OmRlZmF1bHQ6Y2x1c3Rlci1hZG1pbi1kYXNoYm9hcmQtc2EifQ.Ho8tO6L7KWSbxB632DasnoDbBDBLua9L9eJ48tfwmgJJQTLNaOrWP3hxsfGSVSsLuZVlNApYzxziRcdT7xVZ-IcRx2bWV4CF5aV8TcGXToXVQ4ibNlS8Lq6d9kERsx2wIiNj81K6lQk0TsyjbzOsGvAGwxizdWB_eAk1wwJWminuBQWostUBYjhnYE0hmqRijQ62u__MA95cMqS-rw6x2sAirOSwL-68LNLPPMnIcq4hXXrHxdbPLKo3E7KG_V0pH9rlEN6T865EGjQDpk4rcM8av6xw2ek2FcUWKxREGvficllhJWnhlCBdEgpA-YkP4yPziWTmwANlhfVWj_yV5g

4、Secret 与 ConfigMap 对比
最后我们来对比下Secret和ConfigMap这两种资源对象的异同点:

相同点:

key/value的形式
属于某个特定的namespace
可以导出到环境变量
可以通过目录/文件形式挂载
通过 volume 挂载的配置信息均可热更新

不同点:

Secret 可以被 ServerAccount 关联
Secret 可以存储 docker register 的鉴权信息,用在 ImagePullSecret 参数中,用于拉取私有仓库的镜像
Secret 支持 Base64 加密
Secret 分为 kubernetes.io/service-account-token、kubernetes.io/dockerconfigjson、Opaque 三种类型,而 Configmap 不区分类型
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
k8s是一个开源的容器编排平台,可以用来统一管理和部署容器化应用程序。它可以帮助我们简化应用程序的部署、扩展和管理。而MySQL是一种关系型数据库管理系统,它可以用来存储和管理数据。 在使用k8s部署MySQL时,可以使用一些命令来完成一些操作。比如,使用"mysql> use db;"命令可以选中一个数据库;使用"mysql> show tables;"命令可以查看该数据库中有哪些数据表;使用"mysql> describe 表名;"命令可以查看指定表的结构;还可以使用其他命令来删除记录等操作。 在实际部署MySQL的过程中,可以使用k8s的一些资源对象来完成。比如,可以使用Namespace来划分不同的环境,使用Pod来部署MySQL容器,使用Deployment来管理Pod的副本数量和更新策略,使用Service来提供稳定的网络连接,使用PV和PVC来管理持久化存储,使用Secret来管理敏感信息等。通过这些资源对象的组合,可以实现一个单机版的MySQL数据库的部署。 另外,如果要学习更多关于k8s使用和MySQL在k8s中的部署,可以参考相关的文档和教程。比如,可以查阅关于k8s Namespace的用法的文章,了解如何创建和使用Namespace;还可以学习如何创建持久卷PV,用来存储MySQL的数据文件。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [k8s运行mysql服务](https://blog.csdn.net/u010275850/article/details/123267490)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [k8s实战之MySQL单实例部署](https://blog.csdn.net/tianxingzhe37/article/details/124652286)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值