【kubernetes】探索k8s集群中金絲雀發布后續 + 聲明式資源管理yaml

目錄

一、K8S常見的發布方式

1.1藍綠發布

1.2灰度發布(金絲雀發布)

1.3滾動發布

二、金絲雀發布

三、聲明式管理方法

3.1YAML 語法格式

3.1.1查看 api 資源版本標簽

3.1.2查看資源簡寫

3.2YAML文件詳解

3.2.1Deployment.yaml

3.2.2Pod.yaml

3.2.3Service.yaml

3.3Port

3.3.1節點端口

3.3.2集群內部端口

3.4編寫YAML文件案例

3.4.1部署nginx的yaml 配置

3.4.1.1部署myapp的yaml配置

3.4.1.1.1編寫YAML文件?

3.4.1.1.2生成資源

3.4.1.1.3訪問驗證

3.4.2部署 redis的yaml 配置

3.4.2.1編寫YAML文件?

3.4.2.2創建資源

3.4.2.3訪問驗證

3.4.3部署 mysql的yaml 配置

3.4.3.1?生成模板 yaml 文件

3.4.3.2創建資源

3.4.3.3訪問驗證

3.5詳解k8s中的port

3.6YAML文件相關操作

3.6.1 --dry-run——讀取而不創建

3.6.2查看生成yaml格式

3.6.3查看生成json格式

3.6.4使用yaml格式導出生成模板,并進行修改以及刪除一些不必要的參數

3.6.5先查看已經部署的資源

3.6.6將現有的資源生成模板導出

3.6.7保存到文件中

3.6.8查看字段幫助信息,可一層層的查看相關資源對象的幫助信息

3.6.9寫yaml太累怎么辦?

3.7快速編寫YAML文件

3.7.1--dry-run——讀取而不創建

3.7.2-o yaml——查看生成yaml格式

3.7.3-o json——查看生成json格式

3.7.4帶你五分鐘寫yaml文件

3.7.4.1用 --dry-run 命令生成

3.7.4.2用get命令導出

四、根據需求配置-----創建自主式pod

4.1試創建文件獲取模板文件

4.2 編寫yaml文件?

4.3生成資源

4.4訪問測試

五、yaml介紹

5.1語法格式

5.2YAML文件組成部分

5.3常用字段含義

5.4如何快速編寫YAML文件


一、K8S常見的發布方式

1.1藍綠發布

兩套環境交替升級,舊版本保留一定時間便于回滾

優點:對用戶無感,是最安全的發布方式,業務穩定

缺點:需要兩套系統,對資源要求比較高,成本特別高

1.2灰度發布(金絲雀發布)

根據比例將老版本升級,例如80%用戶訪問是老版本,20%用戶訪問是新版本

特點:對自動要求比較高,對比起來系統更加穩定發布,如果遇到問題可以減少影響范圍

先更新一部分pod,然后再暫停更新

安排一小部分的用戶流量去訪問更新的pod來進行測試,當測試沒問題后再擴大比例,直到全部更新完成為止

1.3滾動發布

按批次停止老版本實例,啟動新版本實例。

特點:節約資源,用戶無感,但是部署和回滾的速度慢

按照他的比例,一部分一部分滾動更新,是k8s默認的更新機制

不用創建一定比例的pod;先創建,確定沒問題后,刪除舊日版本的pod

三種方式均可以做到平滑式升級,在升級過程中服務仍然保持服務的連續性,升級對外界是無感知的。那選擇哪種部署方法最合適呢?這取決于哪種方法最適合你的業務和技術需求。

如果你們運維自動化能力儲備不夠,肯定是越簡單越好,建議藍綠發布如果業務對用戶依賴很強,建議灰度發布。如果是K8S平臺,滾動更新是現成的方案,建議先直接使用

二、金絲雀發布

【kubernetes】探索k8s集群中kubectl的陳述式資源管理-CSDN博客

上一篇博客有詳細解讀

2.1環境準備

首先創建

kubectl create ns test
kubectl create deployment nginx-zzz --image=nginx:1.14 --port=80 --replicas=3 -n test

暴露端口

kubectl expose deployment nginx-zzz --port=80 --target-port=80 --name=nginx-service -n test --type=NodePort

2.2更新deployment的版本,并配置暫停deployment

kubectl set image deployment nginx-zzz nginx=nginx:1.15 -n test && kubectl rollout pause deployment nginx-zzz -n testkubectl rollout status deployment nginx-zzz -n test# 更新名為"nginx-zzz"的部署(Deployment)中的 "nginx" 容器的鏡像版本為"nginx:1.15
# 暫停名為"nginx-zzz"的部署的滾動更新,這意味著在執行這個命令后,將不會繼續推進新的副本集,并且當前的副本集將保持不變

開啟另一個窗口查看 pod 信息

監控更新的過程,可以看到已經新增了一個資源,但是并未按照預期的狀態去刪除一個舊的資源,就是因為使用了 pause 暫停命令

# -w 選項,它會使命令進入監視模式,實時顯示資源的變化情況

kubectl get pods -w?-n test

kubectl rollout status deployment nginx-zzz -n test #查看更新狀態

如何做新舊版本分離呢

分階段訪問?

在金絲雀發布中,將流量分流到新舊版本的這個過程被稱為分階段訪問(Staged Access),也可以稱為階段性流量調度(Staged Traffic Shifting)。即將流量逐步引導到新版本的過程,以確保新版本的穩定性和可靠性。

默認情況下,訪問 server 流量將會負載均衡至4個實例上,新增 server 實現新的實例與舊實例訪問分流:

kubectl expose -n test deployment nginx-zzz --port=80 --target-port=80 --name=new-nginx  --type=NodePort

查看 pod 實例標簽名;編輯(查看)位于命名空間test中的名為 new-nginx 的 Service 資源對象,復制文本內容,并創建對應 yaml 文件,修改標簽選擇器內容:

kubectl get svc -n test new-nginx -oyaml > /opt/new-nginx.yaml #模板kubectl get pod --show-labels -n testvim /opt/new-nginx.yaml

刪除 Kubernetes svc 資源,并根據配置文件創建或更新資源:

[root@master01 opt]#kubectl get svc -n test
NAME            TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
new-nginx       NodePort   10.96.173.45   <none>        80:30573/TCP   22m
nginx-service   NodePort   10.96.54.179   <none>        80:30993/TCP   53m
[root@master01 opt]#kubectl delete svc -n test new-nginx
service "new-nginx" deleted
[root@master01 opt]#kubectl get svc -n test
NAME            TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
nginx-service   NodePort   10.96.54.179   <none>        80:30993/TCP   53m
[root@master01 opt]#kubectl apply -f /opt/new-nginx.yaml 
service/new-nginx created
[root@master01 opt]#
[root@master01 opt]#kubectl get svc -n test
NAME            TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
new-nginx       NodePort   10.96.173.45   <none>        80:30573/TCP   7s
nginx-service   NodePort   10.96.54.179   <none>        80:30993/TCP   54m
[root@master01 opt]#kubectl get endpoints new-nginx -n test
NAME        ENDPOINTS       AGE
new-nginx   10.244.2.9:80   64s   

訪問升級版本 pod,查看流量調度是否正確:

