理論+實操:k8S配置參數管理——secret與configmap


secret 安全配置參數

configmap 配置文件參數

一:secret概述

加密數據並存放在etcd中,讓pod的容器以掛載volume方式訪問

應用場景:憑據,身份令牌

官方文檔:https://kubernetes.io/docs/concepts/configuration/secret/

Secret 對象類型用來保存敏感信息,例如密碼、OAuth 令牌和 ssh key。 將這些信息放在 secret 中比放在 Pod 的定義或者 容器鏡像 中來說更加安全和靈活

Secret 是一種包含少量敏感信息例如密碼、token 或 key 的對象。這樣的信息可能會被放在 Pod spec 中或者鏡像中;將其放在一個 secret 對象中可以更好地控制它的用途,並降低意外暴露的風險。

1.1 創建secret的方法

用戶可以創建 secret,同時系統也創建了一些 secret。

  • 內置secret

Service Account 使用 API 憑證自動創建和附加 secret

Kubernetes 自動創建包含訪問 API 憑據的 secret,並自動修改您的 pod 以使用此類型的 secret。這樣可以安全地訪問apiserver

  • 創建您自己的sercet

使用 kubectl 創建 Secret

比如有些pod需要訪問數據庫,這些pod需要使用的用戶名和密碼可以放到本地宿主機的文件裏

資源參數寫入到etcd中

如果有多個pod資源,都可以與一個secret建立關係

1.2 使用secret的方法

要使用 secret,pod 需要引用 secret。

  • Pod 可以用兩種方式使用 secret:

作爲 volume 中的文件被掛載到 pod 中的一個或者多個容器裏;

當 kubelet 爲 pod 拉取鏡像時使用。

二:創建Secret

2.1 基於文件創建

[root@master1 ~]# kubectl create secret --help
Create a secret using specified subcommand.

Available Commands:
  docker-registry 創建一個用於Docker註冊表的祕密
  generic         從本地文件、目錄或文字值創建一個祕密
  tls             創建一個TLS祕密

Usage:
  kubectl create secret [flags] [options]

Use "kubectl <command> --help" for more information about a given command.
Use "kubectl options" for a list of global command-line options (applies to all commands).

-n 轉行符

注意: 特殊字符(例如 $, \*! )需要轉義。 如果您使用的密碼具有特殊字符,則需要使用 \\ 字符對其進行轉義。 例如,如果您的實際密碼是 S!B\*d$zDsb ,則應通過以下方式執行命令: kubectl create secret generic dev-db-secret --from-literal=username=devuser --from-literal=password=S\!B\\*d\$zDsb 您無需從文件中轉義密碼中的特殊字符( --from-file )。

[root@master1 ~]# echo -n 'gsy' > /root/username.txt
[root@master1 ~]# echo -n 'gsy123' > /root/password.txt
[root@master1 ~]# kubectl create secret generic db-user-pass --from-file=/root/username.txt --from-file=/root/password.txt
secret/db-user-pass created
[root@master1 ~]# kubectl get secret
NAME                  TYPE                                  DATA   AGE
db-user-pass          Opaque                                2      10s
default-token-qm9rm   kubernetes.io/service-account-token   3      17d
[root@master1 ~]# kubectl describe secret db-user-pass
Name:         db-user-pass
Namespace:    default
Labels:       <none>
Annotations:  <none>

Type:  Opaque

Data
====
password.txt:  6 bytes
username.txt:  3 bytes

2.2 基於參數手動創建

參數首先要進行base64編碼

[root@master1 ~]# echo -n 'gsy' | base64
Z3N5
[root@master1 ~]# echo -n 'gsy123' | base64
Z3N5MTIz

2.2.1 編輯yaml文件

[root@master1 ~]# vim secret.yaml
apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
data:
  username: Z3N5
  password: Z3N5MTIz
[root@master1 ~]# kubectl create -f secret.yaml 
secret/mysecret created
[root@master1 ~]# kubectl get secret
NAME                  TYPE                                  DATA   AGE
db-user-pass          Opaque                                2      15m
default-token-qm9rm   kubernetes.io/service-account-token   3      17d
mysecret              Opaque                                2      4s
[root@master1 ~]# kubectl describe secret mysecret
Name:         mysecret
Namespace:    default
Labels:       <none>
Annotations:  <none>

Type:  Opaque

Data
====
password:  6 bytes
username:  3 bytes

2.3 總結

第一種,使用參數文件,使用secret中的變量導入到pod中

[root@master1 ~]#  kubectl get secret mysecret -o yaml
apiVersion: v1
data:
  password: Z3N5MTIz
  username: Z3N5
kind: Secret
metadata:
  creationTimestamp: 2020-05-17T07:02:12Z
  name: mysecret
  namespace: default
  resourceVersion: "1022741"
  selfLink: /api/v1/namespaces/default/secrets/mysecret
  uid: 55036ebf-980c-11ea-a668-000c29db840b
type: Opaque

注意:通過對內容進行序列化後,生成一個後綴作爲 Secrets 的名稱。這樣可以確保每次修改內容時都會生成一個新的 Secret。

備註:解碼方法

[root@master1 ~]# echo 'Z3N5' | base64 --decode
gsy[root@master1 ~]#

三:使用secret

  • Secret 可以作爲數據卷被掛載,

  • 或作爲環境變量 暴露出來以供 pod 中的容器使用。

