k8s 配置資源管理

一、Secret的資源配置

1.1?Secret配置的相關說明

????????Secret 是用來保存密碼、token、密鑰等敏感數據的 k8s 資源,這類數據雖然也可以存放在 Pod 或者鏡像中,但是放在 Secret 中是為了更方便的控制如何使用數據,并減少暴露的風險。

有四種類型:

kubernetes.io/service-account-token:由 Kubernetes 自動創建,用來訪問 APIServer 的 Secret,Pod 會默認使用這個 Secret 與 APIServer 通信, 并且會自動掛載到 Pod 的 /run/secrets/kubernetes.io/serviceaccount 目錄中;
Opaque :base64 編碼格式的 Secret,用來存儲用戶自定義的密碼、密鑰等,默認的 Secret 類型;
kubernetes.io/dockerconfigjson :用來存儲私有 docker registry 的認證信息。
kubernetes.io/tls:用于存儲TLS證書和私鑰,通常用于Ingress控制器或其他需要TLS加密通信的服務。

Pod 需要先引用才能使用某個 secret,Pod 有 3 種方式來使用 secret
●作為掛載到一個或多個容器上的卷 中的文件。
●作為容器的環境變量。
●由 kubelet 在為 Pod 拉取鏡像時使用。

應用場景:憑據??Secret | Kubernetes

1.2?陳述式創建 Secret配置

????????Secret 的創建是根據文件中保存到相應信息 進行。例如我們要通過一個用戶名文件和密碼文件來創建具體的Secret資源配置。

#首先準備好相對應的用戶和密碼文件
#echo 中 “-n” 選項為不換行
echo -n 'limahua' > username.txt
echo -n 'qq666' > passwd.txt

用kubectl create secret命令創建Secret

kubectl create secret generic mysecret --from-file=username.txt --from-file=passwd.txt

kubectl describe secrets mysecret

1.3?聲明式 + base64編碼 創建Secret

echo limahua | base64

echo qq666 | base64
通過管道符base64 將明文進行轉碼

編寫yaml文件
vim secret01.yamlapiVersion: v1
kind: Secret                #表明資源的類型為Secret,用于存儲敏感信息
metadata:name: my-secret1
type: Opaque                 # base64 進行轉碼信息保護
data:                        #定義secret的配置信息username: bGltYWh1YQo=     #Base64編碼后的用戶名password: cXE2NjYK         #Base64編碼后的密碼kubectl apply -f secret01.yaml

1.4?將secret 以volume形式掛載到pod中

創建一個pod模板,對其進行修改編輯
kubectl run nginx-secret --image=nginx:1.18 --port=80 --dry-run=client -o yaml > ng-secret.yamlvim ng-secret.yamlapiVersion: v1
kind: Pod
metadata:labels:run: nginx-secretname: nginx-secret
spec:containers:- image: nginx:1.18name: nginx-secretports:- containerPort: 80volumeMounts:- name: secrets                 #引用一個卷(volume)的名稱,該卷在此容器內掛載mountPath: "/etc/secret"      #指定容器內掛載的路徑readOnly: true                #只讀volumes:- name: secrets                   #卷的名稱,與上述容器中引用的卷名對應secret:secretName: mysecret          #指定了此卷的數據來源是一個名為mysecret的Secret對象Kubernetes會自動將mysecret Secret中的數據掛載到指定的/etc/secret路徑下,
所有數據都是以文件形式存在且根據Secret的原始內容Base64解碼。kubectl apply -f ng-secret.yaml

1.5?將Secret導入到pod中,充當環境變量

復制上一個模板,進行修改編輯
cp ng-secret.yaml env-secret.yaml進行編輯修改
vim env-secret.yamlapiVersion: v1
kind: Pod
metadata:labels:run: nginx-secret2name: nginx-secret2
spec:containers:- image: nginx:1.18name: nginx-secret2ports:- containerPort: 80env:                    #定義了環境變量- name: THIS_USER       #環境變量從名為my-secret1的Secret中通過鍵username獲取值volumeFrom:secretKeyRef:name: my-secret1key: username- name: THIS_PASSWORD   #環境變量同樣從my-secret1 Secret中通過鍵password獲取值volumeFrom:secretKeyRef:name: my-secret1key: passwordkubectl apply -f env-secret.yaml