同樣的,編輯(查看)位于命名空間test中的名為 nginx-server 的 Service 資源對象,復制文本內容,并創建對應 yaml 文件,修改標簽選擇器內容:

[root@master01 opt]#kubectl get svc -n test
NAME            TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
new-nginx       NodePort   10.96.173.45   <none>        80:30573/TCP   11m
nginx-service   NodePort   10.96.54.179   <none>        80:30993/TCP   65m
[root@master01 opt]#kubectl get svc -n test nginx-service -o yaml > /opt/nginx-service.yaml
[root@master01 opt]#
[root@master01 opt]#kubectl get pod -n test --show-labels
NAME                         READY   STATUS    RESTARTS   AGE   LABELS
nginx-zzz-548675b8b9-bj7t7   1/1     Running   0          63m   app=nginx-zzz,pod-template-hash=548675b8b9
nginx-zzz-f977d6866-4qd2z    1/1     Running   0          70m   app=nginx-zzz,pod-template-hash=f977d6866
nginx-zzz-f977d6866-fbln6    1/1     Running   0          70m   app=nginx-zzz,pod-template-hash=f977d6866
nginx-zzz-f977d6866-l7tk8    1/1     Running   0          70m   app=nginx-zzz,pod-template-hash=f977d6866
[root@master01 opt]#vim /opt/nginx-service.yaml

kubectl get svc -n testkubectl delete svc nginx-service -n testkubectl apply -f nginx-service.yaml -n test

訪問舊版本 pod,查看流量調度是否正確:?

至此,通過不同 server 對應標簽,完成金絲雀發布中,將流量分流到新舊版本的過程。

(3)確保更新的pod沒問題了,繼續更新

kubectl rollout resume deployment/nginx-zzz -n testkubectl rollout status deployment nginx-zzz -n test

(4)查看最后的更新情況
kubectl get pods -w?

現在都是新版本了

測試下新舊版本訪問

#舊service無法訪問,由于更新了新版本,現在由新的版本提供服務

[root@master01 ~]#kubectl get pods,svc -n test -o wide
NAME                             READY   STATUS    RESTARTS   AGE   IP            NODE     NOMINATED NODE   READINESS GATES
pod/nginx-zzz-548675b8b9-bj7t7   1/1     Running   0          99m   10.244.2.9    node02   <none>           <none>
pod/nginx-zzz-548675b8b9-cqghr   1/1     Running   0          13m   10.244.2.10   node02   <none>           <none>
pod/nginx-zzz-548675b8b9-j7njm   1/1     Running   0          13m   10.244.1.14   node01   <none>           <none>NAME                    TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE   SELECTOR
service/new-nginx       NodePort   10.96.173.45   <none>        80:30573/TCP   49m   pod-template-hash=548675b8b9
service/nginx-service   NodePort   10.96.54.179   <none>        80:30993/TCP   26m   pod-template-hash=f977d6866
[root@master01 ~]#kubectl exec -it pod/nginx-zzz-548675b8b9-bj7t7 bash -n test
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
root@nginx-zzz-548675b8b9-bj7t7:/# echo "111" > /usr/share/nginx/html/index.html 
root@nginx-zzz-548675b8b9-bj7t7:/# exit
exit
[root@master01 ~]#kubectl exec -it pod/nginx-zzz-548675b8b9-cqghr  bash -n test
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
root@nginx-zzz-548675b8b9-cqghr:/# echo "222" > /usr/share/nginx/html/index.html
root@nginx-zzz-548675b8b9-cqghr:/# exit
exit
[root@master01 ~]#kubectl exec -it pod/nginx-zzz-548675b8b9-j7njm  bash -n test
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
root@nginx-zzz-548675b8b9-j7njm:/#  echo "333" > /usr/share/nginx/html/index.html
root@nginx-zzz-548675b8b9-j7njm:/# exit
exit
[root@master01 ~]#curl 10.96.173
^C
[root@master01 ~]#curl 10.96.173.45
222
[root@master01 ~]#curl 10.96.173.45
111
[root@master01 ~]#curl 10.96.173.45
333
[root@master01 ~]#curl 10.96.173.45
222
[root@master01 ~]#curl 10.96.54.179
curl: (7) Failed connect to 10.96.54.179:80; 拒絕連接
[root@master01 ~]#
[root@master01 ~]#curl 192.168.246.11:30573
333
[root@master01 ~]#curl 192.168.246.11:30573
222
[root@master01 ~]#curl 192.168.246.11:30573
111
[root@master01 ~]#curl 192.168.246.11:30993
curl: (7) Failed connect to 192.168.246.11:30993; 拒絕連接
[root@master01 ~]#

三、聲明式管理方法

  • 適合于對資源的修改操作
  • 聲明式資源管理方法依賴于資源配置清單文件對資源進行管理
  • 資源配置清單文件有兩種格式:yaml(人性化,易讀),json(易于api接口解析)
  • 對資源的管理,是通過事先定義在統一資源配置清單內,再通過陳述式命令應用到k8s集群里
  • 語法格式:kubectl create/apply/delete -f xxxx.yaml
//查看資源配置清單
kubectl get deployment nginx -o yaml//解釋資源配置清單
kubectl explain deployment.metadatakubectl get service nginx -o yaml
kubectl explain service.metadata//修改資源配置清單并應用
離線修改:
修改yaml文件,并用 kubectl apply -f xxxx.yaml 文件使之生效
注意:當apply不生效時,先使用delete清除資源,再apply創建資源kubectl get service nginx -o yaml > nginx-svc.yaml
vim nginx-svc.yaml?? ??? ??? ??? ?#修改port: 8080
kubectl delete -f nginx-svc.yaml
kubectl apply -f nginx-svc.yaml
kubectl get svc在線修改:
直接使用 kubectl edit service nginx 在線編輯資源配置清單并保存退出即時生效(如port: 888)
PS:此修改方式不會對yaml文件內容修改//刪除資源配置清單
陳述式刪除:
kubectl delete service nginx聲明式刪除:
kubectl delete -f nginx-svc.yaml

#查看資源配置清單

kubectl get deployment nginx -o yaml

#解釋資源配置清單

kubectl explain deployment.metadatakubectl get service nginx -o yaml
kubectl explain service.metadata

當 yaml 配置文件發送改動成功后,使用create 創建的資源想要更新的時候,需要先delete刪除原有資源再通過yam1文件 創建資源 使用apply 創建的資源想要更新 ,可以直接再執行kubectl apply -f 更新

Kubernetes 支持 YAML 和 JSON 格式管理資源對象
JSON 格式:主要用于 api 接口之間消息的傳遞
YAML 格式:用于配置和管理,YAML 是一種簡潔的非標記性語言,內容格式人性化,較易讀

3.1YAML 語法格式

  • 大小寫敏感
  • 使用縮進表示層級關系
  • 不支持Tab鍵制表符縮進,只使用空格縮進
  • 縮進的空格數目不重要,只要相同層級的元素左側對齊即可,通常開頭縮進兩個空格
  • 符號字符后縮進一個空格,如冒號,逗號,短橫桿(-)等
  • “---”表示YAML格式,一個文件的開始,用于分隔文件間
  • “#”表示注釋

3.1.1查看 api 資源版本標簽

kubectl api-versions