它們也可以被系統的其他部分使用,而不直接暴露在 pod 內。 例如,它們可以保存憑據,系統的其他部分應該用它來代表您與外部系統進行交互。

3.1 作爲環境變量暴露出來

key: username賦值給SECRET_USERNAME

key: password 賦值給SECRET_PASSWORD

gsy[root@master1 ~]# vim secret-env.yaml
apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: nginx
    image: nginx
    env:
      - name: SECRET_USERNAME
        valueFrom:
          secretKeyRef:
            name: mysecret
            key: username
      - name: SECRET_PASSWORD
        valueFrom:
          secretKeyRef:
            name: mysecret
            key: password
  • exec進入測試env
[root@master1 ~]# kubectl apply -f secret-env.yaml 
pod/mypod created
[root@master1 ~]# kubectl get pods -w
NAME                                READY   STATUS    RESTARTS   AGE
dns-test                            1/1     Running   0          4h16m
mypod                               1/1     Running   0          9s
[root@master1 ~]# kubectl exec -it mypod bash
root@mypod:/# echo $SECRET_USERNAME
gsy
root@mypod:/# echo $SECRET_PASSWORD
gsy123
root@mypod:/# exit
exit

3.2 以volume的形式掛載到pod的某個目錄下

[root@master1 ~]# vim secret-volume.yaml
apiVersion: v1
kind: Pod
metadata:
  name: mypod-1
spec:
  containers:
  - name: nginx
    image: nginx
    volumeMounts:
    - name: foo
      mountPath: "/etc/foo"	#容器內掛載路徑
      readOnly: true
  volumes:
  - name: foo
    secret:
      secretName: mysecret
[root@master1 ~]# kubectl create -f secret-volume.yaml 
pod/mypod-1 created
[root@master1 ~]# kubectl exec -it mypod-1 bash
root@mypod-1:/# cd /etc/foo
root@mypod-1:/etc/foo# ls
password  username
root@mypod-1:/etc/foo# cat password 
gsy123root@mypod-1:/etc/foo# cat username 
gsyroot@mypod-1:/etc/foo# ll
bash: ll: command not found
root@mypod-1:/etc/foo# ls -l
total 0
lrwxrwxrwx. 1 root root 15 May 17 07:24 password -> ..data/password
lrwxrwxrwx. 1 root root 15 May 17 07:24 username -> ..data/username

四:configmap

與secret類似,區別在於configmap保存的是不需要加密配置的信息

應用場景:應用配置

4.1 創建方式

  • kubectl、編寫yaml文件

  • 變量參數形式

4.2 使用kubectl創建

[root@master1 ~]# vim redis.txt
redis.host=127.0.0.1
redis.port=6379
redis.password=123456

常見configmap資源

[root@master1 ~]# kubectl create configmap redis-config --from-file=redis.txt
configmap/redis-config created

查看資源

[root@master1 ~]# kubectl get configmap
NAME           DATA   AGE
redis-config   1      30s

查看描述信息

configmap可以簡寫成cm

[root@master1 ~]# kubectl describe configmap redis-config
Name:         redis-config
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
redis.txt:
----
redis.host=127.0.0.1
redis.port=6379
redis.password=123456

Events:  <none>

configmap的這種方式是鬆耦合處理,這種處理方式可以減輕運維壓力

簡化分工

4.3 創建yaml文件

[root@master1 ~]# vim cm.yaml
apiVersion: v1
kind: Pod
metadata:
  name: mypod-cm
spec:
  containers:
    - name: busybox
      image: busybox
      command: [ "/bin/sh","-c","cat /etc/config/redis.txt" ]
      volumeMounts:
      - name: config-volume
        mountPath: /etc/config
  volumes:
    - name: config-volume
      configMap:
        name: redis-config
  restartPolicy: Never
[root@master1 ~]# kubectl apply -f cm.yaml 
pod/mypod-cm created
[root@master1 ~]# kubectl get pods
NAME                                READY   STATUS              RESTARTS   AGE
dns-test                            1/1     Running             0          4h57m
mypod                               1/1     Running             0          41m
mypod-1                             1/1     Running             0          32m
mypod-cm                            0/1     ContainerCreating   0          14s

查看驗證結果

[root@master1 ~]# kubectl logs mypod-cm
redis.host=127.0.0.1
redis.port=6379
redis.password=123456
[root@master1 ~]# 

4.4 使用變量參數形式

創建configmap資源

[root@master1 ~]# vim myconfig.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfig
  namespace: default
data:
  special.level: info
  special.type: hello
[root@master1 ~]# kubectl create -f myconfig.yaml 
configmap/myconfig created
[root@master1 ~]# kubectl get cm
NAME           DATA   AGE
myconfig       2      19s
redis-config   1      23m

創建測試pod,測試pod中輸出configmap變量參數

[root@master1 ~]# vim ceshicmpod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: ceshicmpod
spec:
  containers:
    - name: busybox
      image: busybox
      command: [ "/bin/sh", "-c", "echo $(LEVEL) $(TYPE)" ]
      env:
        - name: LEVEL
          valueFrom:
            configMapKeyRef:
              name: myconfig
              key: special.level
        - name: TYPE
          valueFrom:
            configMapKeyRef:
              name: myconfig
              key: special.type
  restartPolicy: Never
[root@master1 ~]# kubectl apply -f ceshicmpod.yaml 
pod/ceshicmpod created

查看變量輸出結果

[root@master1 ~]# kubectl logs ceshicmpod
info hello
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章