K8S Config應用配置小結
一、背景
在自動化流程中,對于一個應用來說,從開發(fā)階段的配置管理,到制作容器鏡像,再到最后通過K8S集群發(fā)布為服務,整個過程涉及到的配置非常多;
應用環(huán)境:通常是指代碼層面的依賴配置,以常用的Nacos來說,通常會涉及框架、組件、自定義等幾個層面的配置管理;
運行環(huán)境:以微服務架構來說,實際環(huán)境中需要管理多個應用的服務發(fā)布,在整個過程中必然會存在很多配置的管理,比如應用的資源分配、不同環(huán)境交互時的身份認證、敏感信息的安全管理等;
不論是應用還是運行層面的配置,都會涉及到一個基本的邏輯:配置可以抽取出來單獨管理,在流程中直接引入該配置即可;
二、ConfigMap
ConfigMap用來將非機密性的數(shù)據(jù)保存到鍵值對中,Pod可以將其用作環(huán)境變量、命令行參數(shù)或者存儲卷中的配置文件,會將環(huán)境配置信息和容器鏡像解耦,便于應用配置的修改;
1、創(chuàng)建
ConfigMap中data
字段用來保存UTF-8
字符串,binaryData
用來保存二進制數(shù)據(jù)作為base64
編碼的字串;
apiVersion: v1 kind: ConfigMap metadata: name: app-config-map namespace: default data: active: test started: hello program: world
創(chuàng)建【ConfigMap】
kubectl apply -f app-config-map.yaml
查看【ConfigMap】
kubectl get cm/app-config-map -o yaml
K8S界面查看【ConfigMap】
2、使用
用法一:使用「app-config-map」中的值來配置【Pod】,在env
中定義多個環(huán)境變量,但是值從ConfigMap中讀??;
apiVersion: v1 kind: Pod metadata: name: auto-client-one spec: containers: - name: auto-client image: auto-client:1.1.3 imagePullPolicy: Never ports: - containerPort: 8079 env: - name: DATA_ACTIVE valueFrom: configMapKeyRef: name: app-config-map key: active - name: DATA_STARTED valueFrom: configMapKeyRef: name: app-config-map key: started - name: DATA_PROGRAM valueFrom: configMapKeyRef: name: app-config-map key: program
創(chuàng)建【Pod】
kubectl create -f auto-client-one.yaml
用法二:在【Pod】配置中,直接使用envFrom
引入「app-config-map」,從而完成環(huán)境變量的設置;
apiVersion: v1 kind: Pod metadata: name: auto-client-two spec: containers: - name: auto-client image: auto-client:1.1.3 imagePullPolicy: Never ports: - containerPort: 8079 envFrom: - configMapRef: name: app-config-map
查看環(huán)境變量
# 1、執(zhí)行該命令 kubectl exec -it auto-client-one -- bash # 2、輸入命令:env env # 3、打印的環(huán)境變量,只留下【app-config-map】配置的參數(shù) DATA_ACTIVE=test DATA_PROGRAM=world DATA_STARTED=hello # 4、查看【DATA_STARTED】的變量值 echo $DATA_STARTED
在【auto-client:1.1.3】容器鏡像中,添加了一個輸出環(huán)境變量的定時任務,通過查看運行日志,可以看到相關配置會被代碼正確讀??;
@Component public class PrintEnvJob { private static final Logger LOG = LoggerFactory.getLogger(PrintEnvJob.class.getName()) ; @Scheduled(fixedDelay = 60000) public void systemData () { Map<String,String> envMap = System.getenv(); for (Map.Entry<String, String> entry:envMap.entrySet()){ String key = entry.getKey(); String value = entry.getValue(); LOG.info("【key:{},value:{}】",key,value); } } }
【auto-client-one】日志輸出
【auto-client-two】日志輸出
注意事項
- ConfigMap在設計上不是用來保存大量數(shù)據(jù)的,因此保存的數(shù)據(jù)不可超過
1MiB
; - ConfigMap并不提供保密或者加密功能,如果存儲的數(shù)據(jù)是機密的,可以使用Secret對象,或者使用其它方式確保數(shù)據(jù)的私密性;
- ConfigMap中可以通過將
immutable
字段設置為true
創(chuàng)建不可變更的配置,如果要修改只能刪除后重建;
三、Secret
Secret是一種包含少量敏感信息例如密碼、令牌或密鑰的對象,這樣的信息可能會被放在Pod規(guī)約中或者鏡像中,使用Secret意味著不需要在應用程序代碼中包含敏感數(shù)據(jù);
1、創(chuàng)建
將【auto-client:1.1.3】鏡像推送到云端的docker私有倉庫里,并且刪除本地相關鏡像,測試下面的流程;
這里以最常見的鏡像拉取場景來說,通常容器鏡像文件是放在私有的云端倉庫,K8S在訪問時需要提供身份證明,可以通過Secret配置來處理該場景;
kubectl create secret docker-registry 【secret名稱】 --docker-server=【倉庫地址】 --docker-username=【用戶名】 --docker-password=【密碼】 --namespace=【命名空間】 -o yaml > cloud-registry-secret.yaml
2、使用
在上面配置了鏡像拉取的Secret對象,在Pod層面使用imagePullSecrets
來引用該對象,當從私有倉庫拉取容器鏡像時,節(jié)點上的kubelet能夠完成與鏡像倉庫的身份認證;
apiVersion: apps/v1 kind: Deployment metadata: name: auto-client-deployment labels: app: auto-client spec: replicas: 1 selector: matchLabels: app: auto-client template: metadata: labels: app: auto-client spec: imagePullSecrets: - name: cloud-registry-secret containers: - name: auto-client image: 【倉庫地址】/auto-client:1.1.3 imagePullPolicy: Always ports: - containerPort: 8079
注意事項
- 默認情況下Secret未加密地存儲在
etcd
中,任何擁有權限的用戶都可以檢索或修改Secret信息; - 每個Secret的大小最多為
1MiB
,施加這一限制是為了避免用戶創(chuàng)建非常大的Secret,進而導致API服務器和kubelet內存耗盡;
四、Pod與容器
在定義Pod時可以選擇性地為每個容器設定所需要的資源數(shù)量,最常見的可設定資源是CPU和內存大小,或者其他類型的資源,這樣有利于調度器給Pod選擇合適的節(jié)點;
apiVersion: apps/v1 kind: Deployment metadata: name: auto-client-rs-deployment labels: app: auto-client spec: replicas: 1 selector: matchLabels: app: auto-client template: metadata: labels: app: auto-client spec: containers: - name: auto-serve image: auto-client:1.1.3 imagePullPolicy: Never ports: - containerPort: 8079 resources: requests: cpu: "250m" memory: "128Mi" limits: cpu: "500m" memory: "256Mi"
注意事項
- CPU和內存統(tǒng)稱為計算資源,計算資源的數(shù)量是可測量的,可以被請求、被分配、被消耗;
requests
為容器指定資源需求,limits
為容器設置資源限制;- 如果Pod運行所在節(jié)點有足夠的可用資源,容器可以使用超出對應資源
request
屬性所設置的資源量,但是不可以使用超出其資源limit
屬性所設置的資源量;
五、參考源碼
文檔倉庫: https://gitee.com/cicadasmile/butte-java-note 腳本倉庫: https://gitee.com/cicadasmile/butte-auto-parent
到此這篇關于K8S Config應用配置的文章就介紹到這了,更多相關K8S Config應用配置內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Rainbond上部署API?Gateway?Kong及環(huán)境配置教程
這篇文章主要為大家介紹了Rainbond上部署API?Gateway?Kong及環(huán)境配置教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-04-04Kubernetes Dashboard 配置用戶名密碼方式登錄操作流程
為了K8s集群安全,默認情況下Dashboard以Token的形式登錄的,那如果我們想以用戶名/密碼的方式登錄該怎么操作呢?其實只需要我們創(chuàng)建用戶并進行 ClusterRoleBinding綁定即可,下面給大家分享Kubernetes Dashboard 配置用戶名密碼方式登錄操作流程,感興趣的朋友一起看看吧2024-06-06一文詳解基于Kubescape進行Kubernetes安全加固
這篇文章主要為大家介紹了基于Kubescape進行Kubernetes安全加固詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-02-02Rainbond的ServiceMesh架構組件端口沖突處理解決
這篇文章主要大家介紹了Rainbond?ServiceMesh架構組件端口沖突處理方式,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-04-04