查看 api 資源版本標簽kubectl api-versions
admissionregistration.k8s.io/v1beta1
apiextensions.k8s.io/v1beta1
apiregistration.k8s.io/v1
apiregistration.k8s.io/v1beta1
apps/v1								#如果是業務場景一般首選使用 apps/v1
apps/v1beta1						#帶有beta字樣的代表的是測試版本,不用在生產環境中
apps/v1beta2
authentication.k8s.io/v1
authentication.k8s.io/v1beta1
authorization.k8s.io/v1
authorization.k8s.io/v1beta1
autoscaling/v1
autoscaling/v2beta1
autoscaling/v2beta2
batch/v1
batch/v1beta1
certificates.k8s.io/v1beta1
coordination.k8s.io/v1beta1
events.k8s.io/v1beta1
extensions/v1beta1
networking.k8s.io/v1
policy/v1beta1
rbac.authorization.k8s.io/v1
rbac.authorization.k8s.io/v1beta1
scheduling.k8s.io/v1beta1
storage.k8s.io/v1
storage.k8s.io/v1beta1
v1
  • ?如果是業務場景一般首選使用 apps/v1
  • 帶有beta字樣的代表的是測試版本,不用在生產環境中

3.1.2查看資源簡寫

kubectl api-resources

3.2YAML文件詳解

3.2.1Deployment.yaml

apiVersion: extensions/v1beta1   #接口版本
kind: Deployment                 #接口類型
metadata:name: cango-demo               #Deployment名稱namespace: cango-prd           #命名空間labels:app: cango-demo              #標簽
spec:replicas: 3strategy:rollingUpdate:  #由于replicas為3,則整個升級,pod個數在2-4個之間maxSurge: 1      #滾動升級時會先啟動1個podmaxUnavailable: 1 #滾動升級時允許的最大Unavailable的pod個數template:         metadata:labels:app: cango-demo  #模板名稱必填sepc: #定義容器模板,該模板可以包含多個容器containers:                                                                   - name: cango-demo        #鏡像名稱image: swr.cn-east-2.myhuaweicloud.com/cango-prd/cango-demo:0.0.1-SNAPSHOT #鏡像地址command: [ "/bin/sh","-c","cat /etc/config/path/to/special-key" ]    #啟動命令args:                                                                #啟動參數- '-storage.local.retention=$(STORAGE_RETENTION)'- '-storage.local.memory-chunks=$(STORAGE_MEMORY_CHUNKS)'- '-config.file=/etc/prometheus/prometheus.yml'- '-alertmanager.url=http://alertmanager:9093/alertmanager'- '-web.external-url=$(EXTERNAL_URL)'#如果command和args均沒有寫,那么用Docker默認的配置。#如果command寫了,但args沒有寫,那么Docker默認的配置會被忽略而且僅僅執行.yaml文件的command(不帶任何參數的)。#如果command沒寫,但args寫了,那么Docker默認配置的ENTRYPOINT的命令行會被執行,但是調用的參數是.yaml中的args。#如果如果command和args都寫了,那么Docker默認的配置被忽略,使用.yaml的配置。imagePullPolicy: IfNotPresent  #如果不存在則拉取livenessProbe:       #表示container是否處于live狀態。如果LivenessProbe失敗,LivenessProbe將會通知kubelet對應的container不健康了。隨后kubelet將kill掉container,并根據RestarPolicy進行進一步的操作。默認情況下LivenessProbe在第一次檢測之前初始化值為Success,如果container沒有提供LivenessProbe,則也認為是Success;httpGet:path: /health #如果沒有心跳檢測接口就為/port: 8080scheme: HTTPinitialDelaySeconds: 60 ##啟動后延時多久開始運行檢測timeoutSeconds: 5successThreshold: 1failureThreshold: 5readinessProbe:httpGet:path: /health #如果沒有心跳檢測接口就為/port: 8080scheme: HTTPinitialDelaySeconds: 30 ##啟動后延時多久開始運行檢測timeoutSeconds: 5successThreshold: 1failureThreshold: 5resources:              ##CPU內存限制requests:cpu: 2memory: 2048Milimits:cpu: 2memory: 2048Mienv:                    ##通過環境變量的方式,直接傳遞pod=自定義Linux OS環境變量- name: LOCAL_KEY     #本地Keyvalue: value- name: CONFIG_MAP_KEY  #局策略可使用configMap的配置Key,valueFrom:configMapKeyRef:name: special-config   #configmap中找到name為special-configkey: special.type      #找到name為special-config里data下的keyports:- name: httpcontainerPort: 8080 #對service暴露端口volumeMounts:     #掛載volumes中定義的磁盤- name: log-cachemount: /tmp/log- name: sdb       #普通用法,該卷跟隨容器銷毀,掛載一個目錄mountPath: /data/media    - name: nfs-client-root    #直接掛載硬盤方法,如掛載下面的nfs目錄到/mnt/nfsmountPath: /mnt/nfs- name: example-volume-config  #高級用法第1種,將ConfigMap的log-script,backup-script分別掛載到/etc/config目錄下的一個相對路徑path/to/...下,如果存在同名文件,直接覆蓋。mountPath: /etc/config       - name: rbd-pvc                #高級用法第2中,掛載PVC(PresistentVolumeClaim)#使用volume將ConfigMap作為文件或目錄直接掛載,其中每一個key-value鍵值對都會生成一個文件,key為文件名,value為內容,volumes:  # 定義磁盤給上面volumeMounts掛載- name: log-cacheemptyDir: {}- name: sdb  #掛載宿主機上面的目錄hostPath:path: /any/path/it/will/be/replaced- name: example-volume-config  # 供ConfigMap文件內容到指定路徑使用configMap:name: example-volume-config  #ConfigMap中名稱items:- key: log-script           #ConfigMap中的Keypath: path/to/log-script  #指定目錄下的一個相對路徑path/to/log-script- key: backup-script        #ConfigMap中的Keypath: path/to/backup-script  #指定目錄下的一個相對路徑path/to/backup-script- name: nfs-client-root         #供掛載NFS存儲類型nfs:server: 10.42.0.55          #NFS服務器地址path: /opt/public           #showmount -e 看一下路徑- name: rbd-pvc                 #掛載PVC磁盤persistentVolumeClaim:claimName: rbd-pvc1         #掛載已經申請的pvc磁盤

3.2.2Pod.yaml