1.6?實戰運用:使用secret配置免密交互拉取habor私有倉庫鏡像

harbor倉庫的搭建詳見:kubeadm 部署k8s集群-CSDN博客

在pod詳解里有

????????我們在搭建好docker的私有倉庫后,在使用私有倉庫時需要通過docker login指令來登錄到私有倉庫中。

????????但同時在使用的過程中也會把habor倉庫的用戶名和密碼暴露在命令行中,存在一定的安全隱患。k8s中的secret配置的運用能夠實現并且規避這一問題的存在

?進行私有倉庫的secret資源創建

#私有倉庫的secret配置
kubectl create secret docker-registry myharbor --docker-server=hub.benet.com --docker-username=admin --docker-password=Harbor12345 --docker-email=admin@qq.com

引用secret資源拉取私有倉庫鏡像創建pod
vim harbor-nginx.yamlapiVersion: apps/v1
kind: Deployment
metadata:name: myapp-nginx
spec:replicas: 3selector:matchLabels:app: myapp-nginxtemplate:metadata:labels:app: myapp-nginxspec:containers:- name: myapp-containerimage: hub.benet.com/library/nginx:v1
#從私有 Docker registry hub.benet.com 中拉取 library/nginx 鏡像的 v1 版本imagePullSecrets:        #定義了用于拉取私有 Docker registry 鏡像所需的 Secret- name: myharbor
#指定了一個 Secret 的名稱,這里為 myharbor,這意味著 Kubernetes 在拉取私有 Docker registry 的
鏡像時,將使用 myharbor Secret 中的認證信息kubectl apply -f harbor-nginx.yaml

以下是實驗沒有結果可能存在的問題:

注意以上配置完成后要重啟docker 加載該配置。

另一種方法:

