前言
kubectl 工具能夠支持三種對象管理方式:
- 聲明式對象配置
- 指令式命令
- 指令式對象配置
前面我使用了兩篇文章講解了使用配置文件對 Kubernetes 對象進(jìn)行聲明式管理的相關(guān)知識點(diǎn),本篇文章我將帶領(lǐng)大家一起學(xué)習(xí)剩下的兩個(gè)Kubernetes 對象管理的指令式命令管理和配置文件命令式管理。
一、使用指令式命令管理 Kubernetes 對象
使用構(gòu)建在 kubectl 命令行工具中的指令式命令可以直接快速創(chuàng)建、更新和刪除 Kubernetes 對象。本篇文章將解釋這些命令的組織方式以及如何使用它們來管理現(xiàn)時(shí)對象。
1.1、創(chuàng)建對象
kubectl 工具支持動詞驅(qū)動的命令,用來創(chuàng)建一些最常見的對象類別。 命令的名稱設(shè)計(jì)使得不熟悉 Kubernetes 對象類型的用戶也能做出判斷。
- run:創(chuàng)建一個(gè)新的 Pod 來運(yùn)行一個(gè)容器。
- expose:創(chuàng)建一個(gè)新的 Service 對象為若干 Pod 提供流量負(fù)載均衡。
- autoscale:創(chuàng)建一個(gè)新的 Autoscaler 對象來自動對某控制器(如 Deployment) 執(zhí)行水平擴(kuò)縮。
kubectl 命令也支持一些對象類型驅(qū)動的創(chuàng)建命令。 這些命令可以支持更多的對象類別,并且在其動機(jī)上體現(xiàn)得更為明顯,不過要求 用戶了解它們所要?jiǎng)?chuàng)建的對象的類別。
create <對象類別> [<子類別>] <實(shí)例名稱>
某些對象類別擁有自己的子類別,可以在 create 命令中設(shè)置。 例如,Service 對象有 ClusterIP、LoadBalancer 和 NodePort 三種子類別。
下面是一個(gè)創(chuàng)建 NodePort 子類別的 Service 的示例:
$ kubectl create service nodeport <服務(wù)名稱>
在前述示例中,create service nodeport
命令也稱作 create service
命令的子命令。 可以使用 -h 標(biāo)志找到一個(gè)子命令所支持的參數(shù)和標(biāo)志。
$ kubectl create service nodeport -h
1.2、更新對象
kubectl 命令也支持一些動詞驅(qū)動的命令,用來執(zhí)行一些常見的更新操作。 這些命令的設(shè)計(jì)是為了讓一些不了解 Kubernetes 對象的用戶也能執(zhí)行更新操作, 但不需要了解哪些字段必須設(shè)置:
- scale:對某控制器進(jìn)行水平擴(kuò)縮以便通過更新控制器的副本個(gè)數(shù)來添加或刪除 Pod。
- annotate:為對象添加或刪除注解。
- label:為對象添加或刪除標(biāo)簽。
kubectl 命令也支持由對象的某一方面來驅(qū)動的更新命令。 設(shè)置對象的這一方面可能對不同類別的對象意味著不同的字段:
- set <字段>:設(shè)置對象的某一方面。
kubectl 工具支持以下額外的方式用來直接更新現(xiàn)時(shí)對象,不過這些操作要求 用戶對 Kubernetes 對象的模式定義有很好的了解:
- edit:通過在編輯器中打開現(xiàn)時(shí)對象的配置,直接編輯其原始配置。
- patch:通過使用補(bǔ)丁字符串(Patch String)直接更改某現(xiàn)時(shí)對象的的特定字段。
1.3、刪除對象
我們可以使用 delete
命令從集群中刪除一個(gè)對象:
delete <類別>/<名稱>
可以使用 kubectl delete
來執(zhí)行指令式命令或者指令式對象配置。不同之處在于傳遞給命令的參數(shù)。要將 kubectl delete
作為指令式命令使用,將要?jiǎng)h除的對象作為 參數(shù)傳遞給它。
下面是一個(gè)刪除名為 nginx 的 Deployment 對象的命令:
$ kubectl delete deployment/nginx
1.4、查看對象
用來打印對象信息的命令有好幾個(gè):
- get:打印匹配到的對象的基本信息。使用 get -h 可以查看選項(xiàng)列表。
- describe:打印匹配到的對象的詳細(xì)信息的匯集版本。
- logs:打印 Pod 中運(yùn)行的容器的 stdout 和 stderr 輸出。
1.5、使用 set 命令在創(chuàng)建對象之前修改對象
有些對象字段在 create 命令中沒有對應(yīng)的標(biāo)志。在這些場景中, 你可以使用 set 和 create 命令的組合來在對象創(chuàng)建之前設(shè)置字段值。 這是通過將 create 命令的輸出用管道方式傳遞給 set 命令來實(shí)現(xiàn)的, 最后執(zhí)行 create 命令來創(chuàng)建對象。
下面是一個(gè)例子:
$ kubectl create service clusterip my-svc --clusterip="None" -o yaml --dry-run=client | kubectl set selector --local -f - 'environment=qa' -o yaml | kubectl create -f -
- 命令
kubectl create service -o yaml --dry-run=client
創(chuàng)建 Service 的配置,但 將其以 YAML 格式在標(biāo)準(zhǔn)輸出上打印而不是發(fā)送給 API 服務(wù)器。 - 命令
kubectl set selector --local -f - -o yaml
從標(biāo)準(zhǔn)輸入讀入配置,并將更新后的 配置以 YAML 格式輸出到標(biāo)準(zhǔn)輸出。 - 命令
kubectl create -f -
使用標(biāo)準(zhǔn)輸入上獲得的配置創(chuàng)建對象。
1.6、在創(chuàng)建之前使用 --edit 更改對象
使用 kubectl create --edit
來在對象被創(chuàng)建之前執(zhí)行任意的變更。
下面是一個(gè)例子:
$ kubectl create service clusterip my-svc --clusterip="None" -o yaml --dry-run=client > /tmp/srv.yaml
kubectl create --edit -f /tmp/srv.yaml
命令 kubectl create service
創(chuàng)建 Service 的配置并將其保存到 /tmp/srv.yaml
文件。
命令 kubectl create --edit
在創(chuàng)建 Service 對象打開其配置文件進(jìn)行編輯。
二、使用配置文件對 Kubernetes 對象進(jìn)行命令式管理
使用 kubectl 命令行工具以及用 YAML 或 JSON 編寫的對象配置文件來創(chuàng)建、更新和刪除 Kubernetes 對象。 本文檔說明了如何使用配置文件定義和管理對象。
1.1、創(chuàng)建對象
可以使用 kubectl create -f
從配置文件創(chuàng)建一個(gè)對象。
$ kubectl create -f <filename|url>
1.2、更新對象
可以使用 kubectl replace -f
根據(jù)配置文件更新活動對象。
$ kubectl replace -f <filename|url>
使用 replace 命令更新對象會刪除所有未在配置文件中指定的規(guī)范的某些部分。 不應(yīng)將其規(guī)范由集群部分管理的對象使用,比如類型為 LoadBalancer 的服務(wù), 其中 externalIPs 字段獨(dú)立于配置文件進(jìn)行管理。 必須將獨(dú)立管理的字段復(fù)制到配置文件中,以防止 replace 刪除它們。
1.3、刪除對象
你可以使用 kubectl delete -f
刪除配置文件中描述的對象。
$ kubectl delete -f <filename|url>
如果配置文件在 metadata 節(jié)中設(shè)置了 generateName 字段而非 name 字段, 無法使用 kubectl delete -f <filename|url>
來刪除該對象。 必須使用其他標(biāo)志才能刪除對象。例如:
$ kubectl delete <type> <name>
$ kubectl delete <type> -l <label>
1.4、查看對象
可以使用 kubectl get -f
查看有關(guān)配置文件中描述的對象的信息。
$ kubectl get -f <filename|url> -o yaml
-o yaml 標(biāo)志指定打印完整的對象配置。 使用 kubectl get -h
查看選項(xiàng)列表。
1.5、局限性
當(dāng)完全定義每個(gè)對象的配置并將其記錄在其配置文件中時(shí),create、 replace 和delete 命令會很好的工作。 但是,當(dāng)更新一個(gè)活動對象,并且更新沒有合并到其配置文件中時(shí),下一次執(zhí)行 replace 時(shí),更新將丟失。 如果控制器,例如 HorizontalPodAutoscaler ,直接對活動對象進(jìn)行更新,則會發(fā)生這種情況。
這有一個(gè)例子:
- 從配置文件創(chuàng)建一個(gè)對象。
- 另一個(gè)源通過更改某些字段來更新對象。
- 從配置文件中替換對象。在步驟2中所做的其他源的更改將丟失。
如果需要支持同一對象的多個(gè)編寫器,則可以使用 kubectl apply 來管理該對象。
1.5、從 URL 創(chuàng)建和編輯對象而不保存配置
假設(shè)你具有對象配置文件的 URL。 你可以在創(chuàng)建對象之前使用 kubectl create --edit
對配置進(jìn)行更改。 這對于指向可以由讀者修改的配置文件的教程和任務(wù)特別有用。
$ kubectl create -f <url> --edit
1.6、從命令式命令遷移到命令式對象配置
從命令式命令遷移到命令式對象配置涉及幾個(gè)手動步驟。
將活動對象導(dǎo)出到本地對象配置文件:
$ kubectl get <kind>/<name> -o yaml > <kind>_<name>.yaml
從對象配置文件中手動刪除狀態(tài)字段。
對于后續(xù)的對象管理,只能使用 replace 。
$ kubectl replace -f <kind>_<name>.yaml
1.7、定義控制器選擇器和 PodTemplate 標(biāo)簽
推薦的方法是定義單個(gè)不變的 PodTemplate 標(biāo)簽,該標(biāo)簽僅由控制器選擇器使用,而沒有其他語義。
標(biāo)簽示例:文章來源:http://www.zghlxwxcb.cn/news/detail-414291.html
selector:
matchLabels:
controller-selector: "apps/v1/deployment/nginx"
template:
metadata:
labels:
controller-selector: "apps/v1/deployment/nginx"
總結(jié)
文章寫到這里,Kubernetes 對象管理的三種方式已經(jīng)寫完了,如果本篇文章對你有幫助,請支持一下,謝謝。
下一篇我們將一起學(xué)習(xí)如何使用 kubectl patch 更新 API 對象。文章來源地址http://www.zghlxwxcb.cn/news/detail-414291.html
到了這里,關(guān)于【云原生 | Kubernetes 系列】K8s 實(shí)戰(zhàn) Kubernetes 對象管理之指令式命令管理和配置文件命令式管理的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!