apiVersion: v1			#必選,版本號,例如v1
kind: Pod				#必選,Pod
metadata:				#必選,元數據name: string			  #必選,Pod名稱namespace: string		  #必選,Pod所屬的命名空間labels:				  #自定義標簽- name: string		    #自定義標簽名字annotations:			    #自定義注釋列表- name: string
spec:					#必選,Pod中容器的詳細定義containers:			  #必選,Pod中容器列表- name: string		    #必選,容器名稱image: string		    #必選,容器的鏡像名稱imagePullPolicy: [Always | Never | IfNotPresent]	#獲取鏡像的策略:Alawys表示總是下載鏡像,IfnotPresent表示優先使用本地鏡像,否則下載鏡像,Nerver表示僅使用本地鏡像command: [string]		#容器的啟動命令列表,如不指定,使用打包時使用的啟動命令args: [string]			#容器的啟動命令參數列表workingDir: string		#容器的工作目錄volumeMounts:			#掛載到容器內部的存儲卷配置- name: string			  #引用pod定義的共享存儲卷的名稱,需用volumes[]部分定義的的卷名mountPath: string		  #存儲卷在容器內mount的絕對路徑,應少于512字符readOnly: boolean		  #是否為只讀模式ports:					#需要暴露的端口庫號列表- name: string			  #端口號名稱containerPort: int	  #容器需要監聽的端口號hostPort: int			  #容器所在主機需要監聽的端口號,默認與Container相同protocol: string		  #端口協議,支持TCP和UDP,默認TCPenv:					#容器運行前需設置的環境變量列表- name: string			  #環境變量名稱value: string			  #環境變量的值resources:				#資源限制和請求的設置limits:				  #資源限制的設置cpu: string			    #Cpu的限制,單位為core數,將用于docker run --cpu-shares參數memory: string			#內存限制,單位可以為Mib/Gib,將用于docker run --memory參數requests:				  #資源請求的設置cpu: string			    #Cpu請求,容器啟動的初始可用數量memory: string		    #內存清楚,容器啟動的初始可用數量livenessProbe:     		#對Pod內個容器健康檢查的設置,當探測無響應幾次后將自動重啟該容器,檢查方法有exec、httpGet和tcpSocket,對一個容器只需設置其中一種方法即可exec:					#對Pod容器內檢查方式設置為exec方式command: [string]	  #exec方式需要制定的命令或腳本httpGet:				#對Pod內個容器健康檢查方法設置為HttpGet,需要制定Path、portpath: stringport: numberhost: stringscheme: stringHttpHeaders:- name: stringvalue: stringtcpSocket:			#對Pod內個容器健康檢查方式設置為tcpSocket方式port: numberinitialDelaySeconds: 0	#容器啟動完成后首次探測的時間,單位為秒timeoutSeconds: 0		#對容器健康檢查探測等待響應的超時時間,單位秒,默認1秒periodSeconds: 0			#對容器監控檢查的定期探測時間設置,單位秒,默認10秒一次successThreshold: 0failureThreshold: 0securityContext:privileged:falserestartPolicy: [Always | Never | OnFailure]		#Pod的重啟策略,Always表示一旦不管以何種方式終止運行,kubelet都將重啟,OnFailure表示只有Pod以非0退出碼退出才重啟,Nerver表示不再重啟該PodnodeSelector: obeject		#設置NodeSelector表示將該Pod調度到包含這個label的node上,以key:value的格式指定imagePullSecrets:			#Pull鏡像時使用的secret名稱,以key:secretkey格式指定- name: stringhostNetwork:false			#是否使用主機網絡模式,默認為false,如果設置為true,表示使用宿主機網絡volumes:					#在該pod上定義共享存儲卷列表- name: string				  #共享存儲卷名稱 (volumes類型有很多種)emptyDir: {}				  #類型為emtyDir的存儲卷,與Pod同生命周期的一個臨時目錄。為空值hostPath: string			  #類型為hostPath的存儲卷,表示掛載Pod所在宿主機的目錄path: string			    #Pod所在宿主機的目錄,將被用于同期中mount的目錄secret:					#類型為secret的存儲卷,掛載集群與定義的secre對象到容器內部scretname: string  items:     - key: stringpath: stringconfigMap:				#類型為configMap的存儲卷,掛載預定義的configMap對象到容器內部name: stringitems:- key: string

3.2.3Service.yaml

apiVersion: v1
kind: Service
matadata:                                #元數據name: string                           #service的名稱namespace: string                      #命名空間  labels:                                #自定義標簽屬性列表- name: stringannotations:                           #自定義注解屬性列表  - name: string
spec:                                    #詳細描述selector: []                           #label selector配置,將選擇具有label標簽的Pod作為管理 #范圍type: string                           #service的類型,指定service的訪問方式,默認為 #clusterIpclusterIP: string                      #虛擬服務地址      sessionAffinity: string                #是否支持sessionports:                                 #service需要暴露的端口列表- name: string                         #端口名稱protocol: string                     #端口協議,支持TCP和UDP,默認TCPport: int                            #服務監聽的端口號targetPort: int                      #需要轉發到后端Pod的端口號nodePort: int                        #當type = NodePort時,指定映射到物理機的端口號status:                                #當spce.type=LoadBalancer時,設置外部負載均衡器的地址loadBalancer:                        #外部負載均衡器    ingress:                           #外部負載均衡器 ip: string                       #外部負載均衡器的Ip地址值hostname: string                 #外部負載均衡器的主機名

3.3Port

在Kubernetes中,端口的概念非常重要。Pod中的應用程序可能需要暴露一些端口來讓其他Pod或外部應用程序訪問在Kubernetes中,端口主要分為兩種類型,節點端口和集群內部端口。

3.3.1節點端口

節點端口(NodePort)允許外部流量通過節點直接訪問Pod。使用這種方式后,外部流量將會通過節點的IP地址和指定的端口轉發到相應的Pod。NodePort隨機指定一個端口號,端口范圍在30000-32767之間可以通過指定NodePort的值來指定一個特定的節點端口。

3.3.2集群內部端口

集群內部端口暴露應用程序服務給其他Pod使用。通過定義端口并把它們暴露給其他Pod,可以方便地實現服務發現和內部路由功能。在Kubernetes中,有三種類型的內部端口:容器端口(Container Port)、名稱化端口(Named Port)和端點端口(Endpoint Port)。

  • 容器端口(Container Port):應用程序在容器內部暴露的端口號。
  • 名稱化端口(Named Port):在為抽Service中定義的端口,作象概念使用,并將請求轉發到一個或多個容器端口。
  • 端點端口(Endpoint Port):通過Service提供的端口,它將轉發到一個或多個Pod的容器端口和IP地址。

這些端口類型可用于不同的場景,可以根據需求來選擇具體的端口類型。

在Kubernetes中定義端口時,通常需要指定兩個屬性:端口號和協議類型。端口號是一個整數,協議類型可以是TCP或UDP。例如,定義TCP協議的8080端口可以寫成:8080/TCP。通過這兩個屬性定義,Kubernetes能夠正確接受和轉發請求,從而使應用程序正常工作

可以結合3.5標題進行探索哦

3.4編寫YAML文件案例

3.4.1部署nginx的yaml 配置

