【三小时学会Kubernetes!(二) 】Kubernetes 简介及Pod实践
Kubernetes 简介
我向你保证我没有夸大其词,读完本文你会问“为什么我们不称它为 Supernetes?”

Kubernetes 是什么?
从容器启动微服务后,我们有一个问题,让我们通过如下问答的形式具体描述这个问题:
问:我们怎么扩大或缩小容器?
答:我们启动另外一个容器。
问:我们如何在容器间分摊负荷?如果当前服务器的负荷达到最大,那我们是否需要另外一个服务器?我们如何最大化硬件使用率?
答:唔......呃......(让我搜一下)
问:如果在打更新补丁的时候,不影响到所有的服务?如果服务出了问题,如何才能返回之前能正常工作的版本?
Kubernetes 可以解决以上所有问题(以及更多问题!)。我可以用一句话总结 Kubernetes:“Kubernetes 是容器控制平台,可以抽象所有的底层基础设施(容器运行用到的基础设施)。”
我们对容器控制平台有个模糊的概念。在本文后续部分,我们将看看它的实际应用,但是这是第一次我们提到“底层基础设施的抽象”,所以我们来详细看看这个概念。
底层基础设施的抽象
Kubernetes 通过一个简单的 API 提供底层基础设施的抽象,我们可以向该 API 发送请求。这些请求可以让 Kubernetes
尽最大能力应对。例如,可以简单地要求“Kubernetes 添加映像 x 的 4 个容器。”然后 Kubernetes
会找出使用中的节点,并在内添加新的容器(如图 12 所示)。

这对开发人员来说意味着什么?意味着开发人员不需要在意节点的数目,也不需要在意从哪里运行容器以及如何与它们交流。开发人员不需要管理硬件优化,或担心节点关闭(它们将遵循墨菲法则),因为新的节点会添加到
Kubernetes 集群。同时 Kubernetes 会在其他运行的节点中添加容器。Kubernetes 会发挥最大的作用。
在图 2 中我们看到了一些新东西:
- API服务器:与集群交互的唯一方式。负责启动或停止另外一个容器,或检查当前状态,日志等;
- Kubelet:监视节点内的容器,并与主节点交流;
- Pod:初始阶段我们可以把 pod 当成容器。
就介绍这么多,跟深入的介绍会导致我们分心,我们可以等到后面一点再介绍,有一些有用的资源,比如官方文档,或者阅读 Marko Lukša
的著作《Kubernetes in Action》,以及 Sébastien Goasguen & Michael Hausenblas
的《Kubernetes Cookbook》。
标准化的云服务提供商
Kubernetes 另外一个深入人心的点是:它标准化了云服务提供商。这是一个很大胆的宣言,我们通过如下例子来具体看一看:
比如,有一个 Azure、Google 云平台或其他云服务提供商的专家,他担任了一个搭建在全新的云服务提供商的项目。这可能引起很多后果,比如说:他可能无法在截止期限内完成;公司可能需要招聘更多相关的人员,等等。
相对的,Kubernetes 就没有这个问题。因为不论是哪家云服务提供商,你都可以在上面运行相同的命令。你可以以既定的方式向 API 服务器发送请求。Kubernetes 会负责抽象,并实装这家云服务商。
停一秒钟仔细想一下,这是极其强有力的功能。对公司来说,这意味着他们不需要绑定到一家云服务商。他们可以计算别家云服务商的开销,然后转移到别家。他们依旧可以保留原来的专家,保留原来的人员,他们还可以花更少的钱。
说了这么多,在下一节中让我们来实际使用 Kubernetes。
Kubernetes 实践——Pod
我们建立了微服务在容器上运行,虽然颇为坎坷,但还是可以工作的。我们还提到这种解决方案不具有伸缩性和弹性,而 Kubernetes 可以解决这些问题。在本文的后续章节,我们会将各个服务转移到由 Kubernetes 管理的容器中,如图 13 所示。

在本文中,我们将使用 Minikube 进行本地调试,尽管所有东西都是运行在 Azure 和 Google 云平台中的。
安装和启动 Minikube
请参阅安装 Minikube 的官方文档:
- https://kubernetes.io/docs/tasks/tools/install-minikube/
在安装 Minikube 的同时,你可以捎带着安装 Kubectl。Kubectl 是向 Kubernetes API 服务器发送请求的客户端。
可以通过运行 minikube start 命令启动 Minikube,在启动后,运行 kubectl get nodes 命令可以得到如下结果:
kubectl get nodes NAME STATUS ROLES AGE VERSION minikube Ready <none> 11m v1.9.0
Minikube 提供给我们的 Kubernetes 集群只有一个节点,但是记住我们并不在乎有多少个节点,Kubernetes 会负责抽象,对我们来说深入掌握 Kubernetes 并不重要。
在下一节中,我们将介绍 Kubernetes 的第一个资源:Pod。
Pod
我大爱容器,相信现在你也很喜欢容器。那为什么 Kubernetes 给我们最小的可部署计算单元 Pod 呢?Pod是干什么的?由一个或一组容器组成的 Pod 可以共享相同的运行环境。
但是我们真的需要在一个 Pod 内运行两个容器吗?呃……一般来说,只会运行一个容器,我们的例子中也是这样的。但是有些情况下,比如两个容器需要共享卷,或它们之间是通过跨进程的交流方式交流的,又或者它们被绑到一起,那么就可以使用 Pod。Pod 的另一个特征是:如果我们希望使用其他 Rke 等技术的话,我们可以做到不依赖 Docker 容器。

