1. 程式人生 > 其它 >k8s學習記錄,配置管理Secret(十八)

k8s學習記錄,配置管理Secret(十八)

1、Secret和Configmap一樣,都是做配置管理的資源,但是Secret在做配置儲存時會對儲存的資訊加密【base64加密】

常用型別

  • Opaque: 通用型Secret,預設型別
  • kubernetes.io/service-account-token:作用於ServiceAccount,包含一個令牌,用於標識API服務賬戶;
  • kubernetes.io/dockerconfigjson:下載私有倉庫映象使用的Secret,和宿主機的/root/.docker/config.json一致,宿主機登入後即可產生該檔案
  • kubernetes.io/basic-auth:用於使用基本認證(賬號密碼)的Secret,可以使用Opaque取代;
  • kubernetes.io/ssh-auth:用於儲存ssh金鑰的Secret;
  • kubernetes.io/tls:用於儲存HTTPS域名證書檔案的Secret,可以被Ingress使用;
  • bootstrap.kubernetes.io/token: 一種簡單的bearer token,用於建立新叢集或將新節點新增到現有叢集,在叢集安裝時可用於自動頒發叢集的證書

2、建立Secret【--from-file】

##生成2個txt檔案,儲存admin使用者名稱及admin密碼
[root@k8s-master01 podtest]# echo -n 'admin' > ./username.txt
[root@k8s-master01 podtest]# echo -n '1f2d1e2e67df' > ./password.txt

##根據儲存的2個檔案,建立Secret
[root@k8s-master01 podtest]# kubectl create secret generic db-user-pass --from-file=username.txt --from-file=password.txt
secret/db-user-pass created

##建立成功後檢視secret中儲存的資訊
[root@k8s-master01 podtest]# kubectl get secret
NAME                  	TYPE                                  	DATA   	AGE
db-user-pass          	Opaque                                	2      	8s
default-token-rqncz   kubernetes.io/service-account-token  	3      	114d
[root@k8s-master01 podtest]# kubectl get secret db-user-pass -oyaml
apiVersion: v1
data:
  password.txt: MWYyZDFlMmU2N2Rm
  username.txt: YWRtaW4=
kind: Secret
metadata:
  creationTimestamp: "2021-08-20T00:38:35Z"
  name: db-user-pass
  namespace: default
  resourceVersion: "12680399"
  uid: d4536eed-2539-4771-81d3-d7f9f9642c8f
type: Opaque

3、建立Secret【--from-literal】

## 在建立命令中指定要儲存的key和value
[root@k8s-master01 podtest]# kubectl create secret generic dev-db-secret --from-literal=username=devuser --from-literal=password='JQHU*#(!NAF='
secret/dev-db-secret created
[root@k8s-master01 podtest]# kubectl get secret
NAME                  TYPE                                  				DATA   	AGE
db-user-pass          Opaque                                			2      	15m
default-token-rqncz   kubernetes.io/service-account-token   	3      	114d
dev-db-secret         Opaque                                			2      	13s

## 檢視建立成功的secret及儲存的內容
[root@k8s-master01 podtest]# kubectl get secret dev-db-secret -oyaml
apiVersion: v1
data:
  password: SlFIVSojKCFOQUY9
  username: ZGV2dXNlcg==
kind: Secret
metadata:
  creationTimestamp: "2021-08-20T00:53:25Z"
  name: dev-db-secret
  namespace: default
  resourceVersion: "12682452"
  uid: cf1a7249-8849-4ff9-839b-faa6df513785
type: Opaque

注意⚠️:

  • 在使用--from-literal建立時,如果寫入的內容有特殊字元"\ = ?"等時,需要使用單引號將內容包括住,否則會提示建立失敗

4、基於yaml檔案來建立secret

## 先將要建立的secret資訊進行base64加密
[root@k8s-master01 podtest]# echo -n 'creamk87k8s' | base64
Y3JlYW1rODdrOHM=
[root@k8s-master01 podtest]# echo -n '12jdh12j412' | base64
MTJqZGgxMmo0MTI=

## 將加密後的資訊寫入到yaml檔案中
[root@k8s-master01 podtest]# vim secret.yaml
apiVersion: v1
kind: Secret
metadata:
  name: secret-from-file
type: Opaque
data:
  username: Y3JlYW1rODdrOHM=
  password: MTJqZGgxMmo0MTI=

## 儲存後退出,使用命令建立Secret
[root@k8s-master01 podtest]# kubectl create -f secret.yaml

5、使用Secret拉取私有映象檔案

## 登入阿里雲官方映象倉庫,輸入個人使用者名密碼登入成功
docker login registry.cn-hangzhou.aliyuncs.com/creamk87/nginx
## 登入成功後,才可以拉取映象檔案至本地

如果deployment等資源拉取私有映象時,怎麼處理呢

## 修改deployment中images地址為私有映象倉庫地址:registry.cn-hangzhou.aliyuncs.com/creamk87/nginx:1.15.1

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: dp-cm
  name: dp-cm
spec:
  replicas: 1
  selector:
    matchLabels:
      app: dp-cm
  template:
    metadata:
      labels:
        app: dp-cm
    spec:
      containers:
      - image: registry.cn-hangzhou.aliyuncs.com/creamk87/nginx:1.15.1
        name: nginx
        env:
         - name: LIVE
            valueFrom:
              configMapKeyRef:
                name: gameenvcm
                key: live

在建立deploy過程中,使用的是私有映象檔案,所以報錯需要登入才可進行映象拉取

檢視建立secret的幫助文件

從建立的幫助文件中可以看到,建立型別設定為docker-registry

繼續檢視幫助文件,建立時需要填寫的引數

[root@k8s-master01 podtest]# kubectl create secret docker-registry myregistry -h


## 建立secret的命令,docker登入資訊請替換為自己的登入資訊
kubectl create secret docker-registry myregistry --docker-username=creamk8757 --docker-password=xxxxxxxxx [email protected] --docker-server=registry.cn-hangzhou.aliyuncs.com

建立完成secret之後,再對原deployment進行secret的掛載

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: dp-cm
  name: dp-cm
spec:
  replicas: 1
  selector:
    matchLabels:
      app: dp-cm
  template:
    metadata:
      labels:
        app: dp-cm
    spec:
      imagePullSecrets:
      - name: myregistry
#     - name: dockerregistry  ## 如果有多個Secret可以依次在下方配置
      containers:
      - image: registry.cn-hangzhou.aliyuncs.com/creamk87/nginx:1.15.1
        name: nginx
## 使用新的yaml檔案進行更新
kubectl replace -f dp-cm.yaml


新建立的pod拉取映象成功

6、使用Secret管理HTTPS證書【正式環境一般不這麼使用,通常配置在負載均衡入口】

在個人電腦先準備練習用的證書,使用openssl生成證書

openssl req -x509 -nodes -days 365 \
-newkey rsa:2048 tls.key -out tls.crt -subj "/CN=test.com"

注意⚠️
僅個人練習使用,正式環境使用公司購買的證書來進行secret建立

## 使用證書檔案的crt和key來建立secret
kubectl create secret tls nginx-test-tls --key=tls.key --cert=tls.crt

建立完成後,直接在ingress中進行配置

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: nginx-https-test
  namespace: default
  annotations:
    kubernetes.io/ingress.class: "nginx"
spec:
  rules:
  - host: https-test.com
     http:
	   paths:
	   - backend:
	       serviceName: nginx-svc
		   servicePort: 80
 tls:
  - secretName: nginx-test-tls