k8s--密码管理

136 阅读3分钟

secret

secret的主要作用是存储密码信息,以及往pod里传递文件。secret以键值对的方式存储,

键=值或者是key=value
其中值是通过base64编码过的

创建secret的方法有很多,可以直接指定key,value,也可以把一个文件的内容作为value,还可以直接写yaml文件

secret/mysecret1 created
root@k8sdbamaster:/data/secert# kubectl get secret -n nssec
NAME        TYPE     DATA   AGE
mysecret1   Opaque   2      10s

secret有三种类型

  1. Opaque : base64编码格式的secret,用来存储密码,密钥等,但数据也通过base64-decode解码得到原始数据,加密性很弱。
  2. kubernetes.io/dockerconfigjson: 用来存储私有docker registry的认证信息
  3. kubernetes.io/service-account-token: 用于被serviceaccount引用 创建serviceaccount的时候,kubernetes会默认创建对应的secret.pod如果使用了serviceaccount对应的secret会自动挂载到pod目录/run/secrets/kubernetes.io/serviceaccount
--查看secret的属性和键值对
root@k8sdbamaster:/data/secert# kubectl describe secrets mysecret1 -n nssec
Name:         mysecret1
Namespace:    nssec
Labels:       <none>
Annotations:  <none>

Type:  Opaque

Data
====
xx:  3 bytes
yy:  6 bytes
root@k8sdbamaster:/data/secert# kubectl get secret mysecret1 -n nssec -o yaml
apiVersion: v1
data:
  xx: dG9t
  yy: cmVkaGF0
kind: Secret
metadata:
  creationTimestamp: "2023-09-09T11:06:42Z"
  name: mysecret1
  namespace: nssec
  resourceVersion: "2997695"
  uid: 324a18a7-4878-4185-88d3-73b5057bad79
type: Opaque
--通过base64 --decode解码查看键值对的具体值
root@k8sdbamaster:/data/secert# echo "dG9t" | base64 --decode
tomroot@k8sdbamaster:/data/secert# echo "cmVkaGF0" | base64 --decode
redhatroot@k8sdbamaster:/data/secert#

把文件创建为secret,此时文件名作为Key,文件的内容作为value,这种创建secret的作用是把一个文件的内容写入secret中,后面通过卷的方式来引用这个secret

root@k8sdbamaster:/data/secert# kubectl create secret generic mysecret2 --from-file=/etc/hosts -n nssec
--以yaml格式查看secret内容
root@k8sdbamaster:/data/secert# kubectl get secrets mysecret2 -n nssec -o yaml
apiVersion: v1
data:
  hosts: MTI3LjAuMC4xIGxvY2FsaG9zdAoxMC4yNy4xMC40NyBrOHNkYmFtYXN0ZXIKMTAuMjcuMTAuNDkgazhzZGJhd29ya2VyMQoxMC4yNy4xMC41MCBrOHNkYmF3b3JrZXIyCgojIFRoZSBmb2xsb3dpbmcgbGluZXMgYXJlIGRlc2lyYWJsZSBmb3IgSVB2NiBjYXBhYmxlIGhvc3RzCjo6MSAgICAgaXA2LWxvY2FsaG9zdCBpcDYtbG9vcGJhY2sKZmUwMDo6MCBpcDYtbG9jYWxuZXQKZmYwMDo6MCBpcDYtbWNhc3RwcmVmaXgKZmYwMjo6MSBpcDYtYWxsbm9kZXMKZmYwMjo6MiBpcDYtYWxscm91dGVycwoK
kind: Secret
metadata:
  creationTimestamp: "2023-09-09T11:19:26Z"
  name: mysecret2
  namespace: nssec
  resourceVersion: "2998842"
  uid: 4cc010c1-c1e7-47b8-8c5c-0cefa4478583
type: Opaque
--json文件格式查看secret内容
root@k8sdbamaster:/data/secert# kubectl get secrets mysecret2 -n nssec -o jsonpath='{.data.hosts}'
MTI3LjAuMC4xIGxvY2FsaG9zdAoxMC4yNy4xMC40NyBrOHNkYmFtYXN0ZXIKMTAuMjcuMTAuNDkgazhzZGJhd29ya2VyMQoxMC4yNy4xMC41MCBrOHNkYmF3b3JrZXIyCgojIFRoZSBmb2xsb3dpbmcgbGluZXMgYXJlIGRlc2lyYWJsZSBmb3IgSVB2NiBjYXBhYmxlIGhvc3RzCjo6MSAgICAgaXA2LWxvY2FsaG9zdCBpcDYtbG9vcGJhY2sKZmUwMDo6MCBpcDYtbG9jYWxuZXQKZmYwMDo6MCBpcDYtbWNhc3RwcmVmaXgKZmYwMjo6MSBpcDYtYWxsbm9kZXMKZmYwMjo6MiBpcDYtYWxscm91dGVycwoKroot@k8sdbamaster:/data/secert#
--获取具体值
root@k8sdbamaster:/data/secert# kubectl get secrets mysecret2 -n nssec -o jsonpath='{.data.hosts}' | base64 -d

通过创建变量文件的方式创建一个文件来创建secret

变量1=值1
变量2=值2

root@k8sdbamaster:/data/secert# cat env.txt xx=tom yy=redhat root@k8sdbamaster:/data/secert# kubectl create secret generic mysecret4 -n nssec --from-env-file=env.txt secret/mysecret4 created

通过创建yaml文件的方式

root@k8sdbamaster:/data/secert# echo -n 'tom' | base64
dG9t
root@k8sdbamaster:/data/secert# echo -n 'redhat' | base64
cmVkaGF0
root@k8sdbamaster:/data/secert# cat secret5.yaml
apiVersion: v1
kind: Secret
metadata:
  name: mysecret5
  namespace: nssec
type: Opaque
data:
  xx: dG9t
  yy: cmVkaGF0
root@k8sdbamaster:/data/secert# kubectl apply -f secret5.yaml

使用secret

以卷的方式

这种方式主要是在pod的yaml文件中创建一个类型为secret的卷,然后挂载到容器里某个指定的目录。容器创建好之后,会在容器的挂载目录创建一个文件,文件的名字是secret里的key,文件的内容是key对应的value。这种以卷的方式引用secret的主要作用是往pod里传递文件

root@k8sdbamaster:/data/secert# cat pod1.yaml
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: pod1
  name: pod1
  namespace: nssec
spec:
  volumes:
  - name: xx
    secret:
      secretName: mysecret2
  containers:
  - image: nginx
    imagePullPolicy: IfNotPresent
    name: pod1
    volumeMounts:
    - name: xx
      mountPath: "/etc/test"
      subPath: issue   //如果secret中有多个文件,subPath可以指定从secret中引用哪个文件
    resources: {}
  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}

以变量的方式

变量的值将会使用secretX里的keyX这个键对应的值

env:
- name: 
  valueFrom:
    secretKeyRef:
      name: secretX
      key: keyX

secret和configmap的区别是secret的值使用base64编码,而configmap不需要