---------- 部署 harbor 創建私有項目 ----------
//在 Docker harbor 節點(192.168.80.13)上操作
systemctl stop firewalld.service
systemctl disable firewalld.service
setenforce 0yum install -y yum-utils device-mapper-persistent-data lvm2 
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 
yum install -y docker-ce
systemctl start docker.service
systemctl enable docker.service
docker version//上傳 docker-compose 和 harbor-offline-installer-v1.2.2.tgz 到 /opt 目錄中
cd /opt
chmod +x docker-compose
mv docker-compose /usr/local/bin///部署 Harbor 服務
tar zxvf harbor-offline-installer-v1.2.2.tgz -C /usr/local/
vim /usr/local/harbor/harbor.cfg
--5行--修改,設置為Harbor服務器的IP地址或者域名
hostname = 192.168.80.13cd /usr/local/harbor/
./install.sh//在 Harbor 中創建一個新項目
(1)瀏覽器訪問:http://192.168.80.13 登錄 Harbor WEB UI 界面,默認的管理員用戶名和密碼是 admin/Harbor12345
(2)輸入用戶名和密碼登錄界面后可以創建一個新項目。點擊“+項目”按鈕
(3)填寫項目名稱為“kgc-project”,點擊“確定”按鈕,創建新項目//在每個 node 節點配置連接私有倉庫(注意每行后面的逗號要添加)
cat > /etc/docker/daemon.json <<EOF
{"registry-mirrors": ["https://6ijb8ubo.mirror.aliyuncs.com"],"insecure-registries":["192.168.80.13"]
}
EOFsystemctl daemon-reload
systemctl restart docker//在每個 node 節點登錄 harbor 私有倉庫
docker login -u admin -p harbor12345 http://192.168.80.13//在一個 node 節點下載 Tomcat 鏡像進行推送
docker pull tomcat:8.0.52
docker imagesdocker tag tomcat:8.0.52 192.168.80.13/kgc-project/tomcat:v1
docker imagesdocker push 192.168.80.13/kgc-project/tomcat:v1//查看登陸憑據
cat /root/.docker/config.json | base64 -w 0			#base64 -w 0:進行 base64 加密并禁止自動換行
ewoJImF1dGhzIjogewoJCSIxOTIuMTY4LjE5NS44MCI6IHsKCQkJImF1dGgiOiAiWVdSdGFXNDZTR0Z5WW05eU1USXpORFU9IgoJCX0KCX0sCgkiSHR0cEhlYWRlcnMiOiB7CgkJIlVzZXItQWdlbnQiOiAiRG9ja2VyLUNsaWVudC8xOS4wMy41IChsaW51eCkiCgl9Cn0=//創建 harbor 登錄憑據資源清單,用于 K8S 訪問 Harbor 私服拉取鏡像所需要的密鑰權限憑證 secret 資源
vim harbor-pull-secret.yaml
apiVersion: v1
kind: Secret
metadata:name: harbor-pull-secret
data:.dockerconfigjson: ewoJImF1dGhzIjogewoJCSIxOTIuMTY4LjE5NS44MCI6IHsKCQkJImF1dGgiOiAiWVdSdGFXNDZTR0Z5WW05eU1USXpORFU9IgoJCX0KCX0sCgkiSHR0cEhlYWRlcnMiOiB7CgkJIlVzZXItQWdlbnQiOiAiRG9ja2VyLUNsaWVudC8xOS4wMy41IChsaW51eCkiCgl9Cn0=			#復制粘貼上述查看的登陸憑據
type: kubernetes.io/dockerconfigjson//創建 secret 資源
kubectl create -f harbor-pull-secret.yaml//查看 secret 資源
kubectl get secret//創建資源從 harbor 中下載鏡像
cd /opt/demo
vim tomcat-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: my-tomcat
spec:replicas: 2selector:matchLabels:app: my-tomcattemplate:metadata:labels:app: my-tomcatspec:imagePullSecrets:						#添加 K8S 訪問 Harbor 私服拉取鏡像所需要的 secret 資源選項- name: harbor-pull-secret			#指定 secret 資源名稱containers:- name: my-tomcatimage: 192.168.80.13/kgc-project/tomcat:v1		#指定 harbor 中的鏡像名ports:- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:name: my-tomcat
spec:type: NodePortports:- port: 8080targetPort: 8080nodePort: 31111selector:app: my-tomcat//刪除之前在 node 節點下載的 Tomcat 鏡像
docker rmi tomcat:8.0.52
docker rmi 192.168.80.13/kgc-project/tomcat:v1
docker images//創建資源
kubectl create -f tomcat-deployment.yamlkubectl get pods
NAME                              READY   STATUS    RESTARTS   AGE
my-tomcat-d55b94fd-29qk2   1/1     Running   0         
my-tomcat-d55b94fd-9j42r   1/1     Running   0         //查看 Pod 的描述信息,可以發現鏡像時從 harbor 下載的
kubectl describe pod my-tomcat-d55b94fd-29qk2//刷新 harbor 頁面,可以看到鏡像的下載次數增加了

二、ConfigMap資源配置

與Secret類似,區別在于ConfigMap保存的是不需要加密配置的信息。
????????ConfigMap 功能在 Kubernetes1.2 版本中引入,許多應用程序會從配置文件、命令行參數或環境變量中讀取配置信息。Con?gMap API 給我們提供了向容器中注入配置信息的機制,Con?gMap 可以被用來保存單個屬性,也可以用來保存整個配置文件或者JSON二進制大對象。
應用場景:應用配置

2.1?使用目錄來創建configMap資源

?創建一個目錄并且在一個目錄中填寫兩個文件:

mkdir /opt/configmap/vim /opt/configmap/game.properties
enemies=aliens
lives=3
enemies.cheat=true
enemies.cheat.level=noGoodRotten
secret.code.passphrase=UUDDLRLRBABAS
secret.code.allowed=true
secret.code.lives=30vim /opt/configmap/ui.properties
color.good=purple
color.bad=yellow
allow.textmode=true
how.nice.to.look=fairlyNice

kubectl create configmap game-config --from-file=/opt/configmap/
//--from-file 指定在目錄下的所有文件都會被用在 Con?gMap 里面創建一個鍵值對,鍵的名字就是文件名,值就是文件的內容