图14:Pod 属性
总的来说,Pod 的主要属性包括(如图 14 所示):
- 每个 Pod 可以在 Kubernetes 集群内拥有唯一的 IP 地址;
- Pod 可以拥有多个容器。这些容器共享同一个端口空间,所以他们可以通过 localhost 交流(可想而知它们无法使用相同的端口),与其他 Pod 内容器的交流可以通过结合 Pod 的 IP 完成;
- 一个 Pod 内的容器共享同一个卷、同一个 IP、端口空间、IPC 命名空间。
注:容器有个自己独立的文件系统,尽管他们可以通过 Kubernetes 的资源卷共享数据。
更多详细内容,请参阅相关的官方文档:
https://kubernetes.io/docs/concepts/workloads/pods/pod/
Pod 的定义
如下是我们的第一个 pod sa-frontend 的清单文件,我们会对文件内容进行逐一解释。
apiVersion: v1
kind: Pod # 1
metadata:
name: sa-frontend # 2
spec: # 3
containers:
- image: rinormaloku/sentiment-analysis-frontend # 4
name: sa-frontend # 5
ports:
- containerPort: 80 # 6
#1 kind:指定我们想创建的 Kubernetes 资源的类型。这里是 Pod。
#2 name:定义该资源的名字。我们在这里命名为 sa-frontend。
#3 spec:该对象定义了资源应有的状态。Pod Spec 中最重要的属性是容器的数组。
#4 image:是指我们希望在本 Pod 中启动的容器的映像。
#5 name:Pod 中容器中唯一的名字。
#6 containerPort:是指容器监听的端口号。这只是为了提供文档信息(即便没有这个端口也不会影响访问)。
创建 SA Frontend 的 Pod
你可以在 resource-manifests/sa-frontend-pod.yaml 中找到上述 Pod 的定义。你可以在终端中进入该文件夹,或在命令行输入完整的路径。然后执行如下命令:
kubectl create -f sa-frontend-pod.yaml pod "sa-frontend" created
可以通过如下命令确认 Pod:
kubectl get pods NAME READY STATUS RESTARTS AGE sa-frontend 1/1 Running 0 7s
如果该 Pod 还处于容器生成中的状态的话,你可以在运行命令的时候加入参数 --watch,当 Pod 进入运行状态的时候,终端会显示信息。
从外部访问应用程序
为了从外部访问应用程序,我们需要创建服务类型的Kubernetes资源,具体内容我们将在后续章节讲解,虽然通过服务类型的资源支持外部访问是更合适的做法,但是此处为了快速调试,我们还有另外一个办法,即转发端口:
kubectl port-forward sa-frontend-pod 88:80 Forwarding from 127.0.0.1:88 -> 80
在浏览器中访问 127.0.0.1:88,即可打开 React 应用程序。
扩大规模的错误方法
我们说过 Kubernetes 的主要特色之一就是伸缩性,为了证明这一点,让我们运行另外一个 Pod。我们通过如下定义创建另外一个 Pod 资源:
apiVersion: v1
kind: Pod
metadata:
name: sa-frontend2 # The only change
spec:
containers:
- image: rinormaloku/sentiment-analysis-frontend
name: sa-frontend
ports:
- containerPort: 80
然后,通过如下命令创建新的 Pod:
kubectl create -f sa-frontend-pod2.yaml pod "sa-frontend2" created
可以通过如下命令确认第二个 Pod:
kubectl get pods NAME READY STATUS RESTARTS AGE sa-frontend 1/1 Running 0 7s sa-frontend2 1/1 Running 0 7s
现在我们有两个运行中的 Pod。
请注意:这不是最终的解决方案,还有很多缺陷。我们将在另一个 Kubernetes 资源的部署一节中改善这个方案。
总结 Pod
提供静态文件的 Nginx 网络服务器在另个不同的 Pod 内运行。现在我们有两个问题:
- 怎样对外开放这些服务,让用户通过 URL 来访问它们?
- 怎样平衡 Pod 之间的负荷?

