溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

k8s的Secret(密文)和configmap(明文)的使

發(fā)布時(shí)間:2020-03-02 03:17:44 來(lái)源:網(wǎng)絡(luò) 閱讀:525 作者:mb5cd21e691f31a 欄目:云計(jì)算

一、Secret

Secret :用來(lái)保存一些敏感信息,比如數(shù)據(jù)庫(kù)的用戶名密碼或者秘鑰。

概覽

Secret是用來(lái)保存小片敏感數(shù)據(jù)的k8s資源,例如密碼,token,或者秘鑰。這類數(shù)據(jù)當(dāng)然也可以存放在Pod或者鏡像中,但是放在Secret中是為了更方便的控制如何使用數(shù)據(jù),并減少暴露的風(fēng)險(xiǎn)。
用戶可以創(chuàng)建自己的secret,系統(tǒng)也會(huì)有自己的secret。
Pod需要先引用才能使用某個(gè)secret,Pod有2種方式來(lái)使用secret:作為volume的一個(gè)域被一個(gè)或多個(gè)容器掛載;在拉取鏡像的時(shí)候被kubelet引用。

內(nèi)建的Secrets

由ServiceAccount創(chuàng)建的API證書附加的秘鑰
k8s自動(dòng)生成的用來(lái)訪問apiserver的Secret,所有Pod會(huì)默認(rèn)使用這個(gè)Secret與apiserver通信

1. Secret類型

Secret有三種類型:

*** Opaque:使用base64編碼存儲(chǔ)信息,可以通過(guò)base64 --decode解碼獲得原始數(shù)據(jù),因此安全性弱。

  • kubernetes.io/dockerconfigjson:用于存儲(chǔ)docker registry的認(rèn)證信息。
  • kubernetes.io/service-account-token:用于被 serviceaccount 引用。serviceaccout 創(chuàng)建時(shí) Kubernetes 會(huì)默認(rèn)創(chuàng)建對(duì)應(yīng)的 secret。Pod 如果使用了 serviceaccount,對(duì)應(yīng)的 secret 會(huì)自動(dòng)掛載到 Pod 的 /run/secrets/kubernetes.io/serviceaccount 目錄中。**

舉例:保存數(shù)據(jù)庫(kù)的用戶名和密碼

用戶名: root
密碼: 123.com

1、通過(guò)--from-literal(文字的)

[root@master secret]# kubectl create secret generic mysecret1 --from-literal=username=root --from-literal=pasword=123.com

generic:通用的,一般的加密方式

查看一下
[root@master secret]# kubectl get secrets 

k8s的Secret(密文)和configmap(明文)的使

類型是Opaque(不透明的)

2、通過(guò)from-file(文件)

新建兩個(gè)文件并分別寫入用戶名和密碼
[root@master secret]# echo root > username
[root@master secret]# echo 123.com  > password
創(chuàng)建一個(gè)secret
[root@master secret]#  kubectl create secret generic mysecret2 --from-file=username --from-file=password 
查看一下
[root@master secret]# kubectl get secrets

k8s的Secret(密文)和configmap(明文)的使

3、通過(guò)-- from- env-file:

創(chuàng)建一個(gè)文件寫入用戶名和密碼
[root@master secret]#vim env.txt 
username=root
password=123.com
創(chuàng)建一個(gè)secret
[root@master secret]# kubectl create secret generic mysecret3 --from-env-file=env.txt 
查看一下
[root@master secret]# kubectl get secrets 

k8s的Secret(密文)和configmap(明文)的使

4、通過(guò)yaml配置文件

(1)把需要保存的數(shù)據(jù)加密(”base64“的方式)
[root@master secret]# echo root | base64
cm9vdAo=
[root@master secret]# echo 123.com | base64
MTIzLmNvbQo=

解碼:

[root@master secret]# echo -n cm9vdAo | base64 --decode 
root
[root@master secret]# echo -n MTIzLmNvbQo | base64 --decode 
123.com
(2)編寫secre4的yaml文件
[root@master secret]# vim secret4.yaml
apiVersion: v1
kind: Secret
metadata:
  name: mysecret4
data:
  username: cm9vdAo=
  password: MTIzLmNvbQo=
執(zhí)行一下
[root@master secret]# kubectl apply -f secret4.yaml 
(3)查看一下
[root@master secret]# kubectl get secrets 

k8s的Secret(密文)和configmap(明文)的使

如果來(lái)使用Secret資源

1. 以Volume掛載的方式

使用Secret

secret可以作為數(shù)據(jù)卷掛載或者作為環(huán)境變量暴露給Pod中的容器使用,也可以被系統(tǒng)中的其他資源使用。比如可以用secret導(dǎo)入與外部系統(tǒng)交互需要的證書文件等。