2.2?使用文件創建configMap資源

只要指定為一個文件就可以從單個文件中創建 Con?gMap
--from-file 這個參數可以使用多次,即可以使用兩次分別指定上個實例中的那兩個配置文件,效果就跟指定整個目錄是一樣的

kubectl create configmap game-config-2 --from-file=/opt/configmap/game.properties --from-file=/opt/configmap/ui.properties

2.3?直接使用參數創建confidenceMap資源

使用字面值創建

使用文字值創建,利用 --from-literal 參數傳遞配置信息,該參數可以使用多次,格式如下

kubectl create configmap special-config --from-literal=name=huhu --from-literal=hobby=play

這里的--from-literal 后跟 key=value

2.4?pod利用configMap資源

(1)?使用 Con?gMap 來替代環境變量
vim env.yamlapiVersion: v1
kind: ConfigMap
metadata:name: special-config1namespace: default
data:special.how: very         #這里定義了一些configMap的配置資源special.type: good        #這里定義了一些configMap的配置資源
---
apiVersion: v1
kind: ConfigMap
metadata:name: env-config1namespace: default
data:log_level: INFO            #這里定義了一些configMap的配置資源kubectl apply -f env.yaml

(2) 創建pod,并且引用configMap資源
vim test-pod.yamlapiVersion: v1
kind: Pod
metadata:name: test-pod
spec:containers:- name: busyboximage: busybox:1.28.4command: [ "/bin/sh", "-c", "env" ]#容器啟動時執行的命令,這里運行env命令來打印環境變量。env:- name: SPECIAL_HOW_KEYvalueFrom:configMapKeyRef:name: special-config1key: special.how#從名為special-config1的ConfigMap中通過鍵special.how獲取值,并設置為環境變量。- name: SPECIAL_TYPE_KEYvalueFrom:configMapKeyRef:name: special-config1key: special.type#同樣從special-config1 ConfigMap中通過鍵special.type獲取值設置為環境變量。envFrom:- configMapRef:name: env-config1#從名為env-config1的ConfigMap中批量導入所有鍵值對作為環境變量。restartPolicy: Neverkubectl create -f test-pod.yaml

2.5?使用 ConfigMap 設置命令行參數

vim test-pod2.yamlapiVersion: v1
kind: Pod
metadata:name: test-pod2
spec:containers:- name: busyboximage: busybox:1.28.4command: - /bin/sh- -c- echo "$(SPECIAL_HOW_KEY) $(SPECIAL_TYPE_KEY)"
#與上一個配置文件相同這里把configMap中配置設置為pod中環境變量  再用echo將其輸出env:- name: SPECIAL_HOW_KEYvalueFrom:configMapKeyRef:name: special-config1key: special.how- name: SPECIAL_TYPE_KEYvalueFrom:configMapKeyRef:name: special-config1key: special.typeenvFrom:- configMapRef:name: env-config1restartPolicy: Neverkubectl create -f test-pod2.yaml

2.6?通過數據卷插件使用Con?gMap

????????在數據卷里面使用 Con?gMap,就是將文件填入數據卷,在這個文件中,鍵就是文件名,鍵值就是文件內容

vim test-pod3.yamlapiVersion: v1
kind: Pod
metadata:name: test-pod3
spec:containers:- name: busyboximage: busybox:1.28.4command: [ "/bin/sh", "-c", "sleep 36000" ]volumeMounts:- name: config-volumemountPath: /etc/configvolumes:- name: config-volumeconfigMap:name: special-config1restartPolicy: Neverkubectl create -f test-pod3.yaml

我想通過configMap實現單獨掛載pod中的nginx.conf配置

#首先獲取nginx.conf 下載或則之前保存都可以
# nginx.conf 配置文件在/opt/benet/目錄 下
kubectl create cm my-nginx --from-file=/opt/benet

