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 ################ ##################### ...
随机推荐
-
2. Transcribing DNA into RNA
Problem An RNA string is a string formed from the alphabet containing 'A', 'C', 'G', and 'U'. Given ...
-
Jvm支持的最大线程数
摘自 http://blog.csdn.net/xyls12345/article/details/26482387 JVM最大线程数 (2012-07-04 23:20:15) 转载▼ 标签: jv ...
-
htc M8 无法自动恢复数据连接(4g)的问题解决
情况如下:htc m8 tdd-lte的双待手机,4g.2g同时在线. 本月出现,在短时间没有信号的情况后,无法恢复数据连接,哪怕是edge,更不论4g了. 尝试各种方法无解.最后咨询10086解决此 ...
-
返回Json数据浏览器带上<;pre>;<;/pre>;标签解决方法
问题: 当后台获取到前台传来的文件时(例如上传功能, 导入功能), 返回类型为application/json, 这个时候响应到前端的JSON格式的数据格式可能是: <pre style=&q ...
-
【Ajax】实现注册页面判断用户名是否可用的提示—异步加载
效果如图 在注册或登录网站时,当我们输入错误格式的账号或信息时,会看到这种提示. 那怎么实现呢,通过ajax异步加载的方式,可以实现不刷新页面就显示出该提示. 实现 首先创建一个JSP,写一个简单的页 ...
-
Paxos算法 Paxos Made Simple
Paxos算法 Paxos Made Simple Leslie Lamport 2001.11.1 简介 Paxos算法,纯文本方式描述,非常简单. 1 介绍 为 实现具有容错能力的分布式系统而提出 ...
-
MD5算法的使用
using System.Security.Cryptography; using System.Text; StringBuilder sb = new StringBuilder();//构建一个 ...
-
AspectJ AOP例子
最近在学习Spring AOP,其中涉及到AspectJ的AOP框架.主要参考:http://howtodoinjava.com/spring/spring-aop/spring-aop-aspect ...
-
桥接模式及C++实现 C++设计模式-AbstractFactory抽象工厂模式
桥接模式及C++实现 桥接模式 先说说桥接模式的定义:将抽象化(Abstraction)与实现化(Implementation)分离,使得二者可以独立地变化. 桥接模式号称设计模式中最难理解的模式之一 ...
-
2017年7月Web服务器调查报告
在2017年7月的调查中,我们收到了来自1,767,964,429个网站和6,593,508个面向web的计算机的反馈.这是一个小小的进步,网站的数量增加了100万个(+0.06%),面向web的计算 ...