关注公众号 创业技术圈
什么是kubernetes?
kubernetes通常又被称作k8s(因为开头的k和结尾的s中间有8个字母,跟i18n是相同的缩写模式),以下统一用k8s来表示。
我们知道通过docker等应用容器技术可以做到很好的应用与宿主机之间的隔离以及资源划分等,但是生产环境中这些应用容器往往部署到集群当中,而不是单机环境,因此需要一个对整个集群和应用容器之间的调度进行管理,以及集群扩容/缩容等等,这时k8s就派上用场了,对于应用开发完全隔离集群的细节。
我们假设我们的集群中有四台机器,四个机器里面部署了三个服务A/B/C,每个服务的部署情况如下图所示:
服务A有三个容器,分别在1,2,3节点上
服务B有三个容器,节点1一个,节点2两个
服务C只有一个容器,被部署在节点4上面

针对上面的集群结构,我们思考下面几个场景?
如果我们想要把服务B增加到四个容器,这时候新增的容器应该部署到哪个节点上?
如果我要新增加一个节点,这时候哪些容器需要迁移到新的节点上面去?
此时如果节点4发生故障,那么服务C就会受到影响,这时候需要自动迁移到其他节点,如何操作?
指向服务C的请求被负载均衡分配到了Node1节点上,但是如果Node1节点上面没有部署服务C,这时候请求该如何转发到对应的docker容器里面?
当前的集群如果节点二的压力明显比较大,应该想办法让集群更的资源分配更均衡,如何操作?
是的,聪明的你可能很快就想好了针对上面几个问题的答案,各种调度算法, 各种自动扩容/缩容等等,k8s就是来干这个事情的,它让你不再需要考虑上面的这些问题,统统交给k8s去处理就可以了。
k8s里面的核心概念
Pod
Pod英文是豌豆荚的意思,这里就是说把一个或多个Container(简单理解为docker容器)捆绑在一起,当做一个最小调度资源来看待。
Pod里面可以只有一个docker容器
比如有一个业务容器,还有一个是日志记录的容器,用于记录整个业务的日志(fluntd),这时候就可以把两个容器放到一个pod里面。
同一个pod里面的多个容器之间共享网络命名空间,localhost是可以互通的
Pod是最小的调度单元,我们前面的拓扑图例子里面讲的是容器,其实是不对的,因为我们有时候需要多个容器捆绑在一起使用。
Label
k8s里面的大部分资源(pod,deployment,service等等)都支持打上Label,Label是一个键值对组成的标签,用于选择资源的时候用到,比如上面的拓扑结构中。
我可以对服务A打上app=a,服务B打上app=b这样的标签。
我也可以对Node进行标签标记,比如节点4上面打上IsNew=true这种。
Label的key和value都是由用户自定义的,主要用于选择。
我们经常通过Label来选择出自己带有某些标签的各种资源,比如服务里面要选择一组Pod等等。
Deployment
Deployment之前叫做Replication Controller(增加了一些新的东西),如果你见到这两名字可以理解为一个东西。
Deployment我们可以理解为我们部署的一个应用,这时候你需要告诉k8s你这个应用需要用哪个镜像部署,部署几个副本,启动的命令,依赖的资源等等,这些信息组成pod的模板,另外就是需要提供标签相关的信息。
Deployment会根据你的要求,自动的去完成在k8s集群上面的部署,你不需要关心集群的一些细节(我们上面提到的那些问题),当然,如果你想了解的话,也可以查看,或者想要一些特殊要求可以通过一些高阶操作来实现定制。
Service
如果说Deployment是我们部署的应用,那么Service就是我们部署的应用对外的暴露形式。
Service通过Label标记去选择pod,然后把这一组pod抽象为一个服务地址。服务通过IP+Port的形式暴露,其他服务可以通过这个IP地址+端口访问到具体的某个Pod,这时候Service还会承担负载均衡的责任,帮你自动路由到其中一个的pod上面。
我们会先通过DNS服务来给每个服务生成一个DNS域名,方便访问。
下面是一张动图,详细的解释了service的工作。

Node
物理主机或者虚拟主机,这个很好理解。
每个Node上面都运行这如下关键组件
kubelet 是主节点代理
kube-proxy Service通过kube-proxy实现将连接路由到pod,入上图所示。
Docker或Rocket 底层依赖的容器技术。
Kubernetes Master
通过管理和调度集群的节点。
提供Kubernetes API Server。可以通过REST接口与之交互,可以进行资源的管理与监控等等。
理解了上面的这些概念,基本上算是对k8s有了初步的认识。
更多内容欢迎关注公众号 创业技术圈
网友评论