vim pod-nginx1.yaml 
apiVersion: v1
kind: Pod
metadata:name: mypod1
spec:volumes:- name: nginxconfigMap:            #指定卷數據來源于 ConfigMapname: my-nginx      #具體指定了 ConfigMap 的名稱containers:- image: nginx:1.18name: nginxvolumeMounts:- name: nginxmountPath: /etc/nginx/nginx.confsubPath: nginx.conf     #subPath  可以實現只覆蓋修改該文件,而不影響目錄如果不加subPath,你掛載到容器內的目錄中其它文件將被覆蓋。且如果configMap有其它鍵值也會被一起掛載。kubectl apply -f pod-nginx1.yaml

2.7 configMap 的熱更新

#創建一個cm資源
kubectl create configmap name-hobby --from-literal=hobby=fly#創建一個pod,并且通過volume的方式掛載configMap中的name-config
vim  pod-demo5.yaml
apiVersion: apps/v1
kind: Deployment
metadata:labels:app: namepod1name: namepod1
spec:replicas: 1selector:matchLabels:app: namepod1template:metadata:labels:app: namepod1spec:volumes:- name: pod-testconfigMap:name: name-hobbycontainers:- image: nginx:1.18name: mypodvolumeMounts:- name: pod-testmountPath: /opt/

開啟另一個終端進行實時修改:

kubectl edit cm name-hobby

等大概一分鐘左右,使用該 ConfigMap 掛載的 Volume 中的數據同步更新

ConfigMap 更新后滾動更新 Pod

????????更新 ConfigMap 目前并不會觸發相關 Pod 的滾動更新,可以通過在 .spec.template.metadata.annotations 中添加 version/config ,每次通過修改 version/config 來觸發滾動更新

kubectl patch deployment namepod1 --patch '{"spec": {"template": {"metadata": {"annotations": {"version/config": "20240603" }}}}}'

PS:更新 ConfigMap 后:
●使用該 ConfigMap 掛載的 Env 不會同步更新。
●使用該 ConfigMap 掛載的 Volume 中的數據需要一段時間(實測大概10秒)才能同步更新。

總結

使用 Secret 資源
掛載的方式
在 pod.spec.volumes 字段中定義卷類型為 secret 
在 pod.spec.containers.volumeMounts 字段中把存儲卷掛載到指定的容器目錄,secret資源數據的key將
以文件名的形式存在,value為文件內容容器環境變量引用的方式
在 pod.spec.containers.env.name 字段中自定義容器的環境變量名
在.containers.env.valueFrom.secretKeyRef.name字段中指定secret資源的名
稱,.containers.env.valueFrom.secretKeyRef.key字段中指定這個secret資源數據的key, 
從而確定引用那個secret資源的key的value作為這個環境變量的值在 .containers.envFrom.secretRef.name 字段中指定secret資源的名稱,可實現使用secret資源數據的
key作為容器環境變量名,value作為這個環境變量的值K8S從私有倉庫拉取鏡像時使用
在 pod.spec.imagePullSecrets 字段中指定 kubernetes.io/dockerconfigjson 類型的 secret 資源來
作為連接私有倉庫的認證信息ConfigMap  簡稱  cm ,保存配置文件  環境變量 命令行參數 之類的不需要加密的信息
創建 cm 資源
kubectl create  cm  XXX --from-file=文件/目錄    --from-literal=變量的鍵值對(key=value)查看cm資源的數據,數據以明文格式顯示key的value
kubectl describe cm  XXX   或    kubectl get cm XXX -o yaml使用 cm 資源
容器環境變量引用的方式
env 指定自定義的環境變量名,通過指定的cm資源名稱和key來給這個變量賦值
envFrom  直接使用cm資源的key作為容器的環境變量名,key的value作為這個變量的值掛載的方式
volumes 定義卷類型為 configMap ,使用 items 字段可以自定義掛載的文件的子目錄和文件名
volumeMounts  把卷掛載到容器目錄。cm資源數據中的key以文件名的形式存在,value為文件內容   使用 subPath 指定文件名,實現只把卷掛載到指定的文件名上cm資源熱更新
更新cm資源的數據可以同步更新通過掛載的方式使用cm資源數據的Pod中的配置(注:使用subPath掛載的文件
不會更新)
如果使用env或envFrom引用環境變量的方式,是不會同步更新Pod中的配置

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/22344.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/22344.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/22344.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