mkdir /opt/demo
cd demo/vim nginx-deployment.yaml
apiVersion: apps/v1		#指定api版本標簽
kind: Deployment		#定義資源的類型/角色,deployment為副本控制器,此處資源類型可以是Deployment、Job、Ingress、Service等
metadata:					#定義資源的元數據信息,比如資源的名稱、namespace、標簽等信息name: nginx-deployment	#定義資源的名稱,在同一個namespace空間中必須是唯一的labels:				#定義Deployment資源標簽app: nginx	
spec:					#定義deployment資源需要的參數屬性,諸如是否在容器失敗時重新啟動容器的屬性replicas: 3			#定義副本數量selector:				#定義標簽選擇器matchLabels:		#定義匹配標簽app: nginx		#需與 .spec.template.metadata.labels 定義的標簽保持一致template:				#定義業務模板,如果有多個副本,所有副本的屬性會按照模板的相關配置進行匹配metadata:labels:           #定義Pod副本將使用的標簽,需與 .spec.selector.matchLabels 定義的標簽保持一致app: nginxspec:containers:				#定義容器屬性- name: nginx				#定義一個容器名,一個 - name: 定義一個容器image: nginx:1.15.4		#定義容器使用的鏡像以及版本ports:- containerPort: 80		#定義容器的對外的端口//創建資源對象
kubectl create -f nginx-deployment.yaml//查看創建的pod資源
kubectl get pods -o wide
NAME                              READY   STATUS    RESTARTS   AGE    IP            NODE            NOMINATED NODE
nginx-deployment-d55b94fd-29qk2   1/1     Running   0          7m9s   172.17.36.4   192.168.80.12   <none>
nginx-deployment-d55b94fd-9j42r   1/1     Running   0          7m9s   172.17.36.3   192.168.80.12   <none>
nginx-deployment-d55b94fd-ksl6l   1/1     Running   0          7m9s   172.17.26.3   192.168.80.11   <none>//創建service服務對外提供訪問并測試
vim nginx-service.yaml
apiVersion: v1  
kind: Service  
metadata:name: nginx-servicelabels:app: nginx  
spec:type: NodePort  ports:- port: 80targetPort: 80  selector:app: nginx//創建資源對象
kubectl create -f nginx-service.yaml //查看創建的service
kubectl get svc
NAME            TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)        AGE
kubernetes      ClusterIP   10.0.0.1     <none>        443/TCP        16d
nginx-service   NodePort    10.0.0.119   <none>        80:35680/TCP   14s//在瀏覽器輸入 nodeIP:nodePort 即可訪問
http://192.168.80.11:35680
http://192.168.80.12:35680
3.4.1.1部署myapp的yaml配置
3.4.1.1.1編寫YAML文件?

詳細解讀yaml配置清單文件

可以查看如何寫

?kubectl explain deployment.spec.template.spec
kubectl explain deployment.spec.template.spec.containers

每次可以在?. 后面繼續添加你需要的內容,它會給你提供模板可以參考

[root@master01 opt]#mkdir /opt/demo
[root@master01 opt]#cd /opt/demo/
[root@master01 demo]#vim nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: haha-zzznamespace: defaultlabels:app: haha
spec:replicas: 3selector:matchLabels:app: hahatemplate:metadata:labels:app: hahaspec:containers:- name: hahaimage: soscscs/myapp:v1ports:- name:containerPort: 80

3.4.1.1.2生成資源
kubectl create -f nginx-deployment.yamlkubectl get pods -o wide

創建service服務對外提供訪問并測試

apiVersion: v1
kind: Service
metadata:name: nginx-servicenamespace: default
spec:ports:- port: 8081targetPort: 80nodePort: 30002type: NodePortselector:app: haha

創建資源對象

kubectl apply -f nginx-service.yaml

查看創建的service

kubectl get pod,svc

在瀏覽器輸入 nodeIP:nodePort 即可訪問

3.4.1.1.3訪問驗證

在瀏覽器輸入 nodeIP:nodePort 即可訪問

xhell里也可以訪問

3.4.2部署 redis的yaml 配置

3.4.2.1編寫YAML文件?
mkdir /opt/redis
cd /opt/redis/
vim redis.yaml

apiVersion: apps/v1
kind: Deployment
metadata:name: redis-dpmlabels:app: redis
spec:replicas: 3selector:matchLabels:app: redistemplate:metadata:labels:app: redisspec:containers:- name: redisimage: redis:latestports:- containerPort: 6379
---
apiVersion: v1
kind: Service
metadata:name: redis-dbmlabels:app: redis
spec:selector:app: redisports:- nodePort: 32379port: 6379protocol: TCPtargetPort: 6379type: NodePort

3.4.2.2創建資源

創建資源對象 并 查看創建的pod資源

kubectl apply -f redis.yaml
kubectl get pods,svc

這邊要等一等,等到都是running代表創建好了

一直不是running重啟下虛擬機好啦

3.4.2.3訪問驗證

3.4.3部署 mysql的yaml 配置

3.4.3.1?生成模板 yaml 文件

使用 yaml 格式導出生成模板,并進行修改以及刪除一些不必要的參數

① 生成并修改命名空間創建 yaml 文件

[root@master01 opt]#kubectl create ns mysql-server -o yaml --dry-run=client > mysql.yaml
[root@master01 opt]#
[root@master01 opt]#vim mysql.yaml
apiVersion: v1
kind: Namespace
metadata:name: mysql-server
---

② 生成并修改清單創建 yaml 文件

  • 追加創建一個 Deployment YAML 文件模板,但不包含環境變量
  • 手動編輯 mysql.yaml 文件,添加環境變量、卷掛載

[root@master01 opt]# kubectl create deployment mysql-01 --image=mysql:latest --port=3306 --replicas=1 -n mysql-server --dry-run=client -o yaml >> mysql.yaml
[root@master01 opt]#vim mysql.yaml
apiVersion: v1             # Kubernetes API 的版本
kind: Namespace            # 定義了一個 Namespace
metadata:                  # 包含了資源的元數據,比如名稱、標簽等name: mysql-server       # Namespace 的名稱
---                        # 這個分隔符表示 YAML 文件中的兩個資源定義之間的分隔
apiVersion: apps/v1
kind: Deployment           # 指定了資源類型為 Deploymen
metadata:                  # 包含了 Deployment 的元數據,比如名稱、標簽等labels:                  # Deployment 的標簽,用于標識和選擇相關的資源app: mysql-01        name: mysql-01           # Deployment 的名稱namespace: mysql-server  # Deployment 所屬的 Namespace
spec:                      # 定義了 Deployment 的規格,包括副本數量、選擇器和 Pod 模板replicas: 1              # Deployment 的副本數量selector:                # 定義了用于選擇 Pod 的標簽matchLabels:           # 這是選擇器的標簽,與 Pod 模板中的標簽匹配app: mysql-01        template:                # 定義了要創建的 Pod 的模板metadata:              # 包含了 Pod 模板的元數據,比如標簽等labels:              # Pod 模板的標簽,用于標識和選擇相關的資源app: mysql-01spec:                  # 定義了 Pod 的規格,包括容器和端口containers:- image: mysql:latest          # 容器的鏡像,使用的是最新版本的 MySQL 鏡像name: mysql                  # 容器的名稱ports:                       # 容器的端口列表- containerPort: 3306        # 容器的端口env:                         # 定義環境變量列表- name: MYSQL_ROOT_PASSWORD  # 環境變量的名稱value: "123123"            # 設置MySQL的root密碼,也就是環境變量的值
# 當MySQL容器首次啟動時,它會檢查數據庫是否已經初始化,并且如果沒有提供密碼相關的環境變量,它會報錯并退出volumeMounts:                # 定義如何掛載卷到容器中- name: mysql-data           # 引用的卷的名稱mountPath: /var/lib/mysql  # 卷在容器中的掛載路徑volumes:                       # 定義Pod中使用的卷列表- name: mysql-data             # 卷的名稱,與volumeMounts中的name相對應emptyDir: {}
# 一個空目錄卷。這種類型的卷在Pod首次被調度到節點上時創建,并在Pod被刪除時銷毀。它不持久化數據,僅用于臨時存儲
---

