k8s 基本使用
Kubernetes 編排系統(tǒng):https://www.cnblogs.com/gaoyuechen/p/8685771.html
k8s 集群中的 yaml 文件詳解:https://blog.csdn.net/qq_28361541/article/details/106089574
什么是 k8s,k8s 有什么功能 ? :https://www.jianshu.com/p/707c8ebb8616
k8s :https://www.cnblogs.com/xy51/p/12744956.html
k8s 超詳細(xì)總結(jié):https://www.cnblogs.com/cheyunhua/p/14498014.html
k8s 總結(jié):http://yaoguais.github.io/article/golang/k8sinterview.html
K8s 初識(shí):http://www.weixuecn.cn/article/11410.html
《Kubernetes實(shí)戰(zhàn)》
Kubernetes 是什么?
Kubernetes,又稱(chēng)為 k8s(首字母為 k、首字母與尾字母之間有 8 個(gè)字符、尾字母為 s,所以簡(jiǎn)稱(chēng) k8s)或者簡(jiǎn)稱(chēng)為 "kube" ,是一種可自動(dòng)實(shí)施?Linux 容器操作的開(kāi)源平臺(tái)。它可以幫助用戶(hù)省去應(yīng)用容器化過(guò)程的許多手動(dòng)部署和擴(kuò)展操作。也就是說(shuō),您可以將運(yùn)行 Linux 容器的多組主機(jī)聚集在一起,由 Kubernetes 幫助您輕松高效地管理這些集群。而且,這些集群可跨公共云、私有云或混合云部署主機(jī)。因此,對(duì)于要求快速擴(kuò)展的云原生應(yīng)用而言(例如借助 Apache Kafka 進(jìn)行的實(shí)時(shí)數(shù)據(jù)流處理),Kubernetes 是理想的托管平臺(tái)。
Kubernetes 最初由 Google 的工程師開(kāi)發(fā)和設(shè)計(jì)。Google 是最早研發(fā) Linux 容器技術(shù)的企業(yè)之一(組建了cgroups),曾公開(kāi)分享介紹?Google 如何將一切都運(yùn)行于容器之中(這是 Google 云服務(wù)背后的技術(shù))。Google 每周會(huì)啟用超過(guò) 20 億個(gè)容器——全都由內(nèi)部平臺(tái)?Borg?支撐。Borg 是 Kubernetes 的前身,多年來(lái)開(kāi)發(fā) Borg 的經(jīng)驗(yàn)教訓(xùn)成了影響 Kubernetes 中許多技術(shù)的主要因素。
趣事:Kubernetes 徽標(biāo)的七個(gè)輪輻代表著項(xiàng)目最初的名稱(chēng)"九之七項(xiàng)目"(Project Seven of Nine)。
Kubernetes相關(guān)術(shù)語(yǔ)
點(diǎn)擊查看 Kubernetes (k8s)術(shù)語(yǔ)表
和其它技術(shù)一樣,Kubernetes 也會(huì)采用一些專(zhuān)用的詞匯,這可能會(huì)對(duì)初學(xué)者理解和掌握這項(xiàng)技術(shù)造成一定的障礙。為了幫助您了解 Kubernetes,我們?cè)谙旅鎭?lái)解釋一些常用術(shù)語(yǔ)。
- 主機(jī)(Master):?用于控制 Kubernetes 節(jié)點(diǎn)的計(jì)算機(jī)。所有任務(wù)分配都來(lái)自于此。
- 節(jié)點(diǎn)(Node):負(fù)責(zé)執(zhí)行請(qǐng)求和所分配任務(wù)的計(jì)算機(jī)。由 Kubernetes 主機(jī)負(fù)責(zé)對(duì)節(jié)點(diǎn)進(jìn)行控制。
- 容器集(Pod):被部署在單個(gè)節(jié)點(diǎn)上的,且包含一個(gè)或多個(gè)容器的容器組。同一容器集中的所有容器共享同一個(gè) IP 地址、IPC、主機(jī)名稱(chēng)及其它資源。容器集會(huì)將網(wǎng)絡(luò)和存儲(chǔ)從底層容器中抽象出來(lái)。這樣,您就能更加輕松地在集群中移動(dòng)容器。
- 復(fù)制控制器(Replication controller):用于控制應(yīng)在集群某處運(yùn)行的完全相同的容器集副本數(shù)量。
- 服務(wù)(Service):將工作內(nèi)容與容器集分離。Kubernetes 服務(wù)代理會(huì)自動(dòng)將服務(wù)請(qǐng)求分發(fā)到正確的容器集——無(wú)論這個(gè)容器集會(huì)移到集群中的哪個(gè)位置,甚至可以被替換掉。
- Kubelet:運(yùn)行在節(jié)點(diǎn)上的服務(wù),可讀取容器清單(container manifest),確保指定的容器啟動(dòng)并運(yùn)行。
- kubectl:?Kubernetes 的命令行配置工具。
k8s基本原理
https://juejin.cn/post/6844903902869995534
- k8s demo 部署示例
- k8s 基本架構(gòu)和原理
- k8s 資源對(duì)象
- k8s 網(wǎng)絡(luò)模型
- 總結(jié)
學(xué)習(xí) Kubernetes 基礎(chǔ)知識(shí)
From:https://kubernetes.io/zh/docs/tutorials/kubernetes-basics/
介紹了 Kubernetes 集群編排系統(tǒng)的基礎(chǔ)知識(shí)。每個(gè)模塊包含關(guān)于 Kubernetes 主要特性和概念的一些背景信息,并包括一個(gè)在線(xiàn)互動(dòng)教程。這些互動(dòng)教程讓您可以自己管理一個(gè)簡(jiǎn)單的集群及其容器化應(yīng)用程序。
使用互動(dòng)教程,您可以學(xué)習(xí):
- 在集群上部署容器化應(yīng)用程序
- 彈性部署
- 使用新的軟件版本,更新容器化應(yīng)用程序
- 調(diào)試容器化應(yīng)用程序
- 1. 創(chuàng)建一個(gè) Kubernetes 集群
- 2. 部署應(yīng)用程序
- 3. 應(yīng)用程序探索
- 4. 應(yīng)用外部可見(jiàn)
- 5. 應(yīng)用可擴(kuò)展
- 6. 應(yīng)用更新
k8s 基本使用(上)
From:https://www.jianshu.com/p/8d60ce1587e1
想提前了解一下 k8s 相關(guān)的知識(shí)的話(huà),可以通過(guò)以下鏈接進(jìn)行學(xué)習(xí):
- 10分鐘看懂 Docker 和 K8S:https://zhuanlan.zhihu.com/p/53260098
- Kubernetes中文社區(qū) --- 從零開(kāi)始 k8s:https://www.kubernetes.org.cn/doc-11
- k8s官網(wǎng) - 中文:https://kubernetes.io/zh/
- Kubernetes 中文文檔:http://docs.kubernetes.org.cn/
結(jié)構(gòu)模型
k8s 是經(jīng)典的一對(duì)多模型,有一個(gè)主要的管理節(jié)點(diǎn)master和許多的工作節(jié)點(diǎn)slaver。當(dāng)然,k8s 也可以配置多個(gè)管理節(jié)點(diǎn),擁有兩個(gè)以上的管理節(jié)點(diǎn)被稱(chēng)為 高可用。k8s 包括了許多的組件,每個(gè)組件都是單運(yùn)行在一個(gè)docker容器中,然后通過(guò)自己規(guī)劃的虛擬網(wǎng)絡(luò)相互訪(fǎng)問(wèn)。你可以通過(guò)kubectl get pod -n kube-system查看所有節(jié)點(diǎn)上的組件容器。
在管理節(jié)點(diǎn)中會(huì)比工作節(jié)點(diǎn)運(yùn)行更多的 k8s 組件,我們就是靠著這些多出來(lái)的組件來(lái)對(duì)工作節(jié)點(diǎn)發(fā)號(hào)施令。他們都叫什么這里就不詳細(xì)提了。反正對(duì)于”基本使用“來(lái)說(shuō),這些名字并不重要。
理念
要想理解一個(gè)東西就要先明白它的內(nèi)在理念。通俗點(diǎn)就是,k8s 做了什么?為了提供更加可靠的服務(wù),就要增加服務(wù)器的數(shù)量,減少每個(gè)服務(wù)器的體量來(lái)平攤負(fù)載,而越來(lái)越多的虛擬機(jī)就會(huì)帶來(lái)越來(lái)越高的運(yùn)維成本。如何讓少量的運(yùn)維人員就可以管理數(shù)量眾多的服務(wù)器及其上的服務(wù)呢?這就是 k8s 做的工作。
k8s 把數(shù)量眾多的服務(wù)器重新抽象為一個(gè)統(tǒng)一的資源池,對(duì)于運(yùn)維人員來(lái)說(shuō),他們面前沒(méi)有服務(wù)器1、服務(wù)器2的概念,而是一個(gè)統(tǒng)一的資源池,增加新的服務(wù)器對(duì)運(yùn)維人員來(lái)說(shuō),只是增加自資源池的可用量。不僅如此,k8s 把所有能用的東西都抽象成了資源的概念,從而提供了一套更統(tǒng)一,更簡(jiǎn)潔的管理方式。
接下來(lái),我會(huì)把每個(gè)基本命令當(dāng)做一節(jié)來(lái)進(jìn)行介紹,并輔以介紹一些基本概念。本文介紹的命令涵蓋了增刪改查四方面,可參加下面表格,因?yàn)槠^長(zhǎng),我們將create及之后的不那么常用的命令放在下一篇文章 k8s 基本使用(下) 里講:
| get | 查 | 列出某個(gè)類(lèi)型的下屬資源 |
| describe | 查 | 查看某個(gè)資源的詳細(xì)信息 |
| logs | 查 | 查看某個(gè) pod 的日志 |
| create | 增 | 新建資源 |
| explain | 查 | 查看某個(gè)資源的配置項(xiàng) |
| delete | 刪 | 刪除某個(gè)資源 |
| edit | 改 | 修改某個(gè)資源的配置項(xiàng) |
| apply | 改 | 應(yīng)用某個(gè)資源的配置項(xiàng) |
kubectl get 列出資源!
接下來(lái)進(jìn)入正題,首先來(lái)了解一下 k8s 中最最最常用的命令kubectl get,要記住,k8s 把所有的東西都抽象成了資源,而kubectl get就是用來(lái)查看這些資源的。最常見(jiàn)的資源就是 pod 。
什么是 pod?
pod(豆莢)。 pod 的概念其實(shí)和docker中的容器非常相似。他是 k8s 中的最小工作單位。你可以把 pod 理解成一個(gè)一個(gè)的小機(jī)器人,而 k8s 抽象出來(lái)的大資源池就是他們的工廠(chǎng)。
pod 和 docker 容器的關(guān)系?
pod 將一個(gè)或多個(gè)docker容器封裝成一個(gè)統(tǒng)一的整體進(jìn)行管理并對(duì)外提供服務(wù)。
不僅我們自己的服務(wù)是要包裝成 pod 的,就連 k8s 自己也是運(yùn)行在一堆 pod 上。接下來(lái)就讓我們查看一下 k8s 的 pod :kubectl get pod -n kube-system
-n?參數(shù)指定了要查看哪個(gè)命名空間下的 pod 。 k8s 所有的 pod 都被放置在kube-system命名空間下。
什么是命名空間?
命名空間namespace,是 k8s 中”組“的概念,提供同一服務(wù)的 pod 就應(yīng)該被放置同一命名空間下,而不是混雜在一起。k8s 可以用命名空間來(lái)做權(quán)限控制。如果不指定的話(huà), pod 將被放置在默認(rèn)的命名空間default下。
執(zhí)行了kubectl get pod -n kube-system命令后,你就可以看到如下內(nèi)容:
其中每一行就是一個(gè)資源,這里我們看到的資源是 pod 。你看到的 pod 數(shù)量可能和我的不一致,因?yàn)檫@個(gè)列表里包含了 k8s 在所有節(jié)點(diǎn)上運(yùn)行的 pod ,你加入的節(jié)點(diǎn)越多,那么顯示的 pod 也就越多。我們來(lái)一列一列的看:
- NAME:第一列是 pod 的名字,k8s 可以為 pod 隨機(jī)分配一個(gè)五位數(shù)的后綴。
- READY:第二列是 pod 中已經(jīng)就緒的 docker 容器的數(shù)量,上文中我們提到了,pod 封裝了一個(gè)或多個(gè) docker 容器。在這里,1/1的含義為就緒1個(gè)容器/共計(jì)1個(gè)容器。
- STATUS:第三列是 pod 的當(dāng)前狀態(tài),下面是一些常見(jiàn)的狀態(tài):
| Running | 運(yùn)行中 |
| Error | 異常,無(wú)法提供服務(wù) |
| Pending | 準(zhǔn)備中,暫時(shí)無(wú)法提供服務(wù) |
| Terminaling | 結(jié)束中,即將被移除 |
| Unknown | 未知狀態(tài),多發(fā)生于節(jié)點(diǎn)宕機(jī) |
| PullImageBackOff | 鏡像拉取失敗 |
- RESTART:k8s 可以自動(dòng)重啟 pod,這一行就是標(biāo)記了 pod 一共重啟了多少次。
- AGE:pod 一共存在了多長(zhǎng)時(shí)間。
kubectl get?可以列出 k8s 中所有資源
這里只介紹了如何用kubectl獲取 pod 的列表。但是不要把get和pod綁定在一起,pod 只是 k8s 中的一種服務(wù),你不僅可以get pod,還可以get svc(查看服務(wù))、get rs(查看副本控制器)、get deploy(查看部署)等等等等,雖然說(shuō)kubectl get pod是最常用的一個(gè),但是如果想查看某個(gè)資源而又不知道命令是什么,kbuectl get <資源名>就對(duì)了。
想看更多的信息,可以指定-o wide參數(shù),如下:kubectl get pod -n kube-system -o wide
加上這個(gè)參數(shù)之后就可以看到資源的所在ip和所在節(jié)點(diǎn)node了。
記得加上 -n
-n可以說(shuō)是kubectl get命令使用最頻繁的參數(shù)了,在正式使用中,我們永遠(yuǎn)不會(huì)把資源發(fā)布在默認(rèn)命名空間。所以,永遠(yuǎn)不要忘記在get命令后面加上-n。
小結(jié)
kubectl get命令可以列出 k8s 中的資源,而kubectl get pod是非常常用的查看 pod 的命令。而-n參數(shù)則可以指定 pod 所在的命名空間。
kubectl describe 查看詳情!
kubectl describe命令可以用來(lái)查看某一資源的具體信息,他同樣可以查看所有資源的詳情,不過(guò)最常用的還是查看 pod 的詳情。他也同樣可以使用-n參數(shù)指定資源所在的命名空間。
舉個(gè)例子,我們可以用下面命令來(lái)查看剛才 pod 列表中的某個(gè) pod,注意不要忘記把 pod 名稱(chēng)修改成自己的:kubectl describe pod kube-flannel-ds-amd64-2d6tb -n kube-system
然后你就可以看到很多的信息,咱們分開(kāi)說(shuō),首先是基本屬性,你可以在詳細(xì)信息的開(kāi)頭找到它:
基本屬性
# 實(shí)例名稱(chēng) Name: kube-flannel-ds-amd64-2d6tb # 所處命名空間 Namespace: kube-system # 所在節(jié)點(diǎn) Node: worker2/192.168.56.22 # 啟動(dòng)時(shí)間 Start Time: Wed, 03 Jul 2019 09:31:50 +0000 # 標(biāo)簽 Labels: app=flannelcontroller-revision-hash=bfc6b6dd4pod-template-generation=2tier=node # 注解 Annotations: <none> # 當(dāng)前狀態(tài) Status: Running # 所在節(jié)點(diǎn) IP IP: 192.168.56.22 # 由那種資源生成 / 控制 Controlled By: DaemonSet/kube-flannel-ds-amd64其中幾個(gè)比較常用的,例如Node、labels和Controlled By。通過(guò)Node你可以快速定位到 pod 所處的機(jī)器,從而檢查該機(jī)器是否出現(xiàn)問(wèn)題或宕機(jī)等。通過(guò)labels你可以檢索到該 pod 的大致用途及定位。而通過(guò)Controlled By,你可以知道該 pod 是由那種 k8s 資源創(chuàng)建的,然后就可以使用kubectl get <資源名>來(lái)繼續(xù)查找問(wèn)題。例如上文DaemonSet/kube-flannel-ds-amd64,就可以通過(guò)kubectl get DaemonSet -n kube-system來(lái)獲取上一節(jié)資源的信息。
內(nèi)部鏡像信息
在中間部分你可以找到像下面一樣的Containers段落。該段落詳細(xì)的描述了 pod 中每個(gè) docker 容器的信息,常用的比如Image字段,當(dāng) pod 出現(xiàn) ImagePullBackOff錯(cuò)誤的時(shí)候就可以查看該字段確認(rèn)拉取的什么鏡像。其他的字段名都很通俗,直接翻譯即可。
Containers:kube-flannel:Container ID: docker://25d2c4896847bbf53735c57a60c5b3146e2b3a0f86811074bcd28a8291213c18Image: quay.io/coreos/flannel:v0.11.0-amd64Image ID: docker://sha256:ff281650a721f46bbe2169292c91031c66411554739c88c861ba78475c1df894Port: <none>Host Port: <none>Command:/opt/bin/flanneldArgs:--ip-masq--kube-subnet-mgr--iface=enp0s8State: RunningStarted: Wed, 03 Jul 2019 09:31:53 +0000Ready: TrueRestart Count: 0Limits:cpu: 100mmemory: 50MiRequests:cpu: 100mmemory: 50MiEnvironment: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查看詳情的時(shí)候,最常用的信息獲取處就是這個(gè)Event段落了,你可以在介紹內(nèi)容的末尾找到它,如下:
Events: <none>是的,如果你看到上面這樣,沒(méi)有任何Events的話(huà),就說(shuō)明該 pod 一切正常。當(dāng) pod 的狀態(tài)不是Running時(shí),這里一定會(huì)有或多或少的問(wèn)題,長(zhǎng)得像下面一樣,然后你就可以通過(guò)其中的信息分析 pod 出現(xiàn)問(wèn)題的詳細(xì)原因了:
Events:Type Reason Age From Message---- ------ ---- ---- -------Normal Killing 29m kubelet, worker1 Stopping container kube-flannelWarning 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"小結(jié)
kubectl describe <資源名> <實(shí)例名>可以查看一個(gè)資源的詳細(xì)信息,最常用的還是比如kubectl describe pod <pod名> -n <命名空間>來(lái)獲取一個(gè) pod 的基本信息。如果出現(xiàn)問(wèn)題的話(huà),可以在獲取到的信息的末尾看到Event段落,其中記錄著導(dǎo)致 pod 故障的原因。
kubectl logs 查看日志!
如果你想查看一個(gè) pod 的具體日志,就可以通過(guò)kubectl logs <pod名>來(lái)查看。注意,這個(gè)只能查看 pod 的日志。通過(guò)添加-f參數(shù)可以持續(xù)查看日志。例如,查看kube-system命名空間中某個(gè)flannel pod 的日志,注意修改 pod 名稱(chēng):
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 ...如果你發(fā)現(xiàn)某個(gè) pod 的服務(wù)有問(wèn)題,但是狀態(tài)還是顯示Running,就可以使用kubectl logs來(lái)查看其詳細(xì)日志。
總結(jié)
在本篇文章里,我們了解了 k8s 的宗旨和一些基本概念,并知道了最為常用的get、descibe及l(fā)ogs命令,知道了這三條命令之后就幾乎可以從 k8s 中獲取所有常用信息了。接下來(lái)的 k8s 基本使用(下)里,我們會(huì)更深一步,來(lái)了解 k8s 中如何創(chuàng)建、修改及刪除資源。
?
總結(jié)
- 上一篇: 安卓逆向_22( 二 ) --- Xpo
- 下一篇: Python集合(set)类型的操作