日志優化開發效率

日志怎么打&#xff1f; 1.在關鍵節點打日志 (1).請求入口 (2).結果響應 2.可能發生錯誤的節點打日志 3.日志不是越多越好&#xff0c;打日志也會消耗性能 RequestMapping("/add")public Boolean publishBlog(String title, String content, HttpServletRequest req…

react快速開始(四)-之Vite 還是 (Create React App) CRA? 用Vite創建項目

文章目錄 react快速開始(四)-之Vite 還是 (Create React App) CRA? 用Vite創建項目背景Vite 和 (Create React App) CRAVite&#xff1f;Vite 是否支持 TypeScript&#xff1f; 用Vite創建react項目參考 react快速開始(四)-之Vite 還是 (Create React App) CRA? 用Vite創建項…

Java面向對象筆記

多態 一種類型的變量可以引用多種實際類型的對象 如 package ooplearn;public class Test {public static void main(String[] args) {Animal[] animals new Animal[2];animals[0] new Dog();animals[1] new Cat();for (Animal animal : animals){animal.eat();}} }class …

Java面試題-集合

Java面試題-集合 1、什么是集合&#xff1f;2、集合和數組的區別是什么&#xff1f;3、集合有哪些特點&#xff1f;4、常用的集合類有哪些&#xff1f;5、List&#xff0c; Set&#xff0c; Map三者的區別&#xff1f;6、說說集合框架底層數據結構&#xff1f;7、線程安全的集合…

MeshFusion Pro : Ultimate Optimization Tool

MeshFusion Pro是Unity的強大優化工具,它使用一種高效的方法來組合對象,以減少繪制調用并提高FPS。 MeshFusion Pro可用于組合靜態對象以及LODGroups。您還可以創建動態組合對象,其中每個單獨的網格都可以在運行時移動,新的組合網格將自動更新。在保持單個網格自由度的同時…

【數據結構與算法 | 二叉樹篇】力扣101, 104, 111

1. 力扣101 : 對稱二叉樹 (1). 題 給你一個二叉樹的根節點 root &#xff0c; 檢查它是否軸對稱。 示例 1&#xff1a; 輸入&#xff1a;root [1,2,2,3,4,4,3] 輸出&#xff1a;true示例 2&#xff1a; 輸入&#xff1a;root [1,2,2,null,3,null,3] 輸出&#xff1a;false…

Java1.8語言+ springboot +mysql + Thymeleaf 全套家政上門服務平臺app小程序源碼

Java1.8語言 springboot mysql Thymeleaf 全套家政上門服務平臺app小程序源碼 家政系統是一套可以提供上門家政、上門維修、上門洗車、上門搬家等服務為一體的家政平臺解決方案。它能夠與微信對接、擁有用戶端小程序&#xff0c;并提供師傅端app&#xff0c;可以幫助創業者在…

樹的算法基礎知識

什么是樹&#xff1a; 樹是n&#xff08;n>0&#xff09;個結點的有限集。n0時稱為空樹。在任意一棵非空樹中&#xff1a; 有且僅有一個特定的稱為根的結點當n>1時&#xff0c;其余結點可分為m&#xff08;m>0&#xff09;個互不相交的有限集T1、T2、......、Tm&…

ElasticSearch學習筆記之三:Logstash數據分析

第3章 Logstash數據分析 Logstash使用管道方式進行日志的搜集處理和輸出。有點類似*NIX系統的管道命令 xxx | ccc | ddd&#xff0c;xxx執行完了會執行ccc&#xff0c;然后執行ddd。 在logstash中&#xff0c;包括了三個階段: 輸入input --> 處理filter&#xff08;不是必須…

異或炸彈(easy)(牛客小白月賽95)

題目鏈接: D-異或炸彈&#xff08;easy&#xff09;_牛客小白月賽95 (nowcoder.com) 題目&#xff1a; 題目分析&#xff1a; 一看 還以為是二維差分的題呢 到后來才發現是一維差分問題 這里的距離是 曼哈頓距離 dis abs(x - xi) abs(y - yi) 暴力的做法 就是枚舉 n * n 個…

