目錄
一、k8s集群資源管理方式分類
1.1陳述式資源管理方式:增刪查比較方便,但是改非常不方便
1.2聲明式資源管理方式:yaml文件管理
二、陳述式資源管理方法
2.1查看版本信息
2.2查看資源對象簡寫
2.3配置kubectl自動補全
2.4node節點查看日志
三、基本信息查看
3.1查看 master 節點狀態
3.2查看命名空間
3.3查看default命名空間的所有資源
3.4創建命名空間
3.5刪除命名空間
3.6在命名空間kube-public 創建副本控制器(deployment)來啟動Pod(nginx-aa)
3.6.1用于創建deployment 控制器管理的pod
3.6.2run:用于創建一個自主式/靜態 Pod
3.7描述某個資源的詳細信息
3.8查看命名空間kube-public 中的pod 信息
3.9kubectl exec可以跨主機登錄容器,docker exec 只能在容器所在主機上登錄
3.10刪除(重啟)pod資源,由于存在deployment/rc之類的副本控制器,刪除pod也會重新拉起來
3.11擴縮容
3.11.1擴容
3.11.2縮容
3.12刪除副本控制器
3.13查看標簽
四、項目的生命周期
4.1創建? ? kubectl create命令
4.2發布? ? kubectl expose命令
4.2.1?Kubernetes 之所以需要 Service
4.2.2service 的 type 類型
4.2.3端口類型
4.2.3.1port
4.2.3.2nodePort
4.2.3.3targetPort
4.2.3.4containerPort
4.3更新?? ?kubectl set命令
4.4回滾?? ?kubectl rollout命令
4.5刪除? ? kubectl delete命令
五、金絲雀發布(Canary Release)
5.1金絲雀發布介紹
5.2金絲雀發布圖解
5.3金絲雀發布部署
5.4金絲雀發布優缺點
5.4.1金絲雀發布的優點
5.4.2金絲雀發布的缺點
5.5寫累了吧淺休息下
六、詳解service資源
6.1service的端口分類
6.2service的四大基礎類型
6.3查看service關聯的端點的方式
一、k8s集群資源管理方式分類
1.1陳述式資源管理方式:增刪查比較方便,但是改非常不方便
使用一條kubectl命令和參數選項來實現資源對象管理操作
即通過命令的方式來實現對資源的管理
1.2聲明式資源管理方式:yaml文件管理
使用yaml配置文件或者json配置文件來定義配置,實現資源對象的管理操作
二、陳述式資源管理方法
- kubernetes 集群管理集群資源的唯一入口是通過相應的方法調用 apiserver 的接口
- kubectl 是官方的CLI命令行工具,用于與 apiserver 進行通信,將用戶在命令行輸入的命令,組織并轉化為 apiserver 能識別的信息,進而實現管理 k8s 各種資源的一種有效途徑
- kubectl 的命令大全? ??kubectl --help
- k8s中的文檔:http://docs.kubernetes.org.cn/683.html
- 對資源的增、刪、查操作比較方便,但對改的操作就不容易了
#查看版本信息
kubectl version#查看資源對象簡寫
kubectl api-resources#查看集群信息?
kubectl cluster-info#配置kubectl自動補全 只是當前生效,永久生效加入 ~/.bashrc中
source <(kubectl completion bash)#node節點查看日志
journalctl -u kubelet -f
2.1查看版本信息
kubectl version
2.2查看資源對象簡寫
kubectl api-resources
2.3配置kubectl自動補全
source <(kubectl completion bash)
2.4node節點查看日志
journalctl -u kubelet -f
三、基本信息查看
kubectl get <resource> [-o wide|json|yaml] [-n namespace]
獲取資源的相關信息,-n 指定命令空間,-o 指定輸出格式
resource可以是具體資源名稱,如pod nginx-xxx;也可以是資源類型,如pod;或者all(僅展示幾種核心資源,并不完整)
--all-namespaces 或 -A :表示顯示所有命令空間,
--show-labels :顯示所有標簽
-l app :僅顯示標簽為app的資源
-l app=nginx :僅顯示包含app標簽,且值為nginx的資源//查看 master 節點狀態
kubectl get componentstatuses
kubectl get cs//查看命令空間
kubectl get namespace
kubectl get ns
//命令空間的作用:用于允許不同 命令空間 的 相同類型 的資源 重名的//查看default命名空間的所有資源
kubectl get all [-n default]//創建命名空間app
kubectl create ns app
kubectl get ns//刪除命名空間app
kubectl delete namespace app
kubectl get ns //在命名空間kube-public 創建副本控制器(deployment)來啟動Pod(nginx-wl)
kubectl create deployment nginx-wl --image=nginx -n kube-public //描述某個資源的詳細信息
kubectl describe deployment nginx-wl -n kube-public
kubectl describe pod nginx-wl-d47f99cb6-hv6gz -n kube-public//查看命名空間kube-public 中的pod 信息
kubectl get pods -n kube-public
NAME READY STATUS RESTARTS AGE
nginx-wl-d47f99cb6-hv6gz 1/1 Running 0 24m//kubectl exec可以跨主機登錄容器,docker exec 只能在容器所在主機上登錄
kubectl exec -it nginx-wl-d47f99cb6-hv6gz bash -n kube-public//刪除(重啟)pod資源,由于存在deployment/rc之類的副本控制器,刪除pod也會重新拉起來
kubectl delete pod nginx-wl-d47f99cb6-hv6gz -n kube-public//若pod無法刪除,總是處于terminate狀態,則要強行刪除pod
kubectl delete pod <pod-name> -n <namespace> --force --grace-period=0
#grace-period表示過渡存活期,默認30s,在刪除pod之前允許POD慢慢終止其上的容器進程,從而優雅退出,0表示立即終止pod//擴縮容
kubectl scale deployment nginx-wl --replicas=2 -n kube-public # 擴容
kubectl scale deployment nginx-wl --replicas=1 -n kube-public # 縮容//刪除副本控制器
kubectl delete deployment nginx-wl -n kube-public
kubectl delete deployment/nginx-wl -n kube-public
3.1查看 master 節點狀態
kubectl get componentstatuses
kubectl get cs
3.2查看命名空間
kubectl get namespace
kubectl get ns
命名空間的作用:用于允許不同 命名空間 的 相同類型 的資源 可以重名
獲取所有命名空間中的 Pod 列表
kubectl get pod --all-namespaces kubectl get pod -A#獲取所有命名空間中的 Pod 列表
3.3查看default命名空間的所有資源
kubectl get all [-n default]#這個命令 kubectl get all -n default 用于獲取命名空間為 default 的所有資源,包括 Pod、Service、Deployment 等。具體來說,該命令包含以下部分:
kubectl:Kubernetes 命令行工具,用于與 Kubernetes 集群進行交互。
get all:表示要獲取指定命名空間中的所有資源,包括 Pod、Service、Deployment 等。
-n default:指定要獲取資源的命名空間為 default
3.4創建命名空間
kubectl create ns hah
kubectl get ns
同一命名空間不能有相同的名字,不同命名空間可以有相同的名字
3.5刪除命名空間
kubectl delete namespaces hah
kubectl get ns
可以刪除,但是如果這個命名空間下面有資源,資源就都會被刪除,再三考慮哦
3.6在命名空間kube-public 創建副本控制器(deployment)來啟動Pod(nginx-aa)
kubectl create deployment nginx-aa --image=nginx -n kube-public#這個命令 kubectl create deployment nginx-aa --image=nginx -n kube-public 用于在命名空間 kube-public 中創建一個名為 nginx-aa 的 Deployment,并使用 nginx 鏡像作為 Deployment 中的容器。kubectl:Kubernetes 命令行工具,用于與 Kubernetes 集群進行交互。
create deployment nginx-aa:創建一個名為 nginx-aa 的 Deployment。
--image=nginx:指定 Deployment 中要使用的容器鏡像為 nginx。
-n kube-public:指定要將 Deployment 創建在 kube-public 命名空間中。
kubectl create <pod控制器名> <pod名稱> --image=鏡像名
? ? ? ? ? ? ? ? ? ? ? ? ? Deployment:無狀態應用部署
? ? ? ? ? ? ? ? ? ? ? ? ? Statefulset:有狀態應用部署
? ? ? ? ? ? ? ? ? ? ? ? ? Replicaset:副本數量控制器
? ? ? ? ? ? ? ? ? ? ? ? ? Daemonset:確保所有節點運行同一類 Pod
? ? ? ? ? ? ? ? ? ? ? ? ? Cronjob:計劃性任務
示例二:
用kubectl create 創建
3.6.1用于創建deployment 控制器管理的pod
?用run直接創建
3.6.2run:用于創建一個自主式/靜態 Pod
3.7描述某個資源的詳細信息
kubectl describe deployment nginx-aa -n kube-publickubectl describe pod nginx-aa-66b8d4497f-cdj44 -n kube-public
3.8查看命名空間kube-public 中的pod 信息
kubectl get pods -n kube-public
3.9kubectl exec可以跨主機登錄容器,docker exec 只能在容器所在主機上登錄
kubectl exec -it nginx-aa-66b8d4497f-cdj44 bash -n kube-public
示例二:
kubectl get pods -n kube-public -owide#用于獲取在 kube-public 命名空間中運行的所有 Pods 的詳細信息,包括它們的名稱、狀態、IP 地址等。 -n kube-public 參數指定了命名空間為 kube-public,而 -owide 參數指定了輸出的格式為 wide,這樣可以顯示更多的列。#將會列出在 kube-public 命名空間中運行的所有 Pods,并顯示它們的詳細信息。
3.10刪除(重啟)pod資源,由于存在deployment/rc之類的副本控制器,刪除pod也會重新拉起來
kubectl delete pod nginx-aa-66b8d4497f-cdj44 -n kube-public
若pod無法刪除,總是處于terminate狀態,則要強行刪除pod
kubectl delete pod <pod-name> -n <namespace> --force --grace-period=0
#grace-period表示過渡存活期,默認30s,在刪除pod之前允許POD慢慢終止其上的容器進程,從而優雅退出,0表示立即終止pod
3.11擴縮容
?kubectl scale deployment nginx-bb --replicas=5 -n kube-public? ?# 擴容kubectl scale deployment nginx-bb --replicas=2 -n kube-public ?# 縮容kubectl scale pod控制器類型 資源名稱 --replicas=副本數 -n 命名空間
##副本數決定擴容還是縮容
3.11.1擴容
3.11.2縮容
3.12刪除副本控制器
kubectl delete deployment nginx-bb -n kube-public
kubectl delete deployment/nginx-aa -n kube-public
3.13查看標簽
kubectl get pod --show-labels #查看所有資源的標簽
kubectl get pod -l app #指定標簽的鍵查看,只顯示標簽為app的資源
kubectl get pod -l app -A
kubectl get pod -l app=nginx-deployment #顯示包含app標簽且值為nginx的資源
kubectl get pod -l app=nginx-deployment
四、項目的生命周期
項目的生命周期:創建-->發布-->更新-->回滾-->刪除
4.1創建? ? kubectl create命令
- 創建并運行一個或多個容器鏡像。
- 創建一個deployment 或job 來管理容器。
kubectl create --help
kubectl -n 命名空間 create deployment 資源名稱 --image=鏡像 --port=容器的端口 --
replicas=副本數
?
啟動 nginx 實例,暴露容器端口 80,設置副本數 3
kubectl create deployment nginx --image=nginx:1.14 --port=80 --replicas=3kubectl -n 命名空間 create deployment 資源名稱 --image=鏡像 --port=容器的端口 --replicas=副本數kubectl get pods
kubectl get all
可以指定命名空間,也可不指定,此處指定命名空間為test
查看命名空間,剛才創建的nginx=test有3個副本
4.2發布? ? kubectl expose命令
- 將資源暴露為新的 Service
- kubectl expose --help
kubectl expose deployment 控制器名稱 --name=服務名稱?--port=服務端口 --target-port=pod端口
為deployment的nginx創建service,并通過Service的80端口轉發至容器的80端口上,Service的名稱為nginx-service,類型為NodePort
kubectl expose deployment nginx --port=80 --target-port=80 --name=nginx-service --type=NodePort
示例:
kubectl expose deployment nginx-test --port=8082 --target-port=80 --name=nginx-svc --type=NodePort -n test#用于在 test 命名空間中,為名為 nginx-test 的 Deployment 創建一個 Service,并將其暴露為 NodePort 類型的服務。具體來說,該命令包含以下部分:kubectl:Kubernetes 命令行工具,用于與 Kubernetes 集群進行交互。
expose deployment nginx-test:為名為 nginx-test 的 Deployment 創建一個 Service。
--port=8082:指定 Service 使用的端口為 8082。
--target-port=80:指定 Service 要將流量轉發到 Deployment 中的容器的端口 80。
--name=nginx-svc:指定 Service 的名稱為 nginx-svc。
--type=NodePort:指定 Service 的類型為 NodePort,這將在每個節點上隨機選擇一個端口,并將該端口映射到 Service 的目標端口上。
-n test:指定 Service 創建在 test 命名空間中。
通過執行這個命令,您為名為 nginx-test 的 Deployment 創建了一個 NodePort 類型的 Service,并將其暴露在節點的隨機端口上,從而允許外部流量訪問該服務
8082這個端口是隨意定的哦
使用node的IP地址進行檢測,node是運行服務的、master是用來管理的
瀏覽器檢測
xhell也可以直接檢測
---------------------------------------------------------------------------------------------------------------------------------
4.2.1?Kubernetes 之所以需要 Service
Kubernetes 之所以需要 Service,一方面是因為 Pod 的 IP 不是固定的(Pod可能會重建),另一方面則是因為一組 Pod 實例之間總會有負載均衡的需求。
Service 通過 Label Selector 實現的對一組的 Pod 的訪問。
對于容器應用而言,Kubernetes 提供了基于 VIP(虛擬IP) 的網橋的方式訪問 Service,再由 Service 重定向到相應的 Pod。
4.2.2service 的 type 類型
- ClusterIP:提供一個集群內部的虛擬IP以供Pod訪問(service默認類型)
- NodePort:在每個Node上打開一個端口以供外部訪問,Kubernetes將會在每個Node上打開一個端口并且每個Node的端口都是一樣的,通過 NodeIp:NodePort 的方式Kubernetes集群外部的程序可以訪問Service。
每個端口只能是一種服務,端口范圍只能是 30000-32767。
- LoadBalancer:通過設置LoadBalancer映射到云服務商提供的LoadBalancer地址。這種用法僅用于在公有云服務提供商的云平臺上設置Service的場景。通過外部的負載均衡器來訪問,通常在云平臺部署LoadBalancer還需要額外的費用。
在service提交后,Kubernetes就會調用CloudProvider在公有云上為你創建一個負載均衡服務,并且把被代理的Pod的IP地址配置給負載均衡服務做后端。
- externalName:將service名稱映射到一個DNS域名上,相當于DNS服務的CNAME記錄,用于讓Pod去訪問集群外部的資源,它本身沒有綁定任何的資源。 tgc.benet.com ? www.benet.com?
headless clusterIP ?無頭模式 ? 名稱
- 是Kubernetes中一種特殊類型的服務,它不會為服務創建ClusterIP,而是直接將DNS解析指向服務的每個Pod的IP地址。這種模式適用于需要直接與每個Pod進行通信的場景,而不需要負載均衡或代理。
4.2.3端口類型
4.2.3.1port
port 是 k8s 集群內部訪問service的端口,即通過 clusterIP: port 可以從 Pod 所在的 Node 上訪問到 service(四層)
4.2.3.2nodePort
nodePort 是外部訪問 k8s 集群中 service 的端口,通過 nodeIP: nodePort 可以從外部訪問到某個 service。
4.2.3.3targetPort
targetPort 是 Pod 的端口,從 port 或 nodePort 來的流量經過 kube-proxy 反向代理負載均衡轉發到后端 Pod 的 targetPort 上,最后進入容器。
4.2.3.4containerPort
containerPort 是 Pod 內部容器的端口,targetPort 映射到 containerPort。
port: 為service 在 cluster Ip 暴露的端口
targetport: 對應容器映射在pod 上的端口
nodeport:可以通過k8s集群外部使用的 NodeIp +Nodeport 訪問servicecontainerPort: 容器內部進程使用的端口
k8s集群內部 客戶端 ---> clusterip:port ---->? 通過targetport ----> pod:ip containerport
k8s集群外部?客戶端 ---> nodeip:nodeport ---->? 通過targetport ----> pod:ip containerport
查看pod網絡狀態詳細信息和 Service暴露的端口
kubectl get pods,svc -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE
pod/nginx-cdb6b5b95-fjm2x 1/1 Running 0 44s 172.17.26.3 192.168.80.11 <none>
pod/nginx-cdb6b5b95-g28wz 1/1 Running 0 44s 172.17.36.3 192.168.80.12 <none>
pod/nginx-cdb6b5b95-x4m24 1/1 Running 0 44s 172.17.36.2 192.168.80.12 <none>NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
service/kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 14d <none>
service/nginx-service NodePort 10.0.0.189 <none> 80:44847/TCP 18s run=nginx//查看關聯后端的節點
kubectl get endpoints//查看 service 的描述信息
kubectl describe svc nginx//在 node01 節點上操作,查看負載均衡端口
yum install ipvsadm -y
ipvsadm -Ln
//外部訪問的IP和端口
TCP 192.168.80.11:44847 rr-> 172.17.26.3:80 Masq 1 0 0 -> 172.17.36.2:80 Masq 1 0 0 -> 172.17.36.3:80 Masq 1 0 0
//pod集群組內部訪問的IP和端口
TCP 10.0.0.189:80 rr-> 172.17.26.3:80 Masq 1 0 0 -> 172.17.36.2:80 Masq 1 0 0 -> 172.17.36.3:80 Masq 1 0 0 //在 node02 節點上操作,同樣方式查看負載均衡端口
yum install ipvsadm -y
ipvsadm -Ln
TCP 192.168.80.12:44847 rr-> 172.17.26.3:80 Masq 1 0 0 -> 172.17.36.2:80 Masq 1 0 0 -> 172.17.36.3:80 Masq 1 0 0 TCP 10.0.0.189:80 rr-> 172.17.26.3:80 Masq 1 0 0 -> 172.17.36.2:80 Masq 1 0 0 -> 172.17.36.3:80 Masq 1 0 0 curl 10.0.0.189
curl 192.168.80.11:44847
//在master01操作 查看訪問日志
kubectl logs nginx-cdb6b5b95-fjm2x
kubectl logs nginx-cdb6b5b95-g28wz
kubectl logs nginx-cdb6b5b95-x4m24
---------------------------------------------------------------------------------------------------------------------------------
查看pod網絡狀態詳細信息和 Service暴露的端口
[root@master01 ~]#kubectl get pods,svc -o wide -n test
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/nginx-test-7b97cf7f78-dztsx 1/1 Running 0 13m 10.244.1.60 node01 <none> <none>
pod/nginx-test-7b97cf7f78-rg7bx 1/1 Running 0 40m 10.244.1.54 node01 <none> <none>
pod/nginx-test-7b97cf7f78-sx9q5 1/1 Running 0 40m 10.244.1.56 node01 <none> <none>NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
service/nginx-svc NodePort 10.96.253.185 <none> 8082:31385/TCP 86m app=nginx-test#查看關聯后端的節點
kubectl get endpoints#查看 service 的描述信息
kubectl describe svc nginx#在 node 節點上操作,查看負載均衡端口
yum install ipvsadm -y
ipvsadm -Ln
查看pod網絡狀態詳細信息和 Service暴露的端口
kubectl get pods,svc -o wide -n test
?查看關聯后端的節點
kubectl get endpointskubectl get endpoints nginx-zzz #進行查看#用于獲取當前 Kubernetes 集群中所有 Service 的端點信息。端點是 Service 后面的實際 Pod 的 IP 地址和端口。#查看 service 的描述信息
kubectl describe svc nginx?kubectl describe svc nginx-zzz
在 node01 節點上操作,查看負載均衡端口
??
? 在 node02 節點上操作,同樣方式查看負載均衡端口
4.3更新?? ?kubectl set命令
- 更改現有應用資源一些信息。
kubectl set --help
#查看當前 nginx 的版本號
curl -I http://192.168.246.11:31385
curl -I http://192.168.246.12:31385#將nginx 版本更新為 1.18 版本
kubectl set image deployment/nginx nginx=nginx:1.18#處于動態監聽 pod 狀態,由于使用的是滾動更新方式,所以會先生成一個新的pod,然后刪除一個舊的pod,往后依次類推
kubectl get pods -w#再看更新好后的 Pod 的 ip 會改變
kubectl get pods -o wide#再看 nginx 的版本號
curl -I http://192.168.246.11:31385
curl -I http://192.168.246.12:31385
查看當前 nginx 的版本號
?#查看當前 nginx 的版本號
curl -I http://192.168.246.11:31385 #node的ip地址
curl -I http://192.168.246.12:31385
將nginx 版本更新為 1.18版本
kubectl set image deployment/nginx-test nginx=nginx:1.18 -n test
處于動態監聽 pod 狀態,由于使用的是滾動更新方式,所以會先生成一個新的pod,然后刪除一個舊的pod,往后依次類推
kubectl get pods -w
#再看更新好后的 Pod 的 ip 會改變
?kubectl get pods -o wide? kubectl get pods -o wide -n test #指定命名空間test?
#再看更新好后的 Pod 的 ip 會發生改變,如上圖
再看 nginx 的版本號
curl -I http://192.168.246.11:31385
curl -I http://192.168.246.12:31385
4.4回滾?? ?kubectl rollout命令
- 對資源進行回滾管理
- kubectl rollout --help
//查看歷史版本
kubectl rollout history deployment/nginx?//執行回滾到上一個版本
kubectl rollout undo deployment/nginx//執行回滾到指定版本
kubectl rollout undo deployment/nginx --to-revision=1//檢查回滾狀態
kubectl rollout status deployment/nginx
查看歷史版本
kubectl -n test rollout history deployment/nginx-test
執行回滾到上一個版本
kubectl rollout undo deployment/nginx-test -n test
執行回滾到指定版本
?
?kubectl rollout undo deployment/nginx-test --to-revision=2 -n test
檢查回滾狀態
kubectl rollout status deployment/nginx-test -n test
4.5刪除? ? kubectl delete命令
//刪除副本控制器
kubectl delete deployment/nginx//刪除service
kubectl delete svc/nginx-servicekubectl get all
刪除副本控制器
#刪除控制器
?kubectl delete deployment/nginx-test -n test#刪除服務
kubectl delete svc nginx-svc -n test
kubectl delete service/nginx-svc -n test
生命周期: 創建、發布、更新、回滾、刪除
創建:? ?kubelet create? 資源類型? 資源名稱 --image=鏡像名稱? --port=端口? ?--replicas=
發布:kubelet? expose??資源類型? 資源名稱 --port= --targetport= type= clusterip或NodePort
更新:kubelet set image?資源類型? 資源名稱 容器名=鏡像名? 標簽版本
回滾:kubelet rollout undo?資源類型? 資源名稱? ? (默認是回滾到上一個版本)
? ? ? ? ? ?kubelet rollout history 或status??資源類型? 資源名稱 (查看回滾歷史記錄或者狀態)
刪除:kubelet delete?資源類型? 資源名稱
五、金絲雀發布(Canary Release)
5.1金絲雀發布介紹
Deployment控制器支持自定義控制更新過程中的滾動節奏,如“暫停(pause)”或“繼續(resume)”更新操作。比如等待第一批新的Pod資源創建完成后立即暫停更新過程,此時,僅存在一部分新版本的應用,主體部分還是舊的版本。然后,再篩選一小部分的用戶請求路由到新版本的Pod應用,繼續觀察能否穩定地按期望的方式運行。確定沒問題之后再繼續完成余下的Pod資源滾動更新,否則立即回滾更新操作。這就是所謂的金絲雀發布
金絲雀發布的思想則是將少量的請求引流到新版本上,因此部署新版本服務只需極小數的機器。驗證新版本符合預期后,逐步調整流量權重比例,使得流量慢慢從老版本遷移至新版本,期間可以根據設置的流量比例,對新版本服務進行擴容,同時對老版本服務進行縮容,使得底層資源得到最大化利用
5.2金絲雀發布圖解
如圖,某服務當前版本為 v1,現在新版本 v2 要上線。為確保流量在服務升級過程中平穩無損,采用金絲雀發布方案,逐步將流量從老版本遷移至新版本。
5.3金絲雀發布部署
創建deployment
因為我們剛剛刪除了,所有我們重新創建一個
?kubectl create deployment nginx-zzz --image=nginx:1.18 --port=80 --replicas=6 -n test
暴露服務?
kubectl expose deployment nginx-zzz --port=8083 --target-port=80 --name=nginx-service --type=NodePort -n test
查看更新之前的版本
(1)更新deployment的版本,并配置暫停deployment
?
kubectl set image deployment/nginx-zzz nginx=nginx:1.22 -n test && kubectl rollout pause deployment nginx-zzz -n testkubectl rollout status deployment nginx-zzz -n test #觀察更新狀態
再開一個xhell查看,訪問剛跟新的內容
(2)監控更新的過程,可以看到已經新增了一個資源,但是并未按照預期的狀態去刪除一個舊的資源,就是因為使用了pause暫停命令
kubectl get pods -w?-n test
檢測看看,既有1.22版本的nginx,也有1.18版本的nginx
(3)確保更新的pod沒問題了,繼續更新
kubectl rollout resume deployment/nginx-zzz -n test
(4)查看最后的更新情況
?kubectl get pods -w?-n test
更新成功,并且現在都是1.22版本的nginx服務了
結束
5.4金絲雀發布優缺點
5.4.1金絲雀發布的優點
- 按比例將流量無差別地導向新版本,新版本故障影響范圍小
- 發布期間逐步對新版本擴容,同時對老版本縮容,資源利用率高
5.4.2金絲雀發布的缺點
- 流量無差別地導向新版本,可能會影響重要用戶的體驗
- 發布周期長
5.5寫累了吧淺休息下
放松一下,感覺累了嗎?那就停下來歇一歇吧
看看它能不能負載均衡
給它縮容到3個副本,編寫方便一點,哈哈哈
編寫內容,方便查看是否能夠負載均衡
訪問ClusterIP測試是否能負載均衡
也可以去瀏覽器查看哦
六、詳解service資源
6.1service的端口分類
service端口
- port:service的clusterIP使用的端口,只能在K8S集群內部被訪問到。K8S集群內部的客戶端可以通過clusterIP:port來訪問service
- nodePort:NodePort類型的service使用的端口,會在每個node節點上都開啟相同的端口,也就是nodeIP使用的端口(默認范圍為30000~32767)。K8S集群外部或內部的客戶端都可以通過nodeIp:nodePort來訪問service
- targetPort:Pod容器使用的端口。service會將發送給port或nodePort的請求轉發給Pod容器,配置要與containerPort一致
Pod容器的端口
containerPort:創建Pod時所指定的容器端口
6.2service的四大基礎類型
- ClusterIP:默認的service資源的類型,可提供clusterIP:port供K8S集群內部訪問service及其關聯的Pod
- NodePort:會在每個node節點上都開啟相同的端口,K8S集群外部或內部的用戶都可以通過nodeIp:nodePort來訪問service及其關聯的Pod
- LoadBalancer:使用云負載設備和service作映射,外部用戶通過訪問云負載設備即可將請求轉發到K8S的node節點,再通過nodeIP:nodePort來訪問service及其關聯的Pod
- ExternalName:相當于給一個外部地址(域名或IP)作別名,K8S集群內的Pod可以通過這個service訪問相關的外部服務
- service 是通過 標簽選擇器 關聯Pod的標簽 來自動發現Pod的端點(podIP:containerPort)
6.3查看service關聯的端點的方式
查看service關聯的Pod端口
kubectl ?-n 命名空間 ?describe svc <資源名稱>
kubectl ? -n 命名空間 ?get endpoints [svc資源名稱]
kubectl ? -n 命名空間 ?describe endpoints <資源名稱>
大總結:
? # 獲取節點和服務版本信息kubectl get nodes# 獲取pod信息,默認是default名稱空間,并查看附加信息【如:pod的IP及在哪個節點運行】kubectl get pod -o wide# 獲取指定名稱空間的podkubectl get pod -n kube-system# 獲取所有名稱空間的podkubectl get pod -A # 查看pod的詳細信息,以yaml格式或json格式顯示kubectl get pods -o yamlkubectl get pods -o json# 查看pod的標簽信息kubectl get pod -A --show-labels # 根據Selector(label query)來查詢podkubectl get pod -A --selector="k8s-app=kube-dns"# 查看所有名稱空間的service信息kubectl get svc -A# 查看指定名稱空間的service信息kubectl get svc -n kube-system# 查看componentstatuses信息kubectl get cs# 查看所有configmaps信息kubectl get cm -A# 查看所有serviceaccounts信息kubectl get sa -A# 查看所有daemonsets信息kubectl get ds -A# 查看所有deployments信息kubectl get deploy -A# 查看所有replicasets信息kubectl get rs -A# 查看所有statefulsets信息kubectl get sts -A# 查看所有jobs信息kubectl get jobs -A# 查看所有ingresses信息kubectl get ing -A# 查看有哪些名稱空間kubectl get ns?