一、kubectl 基本命令
1、陳述式資源管理方法:
1、kubernetes集群管理集群資源的唯一入口是通過相應的方法調用apiserver的接口
2、kubectl 是官方的CLI命令行工具,用於與apiserver 進行通信,將用戶在命令行輸入的命令,組織並轉化為apiserver能識別的信息,進而實現管理k8s 各種資源的一種有效途徑
3.、kubectl 的命令大全
kubectl --help
k8s中文文檔: http://docs.kubernetes.org.cn/683.html
4、對資源的增、刪、查操作比較方便,但對改的操作就不容易了
//查看k8s版本信息
kubectl version
//查看資源對象簡寫
kubectl api-resources
//查看集群信息
[root@master ~]# kubectl cluster-info
//配置kubectl自動補全
source <(kubectl completion bash)
//node節點查看日志
journalctl -u kubectl -f
2、聲明式資源管理辦法
通過yaml資源配置清單文件在實現資源的管理
kubectl create/apply -f *.yaml
二、基本信息查看
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-test)
kubectl create deployment nginx-test --image=nginx -n kube-public
//描述某個資源的詳細信息
kubectl describe deployment nginx-test -n kube-public kubectl describe pod nginx-test -d47f99cb6-hv6gz -n kube-public
//查看命名空間kube-public中的pod信息
kubectl get pods -n kube-public
//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表示立即終u止pod
//擴縮容
kubectl scale deployment nginx-test --replicas=2 -n kube-public
#縮容
kubectl scale deployment nginx-test --replicas=1 -n kube-public
//刪除副本控制器(兩種表示方法)
kubectl delete deployment nginx-test -n kube-public kubectl delete deployment/nginx-test -n kube-public
三、項目的生命周期
生命周期:創建 —>> 發布 —>> 更新 —>> 回滾 —>> 刪除
1、創建kubectl run命令
●創建並運行一個或多個容器鏡像
●創建一個deployment或job來管理容器
kubectl run --help
//啟動nginx 實例,暴露容器端口80,設置副本數3
kubectl run nginx --image=nginx:1.14 --port=80 --replicas=3 kubectl get pods kubectl get all
2、發布kubectl expose命令
●將資源暴露為新的Service
kubectl expose --help //為deployment的nginx創建service, 並通過Service的80端口轉發至容器的80端口上,Service的名稱為nginx-service, 類型為NodePort
kubectl expose deployment nginx --port=80 --target-port=80 --name=nginx-service --type=NodePort
-----------------------------------------------
Kubernetes之所以需要Service, 一方面是因為Pod的IP 不是固定的(Pod可能會重建),另一-方面則是因為- -組Pod實例之間總會有負載均衡的需求。
Service通過label Selector實現的對一組的Pod的訪問。
對於容器應用而言,Kubernetes 提供了基於VIP (虛擬IP)的網橋的方式訪問 Service, 再由Service 重定向到相應的Pod。
service的類型:
●ClusterIP:提供一個集群內部的虛擬IP以供Pod訪問( service默認類型)
●NodePort:在每個Node.上打開一個端口以供外部訪問,Kubernetes將會在每個Node.上打開一個端口並且每個Node的端口都是一樣的,通過NodeIP:NodePort的方式Kubernetes集群外部的程序可以訪問Service。
注:每個端口只能是一種服務,端口范圍只能是30000-32767
●LoadBalancer:通過外部的負載均衡器來訪問,通常在雲平台部署LoadBalancer還需要額外的費用
-----------------------------------------------
//查看pod網絡狀態詳細信息和Service暴露的端口
kubectl get pods,svc -o wide
//查看關聯后端的節點
kubectl get endpoints
//查看service 的描述信息
kubectl describe svc nginx
//在node01 節點上操作,查看負載均衡端口
yum install ipvsadm -y ipvsadm -Ln
/外部訪問的IP和端口
TCP 192.168.80.11:44847 rr
//pod集群組內部訪問的IP和端口
TCP 10.0.0.189:80 rr
//在node02 節點上操作,同樣方式查看負載均衡端口
yum install ipvsadm -y ipvsadm -Ln TCP 192.168.29.70:31741 rr TCP 10.0.0.189:80 rr curl 10.0.0.189 curl 192.168.229.70:31741
//在master01操作 查看訪問日志
kubect1 logs nginx-cdb6b5b95-fjm2x kubectl logs nginx-cdb6b5b95-g28wz kubectl logs nginx-cdb6b5b95-x4m24
3、更新kubect1 set
●更改現有應用資源一些信息
kubectl set --help
//獲取修改模板
kubect1 set image --he1p Examp1es: # Set a deployment's nginx container image to 'nginx:1.9.1', and its busybox container image to 'busybox'.
kubectl set image deploynent/nginx busybox=busybox nginx=nginx:1.9.1
//查看當前nginx 的版本號
curl -I http://192.168.80.11:44847 curl -I http://192.168.80.12:44847
//將nginx 版本更新為1.15版本
kubect1 set image deployment/nginx nginx=nginx:1.15
//處於動態監聽pod狀態,由於使用的是滾動更新方式,所以會先生成--個新的pod,然后刪除--個舊的pod,往后依次類推
kubectl get pods -w
//再看更新好后的Pod的ip會改變
kubectl get pods -o wide
//再看nginx 的版本號
curl -I http://192.168.80.11:44847 curl -I http://192.168.80.12:44847
見上面的圖,已查看
4、回滾kubect1 rollout
●對資源進行回滾管理
kubect1 rollout --he1p
//查看歷史版本
kubectl rollout history deployment/nginx
//執行回滾到上一個版本
kubectl rollout undo deployment/nginx
//執行回滾到指定版本
kubectl rol1out undo deployment/nginx --to-revision=1
//檢查回滾狀態
kubectl rollout status deployment/nginx
5、刪除kubectl delete
//刪除副本控制器
kubectl delete deployment/nginx
//刪除service
kubectl delete svc/nginx-service kubectl get all
四、金絲雀發布(Canary Release)——陳述式管理方法
Deployment控制器支持自定義控制更新過程中的滾動節奏,如“暫停(pause)”或“繼續(resume)”更新操作。
比如等待第一批新的Pod資源創建完成后立即暫停更新過程,此時,僅存在一部分新版本的應用,主體部分還是舊的版本。然后,再篩選一小部分的用戶請求路由到新版本的Pod應用,繼續觀察能否穩定地按期望的方式運行。
確定沒問題之后再繼續完成余下的Pod資源滾動更新,否則立即回滾更新操作。這就是所謂的金絲雀發布。
(1)更新deployment的版本,並配置暫停deployment
kubectl set image deployment/nginx nginx=nginx:1.16 && kubectl rollout pause deployment/nginx kubectl rollout status deployment/nginx
#觀察更新狀態
(2)監控更新的過程,可以看到已經新增了一個資源,但是並未按照預期的狀態去刪除一個舊的資源, 就是因為使用了pause暫停命令
kubectl get pods -w curl [-I] 10.0.0.189 curl [-I] 192.168.80.11:44847
(3)確保更新的pod沒問題了,繼續更新
kubectl rollout resume deployment/nginx
(4)查看最后的更新情況
kubectl get pods -W curl [-I] 10.0.0.189 curl [-I] 192.168.80.11:44847
五、聲明式管理方法
1.適合於對資源的修改操作
2.聲明式資源管理方法依賴於資源配置清單文件對資源進行管理
資源配置清單文件有兩種格式: yaml (人性化,易讀),json (易於api接口解析)
3.對資源的管理,是通過事先定義在統–資源配置清單內,再通過陳述式命令應用到k8s集群里
4.語法格式: kubectl create/app1y/delete -f xxxx.yaml
kubectl create 和 kubectl apply區別
kubectl create -f xxx.yaml (不建議使用,無法更新,必須先delete) kubectl apply -f xxx.yaml (創建+更新,可以重復使用)
如果yaml文件中的kind值為deployment,那么上面這兩個命令都可以創建一個deployment,生成相應數量的pod
區別:
kubectl create:
(1)kubectl create命令,是先刪除所有現有的東西,重新根據yaml文件生成新的。所以要求yaml文件中的配置必須是完整的
(2)kubectl create命令,用同一個yaml 文件執行替換replace命令,將會不成功,fail掉。
kubectl apply:
kubectl apply命令,根據配置文件里面列出來的內容,升級現有的。所以yaml文件的內容可以只寫需要升級的屬性
//查看資源配置清單
kubectl get deployment nginx -o yaml
//解釋資源配置清單
kubectl explain deployment.metadata kubectl get service nginx -o yaml kubectl explain service.metadata
service是相同的方法查看,省略圖
//修改資源配置清單並應用
離線修改:
修改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