word-海報制作

1、確定海報的尺寸大小 2、創建主題顏色 設計-顏色-自定義顏色-柑橘rgb值改變著色1-著色6的顏色 3、將文字添加至文本框&#xff0c;更改字體顏色、大小和格式 4、添加背景水印&#xff1a;插入-形狀-文本框 5、組合全部元素 圖片素材網址&#xff1a;

Power BI前端設計:深度探索與實戰技巧

Power BI前端設計&#xff1a;深度探索與實戰技巧 Power BI作為一款強大的商業智能工具&#xff0c;其前端設計對于用戶體驗和數據可視化效果至關重要。本文將深入探討Power BI前端設計的四個關鍵方面、五個實用技巧、六個設計要素以及七個注意事項&#xff0c;助您提升Power …

學習分享-如何避免 Apache ShardingSphere 中的笛卡爾積現象

前言 Apache ShardingSphere 是一個開源的分布式數據庫中間件&#xff0c;旨在通過數據分片、分布式事務、分布式治理等技術&#xff0c;提升數據庫系統的性能和可擴展性。然而&#xff0c;最近在使用 ShardingSphere 進行分庫分表并多表查詢時&#xff0c;出現了笛卡爾積現象…

Spark Streaming 概述及入門案例

一、介紹 1. 不同的數據處理 從數據處理的方式&#xff1a; 流式數據處理(Streaming)批量數據處理(Batch) 從數據處理的延遲&#xff1a; 實時數據處理(毫秒級別)離線數據處理(小時或天級別) 2. 簡介 SparkStreaming 是一個準實時(秒或分鐘級別)、微批量的數據處理框架Spa…

在Red Hat Enterprise Linux 9上使用Docker快速安裝并部署RocketMQ

在Red Hat Enterprise Linux 9上快速安裝和部署RocketMQ可以按照以下步驟進行&#xff1a; 1. 安裝Docker 首先&#xff0c;確保Docker已經安裝在你的系統上。 更新系統包并安裝依賴項&#xff1a; sudo yum update -y sudo yum install -y yum-utils device-mapper-persiste…

2024年5月份面試總結

2024年5月份找工作/面試總結&#xff1a; 本人前段時間寫了剛過完年后的一個月內找工作的情況&#xff0c;請查看https://blog.csdn.net/zgaoq/article/details/136236788?spm1001.2014.3001.5501 但是后續寫的總結被和諧了&#xff0c;不知道這篇文章能不能發出來。 1、5月份…

系統架構設計師【第19章】: 大數據架構設計理論與實踐 (核心總結)

文章目錄 19.1 傳統數據處理系統存在的問題19.2 大數據處理系統架構分析19.2.1 大數據處理系統面臨挑戰19.2.2 大數據處理系統架構特征 19.3 Lambda架構19.3.1 Lambda架構對大數據處理系統的理解19.3.2 Lambda架構應用場景19.3.3 Lambda架構介紹19.3.4  Lambda架構的實…

數據庫的換行符到前端不展示了

是這樣的原本數據庫中的數據都是帶有\n換行符的但是頁面卻一直不展示 解決辦法 <el-drawer title"預覽" :visible.sync"drawer" :with-header"false"><div v-for"(item, index) in cardArray" :key"index"><…

如何將 Vue 應用程序部署到 Cloudflare Pages

在現代 Web 開發中&#xff0c;Vue.js 已經成為了一個非常受歡迎的前端框架。它的簡潔、高效和靈活性使得開發人員可以輕松構建出色的用戶界面和交互體驗。而 Cloudflare Pages 提供了一個簡單而強大的方式來托管和部署靜態網站和應用程序。本文將介紹如何將 Vue 應用程序部署到…

Android常見內存泄漏場景總結

一、非靜態內部類造成的內存泄漏 造成原因&#xff1a;非靜態內部類默認會持有外部類的引用&#xff0c;如果內部類的生命周期超過了外部類就會造成內存泄漏。 場景&#xff1a;當Activity銷毀后&#xff0c;由于內部類中存在異步耗時任務還在執行&#xff0c;導致Activity實…