溫馨提示×

溫馨提示×

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

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

k8s之安全信息(Secret)及配置信息(ConfigMa

發(fā)布時間:2020-07-28 15:32:35 來源:網(wǎng)絡(luò) 閱讀:1481 作者:wx5b9c94b17c62a 欄目:云計算

Secret

  • secret也是k8s中的一個資源對象,主要用于保存輕量的敏感信息,比如數(shù)據(jù)庫用戶名和密碼,令牌,認(rèn)證密鑰等。

  • 我們可以將這類敏感信息放在secret對象中,如果把它們暴露到鏡像或者pod spec中稍顯不妥,將其放在secret對象中可以更好地控制及使用,并降低意外暴露的風(fēng)險。
    Secret可以使用volume或者環(huán)境變量的方式來使用這些輕量級數(shù)據(jù)。

Secret有三種類型:

Service Account:用來訪問kubernetes API,由k8s自動創(chuàng)建,并且會自動掛載到pod的/run/secrets/kubernetes.io/serviceaccount 目錄中。
Opaque:base64編碼格式的Secret,用來存儲密碼,密鑰等。
kubernetes.io/dockerconfigjson: 用來存儲私有docker registry的認(rèn)證信息。

secret可以通過命令行或YAML文件來創(chuàng)建,假設(shè)我們需要存放在secret對象中的信息:

1, 用戶名:root
2,密碼:123456

1,創(chuàng)建Secret

創(chuàng)建Secret有以下四種方法:
1.1 通過--from-literal(以文字的方法創(chuàng)建)

[root@master ~]# kubectl  create secret generic mysecret --from-literal=username=root --from-literal=password=123456
secret/mysecret created

//查看創(chuàng)建的secret:
k8s之安全信息(Secret)及配置信息(ConfigMa
//查看該secret的詳細(xì)信息:
k8s之安全信息(Secret)及配置信息(ConfigMa

特點:每個--from-literal只能對應(yīng)一條信息。比較繁瑣。

1.2 通過--from-file(以文件的方式創(chuàng)建)

[root@master ~]# echo root > username
[root@master ~]# echo 123456 > password
[root@master ~]# kubectl create secret  generic newsecret --from-file=username --from-file=password
secret/newsecret created

//查看創(chuàng)建的secret:

[root@master ~]# kubectl  get  secrets  | grep newsecret
newsecret             Opaque                                2      64s

特點:同樣是每個文件對應(yīng)一條信息。每個文件中只能保存一個,為了保證機密性,導(dǎo)入后有必要將本地的文件刪除掉。

1.3 通過--from-env-file(以變量的方式創(chuàng)建)

[root@master ~]# cat > env.txt <<EOF
> username=root
> password=123456
> EOF
[root@master ~]# kubectl  create secret generic env-secret --from-env-file=env.txt
secret/env-secret created

k8s之安全信息(Secret)及配置信息(ConfigMa

特點:可以在文件里面保存多條信息,文件env.txt中每條key=value對應(yīng)一條信息條目。

1.4 通過yaml配置文件:
#文件中的敏感數(shù)據(jù)必須是通過 base64 編碼后的結(jié)果。

[root@master ~]# echo root | base64
cm9vdAo=
[root@master ~]# echo 123456 | base64
MTIzNDU2Cg==

#編寫yaml文件:

apiVersion: v1
kind: Secret
metadata:
  name: secret-app
data:       #該字段為存放數(shù)據(jù)的字段,與其他資源對象不同,沒有spec字段。
  username: cm9vdAo=
  password: MTIzNDU2Cg==

//創(chuàng)建secert:

[root@master ~]# kubectl apply -f  secret.yaml 
secret/secret-app created

//反向解析加密數(shù)據(jù):

[root@master ~]# echo -n  cm9vdAo= | base64 --decode
root
[root@master ~]# echo -n MTIzNDU2Cg== | base64  --decode
123456

特點:便于保存,跨主機使用時會非常方便。

2,如何使用secret

一,以volume方式使用secret:
pod通過volume的方式使用secret:
pod的配置文件如下所示:

apiVersion: v1
kind: Pod
metadata:
  name: secret-pod
spec:
  containers:
  - name: secret-pod
    image: busybox
    args:
      - /bin/sh
      - -c
      - sleep 10; touch /tmp/healthy; sleep 3000
    volumeMounts:
    - name: foo
      mountPath: /etc/foo
      readOnly: true
  volumes:
  - name: foo
    secret:
      secretName: secret-app

(1)定義volume foo,來源為secret(secret-app)
(2)將foo mount到容器路徑/etc/foo,可指定讀寫權(quán)限為readOnly。

//創(chuàng)建pod并在容器中讀取secret:

[root@master secret]# kubectl apply -f  secret-pod.yaml 
pod/secret-pod created
[root@master secret]# kubectl  exec  -it secret-pod /bin/sh
/ # cd /etc/foo/
/etc/foo # ls
password  username
/etc/foo # cat password 
123456
/etc/foo # cat username 
root

可以看到,k8s會在指定路徑/etc/foo下為每條敏感數(shù)據(jù)創(chuàng)建一個文件,文件名就是數(shù)據(jù)條目的key,這里是/etc/foo/username和/etc/foo/password,value則以銘文存放在文件中。

(2)我們也可以自定義存放數(shù)據(jù)的文件名,完整的配置文件如下:

apiVersion: v1
kind: Pod
metadata:
  name: secret-pod
spec:
  containers:
  - name: secret-pod
    image: busybox
    args:
      - /bin/sh
      - -c
      - sleep 10; touch /tmp/healthy; sleep 3000
    volumeMounts:
    - name: foo
      mountPath: /etc/foo
      readOnly: true
  volumes:
  - name: foo
    secret:
      secretName: secret-app
      items:
      - key: username:
        path: my-group/my-username
      - key: password
        path: my-group/my-password

這時數(shù)據(jù)分別存放在/etc/foo/my-group/my-username和/etc/foo/my-group/my-password中。
//驗證數(shù)據(jù)存放位置:

[root@master secret]# kubectl  delete -f secret-pod.yaml 
pod "secret-pod" deleted
[root@master secret]# kubectl apply -f  secret-pod.yaml 
pod/secret-pod created
[root@master secret]# kubectl  exec  -it secret-pod /bin/sh
/ # cd /etc/foo/
/etc/foo # ls
my-group
/etc/foo # cd my-group/
/etc/foo/..2020_02_03_05_37_09.892671465/my-group # cat my-password 
123456
/etc/foo/..2020_02_03_05_37_09.892671465/my-group # cat my-username 
root

(3)以volume方式使用secret支持動態(tài)更新:secret更新后,容器中的數(shù)據(jù)也會更新。
//我們有需求將password更新為“123456.com”

[root@master secret]# echo 123456.com | base64
MTIzNDU2LmNvbQo=

修改secret配置文件:

apiVersion: v1
kind: Secret
metadata:
  name: secret-app
data:
  username: cm9vdAo=
  password: MTIzNDU2LmNvbQo=

//更新secret:

[root@master secret]# kubectl apply -f  secret.yaml 
secret/secret-app configured

//驗證password是否更新成功:

[root@master secret]# kubectl  exec  -it secret-pod /bin/sh
/ # cd /etc/foo/my-group/
/etc/foo/..2020_02_03_05_40_42.995350019/my-group # cat my-password 
123456.com

特點:如果secert的數(shù)據(jù)發(fā)生變化,引用數(shù)據(jù)的資源對象內(nèi)的數(shù)據(jù)也會隨之改變,當(dāng)secret更新-----pod也會更新。

二:以環(huán)境變量的方式使用
通過volume使用secret時,容器必須從文件讀取數(shù)據(jù),會稍嫌麻煩,k8s還支持通過環(huán)境變量來使用secret。

pod配置文件示例如下:

apiVersion: v1
kind: Pod
metadata:
  name: secret-pod
spec:
  containers:
  - name: secret-pod
    image: busybox
    args:
      - /bin/sh
      - -c
      - sleep 10; touch /tmp/healthy; sleep 3000
    env:
      - name: SECRET_USERNAME
        valueFrom:
          secretKeyRef:
            name: secret-app
            key: username
      - name: SECRET_PASSWORD
        valueFrom:
          secretKeyRef:
            name: secret-app
            key: password

//創(chuàng)建pod并讀取secret:

[root@master secret]# kubectl apply -f  secret-pod.yaml 
pod/secret-pod created
[root@master secret]# kubectl exec  -it secret-pod /bin/sh
/ # echo $SECRET_USERNAME
root
/ # echo $SECRET_PASSWORD
123456.com

(2)驗證:接下來我們修改secret中password的值,查看pod內(nèi)的數(shù)據(jù)是否會改變?
經(jīng)過測試,發(fā)現(xiàn)pod中的值是不會發(fā)生改變的。

特點:環(huán)境變量讀取secret很方便,但無法支撐secret動態(tài)更新。

configMap

  • Secret可以為pod提供密碼,Token,私鑰等敏感數(shù)據(jù)。而對于一些非敏感數(shù)據(jù),比如應(yīng)用的配置信息,則可以用ConfigMap。
  • ConfigMap與secret非常相似,主要不同的是,他保存的數(shù)據(jù)是以明文的方式存放。

假設(shè)我們需要存放在ConfigMap對象中的信息:

config1=xxx
config2=yyy

1,創(chuàng)建ConfigMap

同樣擁有以下四種方法:
1.1 通過--from-literal創(chuàng)建:

[root@master configMap]# kubectl create configmap configmap1 --from-literal=config1=xxx --from-literal=config2=yyy
configmap/configmap1 created

//查看configmap信息:
k8s之安全信息(Secret)及配置信息(ConfigMa
可以看到保存的數(shù)據(jù)是以明文的方式存放。

特點:每個--from-literal對應(yīng)一條信息。

1.2 通過--from-file創(chuàng)建:

[root@master configMap]# echo xxx > config1
[root@master configMap]# echo yyy > config2
//創(chuàng)建configmap:
[root@master configMap]# kubectl create configmap configmap2 --from-file=config1 --from-file=config2
configmap/configmap2 created

特點:每個文件對應(yīng)一條信息,每個文件中只能保存一個,為了機密性,導(dǎo)入后需要將本地的文件刪除掉。

1.3 通過--from-env-file的方式創(chuàng)建:

[root@master configMap]# cat > env.txt <<EOF
> config1=xxx
> config2=yyy
> EOF

//創(chuàng)建configmap:

[root@master configMap]# kubectl create configmap configmap3 --from-env-file=env.txt 
configmap/configmap3 created

特點:可以再文件里面保存多條信息,文件env.txt中每條key=value 對應(yīng)一條信息條目。

1.4 通過yaml配置文件:
#文件中的敏感數(shù)據(jù)必須是通過 base64 編碼后的結(jié)果。
configmap配置文件如下:

apiVersion: v1
kind: ConfigMap
metadata:
  name: configmap-app
data:
  config1: xxx   #文件中的數(shù)據(jù)直接以明文輸入即可
  config2: yyy

//創(chuàng)建configmap:

 [root@master configMap]# kubectl apply -f  configmap.yaml 
configmap/configmap-app created

特點:便于保存,跨主機使用時會非常方便。

2,數(shù)據(jù)的引用

與Secret一樣,pod也可以通過volume或者環(huán)境變量的方式使用secret。
一:volume方式
yaml配置文件如下:

apiVersion: v1
kind: Pod
metadata:
  name: configmap-pod
spec:
  containers:
  - name: configmap-pod
    image: busybox
    args:
      - /bin/sh
      - -c
      - sleep 10; touch /tmp/healthy; sleep 3000
    volumeMounts:
    - name: foo
      mountPath: /etc/foo
  volumes:
  - name: foo
    configMap:
      name: configmap-app

//創(chuàng)建pod,并在pod中讀取數(shù)據(jù):

[root@master configMap]# kubectl apply -f configmap-pod.yaml 
pod/configmap-pod created
[root@master configMap]# kubectl exec  -it configmap-pod /bin/sh
/ # cd /etc/foo/
/etc/foo # ls
config1  config2
/etc/test # cat config1
xxx
/etc/test # cat config2
yyy

二:env環(huán)境變量方式
yaml配置文件內(nèi)容如下所示:

apiVersion: v1
kind: Pod
metadata:
  name: configmap-pod
spec:
  containers:
  - name: configmap-pod
    image: busybox
    args:
      - /bin/sh
      - -c
      - sleep 10; touch /tmp/healthy; sleep 3000
    env:
      - name: CONFIG1
        valueFrom:
          configMapKeyRef:
            name: configmap-app
            key: config1
      - name: CONFIG2
        valueFrom:
          configMapKeyRef:
            name: configmap-app
            key: config2

//創(chuàng)建pod并查看pod中的數(shù)據(jù):

[root@master configMap]# kubectl  delete -f  configmap-pod.yaml 
pod "configmap-pod" deleted
[root@master configMap]# kubectl  apply -f  configmap-pod.yaml 
pod/configmap-pod created
[root@master configMap]# kubectl exec  -it configmap-pod /bin/sh
/ # echo $CONFIG1
xxx
/ # echo $CONFIG2
yyy

經(jīng)過測試:同樣configmap和secret的兩種引用方式一樣,volume掛載的方式,如果configmap的數(shù)據(jù)更新,引用的資源對象內(nèi)的數(shù)據(jù)也會更新,而以env環(huán)境變量的方式,則不支持動態(tài)更新(可自己進(jìn)行測試驗證)。

注意:以上只是例子,要知道在大多數(shù)情況下,配置信息都是以文件形式提供,所以創(chuàng)建ConfigMap時一般只采用--from-file或YAML方式,而讀取ConfigMap時通常采用volume方式。

小結(jié):
向pod傳遞配置信息。如果信息需要加密,可使用Secret; 如果是一般的配置信息,則可使用ConfigMap。
Secret和ConfigMap支持四種定義方法,pod在使用它們時,可以選擇volume方式或環(huán)境變量方式,不過只有volume方式支持動態(tài)更新。

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

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

AI