目錄
一、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模板修改并導出
?