k8命令,pod的启动流程与资源文件书写,k8s集群调度
目錄
一.常用命令及kubect介紹
1.kubect介紹
1)語法格式:
2)命名空間的概述
3)查看命名空間
4)查看命名空間中的資源對象
2.查用排錯(cuò)命令
1)查詢資源文件
2)查看資源詳細(xì)信息(經(jīng)常用于排錯(cuò))
3)查看容器的日志信息
3.kubectl 命令與示例
二.kubectl容器管理
1.Pod與控制器
1)Deployment 資源控制器
2)POD是什么
2.POD的概述
1)POD的啟動(dòng)過程
2)POD生命周期
3.POD的啟動(dòng)狀態(tài)
4.POD特點(diǎn)
5.容器管理命令
1)進(jìn)入一個(gè)正在運(yùn)行的容器
6.其他資源控制器
三.資源文件的概述
1.資源對象文件的概述
2.YAMl語法概述
3.資源文件的管理命令
4.POD的資源文件書寫格式概述
??5.deploy資源控制器文件的書寫
6.標(biāo)簽和選擇器的書寫格式
三.集群的管理
1.集群擴(kuò)容
2.集群更新與回滾
1)查看控制器規(guī)則
2)deployment.spec.strategy支持兩種策略
3.集群調(diào)度
3)高級(jí)調(diào)度策略
一.常用命令及kubect介紹
1.kubect介紹
--Kubectl是用于控制Kubernetes集群的命令行工具
1)語法格式:
~]# kubectl [command] [TYPE] [NAME] [flagsJ command: # 子命令,如create, get, describe, delete type: ? ?# 資源類型,可以表示為單數(shù),復(fù)數(shù)或縮寫形式 name: ? ?# 資源的名稱,如果省略,則顯示所有資源信息 flags: ? # 指定可選標(biāo)志,或附加的參數(shù) ? # 查看所有類型 ~]# kubectl api-resources ? ## 示例 # 查詢節(jié)點(diǎn)狀態(tài) ~]# kubectl get node # 查詢主機(jī)信息 ~]# kubectl get node node1 -o wide # -o參數(shù)幫助 ~]# kubectl get node node1 -o wide --help .... [(-o|--output=)json|yaml|name|go-template|go-template-file|template|templatefile|jsonpath|jsonpath-as-json|jsonpath-file|custom-columns|custom-columns-file|wide] ..... # -o 指定以yaml格式顯示出來 ~]# kubectl get node node1 -o yaml # 查詢deployment資源名稱 ~]# kubectl get deployment # 查詢pod容器資源(默認(rèn)命名空間default) ~]# kubectl get pods # 指定查看pods的名稱空間 ~]# kubectl get pods -n kube-system2)命名空間的概述
k8s命名空間為對象名稱提供了一個(gè)作用域,我們可以把資源放到不同的命名空間中,這樣我們可以使用同名的資源名稱,只要保證同一命名空間中的資源名稱唯一即可
系統(tǒng)命名空間
--default默認(rèn)的命名空間,不聲明命名空間的POD都在這里
--kube-node-lease為高可用提供心跳監(jiān)視的命名空間
--kube-public公共數(shù)據(jù),所有用戶都可以讀取它
--kube-system 系統(tǒng)服務(wù)對象所使用的命名空間
3)查看命名空間
~]# kubectl get namespace4)查看命名空間中的資源對象
~]# kubectl -n kube-system get pod2.查用排錯(cuò)命令
1)查詢資源文件
# 格式 ~]# kubectl get [資源類型] [資源名稱] ? ## 示例 # 查看所有pod容器 ~]# kubectl get pods -A # 查看指定容器名稱空間內(nèi)的所有容器 ~]# kubectl get pods -n kube-system NAME ? ? ? ? ? ? ? ? ? ? ? ? ? ? READY ? STATUS ? RESTARTS ? ? ? AGE coredns-557689b88f-g9pwl ? ? ? ? 1/1 ? ? Running ? 1 (5h1m ago) ? 2d22h coredns-557689b88f-rj84r ? ? ? ? 1/1 ? ? Running ? 1 (5h1m ago) ? 2d22h ....... # 查看指定容器名稱空間內(nèi)的指定容器 ~]# kubectl get pods -n kube-system coredns-557689b88f-g9pwl # 查看指定容器名稱空間內(nèi)的指定容器信息 ~]# kubectl get pods -n kube-system coredns-557689b88f-g9pwl -o wide # 查看指定容器名稱空間內(nèi)的指定容器詳細(xì)信息以yaml格式顯示 ~]# kubectl get pods -n kube-system coredns-557689b88f-g9pwl -o yaml # 查看節(jié)點(diǎn)信息并顯示詳細(xì)信息以yaml格式顯示 ~]# kubectl get nodes -o yaml2)查看資源詳細(xì)信息(經(jīng)常用于排錯(cuò))
# 格式 ~]# kubectl describe [資源類型] [資源名稱] ? # 示例 ~]# kubectl describe pods -n kube-system kube-flannel-ds-jxwf53)查看容器的日志信息
-查看console終端的輸出信息
-為空是正常現(xiàn)象,表示沒有日志輸出
# 格式 ~]# kubectl logs [名稱空間] [容器名稱] ? # 示例 ~]# kubectl logs -n kube-system kube-flannel-ds-jxwf5排錯(cuò)流程,一般先get查看,然后再describe,最后再logs查看
3.kubectl 命令與示例
| kubectl run 資源名稱 -參數(shù) --image=鏡像名稱:標(biāo)簽 | 創(chuàng)建資源對象,常用參數(shù)-i交互,-t終端 |
| kubectl get 查詢資源 可選參數(shù) -o wide 顯示主機(jī)信息 | 常用查詢的資源 node|deployment|pod |
| kubectl exec -it 容器id 執(zhí)行的命令 | 同 docker exec 指令,進(jìn)入容器內(nèi) |
| kubectl describe 資源類型 資源名稱 | 查詢資源的詳細(xì)信息 |
| kubectl attach | 同 docker attach 指令,連接容器 |
| kubectl logs 容器id | 查看容器控制臺(tái)的標(biāo)準(zhǔn)輸出 |
| kubectl delete 資源類型 資源名稱 | 刪除指定的資源 |
| kubectl create|apply -f 資源文件 | 執(zhí)行指定的資源文件 |
命令示例
# 執(zhí)行指定的資源文件 ~]# kubectl apply -f kube-flannel.yml # 刪除指定資源文件(當(dāng)flannel注冊失敗容器報(bào)pending時(shí),可以用這種方法重啟) ~]# kubectl delete -f kube-flannel.yml # 查看 ~]# kubectl get pods -A NAMESPACE ? ? NAME ? ? ? ? ? ? ? ? ? ? ? ? ? ? READY ? STATUS ? RESTARTS ? ? AGE default ? ? ? testos ? ? ? ? ? ? ? ? ? ? ? ? ? 1/1 ? ? Running ? 2 (31m ago) ? 125m kube-system ? coredns-557689b88f-g9pwl ? ? ? ? 1/1 ? ? Running ? 1 (8h ago) ? 3d1h kube-system ? coredns-557689b88f-rj84r ? ? ? ? 1/1 ? ? Running ? 1 (8h ago) ? 3d1h kube-system ? etcd-master ? ? ? ? ? ? ? ? ? ? ?1/1 ? ? Running ? 3 (8h ago) ? 3d1h kube-system ? kube-apiserver-master ? ? ? ? ? ?1/1 ? ? Running ? 3 (8h ago) ? 3d1h kube-system ? kube-controller-manager-master ? 1/1 ? ? Running ? 3 (8h ago) ? 3d1h kube-system ? kube-proxy-flzrz ? ? ? ? ? ? ? ? 1/1 ? ? Running ? 2 (8h ago) ? 3d1h kube-system ? kube-proxy-sv5n8 ? ? ? ? ? ? ? ? 1/1 ? ? Running ? 0 ? ? ? ? ? ? 7h42m kube-system ? kube-proxy-tkctb ? ? ? ? ? ? ? ? 1/1 ? ? Running ? 0 ? ? ? ? ? ? 30h kube-system ? kube-scheduler-master ? ? ? ? ? ?1/1 ? ? Running ? 4 (8h ago) ? 3d1h ? ## get 查詢信息 # 查看節(jié)點(diǎn) ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION master Ready master 19h v1.17.6 node-0001 Ready <none> 16h v1.17.6 ? # 查看pod容器 ~]# kubectl get pod No resources found in default namespace. # 注:這里是因?yàn)間et pod不寫指定名稱空間,默認(rèn)找default ? # 查看所有名稱空間 ~]# kubectl get namespaces NAME ? ? ? ? ? ? STATUS ? AGE default ? ? ? ? ? Active ? 9h kube-node-lease ? Active ? 9h kube-public ? ? ? Active ? 9h kube-system ? ? ? Active ? 9h ? # 指定名稱空間查看pod容器 ~]# kubectl -n kube-system get pod NAME READY STATUS RESTARTS AGE kube-flannel-ds-amd64-hf2jp 1/1 Running 0 41m kube-flannel-ds-amd64-rtl4l 1/1 Running 0 41m ... ... ? # describe 查詢詳細(xì)信息 ~]# kubectl -n kube-system describe pod kube-flannel-ds-amd64-rtl4l Name: kube-proxy-4tbp6 Namespace: kube-system ... ... Events: ...... # 注:錯(cuò)誤信息主要找Events ? # 使用run啟動(dòng)容器 ~]# kubectl run testos -it --image=192.168.1.100:5000/myos:v1804 # 注釋: 命令 子命令 自己起的名字 交互式終端 指定鏡像=鏡像倉庫地址/鏡像名 If you don't see a command prompt, try pressing enter /]# exit ~]# kubectl get pods NAME ? ? READY ? STATUS ? RESTARTS ? ? AGE testos ? 1/1 ? ? Running ? 1 (5s ago) ? 3m28s ? # 啟動(dòng)服務(wù) ~]# kubectl run web-test --image=192.168.1.100:5000/myos:httpd ? kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead. deployment.apps/web-test created ? # 訪問節(jié)點(diǎn) ~]# kubectl get pod -o wide #詳細(xì)信息 NAME READY STATUS RESTARTS AGE IP testos-79778b4895-s8mxl 1/1 Running 1 6m33s 10.244.3.2 ... ... testweb--7bf98b9576-v566c 1/1 Running 0 4m24s 10.244.4.2 ... ... ? ~]# curl http://10.244.4.2/info.php <pre> Array ( [REMOTE_ADDR] => 10.244.0.0 [REQUEST_METHOD] => GET [HTTP_USER_AGENT] => curl/7.29.0 [REQUEST_URI] => /info.php ) php_host: web-test-7bf98b9576-v566c 1229 ? # 進(jìn)入容器 ~]# kubectl exec -it testos-79778b4895-s8mxl -- /bin/bash /]# ~]# kubectl attach -it testos-79778b4895-s8mxl /]# ? # 查看終端日志 ~]# kubectl logs web-test-7bf98b9576-v566c AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 10.244.4.2. Set the 'ServerName' directive globally to suppress this message ? # 刪除資源控制器,直接刪除POD會(huì)自動(dòng)重建 ~]# kubectl delete pod testos-79778b4895-s8mxl pod "testos-79778b4895-s8mxl" deleted ? ~]# kubectl delete deployments testos deployment.apps "testos" deleted二.kubectl容器管理
1.Pod與控制器
1)Deployment 資源控制器
Deployment 為 RS 提供滾動(dòng)更新
????????-ReplicaSet資源控制器(RS)
????????-ReplicaSet 創(chuàng)建管理POD
????????-ReplicaSet可以擴(kuò)容和縮容
????????-POD最小的管理單元
????????-POD負(fù)責(zé)啟動(dòng)和運(yùn)行容器
控制器架構(gòu)示例圖
# 查看一級(jí)控制器 ~]# kubectl get deployments.apps NAME ? ? ? ? ? ? ? ? ? ? READY ? STATUS ? RESTARTS ? ? ? AGE testos ? 1/1 ? ? Running ? 1 (6m57s ago) ? 10m ? # 查看二級(jí)控制器 ~]# kubectl get replicasets.apps NAME ? ? ? ? ? ? ? ? ? ? READY ? STATUS ? RESTARTS ? ? ? AGE testos-79778b4895 ? 1/1 ? ? Running ? 1 (6m57s ago) ? 10m ? # 查看三級(jí)控制器 ~]# kubectl get pods NAME ? ? ? ? ? ? ? ? ? ? READY ? STATUS ? RESTARTS ? ? ? AGE testos-79778b4895-s8mxl ? 1/1 ? ? Running ? 1 (6m57s ago) ? 10m ?# 注:二級(jí),三級(jí)等一下控制器都是自動(dòng)生成的,而一級(jí)控制器是自己創(chuàng)建的(必須手定義)
2)POD是什么?
-
POD是Kubernetes中最小的管理元素
-
一個(gè)pod 可以理解為多個(gè)linux命名空間的聯(lián)合
同一個(gè)Pod共享進(jìn)程(PID)
同一個(gè)Pod共享網(wǎng)絡(luò)IP及權(quán)限(NETWORK)
同一個(gè)Pod共享IPC通信信號(hào)(IPC)
同一個(gè)Pod共享主機(jī)名(UTS)
-
包涵1個(gè)或多個(gè)容器 例如:共享網(wǎng)絡(luò)、共享存儲(chǔ)等
理解POD對掌握kubernetes非常重要
Pod支持橫向擴(kuò)展和復(fù)制
2.POD的概述
1)POD的啟動(dòng)過程
用戶創(chuàng)建pod--->>(kubectl )聯(lián)系A(chǔ)PI server--->>(kubectl 的命令)記錄在etcd數(shù)據(jù)庫中--->>然后(api server)再去找Scheduler調(diào)度器,Scheduler再調(diào)用內(nèi)部的算法去找適合運(yùn)行容器的節(jié)點(diǎn)--->>(Scheduler)把結(jié)果返回aip server-->>api server再把結(jié)果記錄到etcd數(shù)據(jù)庫中,由于master默認(rèn)不運(yùn)行服務(wù),所以api serve 回直接找node節(jié)點(diǎn)也就是(kubelete計(jì)算節(jié)點(diǎn))--->> (kubelete)找docker創(chuàng)建容器--(docker)把容器狀態(tài)返回kubelete--->>(kubelet)再把容器狀態(tài)返回給api server--->>( api server)再把結(jié)果記錄再etcd數(shù)據(jù)庫中
注:此時(shí)數(shù)據(jù)庫中記錄了類似與(c1 node running),所以此時(shí)使用kubectl就能調(diào)用這些信息
Scheduler分配容器
第一步篩選
比如此時(shí)要運(yùn)行一個(gè)容器需要(500m的內(nèi)存,端口80),此時(shí) Scheduler就會(huì)去找節(jié)點(diǎn)凡是內(nèi)存沒有500m的排除,端口80被占用的排除,
第二步優(yōu)選
如果此時(shí)有多個(gè)節(jié)點(diǎn)符合篩選條件,則根據(jù)內(nèi)部算法(打分機(jī)制)選擇
2)POD生命周期
Pod對象自從其創(chuàng)建開始至其終止退出的時(shí)間范圍稱為其生命周期。在這段時(shí)間中,Pod會(huì)處于 多種不同的狀態(tài),并執(zhí)行一些操作;其中,創(chuàng)建主容器(main container)為必需的操作,其他可選的操作還包括運(yùn)行于初始化容器(init container)、容器啟動(dòng)后鉤子 (postart hook)、容器的存活性探測(liveness probe) 就緒性探測 (readiness probe)以及容器終止前鉤子 (pre stop hook) 等,這些操作是否執(zhí)行則取決于Pod 的定義
pod的啟動(dòng)--->>初始化容器(init container)(默認(rèn)沒有條件,可以填加初始話條件)--->>隨著容器啟動(dòng)的小程序,也叫啟動(dòng)前腳本(post start hook)(小程序可以執(zhí)行一些特別的操作,比如指定容器為誰的從服務(wù)器,默認(rèn)也是空的)--->> 容器關(guān)閉前腳本(pre stop hook)(默認(rèn)也是空的)(比如刪除容器時(shí)發(fā)現(xiàn)容器在啟動(dòng)之后產(chǎn)生了5個(gè)G的硬盤空間,此時(shí)想要?jiǎng)h除,這時(shí)候就可以設(shè)置結(jié)束前執(zhí)行腳本了)
此時(shí)pod還有兩個(gè)探測器
- 生存探測(liveness probe)
????????如果容器失敗了,就會(huì)重啟
- 就緒性探測 (readiness probe)
????????如果失敗不會(huì)重啟容器,只會(huì)改為NoReady,沒有就緒狀態(tài),這個(gè)時(shí)候就以排錯(cuò)了(默認(rèn)為空)
## 生存探測器示例 ~]# kubectl get pods NAME ? ? READY ? STATUS ? RESTARTS ? ? AGE testos ? 1/1 ? ? Running ? 1 (13m ago) ? 17m ~]# kubectl attach pods -n default -it testos If you don't see a command prompt, try pressing enter. # 在容器內(nèi)查看進(jìn)程 /]# echo $$ 1 # 因?yàn)閍ttach進(jìn)入容器用的父進(jìn)程,而容器的父進(jìn)程是上帝進(jìn)程,且容器退出的方式是殺掉父進(jìn)程,也就是會(huì)干掉容器 /]# exit ? # 就緒探測器發(fā)現(xiàn)容器沒有啟動(dòng)就會(huì)直接顯示該狀態(tài) ~]# kubectl get pods NAME ? ? READY ? STATUS ? ? RESTARTS ? ? AGE testos ? 0/1 ? ? Completed ? 1 (90m ago) ? 93m ? # 此時(shí)生存探測器發(fā)現(xiàn)容器被干掉了,就會(huì)重新生成容器 ~]# kubectl get pods NAME ? ? READY ? STATUS ? RESTARTS ? ? AGE testos ? 1/1 ? ? Running ? 2 (4s ago) ? 93m3.POD的啟動(dòng)狀態(tài)
Pod phase(相位狀態(tài))
--Pod的status字段是一個(gè)PodStatus的對象,Pod對象總是應(yīng) 該處于其生命進(jìn)程中以下幾個(gè)相位(phase)之-。
--Pending 容器創(chuàng)建過程中,但它尚未被調(diào)度完成(api server找Scheduler之前的狀態(tài)就是Pending,如果是這種狀態(tài),則說明節(jié)點(diǎn)不服和調(diào)度)
--Running 所有容器都已經(jīng)被kubelet創(chuàng)建完成(Scheduler到docker之間的狀態(tài))
--Succeeded 所有容器都已經(jīng)成功終止了并不會(huì)被重啟
--Failed Pod中的所有容器中至少有一個(gè)容器退出是非O狀態(tài)
--Unknown 無法正常獲取到Pod對象的狀態(tài)信息
4.POD特點(diǎn)
--Pod的生命周期是短暫的,用后即焚的實(shí)體。 注意:重啟Pod中的容器跟重啟Pod不是一回事。Pod只提供容器的運(yùn)行環(huán)境并保持容器的運(yùn)行狀態(tài),重啟容器不會(huì)造成Pod重啟。(在k8s中沒有停止的概念,只有創(chuàng)建與刪除。create,delete)
--Pod不會(huì)自愈。如果Pod運(yùn)行的Node故障,或者是調(diào)度器本身故障,這個(gè)Pod就會(huì)被刪除。(但是如果有控制器就不不一樣)
--控制器(Deployment/RC/RS)可以自動(dòng)創(chuàng)建和管理多個(gè)Pod, 提供副本管理、滾動(dòng)升級(jí)和集群級(jí)別的自愈能力。
5.容器管理命令
1)進(jìn)入一個(gè)正在運(yùn)行的容器
語法格式:
~]# kubectl exec -it 容器id --執(zhí)行的命令 # 這樣運(yùn)行的退出后不會(huì)重啟2)刪除資源
語法格式:
~]# kubectl delete 資源類型 資源名稱 # 刪除容器 ~]# kubectl delete pods -n default testos-79778b4895-s8mxl pod "testos-79778b4895-s8mxl" deleted # 查看pod容器,發(fā)現(xiàn)還是會(huì)創(chuàng)建出來 ~]# kubectl get pods NAME ? ? READY ? STATUS ? RESTARTS ? ? AGE testos-79778b4895-43er4 ? 1/1 ? ? Running ? 2 (88m ago) ? 92m ? # 此時(shí)就要?jiǎng)h除該pod容器的控制器 ~]# kubectl get deployments.apps NAME ? ? READY ? STATUS ? RESTARTS ? ? AGE testos ? 1/1 ? ? Running ? 2 (88m ago) ? 92m ~]# kubectl delete deployments testos deployment.apps "testos" deleted ? # 刪除容器時(shí)有一個(gè)寬限期,為了保證數(shù)據(jù)的完整性,刪除資源控制器時(shí)也有一個(gè)(terminating回收狀態(tài))寬限期6.其他資源控制器
peployment
????????Deployment /RC/RS 都是資源控制器
????????Deployment為Pod和ReplicaSet提供了一個(gè)聲明式定 義方法,用來替代以前的Replicationcontroller 來方便的管理應(yīng)用。
典型的應(yīng)用場景包括:
????????--定義Deployment來創(chuàng)建Pod和ReplicaSet
????????--滾動(dòng)升級(jí)和回滾應(yīng)用
????????--擴(kuò)容和縮容
????????--暫停和繼續(xù)Deployment
RC/RS/Deployment
????????--kubernetes通過Replication Control1(簡稱RC) 管理POD,在RC中定義了如何啟動(dòng)POD,如何 運(yùn)行,啟動(dòng)幾副本等功能,如果我們創(chuàng)建文件, 在其中使用Yaml的語法格式描述了上面的信息, 這個(gè)文件就是我們的資源對象文件
????????--ReplicaSet (簡稱RS)是RC的升級(jí)版
????????--Deployment為Pods和RS提供描述性的更新方式
三.資源文件的概述
1.資源對象文件的概述
-kuberbetes通過RC/RS 管理POD,在RC中定義了如何啟動(dòng)POD,如何運(yùn)行,啟動(dòng)幾個(gè)副本等功能,如果我們創(chuàng)建的文件,在其中使用Yaml的語法描述了上面的信息,這個(gè)文件就是我們的資源對象文件
-資源文件可以創(chuàng)建,刪除,管理資源對象
-資源文件有很多高級(jí)的復(fù)雜的功能靠簡單的命令方式無法實(shí)現(xiàn),這些都需要使用資源文件描述
2.YAMl語法概述
YAML 是什么?
YAML 是一種可讀性高,以數(shù)據(jù)為中心的數(shù)據(jù)序列化格式。可以表達(dá) 對象(鍵值對)數(shù)組,標(biāo)量; 這幾種數(shù)據(jù)形式 能夠被多種編程語言和腳本語言解析
YAML 語法與格式
基本語法
-
以 k: v 的形式來表示鍵值對的關(guān)系,冒號(hào)后面必須有一個(gè)空格
-
表示注釋
-
對大小寫敏感
-
通過縮進(jìn)來表示層級(jí)關(guān)系,縮排中空格的數(shù)目不重要,只要相同階層的元素左側(cè)對齊就可以了
-
縮進(jìn)只能使用空格,不能使用 tab縮進(jìn)鍵
-
字符串可以不用雙引號(hào)
格式
對象和鍵值對
通過 k: v 的方式表示對象或者鍵值對,冒號(hào)后必須要加一個(gè)空格:
Name: Astron Sex: female School: TJU通過縮進(jìn)來表示對象的多個(gè)屬性:
People: Name: Astron Sex: female School: TJU也可以寫成
people: {name: Astron, sex: female}數(shù)組
數(shù)組(或者列表)中的元素采用 - 表示,以 - 開頭的行表示構(gòu)成一個(gè)數(shù)組
# eg1:- A - B - C #eg2:people: - yyy- zzz- www行內(nèi)表示:
people: [yyy, zzz, www]eg3: 對象數(shù)組
people: - name: yyyage: 18- name: zzzage: 19使用流式表示:
people: [{name: yyy, age: 18},{name: zzz, age: 19}]標(biāo)量
標(biāo)量是最基本的不可再分的值,包括:
-
整數(shù)
-
浮點(diǎn)數(shù)
-
字符串
-
布爾值
-
Null
-
時(shí)間
-
日期
引用
& 用于建立錨點(diǎn),* 用于引用錨點(diǎn),<< 表示合并到當(dāng)前數(shù)據(jù)
eg1:defaults: &defaults adapter: ppp host: qqq ? development: database: mq <<: *defaults相當(dāng)于:
defaults: adapter: ppp host: qqq ? development: database: mq adapter: ppp host: qqqeg2: - &showell steve - clark - eve - *showell相當(dāng)于:
- steve - clark - eve - steve3.資源文件的管理命令
--create 創(chuàng)建資源對象(沒有密等性,一般不用)
--apply 生名更新資源對象
--delete 刪除資源文件
# 更新資源對象,也可以用來創(chuàng)建 ~]# kubectl apply -f mypod.yaml # 創(chuàng)建資源對象,但是用create創(chuàng)建的資源不能用apply更新 ~]# kubectl create -f mypod.yaml # 刪除資源文件 ~]# kubectl delete -f mypod.yaml4.POD的資源文件書寫格式概述
--- ? ? ? ? ? ?# 資源的開始,當(dāng)一個(gè)文件中有多個(gè)時(shí),則說明一個(gè)文件有多個(gè)資源文件 kind: Pod ? ? ?# 資源對象的類型,這里定義pod,默認(rèn)鍵值對采用key(小駝峰) : value(大坨峰),資源所有對象查看(kubectl api-resources) apiVersion: v1 # pod的版本,查看當(dāng)前k8s支持的所有版本(kubectl api-versions),查看當(dāng)前pod的版本,及基本概述(kubectl explain pods),詳細(xì)的當(dāng)輸入前面這條命令的時(shí)候地下會(huì)有網(wǎng)址,不過建議訪問國內(nèi)的(https://kubernetes.io/) metadata: ? ? ?# 元數(shù)據(jù),(屬性數(shù)據(jù),定義該pod的詳細(xì)信息,pod.metadata)name: mypod ?# 定義pod的名字,且是唯一性 spec: ? ? ? ? ?# 標(biāo)志位,標(biāo)志詳細(xì)信息,前面定義了資源對象,所以這里就是pod的詳細(xì)信息(pod.spec)containers: ?# pod里的容器- name: mylinux ?#相當(dāng)于pod里面的容器(mypod.mylinux)image: 172.17.0.98:5000/myos:v1804 ? # 這個(gè)容器用的什么鏡像stdin: true ? ? ? ? ? ? ? ? ? ? ? ? ? # 標(biāo)準(zhǔn)輸出(相當(dāng)與-i)tty: true ? ? ? ? ? ? ? ? ? ? ? ? ? ? # 終端(相當(dāng)與-t) # 注:stdin,tty不寫默認(rèn)是false ? ? ## 示例 # 創(chuàng)建容器 ~]# kubectl apply -f mypod.yaml pod/mypod created # 查看創(chuàng)建 ~]# kubectl get pods NAME ? ? READY ? STATUS ? RESTARTS ? ? AGE mypod ? 1/1 ? ? Running ? 0 ? ? ? ? ? ? 5s # 注意此時(shí)是沒有控制器的,所以可以直接刪除 ~]# kubectl get deployments.apps No resources found in default namespace. ~]# kubectl get replicasets.apps No resources found in default namespace # 直接刪除 ]# kubectl delete pods mypod pod "mypod" deleted ~]# kubectl get replicasets.apps No resources found in default namespace. ~]# kubectl get pods NAME ? ? READY ? STATUS ? RESTARTS ? ? AGE?5.deploy資源控制器文件的書寫
# 由于創(chuàng)建不帶控制器的pod非常的不安全,所以這里創(chuàng)建帶控制器的pod ~]# vim myapache.yaml --- ? ? ? ? ? ? ? ? ? ? # 資源的開始 kind: Deployment ? ? ? ?# 資源對象的類型,為Deployment控制器 apiVersion: apps/v1 ? ? # 控制器的版本,查看deployment的版本(kubectl explain deployment) metadata: ? ? ? ? ? ? ? # 元數(shù)據(jù),(屬性數(shù)據(jù),定義該deployment控制器的詳細(xì)信息,deploy.metadata) name: myapache ? ? ? # 定義deploy控制器的名字,且是唯一性 annotations: ? ? ? ? # 附加信息,該字段保留,后續(xù)介紹kubernetes.io/change-cause: httpd.v1 spec: ? ? ? ? ? ? ? ? ? # 詳細(xì)定義,定義了資源對象控制器的詳細(xì)信息,(deploy.spec)selector: ? ? ? ? ? ?# 定義了控制器的標(biāo)簽 ? matchLabels: ? ? ? ? ? myapp: httpd ? ? # 定義了標(biāo)簽為httpd replicas: 1 ? ? ? ? ?# 定義pod副本數(shù)template: ? ? ? ? ? ?# 定義pod的資源模板metadata: ? ? ? ? ?# pod的元數(shù)據(jù),(屬性數(shù)據(jù),定義該pod的詳細(xì)信息,pod.metadata)labels: ? ? ? ? ?# 定義pod的標(biāo)簽myapp: httpd ?# 標(biāo)簽名 (由于創(chuàng)建了控制器所以不能給pod起名字,只能由控制器創(chuàng)建pod的名字,所以這里只定義了標(biāo)簽)spec: ? ? ? ? ? ? ?# 定義pod的spec這里就是pod的詳細(xì)信息(pod.spec)containers: ? ? ?# pod里的容器- name: webcluster ? ?# 定義于pod里面的容器名字(mypod.webcluster)image: 172.17.0.98:5000/myos:httpd ?# 這個(gè)容器用的什么鏡像stdin: false ? ?# 標(biāo)準(zhǔn)輸出(相當(dāng)與-i),由于這邊啟動(dòng)的是apache,不需要交互試的終端輸出,所以這里同意設(shè)置flase,或者不寫也是可以的tty: false ? ? ?# 終端(相當(dāng)與-t)ports: ? ? ? ? ?# 由于啟動(dòng)的是服務(wù)所以要設(shè)置監(jiān)聽端口號(hào)- protocol: TCP # 監(jiān)聽的協(xié)議TCP containerPort: 80 ?# 監(jiān)聽的端口是80restartPolicy: Always ?# 定義策略,pod維護(hù)容器的策略(策略:Always;OnFailure;Never)默認(rèn)Always,Always表示容器一但死亡,則會(huì)重新創(chuàng)建;OnFailure表示只有當(dāng)容器退出時(shí)$?!=0時(shí)才重啟,也就是啟動(dòng)失敗才重啟;Never表示不管哪種都不重啟; ? # 創(chuàng)建 ~]# kubectl apply -f myapache.yaml deployment.apps/myapache created # 查看pod ~]# kubectl get pods NAME ? ? ? ? ? ? ? ? ? ? ? READY ? STATUS ? RESTARTS ? ? AGE myapache-9d7557448-nq8rw ? 1/1 ? ? Running ? 0 ? ? ? ? ? ? 17s # 查看一級(jí)控制器 ~]# kubectl get deployments.apps myapache ? 1/1 ? ? 1 ? ? ? ? ? 1 ? ? ? ? ? 3m49s # 查看二級(jí)控制器 ~]# kubectl get replicasets.apps NAME ? ? ? ? ? ? ? ? DESIRED ? CURRENT ? READY ? AGE myapache-9d7557448 ? 1 ? ? ? ? 1 ? ? ? ? 1 ? ? ? 4m # 測試 ~]# curl -ik http://10.244.2.46.標(biāo)簽和選擇器的書寫格式
k8s 的 標(biāo)簽 和 標(biāo)簽選擇器 標(biāo)簽 可以附加在 kubernetes 任何資源對象之上的鍵值型 數(shù)據(jù) ,常用于 標(biāo)簽選擇器 的匹配度檢查,從而完成資源篩選 資源 標(biāo)簽 當(dāng) Kubernetes 對系統(tǒng)的任何API對象如Pod和節(jié)點(diǎn)進(jìn)行“分組”時(shí),會(huì)對其添加Label(key=value形式的“鍵-值對”)用以精準(zhǔn)地 選擇 對應(yīng)的API對象
lables是設(shè)置標(biāo)簽,matchLabels匹配標(biāo)簽
為了建立控制器和pod間的關(guān)聯(lián),因?yàn)閜od的名字是唯一的,如果起多個(gè)容器的話,不可以這么操作,所以kubernetes 先給每個(gè)pod打上一個(gè)標(biāo)簽(Label),然后再給相應(yīng)的位置定義標(biāo)簽選擇器(Label Selector),引用這些標(biāo)簽管理,而且資源控制器會(huì)給pod自動(dòng)分配名字;
三.集群的管理
一個(gè)資源控制器可以控制多個(gè)pod
1.集群擴(kuò)容
-
replicas 決定了集群pod數(shù)量
創(chuàng)建一個(gè)單節(jié)點(diǎn)的web容器
-
在集群運(yùn)行的過程中我們可以動(dòng)態(tài)調(diào)整集群pod的數(shù)量
在創(chuàng)建文件之初設(shè)置容器副本數(shù)
~]# cat myapache.yaml --- ......replicas: 1 ? # 根據(jù)數(shù)字設(shè)置...... ? ?在線修改設(shè)置,及時(shí)生效
# 先查看要擴(kuò)容的容器的資源控制器,只有修改資源控制器才有效,而pod是被創(chuàng)建出來的 ~]# kubectl get deployment NAME ? ? ? READY ? UP-TO-DATE ? AVAILABLE ? AGE myapache ? 1/1 ? ? 1 ? ? ? ? ? ?1 ? ? ? ? ? 26m ? # 進(jìn)入配置里修改 ~]# kubectl edit deployment myapache ....... replicas: 3 ? ?# 根據(jù)數(shù)字設(shè)置,這里設(shè)置3測試 ...... ? # 查看 ~]# kubectl get deployment myapache NAME ? ? ? READY ? UP-TO-DATE ? AVAILABLE ? AGE myapache ? 3/3 ? ? 3 ? ? ? ? ? ?3 ? ? ? ? ? 31m ~]# kubectl get pods ~]# kubectl get pods -o wide NAME ? ? ? ? ? ? ? ? ? ? ? READY ? STATUS ? RESTARTS ? ? AGE ? IP ? ? ? ? ? NODE ? ? ? ? ? ? NOMINATED NODE ? READINESS GATES myapache-9d7557448-59fxm ? 1/1 ? ? Running ? 0 ? ? ? ? ? ? 3m4s ? 10.244.1.4 ? vm-0-114-centos ? <none> ? ? ? ? ? <none> myapache-9d7557448-64fhh ? 1/1 ? ? Running ? 0 ? ? ? ? ? ? 109s ? 10.244.1.5 ? vm-0-114-centos ? <none> ? ? ? ? ? <none> myapache-9d7557448-brsbc ? 1/1 ? ? Running ? 0 ? ? ? ? ? ? 109s ? 10.244.2.4 ? vm-0-142-centos ? <none> ? ? ? ? ? <none> testos ? ? ? ? ? ? ? ? ? ? 1/1 ? ? Running ? 2 (23h ago) ? 24h ? ?10.244.1.2 ? vm-0-114-centos ? <none> ? ? ? ? ? <none>scale 命令
# 先查看要擴(kuò)容的容器的資源控制器,只有修改資源控制器才有效,而pod是被創(chuàng)建出來的 ~]# kubectl get deployment myapache NAME ? ? ? READY ? UP-TO-DATE ? AVAILABLE ? AGE myapache ? 3/3 ? ? 3 ? ? ? ? ? ?3 ? ? ? ? ? 31m ? ## 用scale設(shè)置 # 縮減 ~]# kubectl scale deployments.apps myapache --replicas=1 # 查看pod ~]# kubectl get deployment myapache NAME ? ? ? READY ? UP-TO-DATE ? AVAILABLE ? AGE myapache ? 1/1 ? ? 1 ? ? ? ? ? ?1 ? ? ? ? ? 35m ? # 擴(kuò)展 ~]# kubectl scale deployments.apps myapache --replicas=3 # 查看pod ~]# kubectl get deployment myapache NAME ? ? ? READY ? UP-TO-DATE ? AVAILABLE ? AGE myapache ? 3/3 ? ? 3 ? ? ? ? ? ?3 ? ? ? ? ? 31m ~]# kubectl get pods -o wide NAME ? ? ? ? ? ? ? ? ? ? ? READY ? STATUS ? RESTARTS ? ? AGE ? IP ? ? ? ? ? NODE ? ? ? ? ? ? NOMINATED NODE ? READINESS GATES myapache-9d7557448-59fxm ? 1/1 ? ? Running ? 0 ? ? ? ? ? ? 3m4s ? 10.244.1.4 ? vm-0-114-centos ? <none> ? ? ? ? ? <none> myapache-9d7557448-64fhh ? 1/1 ? ? Running ? 0 ? ? ? ? ? ? 109s ? 10.244.1.5 ? vm-0-114-centos ? <none> ? ? ? ? ? <none> myapache-9d7557448-brsbc ? 1/1 ? ? Running ? 0 ? ? ? ? ? ? 109s ? 10.244.2.4 ? vm-0-142-centos ? <none> ? ? ? ? ? <none>2.集群更新與回滾
1)查看控制器規(guī)則
kubectl get 資源對象 資源名稱 -o 格式
~]# kubectl get deployment myapache -o yaml ...... spec:progressDeadlineSeconds: 600replicas: 1revisionHistoryLimit: 10 ? ? ?# 保留最多10個(gè)歷史版本selector: ? ? ? ? ? ? ? ? ? ? matchLabels:myapp: httpdstrategy: ? ? ? ? ? ? ? ? ? ? # 更新策略 rollingUpdate: ? ? ? ? ? ? ?# 滾動(dòng)更新maxSurge: 25% ? ? ? ? ? ? # 最多超過25%的副本數(shù)maxUnavailable: 25% ? ? ? # 最多有25%的副本不可用type: RollingUpdate ? ? ? ? # 更行方式(Recrete ,rollingUpdate)2)deployment.spec.strategy支持兩種策略
-
Recrete
重建式更新,就是刪一個(gè)建一個(gè)(如果有一百個(gè)容器則會(huì)比較慢)
-
rollingUpdate
滾動(dòng)更新,更新期間pod最多有幾個(gè)(相當(dāng)與多線程操作,這邊刪,那邊創(chuàng)),滾動(dòng)更新在創(chuàng)建的時(shí)候最多不能超過25%,最大有25%的副本數(shù)量在不可用(刪除)
示例
## 更新;把a(bǔ)pache升級(jí)成nginx # 先查看原有配置及測試 ~]# kubectl get pods -o wide NAME ? ? ? ? ? ? ? ? ? ? ? READY ? STATUS ? RESTARTS ? ? AGE ? IP ? ? ? ? ? NODE ? ? ? ? ? ? NOMINATED NODE ? READINESS GATES myapache-9d7557448-brsbc ? 1/1 ? ? Running ? 0 ? ? ? ? ? ? 31m ? 10.244.2.4 ? vm-0-142-centos ? <none> ? ? ? ? ? <none> ~]# curl -ik http://10.244.2.4 this is apache # 在線修改 ......kubernetes.io/change-cause: nginx.v1 ?# 版本名 ..... - image: 172.17.0.98:5000/myos:nginx ? # 更新的鏡像 ..... ? # 查看 ]# kubectl get pods -o wide NAME ? ? ? ? ? ? ? ? ? ? ? READY ? STATUS ? ? ? ? ? ? RESTARTS ? ? ? AGE ? ? IP ? ? ? ? ? NODE ? ? ? ? ? ? NOMINATED NODE ? READINESS GATES myapache-5886d7b69b-bl7l4 ? 0/1 ? ? Running ? ?6 (3m42s ago) ? 9m34s ? 10.244.1.6 ? vm-0-114-centos ? <none> ? ? ? ? ? <none> ~]# curl -ik http://10.244.2.4 this is nginx ? ## 回滾 # 查看歷史記錄 ~]# kubectl rollout history deployment myapache deployment.apps/myapache REVISION CHANGE-CAUSE 1 ? ? ? ? httpd.v1 2 ? ? ? ? nginx.v1 # 回滾 ~]# kubectl rollout undo deployment myapache --to-revision=1 deployment.apps/myapache rolled back ~]# kubectl get pods -o wide NAME ? ? ? ? ? ? ? ? ? ? ? READY ? STATUS ? RESTARTS ? AGE ? ? IP ? ? ? ? ? NODE ? ? ? ? ? ? NOMINATED NODE ? READINESS GATES myapache-9d7557448-8gv62 ? 1/1 ? ? Running ? 0 ? ? ? ? 9m59s ? 10.244.2.6 ? vm-0-142-centos ? <none> ? ? ? ? ? <none> ~]# curl -ik http://10.244.2.4 this is apache ?3.集群調(diào)度
容器的創(chuàng)建是隨機(jī)的,如何選擇固定的宿主機(jī)
1)nodeName標(biāo)簽
容器創(chuàng)建是隨機(jī)的,選擇nodeName固宿主機(jī)
# 先查看原有的pod ~]# kubectl get pods -o wide NAME ? ? ? ? ? ? ? ? ? ? ? READY ? STATUS ? RESTARTS ? AGE ? IP ? ? ? ? ? NODE ? ? ? ? ? ? NOMINATED NODE ? READINESS GATES myapache-9d7557448-8gv62 ? 1/1 ? ? Running ? 0 ? ? ? ? 15h ? 10.244.2.6 ? node2 ? <none> ? ? ? ? ? <none> # 可以看出容器在node2上,那么此時(shí)修改yaml文件更新 ~]#vim myapache.yaml --- kind: Deployment apiVersion: apps/v1 metadata:name: myapacheannotations:kubernetes.io/change-cause: httpd.v1 spec:selector:matchLabels:myapp: httpd replicas: 1template:metadata:labels:myapp: httpdspec:nodeName: node1 ?# 在該配置文件中添加一行使其調(diào)度到node1containers: ? ? ? ? - name: webclusterimage: 172.17.0.98:5000/myos:httpdstdin: falsetty: falseports:- protocol: TCPcontainerPort: 80restartPolicy: Always ? ? ~]# kubectl apply -f myapache.yaml deployment.apps/myapache configured ? ~]# kubectl get pod -o wide NAME ? ? ? ? ? ? ? ? ? ? ? READY ? STATUS ? RESTARTS ? AGE ? IP ? ? ? ? ? NODE ? ? ? ? ? ? NOMINATED NODE ? READINESS GATES myapache-58fdbddd8d-m78jv ? 1/1 ? ? Running ? 0 ? ? ? ? 11s ? 10.244.1.8 ? node1 ? <none> ? ? ? ? ? <none>注:如果添加了選則標(biāo)簽,但無法使用該主機(jī),POD將一直處于Pending狀態(tài)
使用 nodeName 參數(shù)讓容器運(yùn)行在指定節(jié)點(diǎn)上
2)nodeSelector標(biāo)簽
如何選擇一類宿主機(jī)?
需要提前為目標(biāo)主機(jī)打上特定的標(biāo)簽(可以是多臺(tái))
在資源文件中根據(jù)標(biāo)簽選擇宿主機(jī)(更加靈活)
node標(biāo)簽的管理
nodeSelector是節(jié)點(diǎn)選擇約束的最簡單推薦形式
-
可以給節(jié)點(diǎn)打上標(biāo)簽,根據(jù)標(biāo)簽來選擇需要的節(jié)點(diǎn)(標(biāo)簽名任意)
-
查看標(biāo)簽
-
設(shè)置標(biāo)簽
- 刪除標(biāo)簽
- 使用 標(biāo)簽 讓容器運(yùn)行在一些節(jié)點(diǎn)上
運(yùn)用資源文件把容器跑在有標(biāo)簽的節(jié)點(diǎn)組上
# 先運(yùn)行標(biāo)簽 ~]# kubectl label nodes node2 disktype=ssd node/node2 labeled # 修改配置文件 ]# cat myapache.yaml --- kind: Deployment apiVersion: apps/v1 metadata:name: myapacheannotations:kubernetes.io/change-cause: httpd.v1 spec:selector:matchLabels:myapp: httpd replicas: 1template:metadata:labels:myapp: httpdspec:nodeSelector: ? ? ?# 添加標(biāo)簽組disktype: ssd ? ?# 綁定剛剛創(chuàng)建的標(biāo)簽containers:- name: webclusterimage: 172.17.0.98:5000/myos:httpdstdin: falsetty: falseports:- protocol: TCPcontainerPort: 80restartPolicy: Alwa ~]# kubectl get node --show-labels NAME ? ? ? ? ? ? STATUS ? ROLES ? ? ? ? ? ? ? ? AGE ? ? VERSION ? LABELS ........ node2 ? Ready ? <none> ? ? ? ? ? ? ? ? 47h ? ? v1.23.2 ? disktype=ssd,..... ? ~]# kubectl get pod -o wide NAME ? ? ? ? ? ? ? ? ? ? ? READY ? STATUS ? RESTARTS ? AGE ? IP ? ? ? ? ? NODE ? ? ? ? ? ? NOMINATED NODE ? READINESS GATES myapache-7d685d5d66-shd86 ? 1/1 ? ? Running ? 0 ? ? ? ? 42s ? 10.244.2.7 ? node2 <none>3)高級(jí)調(diào)度策略
親和與反親和
-
親和可以理解成偏愛或喜好,同樣反親和可以理解成不喜歡
-
在kubernetes 中親和特性在pod. spec. affinity中設(shè)置
-
從親和的對象又可以分為(節(jié)點(diǎn)親和)和(容器親和)
-
從親和的策略又可以分為(硬親和)和(軟親和)
手冊地址:
將 Pod 分配給節(jié)點(diǎn) | Kubernetes
pod節(jié)點(diǎn)親和示例
親和示例
## 非強(qiáng)制性親和示例 # 先創(chuàng)建節(jié)點(diǎn)標(biāo)簽 ~]# kubectl label nodes node2 app=myapp-apache # 創(chuàng)建yaml文件 ~]# vim web-example.yaml --- apiVersion: apps/v1 kind: Deployment metadata:name: web-example spec:selector:matchLabels:app: myapp-webreplicas: 3revisionHistoryLimit: 10strategy:rollingUpdate:maxSurge: 25%maxUnavailable: 25%type: RollingUpdatetemplate:metadata:labels:app: myapp-webspec:affinity: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? podAffinity: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? # pod的親和設(shè)置preferredDuringSchedulingIgnoredDuringExecution: ?# 親和性,表示更傾向于部署在指定節(jié)點(diǎn)上,但不是必須的- weight: 1 ? ? ? ? ? ? ? ?# weight范圍1-100。這個(gè)涉及調(diào)度器的優(yōu)選打分過程,每個(gè)node的評(píng)分都會(huì)加上這個(gè)weight,最后bind最高的nodepodAffinityTerm: ? ? ? ? #指定pod要調(diào)度在含有標(biāo)簽app=myapp-apache的節(jié)點(diǎn)上labelSelector: ? ? ? ? # 連接的標(biāo)簽組 matchExpressions: ? - key: appoperator: Invalues:- myapp-apachetopologyKey: kubernetes.io/hostname ?# 用topologyKey表示,具體值用node label表示,調(diào)度器需要考慮這些pods是否滿足規(guī)則Ycontainers: ? ? ? - name: nginximage: 172.17.0.98:5000/myos:httpdports:- protocol: TCPcontainerPort: 80restartPolicy: Always ? # 創(chuàng)建 ~]# kubectl apply -fweb-example.yaml deployment.apps/web-example configured # 查看調(diào)度 ~]# kubectl get pods -o wide NAME ? ? ? ? ? ? ? ? ? ? ? ? ? READY ? STATUS ? RESTARTS ? AGE ? IP ? ? ? ? ? NODE ? ? ? ? ? ? NOMINATED NODE ? READINESS GATES web-example-558fd5cd9b-gs7v4 ? 1/1 ? ? Running ? 0 ? ? ? ? 9s ? 10.244.1.9 ? ? node1 ? <none> ? ? ? ? ? <none> web-example-558fd5cd9b-jlx97 ? 1/1 ? ? Running ? 0 ? ? ? ? 6s ? 10.244.1.10 ? node2 ? <none> ? ? ? ? ? <none> web-example-558fd5cd9b-tl67p ? 1/1 ? ? Running ? 0 ? ? ? ? 7s ? 10.244.2.17 ? node2 ? <none> ? ? ? ? ? <none> ? # affinity.podAffinity第二個(gè)表示創(chuàng)建的3個(gè)pod部署時(shí)要滿足傾向性親和性,創(chuàng)建的3個(gè)pod更傾向于部署在Pod的標(biāo)簽為app=myapp-apache所在的節(jié)點(diǎn)上,并且所在的節(jié)點(diǎn)要含有kubernetes.io/hostname標(biāo)簽。如下所示,上設(shè)置,app=myapp-apache的pod在kus-node2節(jié)點(diǎn)上,新創(chuàng)建的3個(gè)pod調(diào)度時(shí)要滿足傾向性親和性,最終2個(gè)pod調(diào)度在了k8s-node2上,1個(gè)pod調(diào)度在了k8s-node1上,更傾向于調(diào)度在k8s-node2上 # 強(qiáng)制親和性 ~]# vim web-example.yaml --- apiVersion: apps/v1 kind: Deployment metadata:name: web-example spec:selector:matchLabels:app: myapp-webreplicas: 3revisionHistoryLimit: 10strategy: ? ? ? ? ? ? ? ? ?# 設(shè)置滾動(dòng)升級(jí)rollingUpdate:maxSurge: 25%maxUnavailable: 25%type: RollingUpdatetemplate:metadata:labels:app: myapp-webspec: ? ? ? ? ? ? ? ? ? ? ? ? # pod設(shè)置nodeName: vm-0-142-centos ? nodeSelector: ? ? ? ? ? ? ? # 指定標(biāo)簽disktype: ssd affinity: ? ? ? ? ? ? ? ? ? # 親和設(shè)置podAffinity: ? ? ? ? ? ? ?# pod的親和設(shè)置requiredDuringSchedulingIgnoredDuringExecution: ? #強(qiáng)制親和性- labelSelector: ? ? ? ?# 連接的標(biāo)簽組 matchExpressions: ? #指定pod要調(diào)度在含有標(biāo)簽app=myapp-apache的節(jié)點(diǎn)上- key: appoperator: Invalues:- myapp-apachetopologyKey: kubernetes.io/hostname ? ?# 必須也要滿足此標(biāo)簽要求containers:- name: nginximage: 172.17.0.98:5000/myos:httpdports:- protocol: TCPcontainerPort: 80restartPolicy: Always # affinity.podAffinity第一個(gè)表示部署apache時(shí)會(huì)創(chuàng)建3個(gè)pod,并且這3個(gè)pod要滿足強(qiáng)制親和性,要調(diào)度在節(jié)點(diǎn)含有標(biāo)簽為app=myapp-apache的pod,并且,調(diào)度的節(jié)點(diǎn)要含有標(biāo)簽kubernetes.io/hostname。如上設(shè)置,app=myapp-apache的pod在kus-node2節(jié)點(diǎn)上,所以創(chuàng)建的3個(gè)pod全部調(diào)度在了k8s-node2節(jié)點(diǎn)上反親和示例
就是把podAffinity替換成podAntiAffinity
# 強(qiáng)制 ~]# vim web-example.yaml --- apiVersion: apps/v1 kind: Deployment metadata:name: web-example spec:selector:matchLabels:app: myapp-webreplicas: 3revisionHistoryLimit: 10strategy: ? ? ? ? ? ? ? ? ?rollingUpdate:maxSurge: 25%maxUnavailable: 25%type: RollingUpdatetemplate:metadata:labels:app: myapp-webspec: ? ? ? ? ? ? ? ? ? ? ? ? nodeName: vm-0-142-centos ? nodeSelector: ? ? ? ? ? ? ? disktype: ssd affinity: ? ? ? ? ? ? ? ? ? podAntiAffinity: ? ? ? ? ? ? ?# pod的反親和設(shè)置requiredDuringSchedulingIgnoredDuringExecution: ? #- labelSelector: ? ? ?matchExpressions: ?- key: appoperator: Invalues:- myapp-apachetopologyKey: kubernetes.io/hostname ? ?containers:- name: nginximage: 172.17.0.98:5000/myos:httpdports:- protocol: TCPcontainerPort: 80restartPolicy: Always # 非強(qiáng)制 ~]# vim web-example.yaml --- apiVersion: apps/v1 kind: Deployment metadata:name: web-example spec:selector:matchLabels:app: myapp-webreplicas: 3revisionHistoryLimit: 10strategy:rollingUpdate:maxSurge: 25%maxUnavailable: 25%type: RollingUpdatetemplate:metadata:labels:app: myapp-webspec:affinity: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? podAntiAffinity: ? ? ? ? ? ?# pod的反親和設(shè)置preferredDuringSchedulingIgnoredDuringExecution: ?- weight: 1 ? ? ? ? ? ? ? ?podAffinityTerm: ? ? ? ?labelSelector: ? ? ? ? matchExpressions: ? - key: appoperator: Invalues:- myapp-apachetopologyKey: kubernetes.io/hostname ?containers: ? ? ? - name: nginximage: 172.17.0.98:5000/myos:httpdports:- protocol: TCPcontainerPort: 80restartPolicy: Alwaysnode節(jié)點(diǎn)親和示例
## 反親和性 ~]# vim web-example.yaml --- apiVersion: apps/v1 kind: Deployment metadata:name: web-example spec:selector:matchLabels:app: myapp-webreplicas: 3revisionHistoryLimit: 10strategy:rollingUpdate:maxSurge: 25%maxUnavailable: 25%type: RollingUpdatetemplate:metadata:labels:app: myapp-webspec:affinity:nodeAffinity:preferredDuringSchedulingIgnoredDuringExecution: ?# 反親和性,表示更傾向于部署在指定節(jié)點(diǎn)上,但不是必須的- weight: 1preference:matchExpressions:- key: cpuoperator: Invalues:- highcontainers:- name: nginximage: 172.17.0.98:5000/myos:httpdports:- protocol: TCPcontainerPort: 80restartPolicy: Always ? # 創(chuàng)建容器 ~]# kubectl apply -f web-example.yaml deployment.apps/web-example configured # 查看 ]# kubectl get pods -o wide NAME ? ? ? ? ? ? ? ? ? ? ? ? ? READY ? STATUS ? RESTARTS ? AGE ? IP ? ? ? ? ? NODE ? ? ? ? ? ? NOMINATED NODE ? READINESS GATES web-example-64d897b884-f8gz5 ? 1/1 ? ? Running ? 0 ? ? ? ? 4s ? 10.244.2.31 ? node2 ? <none> ? ? ? ? ? <none> web-example-64d897b884-fqkj8 ? 1/1 ? ? Running ? 0 ? ? ? ? 5s ? 10.244.1.20 ? node1 ? <none> ? ? ? ? ? <none> web-example-64d897b884-pdsln ? 1/1 ? ? Running ? 0 ? ? ? ? 7s ? 10.244.2.30 ? node2 ? <none> ? ? ? ? ? <none> ? #因?yàn)榉菑?qiáng)制所以都可以分配 ? ## 強(qiáng)制反親和性 ? ~]# vim web-example.yaml --- apiVersion: apps/v1 kind: Deployment metadata:name: php-example spec:selector:matchLabels:app: myapp-phpreplicas: 1template:metadata:labels:app: myapp-phpspec:affinity:requiredDuringSchedulingIgnoredDuringExecution: ?#強(qiáng)制反親和性nodeSelectorTerms:- matchExpressions:- key: memoperator: Invalues:- high- midcontainers:- name: php-fpmimage: 192.168.1.100:5000/myos:php-fpmports:- protocol: TCPcontainerPort: 9000restartPolicy: Always # 查看pod的啟動(dòng)此時(shí)就可以看到處于pengding狀態(tài)了 ]# kubectl get pods -o wide NAME ? ? ? ? ? ? ? ? ? ? ? ? ? READY ? STATUS ? RESTARTS ? AGE ? IP ? ? ? ? ? NODE ? ? ? ? ? ? NOMINATED NODE ? READINESS GATES 10.244.2.30 ? node2 ? <none> ? ? ? ? ? <none> web-example-77647fb5fd-85g4m ? 0/1 ? ? Pending ? 0 ? ? ? ? 3s ? <none> ? ? ? <none> ? ? ? ? ? <none> ? ? ? ? ? <none> # 是因?yàn)閹着_(tái)節(jié)點(diǎn)上都沒有標(biāo)簽所以不知道跳哪天導(dǎo)致的報(bào)錯(cuò),這里給node1設(shè)置一個(gè)標(biāo)簽,就可以跳到node2上 ~]# kubectl label node vm-0-114-centos mem=high ]# kubectl get pods -o wide NAME ? ? ? ? ? ? ? ? ? ? ? ? ? READY ? STATUS ? RESTARTS ? AGE ? IP ? ? ? ? ? NODE ? ? ? ? ? ? NOMINATED NODE ? READINESS GATES web-example-77647fb5fd-85g4m ? 1/1 ? ? Running ? 0 ? ? ? ? 14m ? 10.244.1.21 ? node1 ? <none> ? ? ? ? ? <none> web-example-77647fb5fd-9bc9f ? 1/1 ? ? Running ? 0 ? ? ? ? 41s ? 10.244.1.22 ? node1 ? <none> ? ? ? ? ? <none> web-example-77647fb5fd-9vf4k ? 1/1 ? ? Running ? 0 ? ? ? ? 39s ? 10.244.1.23 ? node1 ? <none> ? ? ? ? ? <none>總結(jié)
以上是生活随笔為你收集整理的k8命令,pod的启动流程与资源文件书写,k8s集群调度的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HPA集群控制器
- 下一篇: kubernetes资源控制与及ingr