在Pod中以文件的形式使用secret

  1. 創(chuàng)建一個(gè)Secret,多個(gè)Pod可以引用同一個(gè)Secret
  2. 修改Pod的定義,在spec.volumes[]加一個(gè)volume,給這個(gè)volume起個(gè)名字,spec.volumes[].secret.secretName記錄的是要引用的Secret名字
  3. 在每個(gè)需要使用Secret的容器中添加一項(xiàng)spec.containers[].volumeMounts[],指定spec.containers[].volumeMounts[].readOnly = true,spec.containers[].volumeMounts[].mountPath要指向一個(gè)未被使用的系統(tǒng)路徑。
  4. 修改鏡像或者命令行使系統(tǒng)可以找到上一步指定的路徑。此時(shí)Secret中data字段的每一個(gè)key都是指定路徑下面的一個(gè)文件名
編寫pod的yaml文件
[root@master secret]# vim pod.yaml 

apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: mypod
    image: busybox
    args:
      - /bin/sh
      - -c
      - sleep 300000
    volumeMounts:
    - name: secret-test
      mountPath: "/etc/secret-test"  #pod中的路徑
      readOnly: true                 #是否只讀
  volumes:
  - name: secret-test
    secret:
      secretName: mysecret1

每一個(gè)被引用的Secret都要在spec.volumes中定義
如果Pod中的多個(gè)容器都要引用這個(gè)Secret那么每一個(gè)容器定義中都要指定自己的volumeMounts,但是Pod定義中聲明一次spec.volumes就好了。
映射secret key到指定的路徑
可以控制secret key被映射到容器內(nèi)的路徑,利用spec.volumes[].secret.items來(lái)修改被映射的具體路徑

執(zhí)行一下
[root@master secret]# kubectl apply -f pod.yaml 

Secret文件權(quán)限

可以指定secret文件的權(quán)限,類似linux系統(tǒng)文件權(quán)限,如果不指定默認(rèn)權(quán)限是0644,等同于linux文件的-rw-r--r--權(quán)限

進(jìn)入容器查看保存的數(shù)據(jù)
[root@master secret]# kubectl exec -it mypod /bin/sh
/ # cd /etc/secret-test/
/etc/secret-test # ls
pasword   username
/etc/secret-test # cat username 
root
/etc/secret-test # cat pasword 
123.com
測(cè)試是否有只讀權(quán)限
123.com/etc/secret-test # echo admin > username
/bin/sh: can't create username: Read-only file system

1.1 自定義存放數(shù)據(jù)的文件名的yaml文件

[root@master yaml]#  vim pod.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: mypod
    image: busybox
    args:
      - /bin/sh
      - -c
      - sleep 300000
    volumeMounts:
    - name: secret-test
      mountPath: "/etc/secret-test"  #pod中的路徑
      readOnly: true                 #是否只讀
  volumes:
  - name: secret-test
    secret:
      secretName: mysecret1
      items:
      - key: username
        path: my-group/my-username   #自定義的容器中的目錄
      - key: password
        path: my-group/my-password   #自定義的容器中的目錄
執(zhí)行一下
[root@master yaml]# kubectl apply -f pod.yaml
查看一下
[root@master secret]# kubectl exec -it mypod /bin/sh
//進(jìn)入容器查看
 cat /etc/secret-test/my-group/my-password 
123.com 
 cat /etc/secret-test/my-group/my-username 
root

1.2 如果,現(xiàn)在將secret資源內(nèi)保存的數(shù)據(jù)進(jìn)行更新,請(qǐng)問,使用此數(shù)據(jù)的應(yīng)用內(nèi),數(shù)據(jù)是是否也會(huì)更新?

會(huì)實(shí)時(shí)更新(這里引用數(shù)據(jù),是以volumes掛 載使用數(shù)據(jù)的方式)。

更新mysecret1的數(shù)據(jù): password ---> admin YWRtaW4K (base64)

可以通過(guò)edit 命令,直接修改。

[root@master secret]# kubectl edit secrets mysecret1

k8s的Secret(密文)和configmap(明文)的使

查看一下
[root@master secret]# kubectl exec -it mypod /bin/sh
//進(jìn)入容器查看
  cat /etc/secret-test/my-group/my-password 
admin
  cat /etc/secret-test/my-group/my-username 
root

數(shù)據(jù)已經(jīng)成功更新了

2、以環(huán)境變量的方式

創(chuàng)建一個(gè)Secret,多個(gè)Pod可以引用同一個(gè)Secret
修改pod的定義,定義環(huán)境變量并使用env[].valueFrom.secretKeyRef指定secret和相應(yīng)的key
修改鏡像或命令行,讓它們可以讀到環(huán)境變量