③ 編輯 svc 資源 yaml 文件

由于集群中還未創建 mysql-01,無法使用命令生成模板:kubectl expose service mysql-01 --port=3306 --target-port=3306 --name=mysql-svc --type=NodePort --dry-run=client -o yaml >> mysql.yam

這里手動編輯 yaml 文件:

[root@master01 ~]# vim mysql.yaml 
apiVersion: v1             # Kubernetes API 的版本
kind: Namespace            # 定義了一個 Namespace
metadata:                  # 包含了資源的元數據,比如名稱、標簽等name: mysql-server       # Namespace 的名稱
---                        # 這個分隔符表示 YAML 文件中的兩個資源定義之間的分隔
apiVersion: apps/v1
kind: Deployment           # 指定了資源類型為 Deploymen
metadata:                  # 包含了 Deployment 的元數據,比如名稱、標簽等labels:                  # Deployment 的標簽,用于標識和選擇相關的資源app: mysql-01        name: mysql-01           # Deployment 的名稱namespace: mysql-server  # Deployment 所屬的 Namespace
spec:                      # 定義了 Deployment 的規格,包括副本數量、選擇器和 Pod 模板replicas: 1              # Deployment 的副本數量selector:                # 定義了用于選擇 Pod 的標簽matchLabels:           # 這是選擇器的標簽,與 Pod 模板中的標簽匹配app: mysql-01        template:                # 定義了要創建的 Pod 的模板metadata:              # 包含了 Pod 模板的元數據,比如標簽等labels:              # Pod 模板的標簽,用于標識和選擇相關的資源app: mysql-01spec:                  # 定義了 Pod 的規格,包括容器和端口containers:- image: mysql:latest          # 容器的鏡像,使用的是最新版本的 MySQL 鏡像name: mysql                  # 容器的名稱ports:                       # 容器的端口列表- containerPort: 3306        # 容器的端口env:                         # 定義環境變量列表- name: MYSQL_ROOT_PASSWORD  # 環境變量的名稱value: "123123"            # 設置MySQL的root密碼,也就是環境變量的值
# 當MySQL容器首次啟動時,它會檢查數據庫是否已經初始化,并且如果沒有提供密碼相關的環境變量,它會報錯并退出volumeMounts:                # 定義如何掛載卷到容器中- name: mysql-data           # 引用的卷的名稱mountPath: /var/lib/mysql  # 卷在容器中的掛載路徑volumes:                       # 定義Pod中使用的卷列表- name: mysql-data             # 卷的名稱,與volumeMounts中的name相對應emptyDir: {}
# 一個空目錄卷。這種類型的卷在Pod首次被調度到節點上時創建,并在Pod被刪除時銷毀。它不持久化數據,僅用于臨時存儲
--- 
apiVersion: v1              
kind: Service               # 定義了一個 Service(服務)
metadata:                   # 包含了服務的元數據,比如名稱、標簽等name: mysql-service       # 服務的名稱namespace: mysql-server   # 服務所屬的 Namespacelabels:                   # 服務的標簽,用于標識和選擇相關的資源app: mysql-01           # 服務的標簽,與 Deployment 或 Pod 的標簽匹配
spec:                       # 定義了服務的規格,包括服務類型、端口和選擇器type: NodePort            # 服務的類型,被設置為 NodePortports:                    # 服務的端口列表- port: 3306              # 服務的端口targetPort: 3306        # 服務轉發請求的目標端口selector:                 # 定義了用于選擇后端 Pod 的標簽app: mysql-01           # 選擇器的標簽,與 Deployment 或 Pod 的標簽匹配

3.4.3.2創建資源
[root@master01 opt]#kubectl apply -f mysql.yaml 
namespace/mysql-server unchanged
deployment.apps/mysql-01 created
service/mysql-service created
[root@master01 opt]#
[root@master01 opt]#kubectl get pods,svc -n mysql-server -owide
NAME                            READY   STATUS    RESTARTS   AGE     IP            NODE     NOMINATED NODE   READINESS GATES
pod/mysql-01-776dd57c9b-pjdj9   1/1     Running   0          4m19s   10.244.2.25   node02   <none>           <none>NAME                    TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE     SELECTOR
service/mysql-service   NodePort   10.96.235.149   <none>        3306:32476/TCP   4m19s   app=mysql-01
[root@master01 opt]#

3.4.3.3訪問驗證

登錄mysql容器進行操作

[root@master01 opt]#kubectl exec -it mysql-01-776dd57c9b-pjdj9 -n mysql-server bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
bash-5.1#       
bash-5.1# mysql -uroot -p'123123'
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 8.4.0 MySQL Community Server - GPLCopyright (c) 2000, 2024, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> 
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.02 sec)mysql> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -ADatabase changed
mysql> 
mysql> exit
Bye
bash-5.1# exit
exit
[root@master01 opt]#

這樣就可以進入數據庫,正常查看內容了哦

3.5詳解k8s中的port

●port
port 是 k8s 集群內部訪問service的端口,即通過 clusterIP: port 可以從 Pod 所在的 Node 上訪問到 service

●nodePort
nodePort 是外部訪問 k8s 集群中 service 的端口,通過 nodeIP: nodePort 可以從外部訪問到某個 service。

●targetPort
targetPort 是 Pod 的端口,從 port 或 nodePort 來的流量經過 kube-proxy 反向代理負載均衡轉發到后端 Pod 的 targetPort 上,最后進入容器。

●containerPort
containerPort 是 Pod 內部容器的端口,targetPort 映射到 containerPort。

3.6YAML文件相關操作

/kubectl run --dry-run=client 打印相應的 API 對象而不執行創建
kubectl run nginx-test --image=nginx --port=80 --dry-run=client
kubectl create deployment nginx-deploy --image=nginx --port=80 --replicas=3 --dry-run=client//查看生成yaml格式
kubectl run nginx-test --image=nginx --port=80 --dry-run=client -o yaml
kubectl create deployment nginx-deploy --image=nginx --port=80 --replicas=3 --dry-run=client -o yaml//查看生成json格式
kubectl run nginx-test --image=nginx --port=80 --dry-run=client -o json
kubectl create deployment nginx-deploy --image=nginx --port=80 --replicas=3 --dry-run=client -o json//使用yaml格式導出生成模板,并進行修改以及刪除一些不必要的參數
kubectl run nginx-test --image=nginx --port=80 --dry-run=client -o yaml > nginx-test.yaml
kubectl create deployment nginx-deploy --image=nginx --port=80 --replicas=3 --dry-run=client -o yaml  > nginx-deploy.yaml

3.6.1 --dry-run——讀取而不創建

kubectl run --dry-run=client 打印相應的 API 對象而不執行創建

kubectl run nginx-test --image=nginx --port=80 --dry-run=client
kubectl create deployment nginx-deploy --image=nginx --port=80 --replicas=3 --dry-run=client

3.6.2查看生成yaml格式

kubectl run nginx-test --image=nginx --port=80 --dry-run=client -o yamlkubectl create deployment nginx-deploy --image=nginx --port=80 --replicas=3 --dry-run=client -o yaml

