今天分享如題:
Kubernetes
?
? ?
?
最近更新緩慢由于工作太忙惹,忙里偷閑整理愿能與君共勉💪
K8S對我來說是個新的技術棧,程序員就是需要一直充電🔋
加油,一起進步💪
結構模型
k8s 是經典的一對多模型,有一個主要的管理節點master
和許多的工作節點slaver
。當然,k8s 也可以配置多個管理節點,擁有兩個以上的管理節點被稱為?高可用。k8s 包括了許多的組件,每個組件都是單運行在一個docker
容器中,然后通過自己規劃的虛擬網絡相互訪問。你可以通過kubectl get pod -n kube-system
查看所有節點上的組件容器。
在管理節點中會比工作節點運行更多的 k8s 組件,我們就是靠著這些多出來的組件來對工作節點發號施令。他們都叫什么這里就不詳細提了。反正對于”基本使用“來說,這些名字并不重要。
理念
要想理解一個東西就要先明白它的內在理念。通俗點就是,k8s 做了什么?為了提供更加可靠的服務,就要增加服務器的數量,減少每個服務器的體量來平攤負載,而越來越多的虛擬機就會帶來越來越高的運維成本。如何讓少量的運維人員就可以管理數量眾多的服務器及其上的服務呢?這就是 k8s 做的工作。
k8s 把數量眾多的服務器重新抽象為一個統一的資源池,對于運維人員來說,他們面前沒有服務器1、服務器2的概念,而是一個統一的資源池,增加新的服務器對運維人員來說,只是增加自資源池的可用量。不僅如此,k8s 把所有能用的東西都抽象成了資源的概念,從而提供了一套更統一,更簡潔的管理方式。
接下來,我會把每個基本命令來逐一進行介紹,并輔以介紹一些基本概念。本文介紹的命令涵蓋了增刪改查四方面,可參加下面表格,因為篇幅較長,我們將create
及之后的不那么常用的命令放在下一篇文章里講:
命令名 | 類型 | 作用 |
---|---|---|
get | 查 | 列出某個類型的下屬資源 |
describe | 查 | 查看某個資源的詳細信息 |
logs | 查 | 查看某個 pod 的日志 |
create | 增 | 新建資源 |
explain | 查 | 查看某個資源的配置項 |
delete | 刪 | 刪除某個資源 |
edit | 改 | 修改某個資源的配置項 |
apply | 改 | 應用某個資源的配置項 |
kubectl get 列出資源!
接下來進入正題,首先來了解一下 k8s 中最最最常用的命令kubectl get
,要記住,k8s 把所有的東西都抽象成了資源,而kubectl get
就是用來查看這些資源的。最常見的資源就是 pod 。
什么是 pod?
pod
(豆莢)。pod 的概念其實和docker
中的容器非常相似。他是 k8s 中的最小工作單位。你可以把 pod 理解成一個一個的小機器人,而 k8s 抽象出來的大資源池就是他們的工廠。
pod
?和?docker
?容器的關系?pod 將一個或多個
docker
容器封裝成一個統一的整體進行管理并對外提供服務。
不僅我們自己的服務是要包裝成 pod 的,就連 k8s 自己也是運行在一堆 pod 上。接下來就讓我們查看一下 k8s 的 pod :
?
kubectl get pod -n kube-system
-n
參數指定了要查看哪個命名空間下的 pod 。k8s 所有的 pod 都被放置在kube-system
命名空間下。
什么是命名空間?
命名空間
namespace
,是 k8s 中”組“的概念,提供同一服務的 pod 就應該被放置同一命名空間下,而不是混雜在一起。k8s 可以用命名空間來做權限控制。如果不指定的話, pod 將被放置在默認的命名空間default
下。
執行了kubectl get pod -n kube-system
命令后,你就可以看到如下內容:
其中每一行就是一個資源,這里我們看到的資源是 pod 。你看到的 pod 數量可能和我的不一致,因為這個列表里包含了 k8s 在所有節點上運行的 pod ,你加入的節點越多,那么顯示的 pod 也就越多。我們來一列一列的看:
NAME
:第一列是 pod 的名字,k8s 可以為 pod 隨機分配一個五位數的后綴。
READY
:第二列是 pod 中已經就緒的 docker 容器的數量,上文中我們提到了,pod 封裝了一個或多個 docker 容器。在這里,1/1
的含義為就緒1個容器/共計1個容器
。
STATUS
:第三列是 pod 的當前狀態,下面是一些常見的狀態:
?
狀態名 | 含義 |
---|---|
Running | 運行中 |
Error | 異常,無法提供服務 |
Pending | 準備中,暫時無法提供服務 |
Terminaling | 結束中,即將被移除 |
Unknown | 未知狀態,多發生于節點宕機 |
PullImageBackOff | 鏡像拉取失敗 |
RESTART
:k8s 可以自動重啟 pod,這一行就是標記了 pod 一共重啟了多少次。
AGE
:pod 一共存在了多長時間。
?
-
kubectl get
可以列出 k8s 中所有資源
這里只介紹了如何用kubectl
獲取 pod 的列表。但是不要把get
和pod
綁定在一起,pod 只是 k8s 中的一種服務,你不僅可以get pod
,還可以get svc
(查看服務)、get rs
(查看副本控制器)、get deploy
(查看部署)等等等等,雖然說kubectl get pod
是最常用的一個,但是如果想查看某個資源而又不知道命令是什么,kbuectl get <資源名>
就對了。
如果你想看更多的信息,就可以指定-o wide
參數,如下:
?
kubectl get pod -n kube-system -o wide
加上這個參數之后就可以看到資源的所在ip
和所在節點node
了。
記得加上?-n
-n
可以說是kubectl get
命令使用最頻繁的參數了,在正式使用中,我們永遠不會把資源發布在默認命名空間。所以,永遠不要忘記在get
命令后面加上-n
。
小結
kubectl get
命令可以列出 k8s 中的資源,而kubectl get pod
是非常常用的查看 pod 的命令。而-n
參數則可以指定 pod 所在的命名空間。
-
kubectl describe 查看詳情!
kubectl describe
命令可以用來查看某一資源的具體信息,他同樣可以查看所有資源的詳情,不過最常用的還是查看 pod 的詳情。他也同樣可以使用-n
參數指定資源所在的命名空間。
舉個例子,我們可以用下面命令來查看剛才 pod 列表中的某個 pod,注意不要忘記把 pod 名稱修改成自己的:
?
kubectl describe pod kube-flannel-ds-amd64-2d6tb -n kube-system
然后你就可以看到很多的信息,咱們分開說,首先是基本屬性,你可以在詳細信息的開頭找到它:
基本屬性
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
# 實例名稱
Name: kube-flannel-ds-amd64-2d6tb
# 所處命名空間
Namespace: kube-system
# 所在節點
Node: worker2/192.168.56.22
# 啟動時間
Start Time: Wed, 03 Jul 2019 09:31:50 +0000
# 標簽
Labels: app=flannel
controller-revision-hash=bfc6b6dd4
pod-template-generation=2
tier=node
# 注解
Annotations: <none>
# 當前狀態
Status: Running
# 所在節點 IP
IP: 192.168.56.22
# 由那種資源生成 / 控制
Controlled By: DaemonSet/kube-flannel-ds-amd64
其中幾個比較常用的,例如Node
、labels
和Controlled By
。通過Node
你可以快速定位到 pod 所處的機器,從而檢查該機器是否出現問題或宕機等。通過labels
你可以檢索到該 pod 的大致用途及定位。而通過Controlled By
,你可以知道該 pod 是由那種 k8s 資源創建的,然后就可以使用kubectl get <資源名>
來繼續查找問題。例如上文DaemonSet/kube-flannel-ds-amd64
,就可以通過kubectl get DaemonSet -n kube-system
來獲取上一節資源的信息。
內部鏡像信息
在中間部分你可以找到像下面一樣的Containers
段落。該段落詳細的描述了 pod 中每個 docker 容器的信息,常用的比如Image
字段,當 pod 出現?ImagePullBackOff
錯誤的時候就可以查看該字段確認拉取的什么鏡像。其他的字段名都很通俗,直接翻譯即可。
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
Containers:
kube-flannel:
Container ID: docker://25d2c4896847bbf53735c57a60c5b3146e2b3a0f86811074bcd28a8291213c18
Image: quay.io/coreos/flannel:v0.11.0-amd64
Image ID: docker://sha256:ff281650a721f46bbe2169292c91031c66411554739c88c861ba78475c1df894
Port: <none>
Host Port: <none>
Command:
/opt/bin/flanneld
Args:
--ip-masq
--kube-subnet-mgr
--iface=enp0s8
State: Running
??????Started:??????Wed,?03?Jul?2020?09:31:53?+0000
Ready: True
Restart Count: 0
Limits:
cpu: 100m
memory: 50Mi
Requests:
cpu: 100m
memory: 50Mi
Environment:
POD_NAME: kube-flannel-ds-amd64-2d6tb (v1:metadata.name)
POD_NAMESPACE: kube-system (v1:metadata.namespace)
Mounts:
/etc/kube-flannel/ from flannel-cfg (rw)
/run from run (rw)
/var/run/secrets/kubernetes.io/serviceaccount from flannel-token-fsqdv (ro)
事件
在describe
查看詳情的時候,最常用的信息獲取處就是這個Event
段落了,你可以在介紹內容的末尾找到它,如下:
?
Events: <none>
是的,如果你看到上面這樣,沒有任何Events
的話,就說明該 pod 一切正常。當 pod 的狀態不是Running
時,這里一定會有或多或少的問題,長得像下面一樣,然后你就可以通過其中的信息分析 pod 出現問題的詳細原因了:
- ?
- ?
- ?
- ?
- ?
- ?
Events:
Type Reason Age From Message ---- ------ ---- ---- -------
Normal Killing 29m kubelet, worker1 Stopping container kube-flannel
Warning FailedCreatePodSandBox 27m (x12 over 29m) kubelet, worker1 Failed create pod sandbox: rpc error: code = Unknown desc = failed to create a sandbox for pod "kube-flannel-ds-amd64-9trbq": Error response from daemon: cgroup-parent for systemd cgroup should be a valid slice named as "xxx.slice"
Normal SandboxChanged 19m (x48 over 29m) kubelet, worker1 Pod sandbox changed, it will be killed and re-created.
Normal Pulling 42s kubelet, worker1 Pulling image "quay.io/coreos/flannel:v0.11.0-amd64"
小結
kubectl describe <資源名> <實例名>
可以查看一個資源的詳細信息,最常用的還是比如kubectl describe pod <pod名> -n <命名空間>
來獲取一個 pod 的基本信息。如果出現問題的話,可以在獲取到的信息的末尾看到Event
段落,其中記錄著導致 pod 故障的原因。
-
kubectl logs 查看日志!
如果你想查看一個 pod 的具體日志,就可以通過kubectl logs <pod名>
來查看。注意,這個只能查看 pod 的日志。通過添加-f
參數可以持續查看日志。例如,查看kube-system
命名空間中某個flannel
?pod 的日志,注意修改 pod 名稱:
?
kubectl logs -f -n kube-system kube-flannel-ds-amd64-2d6tb
然后就可以看到如下輸出:
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
E0706 06:55:15.848891 1 reflector.go:201] github.com/coreos/flannel/subnet/kube/kube.go:310: Failed to list *v1.Node: Get https://10.96.0.1:443/api/v1/nodes?resourceVersion=0: dial tcp 10.96.0.1:443: connect: connection refused
E0706 06:55:16.948058 1 reflector.go:201] github.com/coreos/flannel/subnet/kube/kube.go:310: Failed to list *v1.Node: Get https://10.96.0.1:443/api/v1/nodes?resourceVersion=0: dial tcp 10.96.0.1:443: connect: connection refused
E0706 06:55:17.949165 1 reflector.go:201] github.com/coreos/flannel/subnet/kube/kube.go:310: Failed to list *v1.Node: Get https://10.96.0.1:443/api/v1/nodes?resourceVersion=0: dial tcp 10.96.0.1:443: connect: connection refused
E0706 06:55:18.954108 1 reflector.go:201] github.com/coreos/flannel/subnet/kube/kube.go:310: Failed to list *v1.Node: Get https://10.96.0.1:443/api/v1/nodes?resourceVersion=0: dial tcp 10.96.0.1:443: connect: connection refused
E0706 06:55:19.955267 1 reflector.go:201] github.com/coreos/flannel/subnet/kube/kube.go:310: Failed to list *v1.Node: Get https://10.96.0.1:443/api/v1/nodes?resourceVersion=0: dial tcp 10.96.0.1:443: connect: connection refused
E0706 06:55:21.046592 1 reflector.go:201] github.com/coreos/flannel/subnet/kube/kube.go:310: Failed to list *v1.Node: Get https://10.96.0.1:443/api/v1/nodes?resourceVersion=0: dial tcp 10.96.0.1:443: connect: connection refused
E0706 06:55:22.048285 1 reflector.go:201] github.com/coreos/flannel/subnet/kube/kube.go:310: Failed to list *v1.Node: Get https://10.96.0.1:443/api/v1/nodes?resourceVersion=0: dial tcp 10.96.0.1:443: connect: connection refused
E0706 06:55:23.147040 1 reflector.go:201] github.com/coreos/flannel/subnet/kube/kube.go:310: Failed to list *v1.Node: Get https://10.96.0.1:443/api/v1/nodes?resourceVersion=0: dial tcp 10.96.0.1:443: connect: connection refused
E0706 06:55:24.148350 1 reflector.go:201] github.com/coreos/flannel/subnet/kube/kube.go:310: Failed to list *v1.Node: Get https://10.96.0.1:443/api/v1/nodes?resourceVersion=0: dial tcp 10.96.0.1:443: connect: connection refused
E0706 06:55:25.247352 1 reflector.go:201] github.com/coreos/flannel/subnet/kube/kube.go:310: Failed to list *v1.Node: Get https://10.96.0.1:443/api/v1/nodes?resourceVersion=0: dial tcp 10.96.0.1:443: connect: connection refused
E0706 06:55:26.248831 1 reflector.go:201] github.com/coreos/flannel/subnet/kube/kube.go:310: Failed to list *v1.Node: Get https://10.96.0.1:443/api/v1/nodes?resourceVersion=0: dial tcp 10.96.0.1:443: connect: connection refused
E0706 06:55:27.347224 1 reflector.go:201] github.com/coreos/flannel/subnet/kube/kube.go:310: Failed to list *v1.Node: Get https://10.96.0.1:443/api/v1/nodes?resourceVersion=0: dial tcp 10.96.0.1:443: connect: connection refused
E0706 06:55:28.348182 1 reflector.go:201] github.com/coreos/flannel/subnet/kube/kube.go:310: Failed to list *v1.Node: Get https://10.96.0.1:443/api/v1/nodes?resourceVersion=0: dial tcp 10.96.0.1:443: connect: connection refused
E0706 06:55:29.350578 1 reflector.go:201] github.com/coreos/flannel/subnet/kube/kube.go:310: Failed to list *v1.Node: Get https://10.96.0.1:443/api/v1/nodes?resourceVersion=0: dial tcp 10.96.0.1:443: connect: connection refused...
如果你發現某個 pod 的服務有問題,但是狀態還是顯示Running
,就可以使用kubectl logs
來查看其詳細日志。
總結
在本篇文章里,我們了解了 k8s 的宗旨和一些基本概念,并知道了最為常用的get
、descibe
及logs
命令,知道了這三條命令之后就幾乎可以從 k8s 中獲取所有常用信息了。
📌上周分享的Kbuernetes跳轉地址:
希望我們都能對生活保持熱愛?
以下為之前分享的寶藏內容
?
?
?
我認為資料的價值在于能用、好用,不是滿足人的占有欲和獲得感。所以,也請各位擦亮雙眼,提高標準。得到的同時記得他的價值所在,收獲的同時,也請做好擇優標準。BTW,學長做的不好的地方,歡迎你們提出來,又或者如果屏幕前的你將更好的資源拿出分享,那真的十分優秀,也希望各位能無私互助。獲取資料不強制轉發。
希望學長分享的內容對你我都有幫助💪
?
Pandas系列文章
?
?
Pandas系列文章
【技術分析】數據處理工具Pandas 下
【技術分析】數據處理工具Pandas?上
?PART2分享文章
?
-
【習慣法則】所有的習慣養成都遵循21天法則?
-
【學長雜談】積極廢人?自救指南
-
【分享】后廠村鮮為人知的一面
-
【分享】HI,好久不見的學長
-
【測試開發】分享測試開發工程師的內心獨白
-
【AI】代碼自動補全神器,KITE?
-
【影視分享】看諾蘭新片《信條》前還需要做哪些準備工作
-
【面試經歷】有關于-ByteDance. -01字節奇緣
-
【面試經驗】學長一面百度-經驗分享
-
【學習資源】python課程分享_建議分享+收藏
-
【夏季八談】擺攤吧,后浪
?
"生活是苦難的,我又劃著我的斷槳出發了”
?
?
PS:公號內回復 :學長微信,即可聯系到我!
?
覺得內容不錯的 歡迎點擊「在看」支持 謝謝各位
?
我也希望這個世界會因為分享而更美好!
單純分享,無任何利益相關!
?
最后分享一下個人博客以及個人攝影網站📷
www.WakeMeUpNow.cn