ConfigMap資源
介紹
ConfigMap是讓組態檔從鏡像中解耦,讓鏡像的可移植性和可復制性,許多應用程式會從組態檔、命令列引數或環境變數中讀取配置資訊,這些配置資訊需要與docker image解耦,你總不能每修改一個配置就重做一個image吧?ConfigMap API給我們提供了向容器中注入配置資訊的機制,ConfigMap可以被用來保存單個屬性,也可以用來保存整個組態檔或者JSON二進制大物件,ConfigMap保存的值為鍵值方式,value長度沒有限制,
創建ConfigMap
ConfigMap支持命令創建和使用清單創建,有以下四種方式創建,
1、命令直接創建 --from-literal:
為
“kubectl create configmap”命令使用“--from-literal”選項可在命令列直接給出鍵值來創建ConfigMap物件,重復使用此選項可以傳遞多個鍵值對,格式如下:kubectl create configmap NAME --from-literal=key1=value1 --from-literal=key2=value2
[root@k8s-master ~]# kubectl create configmap nginx-config --from-literal=nginx_port=80 --from-literal=server_name=www.ilinux.cn #創建cm資源nginx-config,并指定兩個鍵值 configmap/nginx-config created [root@k8s-master ~]# kubectl get cm #查看cm資源 NAME DATA AGE nginx-config 2 4s [root@k8s-master ~]# kubectl describe cm/nginx-config #查看cm資源nginx-config的詳細資訊 Name: nginx-config Namespace: default Labels: <none> Annotations: <none> Data ==== nginx_port: ---- 80 server_name: ---- www.ilinux.cn Events: <none>
2、命令列基于檔案創建 --from-file:
為
“kubectl create configmap”命令使用“--from-file”選項即可基于檔案內容來創建ConfigMap物件,同樣可以重復多次使用,格式如下:kubectl create configmap my-config --from-file=key1=/path/to/bar/file1.txt --from-file=key2=/path/to/bar/file2.txt
[root@k8s-master ~]# mkdir configmap && cd configmap #創建一個測驗目錄 [root@k8s-master configmap]# vim www.conf #編輯檔案內容用作cm的value server { server_name www.ilinux.cn; listen 80; root /data/web/html/; } [root@k8s-master configmap]# kubectl create configmap nginx-www --from-file=www.conf=./www.conf #使用上面創建的檔案來創建cm資源物件 configmap/nginx-www created [root@k8s-master configmap]# kubectl get cm #查看cm資源物件 NAME DATA AGE nginx-config 2 7m1s nginx-www 1 5s [root@k8s-master configmap]# kubectl get cm nginx-www -o yaml #查看cm資源物件nginx-www的現象資訊 apiVersion: v1 data: www.conf: | server { server_name www.ilinux.cn; listen 80; root /data/web/html/; } kind: ConfigMap ......
3、命令列基于目錄創建 --from-file:
如果組態檔數量較多且存盤于有限的目錄之中,
kubectl還提供了基于目錄直接將多個檔案分別收納為鍵值資料的ConfigMap資源創建方式,將“--from-file”選項后面所跟的路徑指向一個目錄路徑就能將目錄下的所有檔案一同創建于同一ConfigMap資源中,命令格式如下:kubectl create configmap <configmap_name> --from-file=<path-to-directory>
這里假設/data/configs/nginx/conf.d/這個目錄下有許多的nginx的組態檔,下面這條命令則將這個目錄下的所有組態檔在創建ConfigMap資源時,會分別存盤為對應的鍵值資料, # kubectl create configmap nginx-config-files --from-file=/data/configs/nginx/conf.d/
4、使用資源清單創建:
基于清單檔案創建
ConfigMap資源時,它所使用的欄位包括通常的apiVersion、kind和metadata欄位,以及用于存盤資料的關鍵欄位“data”,[root@k8s-master ~]# kubectl explain cm KIND: ConfigMap VERSION: v1 FIELDS: apiVersion <string> kind <string> metadata <Object> binaryData <map[string]string> data <map[string]string>
[root@k8s-master configmap]# vim configmap-demo.yaml apiVersion: v1 kind: ConfigMap metadata: name: configmap-demo namespace: default data: log_level: INFO log_file: /var/log/test.log [root@k8s-master configmap]# kubectl apply -f configmap-demo.yaml configmap/configmap-demo created [root@k8s-master configmap]# kubectl get cm NAME DATA AGE configmap-demo 2 6s nginx-config 2 23m nginx-www 1 16m [root@k8s-master configmap]# kubectl get cm/configmap-demo -o yaml apiVersion: v1 data: log_file: /var/log/test.log log_level: INFO kind: ConfigMap metadata: ....
使用ConfigMap
1、環境變數方式注入到Pod
[root@k8s-master configmap]# vim pod-configmap-1.yaml apiVersion: v1 kind: Pod metadata: name: pod-cm-1 namespace: default labels: app: myapp spec: containers: - name: myapp image: ikubernetes/myapp:v1 ports: - name: http containerPort: 80 env: - name: NGINX_SERVER_PORT valueFrom: #下面這一段表示變數NGINX_SERVER_PORT的值來自于configmap資源nginx-config的key(nginx_port)的值 configMapKeyRef: name: nginx-config #configmap資源名稱 key: nginx_port #configmap資源里面的key名 - name: NGINX_SERVER_NAME valueFrom: configMapKeyRef: name: nginx-config key: server_name [root@k8s-master configmap]# kubectl apply -f pod-configmap-1.yaml #創建Pod pod/pod-cm-1 created [root@k8s-master configmap]# kubectl get pods #查看pod NAME READY STATUS RESTARTS AGE pod-cm-1 1/1 Running 0 4s [root@k8s-master configmap]# kubectl exec -it pod-cm-1 -- printenv |grep NGINX #連接pod資源pod-cm-1并執行命令printenv列印環境變數,過濾是否有上面定義的兩個環境變數 NGINX_SERVER_PORT=80 NGINX_SERVER_NAME=www.ilinux.cn #測驗,修改埠,可以發現使用環境變數的注入pod中的埠不會根據配置的變更而改變 [root@k8s-master configmap]# kubectl edit cm/nginx-config #編輯cm資源nginx-config將nginx_port值改為8080 ...... apiVersion: v1 data: nginx_port: "8080" ...... [root@k8s-master configmap]# kubectl exec -it pod-cm-1 -- printenv |grep NGINX NGINX_SERVER_PORT=80 NGINX_SERVER_NAME=www.ilinux.cn
2、存盤卷方式掛載ConfigMap
[root@k8s-master configmap]# vim pod-configmap-2.yaml apiVersion: v1 kind: Pod metadata: name: pod-cm-2 namespace: default labels: app: myapp spec: containers: - name: myapp image: ikubernetes/myapp:v1 ports: - name: http containerPort: 80 volumeMounts: - name: nginxconf mountPath: /etc/nginx/config.d/ readOnly: true volumes: #創建一個存盤卷 - name: nginxconf #存盤卷名稱 configMap: #使用configMap型別 name: nginx-config #指定configmap資源名稱 [root@k8s-master configmap]# kubectl apply -f pod-configmap-2.yaml #創建Pod pod/pod-cm-2 created [root@k8s-master configmap]# kubectl get pods #查看pod NAME READY STATUS RESTARTS AGE pod-cm-1 1/1 Running 0 10m pod-cm-2 1/1 Running 0 4s [root@k8s-master configmap]# kubectl exec -it pod-cm-2 -- /bin/sh #連接pod資源pod-cm-2,并進入到掛載目錄查看, / # ls /etc/nginx/config.d/ nginx_port server_name / # cd /etc/nginx/config.d/ /etc/nginx/config.d # cat nginx_port 8080 /etc/nginx/config.d # cat server_name www.ilinux.cn #測驗,修改埠,可以發現使用volume的方式掛載configmap到容器中,支持動態更新, [root@k8s-master configmap]# kubectl edit cm/nginx-config #編輯cm資源nginx-config將nginx_port值改為8088 apiVersion: v1 data: nginx_port: "8088" [root@k8s-master configmap]# kubectl exec -it pod-cm-2 -- /bin/sh /etc/nginx/config.d # cat nginx_port 8088 /etc/nginx/config.d #
示例
這里使用上面創建的configmap資源nginx-www示例,
1)編輯資源清單檔案
[root@k8s-master configmap]# vim pod-configmap-3.yaml apiVersion: v1 kind: Pod metadata: name: pod-cm-3 namespace: default labels: app: nginx spec: containers: - name: nginx image: nginx:1.12 ports: - name: http containerPort: 80 volumeMounts: - name: nginxwww mountPath: /etc/nginx/conf.d/ readOnly: true volumes: - name: nginxwww configMap: name: nginx-www
2)創建Pod
[root@k8s-master configmap]# kubectl apply -f pod-configmap-3.yaml pod/pod-cm-3 created [root@k8s-master configmap]# kubectl get pods -o wide #查看pod NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES pod-cm-3 1/1 Running 0 5s 10.244.1.92 k8s-node1 <none> <none>
3)進入到Pod中查看組態檔,并創建對應的資料目錄進行測驗
[root@k8s-master configmap]# kubectl exec -it pod-cm-3 -- /bin/sh #進入到pod中 # ls /etc/nginx/conf.d www.conf # cat /etc/nginx/conf.d/www.conf #查看生成的www.conf組態檔 server { server_name www.ilinux.cn; listen 80; root /data/web/html/; } # nginx -T #查看當前nginx加載的組態檔 ...... server { server_name www.ilinux.cn; listen 80; root /data/web/html/; } # mkdir -p /data/web/html #創建資料目錄 # echo "<h1>ConfigMap Pod Test</h1>" >> /data/web/html/index.html #創建測驗檔案 #這里拿kubernetes集群節點測驗 [root@k8s-master ~]# vim /etc/hosts #編輯hosts檔案將上面的pod和對應的域名進行決議 10.244.1.92 www.ilinux.cn [root@k8s-master ~]# curl www.ilinux.cn #訪問測驗 <h1>ConfigMap Pod Test</h1>
Secret資源
介紹
Secret物件存盤資料的方式及使用方式類似于ConfigMap物件,以鍵值方式存盤資料,在Pod資源中通過環境變數或存盤卷進行資料訪問,解決了密碼、token、密鑰等敏感資料的配置問題,而不需要將這些敏感資料暴露到鏡像或者pod spec中,另外,Secret物件的資料存盤和列印格式為Base64編碼的字串,因此用戶在創建Secret物件時也要提供此種編碼格式的資料,在容器中以環境變數或存盤卷的方式訪問時,它們會被自動解碼為明文格式,需要注意的是,如果是在Master節點上,Secret物件以非加密的格式存盤在etcd中,所以需要對etcd的管理和權限進行嚴格控制,
Secret的四種型別
-
Opaque:自定義資料內容;
base64編碼,用來存盤密碼、秘鑰、資訊、證書等資料,型別識別符號為generic, -
kubernetes.io/service-account-token:`Service Account
的認證資訊,可在創建Service Account`時由Kubernetes自動創建, -
kubernetes.io/dockerconfigjson:用來存盤Docker鏡像倉庫的認證資訊,型別識別符號為
docker-regiestry, -
kubernetes.io/tls:用于為
SSL通信模式存盤證書和私鑰檔案,命令式創建時型別標識為tls,
創建Secret
1、命令直接創建 --from-literal:
為
“kubectl create secret generic”命令使用“--from-literal”選項可在命令列直接給出鍵值來創建ConfigMap物件,重復使用此選項可以傳遞多個鍵值對,格式如下:kubectl create secret generic NAME --from-literal=key1=value1 --from-literal=key2=value2
[root@k8s-master ~]# kubectl create secret generic mysql-auth --from-literal=username=root --from-literal=password=MyP@sswd #創建secret資源mysql-auth,并指定兩個鍵值 secret/mysql-auth created [root@k8s-master ~]# kubectl get secret #查看secret資源 NAME TYPE DATA AGE default-token-blm9l kubernetes.io/service-account-token 3 3d mysql-auth Opaque 2 17s [root@k8s-master ~]# kubectl describe secret/mysql-auth #查看secret資源mysql-auth的詳細資訊 Name: mysql-auth Namespace: default Labels: <none> Annotations: <none> Type: Opaque Data ==== password: 8 bytes username: 4 bytes
2、命令列基于檔案創建 --from-file:
為
“kubectl create secret generic”命令使用“--from-file”選項即可基于檔案內容來創建ConfigMap物件,同樣可以重復多次使用,格式如下:kubectl create secret generic my-secret --from-file=key1=/path/to/bar/file1.txt --from-file=key2=/path/to/bar/file2.txt
[root@k8s-master ~]# mkdir secret && cd secret [root@k8s-master secret]# echo -n admin > ./username [root@k8s-master secret]# echo -n 123456 > ./password [root@k8s-master secret]# [root@k8s-master secret]# kubectl create secret generic mysecret --from-file=username=./username --from-file=password=./password secret/mysecret created [root@k8s-master secret]# kubectl get secret NAME TYPE DATA AGE default-token-blm9l kubernetes.io/service-account-token 3 3d mysecret Opaque 2 6s mysql-auth Opaque 2 5m23s [root@k8s-master secret]# kubectl get secret/mysecret -o yaml apiVersion: v1 data: password: MTIzNDU2 #這里可以看到secret存盤的值都是base64編碼格式 username: YWRtaW4= kind: Secret metadata ......
3、使用資源清單創建:
Secret資源是標準的Kubernetes API物件,除了標準的apiVersion、kind和metadata欄位,它可用的其他欄位如下:data <map[string]string> #"key:value"格式的資料,通常是敏感資訊,資料格式需要以Base64格式編碼的字串,因此需要事先完成編碼 stringData <map[string]string> #以明文格式(非Base64編碼)定義的“key:value"資料;無須事先對資料進行Base64編碼,而是在創建為Secret物件時自動進行編碼并保存于data欄位中, type <string> #僅是為了便于編程方式處理Secret資料而提供的型別標識,
[root@k8s-master secret]# vim secret-demo.yaml apiVersion: v1 kind: Secret metadata: name: secret-demo namespace: default stringData: username: redis password: redisP@ss type: Opaque [root@k8s-master secret]# kubectl apply -f secret-demo.yaml secret/secret-demo created [root@k8s-master secret]# kubectl get secret NAME TYPE DATA AGE default-token-blm9l kubernetes.io/service-account-token 3 3d1h mysecret Opaque 2 28m mysql-auth Opaque 2 33m secret-demo Opaque 2 5s [root@k8s-master secret]# kubectl get secret/secret-demo -o yaml apiVersion: v1 data: password: cmVkaXNQQHNz username: cmVkaXM= kind: Secret metadata: ......
使用Secret
類似于
Pod消費ConfigMap物件的方式,Secret物件可以注入為環境變數,也可以存盤為存盤卷形式掛載使用,因為Secret默認保存的是非明文格式,通過注入為環境變數實為不明智,
存盤卷方式示例:
這里假設需要為Nginx測驗創建SSL虛擬主機
1)首先創建私鑰和自簽證書
[root@k8s-master secret]# openssl genrsa -out nginx.key 2048 [root@k8s-master secret]# openssl req -new -x509 -key nginx.key -out nginx.crt -subj /C=CN/ST=ShenZhen/L=ShenZhen/O=DevOps/CN=www.ilinux.cn
2)創建secret
[root@k8s-master secret]# kubectl create secret tls nginx-ssl --key=./nginx.key --cert=./nginx.crt secret/nginx-ssl created [root@k8s-master secret]# kubectl get secret nginx-ssl NAME TYPE DATA AGE nginx-ssl kubernetes.io/tls 2 14s
3)編輯資源清單
[root@k8s-master secret]# vim pod-secret-demo.yaml apiVersion: v1 kind: Pod metadata: name: secret-volume-demo namespace: default spec: containers: - name: web-server image: nginx:1.12 volumeMounts: - name: nginxcert mountPath: /etc/nginx/ssl/ readOnly: true volumes: - name: nginxcert secret: secretName: nginx-ssl
4)創建pod并驗證
[root@k8s-master secret]# kubectl apply -f pod-secret-demo.yaml pod/secret-volume-demo created [root@k8s-master secret]# kubectl exec -it secret-volume-demo -- /bin/sh # ls /etc/nginx/ssl tls.crt tls.key
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/55401.html
標籤:其他
