kubectl 使用 聲明式管理(yaml文件)
一:聲明式管理方法
1.1 什么是聲明式管理
聲明式管理方法:
- 適合於對資源的修改操作
- 聲明式資源管理方法依賴於資源配置清單文件對資源進行管理
- 資源配置清單文件有兩種格式: yaml (人性化,易讀) , json (易於api接口解析)
- 對資源的管理,是通過事先定義在統一資源配置清單內,再通過陳述式命令應用到k8s集群里
- 語法格式: kubectl create/apply/delete -f xxxx. yaml
1.2 查看資源配置
1.2.1 查看資源配置清單
#將資源配置輸出為yaml 格式
kubectl -n kube-public get deployments.apps nginx -o yaml
1.2 使用explain 解釋資源配置清單
#查看deployment資源配置里字段解釋(只能看到第一層的字段)
kubectl explain -n kube-public deployment
#查看deployment里的metadata字段解釋
kubectl explain -n kube-public deployment.metadata
#查看service 資源配置里的第一層字段解釋
kubectl explain -n kube-public service
#查看service配置里,metadata字段的解釋
kubectl explain -n kube-public service.metadata
1.3 修改資源配置清單並應用
1.3.1 離線修改
離線修改:
修改yaml 文件,並用 kubectl apply -f xxx.yaml 文件使之生效。
注意:當apply 不生效時,先使用delete 清除資源,在apply 創建資源
create 和 apply 的區別
- 都可以使用 kubectl create/apply -f xxx.yaml 創建資源
- create:只能用於創建,不能apply更新。 如果要更新需要先delete 刪除資源,在create/apply創建 新的
- apply:可以創建,也可以直接更新
#將service 資源配置以yaml格式顯示,導入到nginx-svc.yaml里
kubectl -n kube-public get service nginx-service -o yaml > nginx-svc.yaml
#修改yaml 文件,將port 項值修改為8080
vim nginx-svc.yaml
#先使用聲明式方式刪除
kubectl delete -f nginx-svc.yaml
#指定yaml文件,使用聲明式方式創建service
kubectl apply -f nginx-svc.yaml
#再次查看,端口變為了8080
kubectl get svc -n kube-public
1.3.2 在線修改
直接使用kubectl edit service nginx
在線編輯資源配置清單,並保存退出。保存退出后立即生效(如port:888)
此修改方式不會對yaml 文件內容修改
#使用kubect edit 在線修改 資源
kubectl edit -n kube-public service
#將port 值修改為888,並保存退出
kubectl get svc -n kube-public
1.4 刪除資源配置清單
1.4.1 陳述式刪除
#陳述式刪除
kubectl -n kube-public delete service nginx-service
1.4.2 聲明式刪除
#指定yaml 文件,聲明式刪除
kubectl delete -f nginx-svc.yaml
二:使用YALML 管理資源對象
2.1 k8s 的yaml
Kubernetes支持YAML和JSON格式管理資源對象
-
JSON格式:主要用於api接口之間消息的傳遞
-
YAMI格式:用於配置和管理, YAML是一種簡潔的非標記性語言,內容格式人性化,較易讀
YAML語法格式:
- 大小寫敏感使用縮進表示層級關系
- 不支持Tab鍵制表符縮進,只使用空格縮進
- 縮進的空格數目不重要,只要相同層級的元素左側對齊即可,通常開頭縮進兩個空格
- 符號字符后縮進一個空格,如冒號,逗號,短橫桿(-)等
- "---"表示YAMI格式,一個文件的開始,用於分隔文件
- "#"表示注釋
2.2 查看api 資源版本標簽
# 查看api 的版本,不同的k8s版本,支持的api version不同
kubectl api-versions
2.3 編寫yaml 文件
[root@master ~]# mkdir /opt/demo
[root@master ~]# cd /opt/demo/
[root@master demo]# vim nginx-deploymenet.yaml
apiVersion: apps/v1 #指定api版本標簽
kind: Deployment #定義資源的類型。可以是Deployment,Job,Ingress,Service等
metadata: #定義資源的元數據信息,比如資源的名稱,namespace,標簽等信息
name: nginx-deployment #定義資源的名稱,在同一個namespace空間中必須是唯一的
namespace: default #定義命名空間
labels: #定義Deployment資源標簽
app: nginx
spec: #定義deployment資源需要的參數屬性,如,是否在容器失敗時重啟容器的屬性
replicas: 3 #定義副本的數量
selector: #定義標簽選擇器
matchLabels: #定義匹配的標簽
app: nginx #需要與.spec.template.metadata.labels定義的標簽保持一致
template: #定義 業務模板,如果有多個副本,所有的副本屬性會按照模板的相關配置進行匹配
metadata: #定義pod使用的元信息
labels: #定義Pod副本將使用的標簽,需要與.spec.selector.matchLabels 定義的標簽保持一致
app: nginx
spec: #定義pod副本的屬性(如pod里有幾個容器,容器名,容器鏡像,端口等)
containers: #定義容器屬性
- name: nginx #容器的名稱
image: nginx:1.15.12 #容器使用的鏡像
ports: #定義容器使用的端口
- containerPort: 80 #容器使用80端口
ports:
- containerPort: 80
2.4 使用yaml 文件創建資源對象
#創建資源對象
kubectl create -f nginx-deploymenet.yaml
#查看pod的信息
kubectl get pods -o wide
#查看pod使用的標簽
kubectl get pods --show-labels
2.5 使用service 服務對外提供訪問並測試
2.5.1 創建service資源的yaml文件
vim nginx-service.yaml
apiVersion: v1
kind: Service #定義資源類型為Service
metadata: #定義Service的元信息
name: nginx-service #定義service的名稱
namespace: default #定義service的命名空間(和deployment在一個空間)
labels: #定義service的標簽
app: nginx
spec: #設置service的屬性
type: NodePort #指定service的類型,使用NodePort。
ports: #指定端口,一個容器里的服務,對應一個端口。有幾個服務,就創建幾組
- port: 8888 #指定ClusterIP 使用的端口
targetPort: 80 #指定pod使用的端口
nodePort: 31234 #如不指定,會在30000-32767 隨機分配
selector: #使用標簽選擇器去選擇和對應的pod進行關聯
app: nginx
2.5.2創建資源對象
#創建資源對象
kubectl create -f nginx-service.yaml
#查看svc資源
kubectl get svc
2.5.3 訪問測試
curl -I http://192.168.23.12:31234
curl -I http://192.168.23.13:31234
2.6 詳解k8s中port
-
port
- 是k8s集群內部訪問service的端口,即通過clusterIP: port可以從Pod所在的Node上訪問到service.
-
nodePort
- nodePort是外部訪問k8s集群中service的端口,通過nodelP: nodePort可以從外部訪問到某個service4
-
targetPort
- targetport是Pod的端口,從port或nodeport來的流量經過kube-proxy反向代理負載均衡轉發到后端Pod的targetPort上,最后進入容器。
-
containerPort
- containerPort是Pod內部容器的端口, targetPort映射到containerPort.
三: 創建模板
3.1 使用--dry-run 試運行的方式生成模板,創建資源
3.1.1 生成模板
#kubectl run --dry-run 打印相應的API對象而不執行創建
kubectl run nginx-test --image=nginx --port=80 --replicas=3 --dry-run
#查看,並沒有生成相應的pod
kubectl get pods
#查看生成的yaml 格式
kubectl run nginx-test --image=nginx --port=80 --replicas=3 --dry-run -o yaml
#查看生成的json格式
kubectl run nginx-test --image=nginx --port=80 --replicas=3 --dry-run -o json
#使用yaml 格式導出生成模板,並進行修改,刪除一些不必要的參數
kubectl run nginx-test --image=nginx --port=80 --replicas=3 --dry-run -o yaml > nginx-test.yaml
3.1.2 修改模板
vim nginx-test.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
run: nginx-test
name: nginx-test
spec:
replicas: 3
selector:
matchLabels:
run: nginx-test
template:
metadata:
labels:
run: nginx-test
spec:
containers:
- image: nginx
name: nginx-test
ports:
- containerPort: 80
3.1.3 根據生成的模板創建資源
#根據模板創建資源
kubectl apply -f nginx-test.yaml
kubectl get pods
3.2 使用現有的資源生成模板導出
3.2.1 生成模板
#將現有的資源生成模板導出。 --export 可以刪除一些多余的配置
kubectl get deployments.apps nginx-deployment --export -o yaml
#將模板保存到文件中
kubectl get deployments.apps nginx-deployment --export -o yaml > my-deploy.yaml
3.2.2 修改模板
vim my-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx
name: my-deploy
spec:
progressDeadlineSeconds: 600
replicas: 3
revisionHistoryLimit: 10
selector:
matchLabels:
app: mydeploy-nginx
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
labels:
app: mydeploy-nginx
spec:
containers:
- image: nginx:1.15.12
name: nginx
ports:
- containerPort: 80
protocol: TCP
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
3.2.3 根據模板生成資源
#根據模板生成資源
kubectl apply -f my-deploy.yaml
#查看生成的deployment 信息
kubectl get deployments.apps my-deploy