K8S Config應(yīng)用配置小結(jié)
一、背景
在自動(dòng)化流程中,對(duì)于一個(gè)應(yīng)用來(lái)說(shuō),從開(kāi)發(fā)階段的配置管理,到制作容器鏡像,再到最后通過(guò)K8S集群發(fā)布為服務(wù),整個(gè)過(guò)程涉及到的配置非常多;

應(yīng)用環(huán)境:通常是指代碼層面的依賴(lài)配置,以常用的Nacos來(lái)說(shuō),通常會(huì)涉及框架、組件、自定義等幾個(gè)層面的配置管理;
運(yùn)行環(huán)境:以微服務(wù)架構(gòu)來(lái)說(shuō),實(shí)際環(huán)境中需要管理多個(gè)應(yīng)用的服務(wù)發(fā)布,在整個(gè)過(guò)程中必然會(huì)存在很多配置的管理,比如應(yīng)用的資源分配、不同環(huán)境交互時(shí)的身份認(rèn)證、敏感信息的安全管理等;
不論是應(yīng)用還是運(yùn)行層面的配置,都會(huì)涉及到一個(gè)基本的邏輯:配置可以抽取出來(lái)單獨(dú)管理,在流程中直接引入該配置即可;
二、ConfigMap
ConfigMap用來(lái)將非機(jī)密性的數(shù)據(jù)保存到鍵值對(duì)中,Pod可以將其用作環(huán)境變量、命令行參數(shù)或者存儲(chǔ)卷中的配置文件,會(huì)將環(huán)境配置信息和容器鏡像解耦,便于應(yīng)用配置的修改;
1、創(chuàng)建
ConfigMap中data字段用來(lái)保存UTF-8字符串,binaryData用來(lái)保存二進(jìn)制數(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」中的值來(lái)配置【Pod】,在env中定義多個(gè)環(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)境變量的設(shè)置;
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】容器鏡像中,添加了一個(gè)輸出環(huán)境變量的定時(shí)任務(wù),通過(guò)查看運(yùn)行日志,可以看到相關(guān)配置會(huì)被代碼正確讀??;
@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】日志輸出

注意事項(xiàng)
- ConfigMap在設(shè)計(jì)上不是用來(lái)保存大量數(shù)據(jù)的,因此保存的數(shù)據(jù)不可超過(guò)
1MiB; - ConfigMap并不提供保密或者加密功能,如果存儲(chǔ)的數(shù)據(jù)是機(jī)密的,可以使用Secret對(duì)象,或者使用其它方式確保數(shù)據(jù)的私密性;
- ConfigMap中可以通過(guò)將
immutable字段設(shè)置為true創(chuàng)建不可變更的配置,如果要修改只能刪除后重建;
三、Secret
Secret是一種包含少量敏感信息例如密碼、令牌或密鑰的對(duì)象,這樣的信息可能會(huì)被放在Pod規(guī)約中或者鏡像中,使用Secret意味著不需要在應(yīng)用程序代碼中包含敏感數(shù)據(jù);
1、創(chuàng)建
將【auto-client:1.1.3】鏡像推送到云端的docker私有倉(cāng)庫(kù)里,并且刪除本地相關(guān)鏡像,測(cè)試下面的流程;

這里以最常見(jiàn)的鏡像拉取場(chǎng)景來(lái)說(shuō),通常容器鏡像文件是放在私有的云端倉(cāng)庫(kù),K8S在訪問(wèn)時(shí)需要提供身份證明,可以通過(guò)Secret配置來(lái)處理該場(chǎng)景;
kubectl create secret docker-registry 【secret名稱(chēng)】 --docker-server=【倉(cāng)庫(kù)地址】 --docker-username=【用戶(hù)名】 --docker-password=【密碼】 --namespace=【命名空間】 -o yaml > cloud-registry-secret.yaml
2、使用
在上面配置了鏡像拉取的Secret對(duì)象,在Pod層面使用imagePullSecrets來(lái)引用該對(duì)象,當(dāng)從私有倉(cāng)庫(kù)拉取容器鏡像時(shí),節(jié)點(diǎn)上的kubelet能夠完成與鏡像倉(cāng)庫(kù)的身份認(rèn)證;
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: 【倉(cāng)庫(kù)地址】/auto-client:1.1.3
imagePullPolicy: Always
ports:
- containerPort: 8079注意事項(xiàng)
- 默認(rèn)情況下Secret未加密地存儲(chǔ)在
etcd中,任何擁有權(quán)限的用戶(hù)都可以檢索或修改Secret信息; - 每個(gè)Secret的大小最多為
1MiB,施加這一限制是為了避免用戶(hù)創(chuàng)建非常大的Secret,進(jìn)而導(dǎo)致API服務(wù)器和kubelet內(nèi)存耗盡;
四、Pod與容器
在定義Pod時(shí)可以選擇性地為每個(gè)容器設(shè)定所需要的資源數(shù)量,最常見(jiàn)的可設(shè)定資源是CPU和內(nèi)存大小,或者其他類(lèi)型的資源,這樣有利于調(diào)度器給Pod選擇合適的節(jié)點(diǎn);
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"注意事項(xiàng)
- CPU和內(nèi)存統(tǒng)稱(chēng)為計(jì)算資源,計(jì)算資源的數(shù)量是可測(cè)量的,可以被請(qǐng)求、被分配、被消耗;
requests為容器指定資源需求,limits為容器設(shè)置資源限制;- 如果Pod運(yùn)行所在節(jié)點(diǎn)有足夠的可用資源,容器可以使用超出對(duì)應(yīng)資源
request屬性所設(shè)置的資源量,但是不可以使用超出其資源limit屬性所設(shè)置的資源量;
五、參考源碼
文檔倉(cāng)庫(kù): https://gitee.com/cicadasmile/butte-java-note 腳本倉(cāng)庫(kù): https://gitee.com/cicadasmile/butte-auto-parent
到此這篇關(guān)于K8S Config應(yīng)用配置的文章就介紹到這了,更多相關(guān)K8S Config應(yīng)用配置內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
kubernetes 使用jq命令對(duì)資源配置查看方式
這篇文章主要介紹了kubernetes 使用jq命令對(duì)資源配置查看方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11
Rainbond上部署API?Gateway?Kong及環(huán)境配置教程
這篇文章主要為大家介紹了Rainbond上部署API?Gateway?Kong及環(huán)境配置教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04
Kubernetes Dashboard 配置用戶(hù)名密碼方式登錄操作流程
為了K8s集群安全,默認(rèn)情況下Dashboard以Token的形式登錄的,那如果我們想以用戶(hù)名/密碼的方式登錄該怎么操作呢?其實(shí)只需要我們創(chuàng)建用戶(hù)并進(jìn)行 ClusterRoleBinding綁定即可,下面給大家分享Kubernetes Dashboard 配置用戶(hù)名密碼方式登錄操作流程,感興趣的朋友一起看看吧2024-06-06
k8s實(shí)現(xiàn)身份認(rèn)證策略及過(guò)程解析
這篇文章主要為大家介紹了k8s實(shí)現(xiàn)身份認(rèn)證策略及過(guò)程解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02
一文詳解基于Kubescape進(jìn)行Kubernetes安全加固
這篇文章主要為大家介紹了基于Kubescape進(jìn)行Kubernetes安全加固詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02
K8S節(jié)點(diǎn)本地存儲(chǔ)被撐爆問(wèn)題徹底解決方法
這篇文章主要為大家介紹了K8S節(jié)點(diǎn)本地存儲(chǔ)被撐爆問(wèn)題徹底解決方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
Rainbond的ServiceMesh架構(gòu)組件端口沖突處理解決
這篇文章主要大家介紹了Rainbond?ServiceMesh架構(gòu)組件端口沖突處理方式,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04

