目錄
一、擷取資源
二、手動部署一個應用
2.1 手動建立一個控制器deployment
2.2 部署一個service
2.3 動态擴縮容Pod副本
2.4 滾動更新
2.5 動态復原
2.6 配置從叢集外部通路myapp
此篇接上一篇 《Kubernetes 學習筆記(一)--- 基本概念及利用kubeadm部署K8S》
指令
kubectl
是API Server的用戶端程式。
taints
:污點,用于描述節點的污點。Pod排程到某個節點,取決于能夠容忍某個節點的污點的最大限度。
指令:
kubectl describe node k8s-master.fhw.com
可檢視節點的污點(taints)

image.png
一、擷取資源
kubectl get <資源名稱>
幫助:
kubectl get --help
使用
kubectl api-resources
擷取支援的資源的完整清單。
以node資源為例:
kubectl get nodes
參數:
- -o wide 輸出格式,常用格式:json | yaml | wide;
- -w 監控輸出結果,類似tail指令的-f選項;
- --show-labels 顯示标簽;
擷取資源的詳細資訊:
kubectl describe node k8s-master.fhw.com
擷取叢集資訊:
[root@k8s-master .kube]# kubectl cluster-info
Kubernetes master is running at https://192.168.100.135:6443
KubeDNS is running at https://192.168.100.135:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
二、手動部署一個應用
2.1 手動建立一個控制器deployment
建立一個控制器
[root@k8s-master .kube]# kubectl run nginx-deploy --image=nginx:1.14-alpine --replicas=1 --port=80
deployment.apps/nginx-deploy created
-
,pod重新開機政策,Always是pod退出後總是立即重新開機,Never是pod退出後不再重新開機。預設是Always--restart=[Always, OnFailure, Never]
-
,指定在容器中運作的指令;--command -- <cmd> <arg1> ... <argN>
-
,建立一個Cron Job控制器。--schedule="0/5 * * * ?"
檢視deployment清單:
[root@k8s-master .kube]# kubectl get deployment
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
nginx-deploy 1 1 1 1 11m
控制器建立後,會自動部署Pod:
[root@k8s-master .kube]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE
nginx-deploy-5b595999-54c56 1/1 Running 0 1h 10.244.2.3 k8s-node2.fhw.com <none>
通過pod 的IP通路pod中運作的nginx服務:
curl 10.244.2.3
能夠正常通路。
2.2 部署一個service
service為pod提供一個固定通路端點。
用法:
Usage:
kubectl expose (-f FILENAME | TYPE NAME) [--port=port] [--protocol=TCP|UDP] [--target-port=number-or-name]
[--name=name] [--external-ip=external-ip-of-service] [--type=type] [options]
部署service
[root@k8s-master .kube]# kubectl expose deployment nginx-deploy --port=80 --target-port=80 --protocol=TCP --type=ClusterIP
service/nginx-deploy exposed
:暴露的資源類型為控制器deployment;
deployment
: deployment的名稱
nginx-deploy
: service的端口
--port=80
: Pod的端口
--target-port=80
--type=""
: service類型有ClusterIP, NodePort, LoadBalancer, or ExternalName. Default is 'ClusterIP'.
--
:表示這個service隻能在群集内部通路,不能在叢集外部通路;
ClusterIP
:表示可以在叢集外部通路到;
NodePort
擷取service清單:
[root@k8s-master .kube]# kubectl get svc -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 20h <none>
nginx ClusterIP 10.106.125.69 <none> 80/TCP 8s
通過service IP 通路pod中的nginx服務:
curl 10.106.125.69
可以正常通路。
運作一個用戶端Pod,在用戶端Pod内部通過service的名稱去通路nginx服務。
kubectl run client -it --image=busybox --replicas=1 --restart=Never
如下圖,直接通過service的名稱nginx,可以正常通路:
service通過label去關聯pod:
這時你删除這個關聯的pod,控制器會立即啟動一個新pod,并且關聯至名為nginx這個service。
2.3 動态擴縮容Pod副本
先建立一個新應用,叫myapp:
[root@k8s-master ~]# kubectl run myapp --image=ikubernetes/myapp:v1 --replicas=2
deployment.apps/myapp created
[root@k8s-master ~]#
[root@k8s-master ~]# kubectl get deployment -w
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
myapp 2 2 2 2 22s
nginx-deploy 1 1 1 1 3h
[root@k8s-master ~]#
[root@k8s-master ~]#
[root@k8s-master ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE
client 1/1 Running 0 1h 10.244.2.4 k8s-node2.fhw.com <none>
myapp-848b5b879b-fqbkd 1/1 Running 0 42s 10.244.1.6 k8s-node1.fhw.com <none>
myapp-848b5b879b-j7lj5 1/1 Running 0 42s 10.244.2.5 k8s-node2.fhw.com <none>
nginx-deploy-5b595999-54c56 1/1 Running 0 2h 10.244.2.3 k8s-node2.fhw.com <none>
在第2.2節建立的用戶端Pod中通過ip通路建立的應用myapp:
兩個Pod中的内容分别對應Pod名稱。
為myapp建立一個service。
kubectl expose deployment myapp --name=myapp --port=80
再到用戶端Pod中使用service名稱myapp去通路:
如圖,兩個myapp Pod做負載均衡。
将myapp擴容至5個
kubectl scale deployment myapp --replicas=5
這時新增的Pod會立即加入到myapp service中接受請求。
再将myapp縮減至3個
2.4 滾動更新
更新myapp鏡像的版本。
[root@k8s-master ~]# kubectl set image deployment myapp myapp=ikubernetes/myapp:v2
deployment.extensions/myapp image updated
檢視滾動更新狀态
[root@k8s-master ~]# kubectl rollout status deployment myapp
deployment "myapp" successfully rolled out
檢視滾動更新後的結果
myapp更新過後,pod名稱也更新了
檢視pod内容器的鏡像版本:
2.5 動态復原
kubectl rollout undo deployment myapp
預設復原至上一版本
檢視復原結果:
自動擴縮容依賴于監控系統,去監控系統資源使用率,根據系統資源去判斷是否需要擴容。這個問題後續再記錄。
2.6 配置從叢集外部通路myapp
修改service myapp的類型為NodePort
kubectl edit svc myapp
修改後:
檢視service myapp
在叢集中每個節點上都會開啟一個31679端口(這個端口是随機生成的),映射到K8S叢集的myapp service的80端口。可自行在其它節點驗證。
提供給叢集外部的通路端口為31679。
外部通路位址:http://192.168.100.135:31679
在192.168.100.200這台主機上驗證,如圖:
三個節點均可正常通路。
如果想通過一個固定位址去通路這個myapp,可以利用nginx做反向代理:
此篇結尾:
這一篇筆記隻是示範如何通過手動去建立、更新、復原一個應用。這隻是在使用K8S中,最簡單但是無法實作其全部功能 、全部定制的一種使用方式。而在真正使用K8S時,基本不會這樣去操作。我們使用K8S的常用方式,應該是基于YAML格式的配置檔案來定義和建立資源。
下一篇學習用YAML配置檔案來建立資源。