3.6.3查看生成json格式

kubectl run nginx-test --image=nginx --port=80 --dry-run=client -o jsonkubectl create deployment nginx-deploy --image=nginx --port=80 --replicas=3 --dry-run=client -o json

3.6.4使用yaml格式導出生成模板,并進行修改以及刪除一些不必要的參數

kubectl run nginx-test --image=nginx --port=80 --dry-run=client -o yaml > nginx-test.yamlkubectl create deployment nginx-deploy --image=nginx --port=80 --replicas=3 --dry-run=client -o yaml ?> nginx-deploy.yaml

//將現有的資源生成模板導出
kubectl get svc nginx-service -o yaml//保存到文件中
kubectl get svc nginx-service -o yaml > my-svc.yaml//查看字段幫助信息,可一層層的查看相關資源對象的幫助信息
kubectl explain deployments.spec.template.spec.containers
或
kubectl explain pods.spec.containers

3.6.5先查看已經部署的資源

kubectl get deploy

3.6.6將現有的資源生成模板導出

kubectl get svc nginx-service -o yaml

3.6.7保存到文件中

kubectl get svc nginx-service -o yaml > my-svc.yaml

3.6.8查看字段幫助信息,可一層層的查看相關資源對象的幫助信息

kubectl explain deployments.spec.template.spec.containers
或
kubectl explain pods.spec.containers

3.6.9寫yaml太累怎么辦?

  • 用 --dry-run 命令生成
    kubectl run my-deploy --image=nginx --dry-run=client -o yaml > my-deploy.yaml
  • 用get命令導出
kubectl get svc nginx-service -o yaml > my-svc.yaml
或
kubectl edit svc nginx-service ?#復制配置,再粘貼到新文件

3.7快速編寫YAML文件

3.7.1--dry-run——讀取而不創建

kubectl run nginx-cs --image=soscscs/myapp:v1 --port=80 --dry-run=clientkubectl create deployment nginx-dpm --image=soscscs/myapp:v1 --port=80 --replicas=3 --dry-run=client

一般用于測試環境

3.7.2-o yaml——查看生成yaml格式

kubectl run nginx-cs --image=soscscs/myapp:v1 --port=80 --dry-run=client -o yaml

3.7.3-o json——查看生成json格式

kubectl run nginx-cs --image=soscscs/myapp:v1 --port=80 --dry-run=client -o json

3.7.4帶你五分鐘寫yaml文件

3.7.4.1用 --dry-run 命令生成
kubectl run nginx-cs --image=soscscs/myapp:v1 --port=80 --dry-run=client -o yaml > nginx.yyaml

kubectl apply -f nginx.yaml kubectl get pods -owide

3.7.4.2用get命令導出
kubectl get svc -o yaml > nginx-cs-svc.yaml vim nginx-cs-svc.yaml

kubectl apply -f nginx-cs-svc.yaml

四、根據需求配置-----創建自主式pod

自主式Pod(Ad-Hoc Pod或Non-Controller Managed Pod)是指那些由用戶直接創建但不受任何控制器管理的Pod。它們通常通過kubectl run命令或直接向API Server提交YAML/JSON配置文件的方式來創建。自主式Pod一旦創建,除非手動刪除,否則不會自動消失或者被重建。這類Pod沒有與之關聯的控制器,所以如果Pod出現故障,不會像受控制器管理的Pod那樣自動恢復到期望狀態

需求

資源名稱:my-nginx-zzz

命名空間:my-zzz

容器鏡像:nginx:1.21

容器端口:80

標簽:nanjing: my-zzz

創建? server去關聯上面的pod

結果:首先修改頁面:welcome to nanjing? 對外訪問, 輸入地址就能訪問

kubectl create ns my-zzz --dry-run -oyamlkubectl run my-nginx-zzz --image=nginx:1.21 --port=80 --dry-run -o yaml > /opt/pod-yaml

4.1試創建文件獲取模板文件

4.2 編寫yaml文件?

將獲取的yaml資源內容復制過來,進行修改?

apiVersion: v1
kind: Namespace
metadata:name: my-zzz
---
apiVersion: v1
kind: Pod
metadata:labels:nanjing: my-zzzname: my-nginx-zzznamespace: my-zzz
spec:containers:- image: nginx:1.21name: my-nginx-zzzports:- containerPort: 80restartPolicy: Always
---
apiVersion: v1
kind: Service
metadata:labels:nanjing: my-zzzname: my-nginx-zzznamespace: my-zzz
spec:ports:- port: 80protocol: TCPtargetPort: 80selector:nanjing: my-zzztype: NodePort

4.3生成資源

kubectl apply -f /opt/pod-yaml

使用kubectl命令將配置文件中定義的資源應用到你的Kubernetes集群中。請確保在運行該命令之前,你已經正確配置了kubectl,并且具有足夠的權限來執行該操作。

kubectl get pods,svc -n my-zzz -owide

4.4訪問測試

?kubectl exec -it my-nginx-zzz -n my-zzz bashecho "welcome to nanjing" > /usr/share/nginx/html/index.html

五、yaml介紹

5.1語法格式

  • 通過縮進表示層級關系
  • 不能使用Tab進行縮進,只能使用空格縮進(一般縮進兩個空格)
  • 字符后縮進一個空格,比如" : "、" , "等
  • 使用" --- "表示新的yaml文件的開頭
  • 使用" # "表示注釋

5.2YAML文件組成部分

在Kubernetes中,控制器的定義是通過YAML文件完成的,該文件描述了資源的預期狀態,這包括控制器的類型(如Deployment、StatefulSet、Service數量,使用的容器鏡像,以及任何配置參數或環境變量)

5.3常用字段含義

每一個控制器通常對應一種資源類型,如Deployment、Service等等,在YAML中,我們可以指定這些資源的狀態以及如何管理它們

Deployment控制器在YAML文件中的定義可能包括:

  • Metadata:例如控制器的名稱和命名空間
  • Spec:例如應用的副本數量,以及圖像的URL
  • Selector:例如確定哪些Pods應由該控制器管理的標簽
  • Template:例如Pod的基本設計

5.4如何快速編寫YAML文件

  • 使用kubectl create命令直接生成yaml文件并導出
  • 使用kubectl get命令在已有資源導出yaml文件
  • 官網或者其他網站,下載yaml模板修改并導出


?

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

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

相關文章

CSS3特殊屬性