Kubernetes 提供了服务类型的资源。在下一节中我们将详细介绍。
来自:CSDN(微信号:CSDNnews),作者:Rinor Maloku,译者:弯月,责编:郭芮
【三小时学会Kubernetes!(二) 】Kubernetes 简介及Pod实践的更多相关文章
- 三小时学会Kubernetes:容器编排详细指南
三小时学会Kubernetes:容器编排详细指南 如果谁都可以在三个小时内学会Kubernetes,银行为何要为这么简单的东西付一大笔钱? 如果你心存疑虑,我建议你不妨跟着我试一试!在完成本文的学习后 ...
- [转载]三小时学会Kubernetes:容器编排详细指南
原翻译by梁晓勇 原英文:Learn Kubernetes in Under 3 Hours: A Detailed Guide to Orchestrating Containers 我很奇怪,为什 ...
- 【三小时学会Kubernetes!(零) 】系统结构及相关示例微服务介绍
写在前面 牢牢占据容器技术统治地位的 Kubernetes,其重要性想必不言而喻,我保证本文是最详尽的 Kubernetes 技术文档,从我在后台排版了这么漫长的时间就能看出来.废话不多说 — — 以 ...
- 【三小时学会Kubernetes!(五) 】完成整个架构
完成整个架构 现在我们学习了完成架构的所有必须的资源,因此这一节会非常快.图 22 中灰色的部分是需要做的事情.让我们从底部开始:部署 sa-logic 的部署. 图 22:当前应用程序状态 部署 S ...
- 【三小时学会Kubernetes!(一) 】容器简介及为每个服务创建镜像
容器是什么 Kubernetes 是容器管理平台.可想而知我们需要容器去管理它们.但是容器是什么?Docker 官方文档的最佳答案如下: 容器映像是轻量级的.独立的.可执行软件包,包含所有可运行的东西 ...
- 【三小时学会Kubernetes!(四) 】Deployment实践
Deployment 部署 Kubernetes 部署可以帮助每一个应用程序的生命都保持相同的一点:那就是变化.此外,只有挂掉的应用程序才会一尘不变,否则,新的需求会源源不断地涌现,更多代码会被开发出 ...
- 【三小时学会Kubernetes!(三) 】Service实践
服务Service Kubernetes 服务资源可以作为一组提供相同服务的 Pod 的入口.这个资源肩负发现服务和平衡 Pod 之间负荷的重任,如图 16 所示. 图16:Kubernetes 服务 ...
- 三小时攻克 Kubernetes!
我保证本文是最详尽的 Kubernetes 技术文档,从我在后台排版了这么漫长的时间就能看出来.废话不多说——牢牢占据容器技术统治地位的 Kubernetes,其重要性想必不言而喻. 以下为译文: 为 ...
- [原]CentOS7安装Rancher2.1并部署kubernetes (三)---解决登录kubernets超时和部署测试Pod和Containter[nginx为例]
################## Rancher v2.1.7 + Kubernetes 1.13.4 ################ ##################### ...
随机推荐
- 【转载】ARM MMU详解
一.MMU的产生 许多年以前,当人们还在使用DOS或是更古老的操作系统的时候,计算机的内存还非常小,一般都是以K为单位进行计算,相应的,当时的程序规模也不大,所以内存容量虽然小,但还是可以 ...
- SSH secure shell 原理与运用
转: http://www.ruanyifeng.com/blog/2011/12/ssh_remote_login.html 作者: 阮一峰 日期: 2011年12月21日 SSH是每一台Linux ...
- vue——学习笔记
1.vue需要在dom加载完成之后实现实例化 eg: window.onload = function(){ new Vue({ el: '#editor', data: { input: '# he ...
- 聚类之k-means
1.介绍 k-means算法以k为参数(所期望的簇的个数),把n个对象分成k个簇(单层划分),用质心(数据点的平均值)定义簇的原型.使得簇内具有较高的相似度,而簇间的相似度较低. 通过聚类,我们能够发 ...
- append和extend区别
append append方法用于在列表末尾添加新的对象 它是把添加的对象当成一个整体追加到末尾 a=[1,23,436] b=[] b.append(a) print(b)""& ...
- C++ 对象的sizeof问题
需要补充.. 1. 注意虚函数的指针占4个字节.(当然是32位机器) #include <cstdlib> #include <ctime> #include <iost ...
- fetch body里数据为ReadableStream 解决办法
前端工程中发送 HTTP 请求从来都不是一件容易的事,前有骇人的 ActiveXObject ,后有 API 设计十分别扭的 XMLHttpRequest ,甚至这些原生 API 的用法至今仍是很多大 ...
- Let Her Go
转自:https://www.zhihu.com/question/29255072/answer/43962611 [MV]Passenger-Let Her Go-高清MV在线播放 版本一 Let ...
- Django----Request对象&Response对象
Django 使用Request 对象和Response 对象在系统间传递状态. HttpRequest 对象: Request.body:一个字节字符串,表示原始HTTP 请求的正文.它对于处理非H ...
- 如何用纯 CSS 创作一个摇摇晃晃的 loader
效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览.https://codepen.io/comehope/pen/oyJvpe 可交互视频 此 ...