K8S Deployment、ReplicaSet和Pod关系图 新的问题又来了:如果都是为了管控Pod好好干活,为什么要设置Deployment和ReplicaSet两个层级呢,直接让Deployment来管理不可以吗?
回答:不清楚,但是私以为是因为先有ReplicaSet,但是使用中发现ReplicaSet不够满足要求,于是又整了一个Deployment(有清楚Deployment和ReplicaSet联系和区别的小伙伴欢迎留言啊 )。
但是,从K8S使用者角度来看,用户会直接操作Deployment部署服务,而当Deployment被部署的时候,K8S会自动生成要求的ReplicaSet和Pod。在K8S官方文档中也指出用户只需要关心Deployment而不操心ReplicaSet:
This actually means that you may never need to manipulate ReplicaSet objects: use a Deployment instead, and define your application in the spec section.
这实际上意味著您可能永远不需要操作ReplicaSet对象:直接使用Deployments并在规范部分定义应用程序。
补充说明:在K8S中还有一个对象 --- ReplicationController(简称RC) ,官方文档对它的定义是:
ReplicationController 确保在任何时候都有特定数量的 Pod 副本处于运行状态。 换句话说,ReplicationController 确保一个 Pod 或一组同类的 Pod 总是可用的。
怎么样,和ReplicaSet是不是很相近?在Deployments, ReplicaSets, and pods教程中说「ReplicationController是ReplicaSet的前身」,官方也推荐用Deployment取代ReplicationController来部署服务。
Service和Ingress
吐槽下K8S的概念/对象/资源是真的多啊!前文介绍的Deployment、ReplicationController和ReplicaSet主要管控Pod程序服务;那么,Service和Ingress则负责管控Pod网路服务 。
我们先来看看官方文档中Service的定义:
将运行在一组 Pods 上的应用程序公开为网路服务的抽象方法。
使用 Kubernetes,您无需修改应用程序即可使用不熟悉的服务发现机制。 Kubernetes 为 Pods 提供自己的 IP 地址,并为一组 Pod 提供相同的 DNS 名, 并且可以在它们之间进行负载均衡。
翻译下:K8S中的服务(Service)并不是我们常说的「服务」的含义,而更像是网关层,是若干个Pod的流量入口、流量均衡器。
那么,为什么要Service呢 ?
私以为在这一点上,官方文档讲解地非常清楚:
Kubernetes Pod 是有生命周期的。 它们可以被创建,而且销毁之后不会再启动。 如果您使用 Deployment 来运行您的应用程序,则它可以动态创建和销毁 Pod。
每个 Pod 都有自己的 IP 地址,但是在 Deployment 中,在同一时刻运行的 Pod 集合可能与稍后运行该应用程序的 Pod 集合不同。
这导致了一个问题: 如果一组 Pod(称为「后端」)为群集内的其他 Pod(称为「前端」)提供功能, 那么前端如何找出并跟踪要连接的 IP 地址,以便前端可以使用工作量的后端部分?
补充说明:K8S集群的网路管理和拓扑也有特别的设计,以后会专门出一章节来详细介绍K8S中的网路。这里需要清楚一点:K8S集群内的每一个Pod都有自己的IP(是不是很类似一个Pod就是一台伺服器,然而事实上是多个Pod存在于一台伺服器上,只不过是K8S做了网路隔离),在K8S集群内部还有DNS等网路服务(一个K8S集群就如同管理了多区域的伺服器,可以做复杂的网路拓扑)。
此外,笔者推荐k8s外网如何访问业务应用对于Service的介绍,不过对于新手而言,推荐阅读前半部分对于service的介绍即可,后半部分就太复杂了。我这里做了简单的总结:
Service是K8S服务的核心,屏蔽了服务细节,统一对外暴露服务介面,真正做到了「微服务」 。举个例子,我们的一个服务A,部署了3个备份,也就是3个Pod;对于用户来说,只需要关注一个Service的入口就可以,而不需要操心究竟应该请求哪一个Pod。优势非常明显:一方面外部用户不需要感知因为Pod上服务的意外崩溃、K8S重新拉起Pod而造成的IP变更,外部用户也不需要感知因升级、变更服务带来的Pod替换而造成的IP变化,另一方面,Service还可以做流量负载均衡 。
但是,Service主要负责K8S集群内部的网路拓扑。那么集群外部怎么访问集群内部呢?这个时候就需要Ingress了,官方文档中的解释是:
Ingress 是对集群中服务的外部访问进行管理的 API 对象,典型的访问方式是 HTTP。
Ingress 可以提供负载均衡、SSL 终结和基于名称的虚拟托管。
翻译一下:Ingress是整个K8S集群的接入层,复杂集群内外通讯。
最后,笔者把Ingress和Service的关系绘制网路拓扑关系图如下,希望对理解这两个概念有所帮助:
K8S Ingress、Service和Pod关系图
amespace 命名空间
和前文介绍的所有的概念都不一样,namespace跟Pod没有直接关系,而是K8S另一个维度的对象。或者说,前文提到的概念都是为了服务Pod的,而namespace则是为了服务整个K8S集群的。
那么,namespace是什么呢?
上官方文档定义:
Kubernetes 支持多个虚拟集群,它们底层依赖于同一个物理集群。 这些虚拟集群被称为名字空间。
翻译一下:namespace是为了把一个K8S集群划分为若干个资源不可共享的虚拟集群而诞生的 。
也就是说,可以通过在K8S集群内创建namespace来分隔资源和对象 。比如我有2个业务A和B,那么我可以创建ns-a和ns-b分别部署业务A和B的服务,如在ns-a中部署了一个deployment,名字是hello,返回用户的是「hello a」;在ns-b中也部署了一个deployment,名字恰巧也是hello,返回用户的是「hello b」(要知道,在同一个namespace下deployment不能同名;但是不同namespace之间没有影响)。前文提到的所有对象,都是在namespace下的;当然,也有一些对象是不隶属于namespace的,而是在K8S集群内全局可见的,官方文档提到的可以通过命令来查看,具体命令的使用办法,笔者会出后续的实战文章来介绍,先贴下命令:
# 位于名字空间中的资源
kubectl api-resources --namespaced=true
?
# 不在名字空间中的资源
kubectl api-resources --namespaced=false
不在namespace下的对象有:
在namespace下的对象有(部分):
一般做一件事情都是要有内驱力,或者工作需求。
所以,你直接问怎么学k8s,这个会让人难以回答的让你可以执行。我抛几个问题吧,在解决问题的过程中学习,才是最好的学习方法,要么你就把k8s文档一篇不少的全吸收完。
1. deployment, pod, job有什么区别?什么场景用他们?2. service是干嘛的?可以解决些什么问题?3. 我想部署一些有状态的服务,比如MySQL,用k8s怎么做?就这么三个问题吧,其它的,等你有问题了再谈。
首先得把所有的知识点好好捋一遍,官方文档是个不错的选择,如果英文不好,还是买本书吧,现在也就只有kubernetes权威指南比较靠谱,知识点,概念都有解释
本地建他五六个虚拟机,搭个k8s集群出来,知识点一个一个的实践一下。国内有墙,注意镜像的挂起状态,多看日志,有可能就是被墙了
在生产环境下,如果是暴露到了公网环境,安全问题就很重要了,节点,程序之间的加密通讯要著重掌握
去github上看k8s这个项目就能知道,几小时内就能有好几次提交,一周一个版本司空见惯,官方文档都已经跟不上了,好多文档上没有的东西,就只能去代码里看了
可以看看https://zhuanlan.zhihu.com/p/56159304
帮你顶帖,我也是运维,docker的方方面面基本上摸了一遍,一看k8s就感觉两眼迷茫无从下手,很多文档感觉都不系统,希望有大神出来指教一二
了解docker
了解kubernetes概念,坦白说还是很有门槛的
了解kubernetes的架构
学习kubernetes的安装运维、网路存储、日志
划重点:学习如何管理应用
kubernetes的扩展开发
官方文档就可以了
推荐阅读: