k8s基础概念之四 secret

secret是用来保存敏感信息的,令牌或者key、redis、mysql密码

 

secrce的一些简单使用

 1040  echo -n "admin" > ./username.txt
 1041  echo -n "123456" > ./password.txt
 1042  kubectl create secret generic db-user-pass --from-file=./username.txt --from-file=./password.txt
 #-n 就是没有换行符
 ---
 kubectl create secret generic dev-db-secret-2 --from-literal=username=devuser --from-literal=password='S!B\*d$zDsb'
 
 ---
 #验证1
 [root@master01 ~]# kubectl get secrets db-user-pass  -o yaml
apiVersion: v1
data:
  password.txt: MTIzNDU2
  username.txt: YWRtaW4=
kind: Secret
metadata:
  creationTimestamp: "2021-12-10T13:43:34Z"
  managedFields:
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:data:
        .: {}
        f:password.txt: {}
        f:username.txt: {}
      f:type: {}
    manager: kubectl-create
    operation: Update
    time: "2021-12-10T13:43:34Z"
  name: db-user-pass
  namespace: default
  resourceVersion: "808531"
  selfLink: /api/v1/namespaces/default/secrets/db-user-pass
  uid: 363862df-15fa-433f-8ecb-c2406997de84
  
 echo "MTIzNDU2" | base64 --decode
 
 ---
 #验证2
 [root@master01 ~]# kubectl get secret dev-db-secret-2 -o yaml
apiVersion: v1
data:
  password: UyFCXCpkJHpEc2I=
  username: ZGV2dXNlcg==
kind: Secret
metadata:
  creationTimestamp: "2021-12-10T14:02:56Z"
  managedFields:
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:data:
        .: {}
        f:password: {}
        f:username: {}
      f:type: {}
    manager: kubectl-create
    operation: Update
    time: "2021-12-10T14:02:56Z"
  name: dev-db-secret-2
  namespace: default
  resourceVersion: "811968"
  selfLink: /api/v1/namespaces/default/secrets/dev-db-secret-2
  uid: aa636959-5f33-4d05-a3f7-ce12079734f0
type: Opaque

echo "UyFCXCpkJHpEc2I=" | base64 --decode

如果需要使用特殊字符"! @ # ¥ $ % ^"之类的需要用 \ 取消特殊含义,或者单引号也可以取消特殊含义,,单引号和 \ 都是取消字符或者字符串的特殊含义,区别就是取消一个字符或者一个字符串

 

自动加密

apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
data:
  username: c3lzdGVtLWFkbWlu
  password: cllzdGVtLXBhc3N3b3Jk

#写在data下面需要我们手动去加密,
---
apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
strinData:
  username: admin
  password: password

#如果把data写成strinData:的话,我们就可以直接写明文,他会帮我们加密,如果同时写data和strinData,会把data忽略掉,只使用strinData

secret: 用途
  imagePullSecret:
  #Pod拉取私有镜像仓库时使用的账户密码,里面的账户信息,会传递geikubelet然后kubelet就可以拉取有密码的仓库里面的镜像

 

k8s使用账户密码拉取镜像

kubectl create secret docker-reqistry docker-secret2 --docker-server=hub.docker.com --docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL

#挂载使用,和containers同级
imagePullSecrets:
  - name: name   #上面储存的

 

不覆盖目录

以上那些方式挂载的时候,会覆盖所挂载的目录,导致pod没办法正常的启动,所以使用subPath的方式挂载可以只挂载一个文件,从而不覆盖目录

……
……
spec:
  containers:
……
    volumeMounts:
    - mountPath: /etc/nginx/nginx.conf
      name: config-colume
      subPath: etc/nginx/nginx.conf    #不要加根
    ……
  volumes:
  - configMap:
      default:Mode: 420
      name: nginx-conf
      itmes:
        key: nginx.conf
        path: etc/nginx/nginx.conf
    name: config-v

优劣分析:

subPath:不会覆盖目录,但是不会热更新,如果修改了configmap的配置文件,已经挂载到容器内的不会跟着更新。
mountPath: 会热更新,但是会覆盖整个目录,

解决办法:使用mountPath,挂载到一个空目录,然后在容器启动前,做一个链接到相应的目录
 

 

posted @ 2021-12-16 17:16  念长卿  阅读(320)  评论(0)    收藏  举报