特殊屬性 will-change will-change 屬性用于向瀏覽器提供提示,表明某個元素或其特定屬性在未來極有可能發生變化。這有助于瀏覽器提前優化相關渲染流程,提升動畫或其他動態效果的性能。 element {will-change: auto | <animateable-feature> [, <animateable-feat…

C++系列-C/C++內存管理方式

&#x1f308;個人主頁&#xff1a;羽晨同學 &#x1f4ab;個人格言:“成為自己未來的主人~” C/C內存分布 在這篇文章開始之前&#xff0c;我們先以一道題目來進行引入&#xff1a; int glovalvar 1; static int staticGlovalvar 1; void Test() {static int staticva…

Java進階學習筆記27——StringBuilder、StringBuffer

StringBuilder&#xff1a; StringBuilder代表可變字符串對象&#xff0c;相當于一個容器&#xff0c;它里面裝的字符串是可以改變的&#xff0c;就是用來操作字符串的。 好處&#xff1a; StringBuilder比String更適合做字符串的修改操作&#xff0c;效率會更高&#xff0c;…

在CSDN上成長的感悟,你的粉絲長啥樣?

文章目錄 一、寫作的初衷1. 記錄所學內容2.鞏固所學知識3.分享與幫助4.方便后續查找5.獲取激勵 二、你的粉絲長啥樣&#xff1f;1. 粉絲的特點與困惑2. 關于粉絲&#xff0c;細思極恐 三、繼續前行、堅持初心 在CSDN上寫博文&#xff0c;對于我來說&#xff0c;不僅僅是一個記錄…

OTA在線旅行社系統架構:連接世界的科技紐帶

隨著互聯網的快速發展和人們對旅行需求的不斷增長&#xff0c;OTA&#xff08;Online Travel Agency&#xff09;在線旅行社成為了現代旅行業中的重要一環。OTA系統架構的設計和實現將對旅行行業產生深遠影響。本文將探討OTA在線旅行社系統架構的重要性和關鍵組成部分&#xff…

異構圖上的連接預測一

這里寫目錄標題 異構圖&#xff1f;處理數據&#xff1a; 異構圖&#xff1f; 異構圖&#xff1a;就是指節點與邊類型不同的圖。 連接預測&#xff1a;目的是預測圖中兩個節點之間是否存在一條邊&#xff0c;或者是預測兩個節點之間&#xff0c;在未來可能形成的連接。 eg&…

Linux系統如何通過編譯方式安裝python3.11.3

1.切換到/data 目錄 cd /data 2.下載python源碼Python-3.11.3.tgz wget https://www.python.org/ftp/python/3.11.3/Python-3.11.3.tgz tar -xzf Python-3.11.0.tgz cd Python-3.11.3 3.配置python的安裝路徑 和 執行openssl的路徑 ./configure --prefix/usr/local/pyth…

Java筑基(三)

Java筑基&#xff08;三&#xff09; 一、final概念1、案例1&#xff1a;采用繼承&#xff1a;2、案例2&#xff1a;final修飾的類不可以被繼承&#xff1a;3、案例3&#xff1a;final修飾的類不能有子類&#xff0c;但是可以有父類4、final修飾構造方法5、final修飾普通方法6、…

頭歌GCC編程工具集第1關:實驗工具GCC與objdump的使用

任務要求 根據提示&#xff0c;在右側編輯器中顯示的bytes.c文件中的 Begin-End 之間補充代碼&#xff08;即設置一個數組的初始值&#xff09;&#xff0c;使其與如下顯示的main.c文件一起編譯、生成的程序在運行時輸出“SUCCESS”。 程序源文件main.c的內容如下&#xff08;務…

牛客前端面試高頻八股總結(1)(附文檔)

1.html語義化 要求使用具有語義的標簽&#xff1a;header footer article aside section nav 三點好處&#xff1a; &#xff08;1&#xff09;提高代碼可讀性&#xff0c;頁面內容結構化&#xff0c;更清晰 &#xff08;2&#xff09;無css時&#xff0c;時頁面呈現出良好…

滲透工具CobaltStrike工具的下載和安裝

一、CobalStrike簡介 Cobalt Strike(簡稱為CS)是一款基于java的滲透測試工具&#xff0c;專業的團隊作戰的滲透測試工具。CS使用了C/S架構&#xff0c;它分為客戶端(Client)和服務端(Server)&#xff0c;服務端只要一個&#xff0c;客戶端可有多個&#xff0c;多人連接服務端后…

Golang設計模式(四):觀察者模式

觀察者模式 什么是觀察者 觀察者模式(Observer Pattern)&#xff1a;定義對象之間的一種一對多依賴關系&#xff0c;使得每當一個對象狀態發生改變時&#xff0c;其相關依賴對象皆得到通知并被自動更新。觀察者模式的別名包括發布-訂閱&#xff08;Publish/Subscribe&#xf…

音視頻開發8 音視頻中SDL的使用,SDL 在windows上環境搭建,SDL 使用 以及 常用 API說明,show YUV and play PCM

1.SDL簡介 SDL&#xff08;Simple DirectMedia Layer&#xff09;&#xff0c;是一個跨平臺的C語言多媒體開發庫。 支持Windows、Mac OS X、Linux、iOS、Android 提供對音頻、鍵盤、鼠標、游戲操縱桿、圖形硬件的底層訪問 很多的視頻播放軟件、模擬器、受歡迎的游戲都在使用…

面試中算法(A星尋路算法)

一、問題需求&#xff1a; 迷宮尋路游戲中&#xff0c;有一些小怪物要攻擊主角&#xff0c;現在希望你給這些小怪物加上聰 明的AI (Artificial Intelligence&#xff0c;人工智能&#xff09;&#xff0c;讓它們可以自動繞過迷宮中的障礙物&#xff0c;尋找到主角的所在。 A星…

json web token及JWT學習與探索

JSON Web Token&#xff08;縮寫 JWT&#xff09;是目前最流行的跨域認證解決方案 作用&#xff1a; 主要是做鑒權用的登錄之后存儲用戶信息 生成得token(令牌)如下 eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwiaWF0IjoxNjg3Njc0NDkyLCJleHAiOjE2ODc3NjA4OTJ9.Y6eFG…

Django使用fetch實現登錄

Django使用session管理&#xff08;cookie&#xff09;實現了一個用戶登錄和會話保持功能。如果需求不太復雜可以使用Django默認的登錄功能。 1 安裝django-cors-headers 首先需要安裝django-cors-headers pip install django-cors-headers2 在settings中配置 需要按照djan…

用Dockerfile和Shell腳本來部署一個Go項目

如何使用Dockerfile和Shell腳本來部署一個Go項目。這種方法能夠幫助我們自動化構建、測試和部署流程&#xff0c;提高開發效率。 **一、項目結構和代碼** 首先&#xff0c;我們需要準備一個Go項目。假設我們的項目結構如下&#xff1a; my-go-app/ ├── main.go ├── D…

1107 老鼠愛大米

solution 記錄每組的最大值&#xff0c;并比較組間的最大值胖胖鼠~ #include<iostream> using namespace std; int main(){int n, m, ans, fat -1, x;scanf("%d%d", &n, &m);for(int i 0; i < n; i){ans -1;for(int j 0; j < m; j){scanf(…

【C/C++】Makefile文件的介紹與基本用法

創作不易&#xff0c;本篇文章如果幫助到了你&#xff0c;還請點贊 關注支持一下?>&#x16966;<)!! 主頁專欄有更多知識&#xff0c;如有疑問歡迎大家指正討論&#xff0c;共同進步&#xff01; &#x1f525;c系列專欄&#xff1a;C/C零基礎到精通 &#x1f525; 給大…

第三周:從錯誤中認識到管理

1. 約定兩周時間&#xff0c;完成這個功能 在管理者分配好項目任務后&#xff0c;只是口頭約定兩周的時間&#xff0c;沒有形成需求文檔。對于需求&#xff0c;人與人的理解是不一樣的&#xff0c;有些太過于抽象的東西&#xff0c;太難以描繪&#xff0c;只能一而再再而三的確…