編寫pod的yaml文件

[root@master secret]# vim pod-env.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: mypod2
spec:
  containers:
  - name: mypod
    image: busybox
    args:
      - /bin/sh
      - -c
      - sleep 300000
    env:
      - name: SECRET_USERNAME
        valueFrom:
          secretKeyRef:
            name: mysecret2
            key: username
      - name: SECRET_PASSWORD
        valueFrom:
          secretKeyRef:
            name: mysecret2
            key: password
執(zhí)行一下
[root@master secret]# kubectl apply -f pod-env.yaml 
查看一下
[root@master secret]# kubectl get pod

k8s的Secret(密文)和configmap(明文)的使

進(jìn)入容器查看保存的數(shù)據(jù)
[root@master secret]# kubectl exec -it mypod2 /bin/sh
/ # echo $SECRET_USERNAME
root
/ # echo $SECRET_PASSWORD
123.com

2.1 更新sevret文件的內(nèi)容

 [root@master yaml]# kubectl edit secrets mysecret2
 //修改保存文件的內(nèi)容

k8s的Secret(密文)和configmap(明文)的使

查看一下
[root@master secret]# kubectl exec -it mypod2 /bin/sh
/ # echo $SECRET_USERNAME
root
/ # echo $SECRET_PASSWORD
123.com

等待了一定時(shí)間后,可以看到這個(gè)數(shù)據(jù)并沒有沒有改變

總結(jié)

如果引用secret數(shù)據(jù)的應(yīng)用, 要求會(huì)隨著secret資源對(duì)象內(nèi)保存的數(shù)據(jù)的更新,而實(shí)時(shí)更新,那么應(yīng)該使用volumes掛載的方式引用資源因?yàn)橛铆h(huán)境變量的方式引用不會(huì)實(shí)時(shí)更新數(shù)據(jù)。

二、ConfigMap

  上面提到的Secret可以為Pod提供機(jī)密數(shù)據(jù)的存儲(chǔ),而對(duì)于一些非機(jī)密敏感的數(shù)據(jù),像一些應(yīng)用的配置信息啊神馬的,則可以使用Configmap。

  Configmap的創(chuàng)建與使用方式與Secret非常類似,不同點(diǎn)只在于數(shù)據(jù)以明文形式存放(不過(guò),我覺得Secret的密文形式也并不密文,只能算得上是簡(jiǎn)單編碼)。

和Secret資源類似,不同之處在于,secret 資源保存的是敏感信息,而Configmap保存的是以明文方式存放的數(shù)據(jù)。
k8s的Secret(密文)和configmap(明文)的使

username:adam

age:18

創(chuàng)建的四種方式

1、通過(guò)-- from- literal(文字的):

[root@master yaml]# kubectl create configmap myconfigmap1 --from-literal=username=adam --from-literal=age=18
查看一下
[root@master yaml]# kubectl get cm

k8s的Secret(密文)和configmap(明文)的使

[root@master yaml]# kubectl describe cm

k8s的Secret(密文)和configmap(明文)的使

2、通過(guò)--from-file (文件) :

[root@master yaml]# echo adam > username
[root@master yaml]# echo 18 > age
創(chuàng)建
[root@master yaml]# kubectl create configmap myconfigmap2 --from-file=username --from-file=age 
查看一下
[root@master yaml]# kubectl describe cm

k8s的Secret(密文)和configmap(明文)的使

3、通過(guò)--from- env-file:

[root@master yaml]# vim env.txt 
username=adam
age=18
創(chuàng)建
[root@master yaml]# kubectl create configmap  myconfigmap3 --from-env-file=env.txt
查看一下
[root@master configmap]# kubectl describe cm

k8s的Secret(密文)和configmap(明文)的使

4、通過(guò)yaml配置文件:

[root@master yaml]# vim configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfigmap4
data:
  username: 'adam'
  age: '18'
創(chuàng)建
[root@master yaml]# kubectl apply -f configmap.yaml 
查看一下
[root@master yaml]# kubectl describe cm

k8s的Secret(密文)和configmap(明文)的使

如何來(lái)使用configmap資源

1. 以Volume掛載的方式

[root@master yaml]# vim v-pod.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: pod1
spec:
  containers:
  - name: mypod
    image: busybox
    args:
      - /bin/sh
      - -c
      - sleep 300000
    volumeMounts:
    - name: cmp-test
      mountPath: "/etc/cmp-test"
      readOnly: true
  volumes:
  - name: cmp-test
    configMap:
      name: myconfigmap1
執(zhí)行一下
[root@master configmap]# kubectl apply -f v-pod.yaml 
查看一下
[root@master configmap]# kubectl exec -it pod1 /bin/sh
//進(jìn)入容器查看一下
 > cat /etc/cmp-test/age 
18/ 
 > cat /etc/cmp-test/username 
adam/ 

1.1 自定義存放數(shù)據(jù)的文件名的yaml文件

[root@master configmap]# vim v-pod2.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: pod3
spec:
  containers:
  - name: mypod
    image: busybox
    args:
      - /bin/sh
      - -c
      - sleep 300000
    volumeMounts:
    - name: cmp-test
      mountPath: "/etc/cmp-test"
      readOnly: true
  volumes:
  - name: cmp-test
    configMap:
      name: myconfigmap1
      items:
      - key: username
        path: my-group/my-username   #自定義的容器中的目錄
      - key: age
        path: my-group/my-age   #自定義的容器中的目錄 
執(zhí)行一下
[root@master configmap]# kubectl apply -f v-pod2.yaml
查看一下
[root@master configmap]# kubectl exec -it pod3 /bin/sh
//進(jìn)入容器查看
> cat /etc/cmp-test/my-group/my-username 
adam/ 
> cat /etc/cmp-test/my-group/my-age 
18/ 

1.2 如果,現(xiàn)在將secret資源內(nèi)保存的數(shù)據(jù)進(jìn)行更新,請(qǐng)問,使用此數(shù)據(jù)的應(yīng)用內(nèi),數(shù)據(jù)是是否也會(huì)更新?

[root@master configmap]# kubectl edit cm myconfigmap1

k8s的Secret(密文)和configmap(明文)的使

查看一下
[root@master configmap]# kubectl exec -it pod3 /bin/sh
//進(jìn)入容器查看
> cat /etc/cmp-test/my-group/my-username 
adam/ 
> cat /etc/cmp-test/my-group/my-age 
10

可以看到更新成功

2.以環(huán)境變量的方式

[root@master configmap]# vim e-pod.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: pod2
spec:
  containers:
  - name: mypod
    image: busybox
    args:
      - /bin/sh
      - -c
      - sleep 300000
    env:
      - name: CONFIGMAP_NAME
        valueFrom:
          configMapKeyRef:
            name: myconfigmap2
            key: username
      - name: CONFIGMAP_AGE
        valueFrom:
          configMapKeyRef:
            name: myconfigmap2
            key: age
執(zhí)行一下
[root@master configmap]# kubectl apply -f e-pod.yaml 
查看一下
[root@master configmap]# kubectl exec -it pod2 /bin/sh
//進(jìn)入容器查看一下
 > echo $CONFIGMAP_NAME
adam
 > echo $CONFIGMAP_AGE
18

2.1 更新sevret文件的內(nèi)容

[root@master configmap]# kubectl edit cm myconfigmap2
 //修改保存文件的內(nèi)容

k8s的Secret(密文)和configmap(明文)的使

查看一下
[root@master configmap]# kubectl exec -it pod2 /bin/sh
//進(jìn)入容器查看一下
 > echo $CONFIGMAP_NAME
adam
  > echo $CONFIGMAP_AGE
18

等待了一定時(shí)間后,可以看到這個(gè)數(shù)據(jù)并沒有沒有改變

可以看出這個(gè)configmap和secret的更新效果基本沒有區(qū)別。

總結(jié)configmap、與secret資源有什么相同和不同之處。

Secret 與 ConfigMap 對(duì)比

相同點(diǎn):

key/value的形式

屬于某個(gè)特定的namespace

可以導(dǎo)出到環(huán)境變量

可以通過(guò)目錄/文件形式掛載

通過(guò) volume 掛載的配置信息均可熱更新

不同點(diǎn):

Secret 可以被 ServerAccount 關(guān)聯(lián)

Secret 可以存儲(chǔ) docker register 的鑒權(quán)信息,用在 ImagePullSecret 參數(shù)中,用于拉取私有倉(cāng)庫(kù)的鏡像

Secret 支持 Base64 加密

Secret 分為 kubernetes.io/service-account-token、kubernetes.io/dockerconfigjson、Opaque 三種類型,而 Configmap 不區(qū)分類型

總結(jié)以volumes掛載、和環(huán)境變量方式引用資源的相同和不同之處。

volumes掛載(可根據(jù)更改數(shù)據(jù)更新):引用自己創(chuàng)建的secret(密文)或configmap(明文),掛載到容器中指定的目錄下。查看保存的文件時(shí),根據(jù)自己所填路徑和secret或configmap創(chuàng)建的文件,進(jìn)行查看。

環(huán)境變量(不因更改數(shù)據(jù)更新):引用自己創(chuàng)建的secret(密文)或configmap(明文),掛載到容器中指定的目錄下。查看保存的文件時(shí),根據(jù)自己環(huán)境變量,進(jìn)行查看。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI