Kubernetes集群搭建--以及部署过程中填上的那些坑(一)

之前安装并记录了MobaXterm的使用,我主要是拿来作为虚拟机的统一化管理的工具。毕竟比虚拟机看起来容易接受一点。
闲话少说,我需要拿出二十分钟将部署K8s的过程以及部署过程中遇到的坑记录下来,一是方便日后自己更换电脑还需要重新部署,二是方便新学习的同学们少走些弯路。毕竟会遇到很多的问题,而网上大部分搜到答案还解决不了!

我使用VMWare,在其中安装了两个CenterOS虚拟机,之所以不用Ubuntu是因为Ubuntu操作系统的坑是无法填补的。

想得简单了,原以为花二十分钟就可以记录,但是将K8S的基础概念和原理一整理之后发现一个半小时都过去了。。。我将详细的部署写在下一篇中。对于想要了解Kubernetes的同学,可以看一下这篇文章。

我搭建的集群的总体架构图如下:
Kubernetes集群搭建--以及部署过程中填上的那些坑(一)_第1张图片

对于Kubernatetes一些重要的概念介绍如下:

  • 首先是Namsping

Kubernetes集群搭建--以及部署过程中填上的那些坑(一)_第2张图片
在Docker中,容器是最小的处理单元,增删改查的对象是容器,容器是一种虚拟化技术,容器之间是隔离的,隔离是基于Linux Namespace实现的。
而在Kubernetes中,Pod包含一个或者多个相关的容器,Pod可以认为是容器的一种延伸扩展,一个Pod也是一个隔离体,而Pod内部包含的一组容器又是共享的(包括PID、Network、IPC、UTS)。除此之外,Pod中的容器可以访问共同的数据卷来实现文件系统的共享。
以下紧接着介绍Pod

  • Pod

Kubernetes集群搭建--以及部署过程中填上的那些坑(一)_第3张图片
Pod 是Kubernetes的基本操作单元,也是应用运行的载体。整个Kubernetes系统都是围绕着Pod展开的,比如如何部署运行Pod、如何保证Pod的数量、如何访问Pod等。另外,Pod是一个或多个机关容器的集合,提供了一种容器的组合的模型。
以下是Pod的各种状态以及它的存在形式。 
Kubernetes集群搭建--以及部署过程中填上的那些坑(一)_第4张图片

Resource是非常重要的

  • Resource

Kubernetes集群搭建--以及部署过程中填上的那些坑(一)_第5张图片

  • Label:
    RC与Pod的关联是通过Label来实现的。Label机制是Kubernetes中的一个重要设计,通过Label进行对象的弱关联,可以灵活地进行分类和选择。对于Pod,需要设置其自身的Label来进行标识,Label是一系列的Key/value对,在Pod–>metadata–>labeks中进行设置。

Kubernetes集群搭建--以及部署过程中填上的那些坑(一)_第6张图片

Kubernetes集群搭建--以及部署过程中填上的那些坑(一)_第7张图片

  • Master
     Master节点主要由四个模块组成:APIServer、scheduler、controller manager、etcd。
    Kubernetes集群搭建--以及部署过程中填上的那些坑(一)_第8张图片

APIServer。APIServer负责对外提供RESTful的Kubernetes API服务,它是系统管理指令的统一入口,任何对资源进行增删改查的操作都要交给APIServer处理后再提交给etcd。如架构图中所示,kubectl(Kubernetes提供的客户端工具,该工具内部就是对Kubernetes API的调用)是直接和APIServer交互的。

schedule。scheduler的职责很明确,就是负责调度pod到合适的Node上。如果把scheduler看成一个黑匣子,那么它的输入是pod和由多个Node组成的列表,输出是Pod和一个Node的绑定,即将这个pod部署到这个Node上。Kubernetes目前提供了调度算法,但是同样也保留了接口,用户可以根据自己的需求定义自己的调度算法。

controller manager。如果说APIServer做的是“前台”的工作的话,那controller manager就是负责“后台”的。每个资源一般都对应有一个控制器,而controller manager就是负责管理这些控制器的。比如我们通过APIServer创建一个pod,当这个pod创建成功后,APIServer的任务就算完成了。而后面保证Pod的状态始终和我们预期的一样的重任就由controller manager去保证了。

etcd。etcd是一个高可用的键值存储系统,Kubernetes使用它来存储各个资源的状态,从而实现了Restful的API。

  • Node

每个Node节点主要由三个模块组成:kubelet、kube-proxy、runtime。

runtime。runtime指的是容器运行环境,目前Kubernetes支持docker和rkt两种容器。

kube-proxy。该模块实现了Kubernetes中的服务发现和反向代理功能。反向代理方面:kube-proxy支持TCP和UDP连接转发,默认基于Round Robin算法将客户端流量转发到与service对应的一组后端pod。服务发现方面,kube-proxy使用etcd的watch机制,监控集群中service和endpoint对象数据的动态变化,并且维护一个service到endpoint的映射关系,从而保证了后端pod的IP变化不会对访问者造成影响。另外kube-proxy还支持session affinity。

kubelet。Kubelet是Master在每个Node节点上面的agent,是Node节点上面最重要的模块,它负责维护和管理该Node上面的所有容器,但是如果容器不是通过Kubernetes创建的,它并不会管理。本质上,它负责使Pod得运行状态与期望的状态一致。

Kubernetes集群搭建--以及部署过程中填上的那些坑(一)_第9张图片

Kubernetes集群搭建--以及部署过程中填上的那些坑(一)_第10张图片

  • Service
     为了适应快速的业务需求,微服务架构已经逐渐成为主流,微服务架构的应用需要有非常好的服务编排支持。Kubernetes中的核心要素Service便提供了一套简化的服务代理和发现机制,天然适应微服务架构。
    Kubernetes集群搭建--以及部署过程中填上的那些坑(一)_第11张图片

    • Service原理

        在Kubernetes中,在受到RC调控的时候,Pod副本是变化的,对于的虚拟IP也是变化的,比如发生迁移或者伸缩的时候。这对于Pod的访问者来说是不可接受的。Kubernetes中的Service是一种抽象概念,它定义了一个Pod逻辑集合以及访问它们的策略,Service同Pod的关联同样是居于Label来完成的。Service的目标是提供一种桥梁, 它会为访问者提供一个固定访问地址,用于在访问时重定向到相应的后端,这使得非 Kubernetes原生应用程序,在无须为Kubemces编写特定代码的前提下,轻松访问后端。

        Service同RC一样,都是通过Label来关联Pod的。当你在Service的yaml文件中定义了该Service的selector中的label为app:my-web,那么这个Service会将Pod–>metadata–>labeks中label为app:my-web的Pod作为分发请求的后端。当Pod发生变化时(增加、减少、重建等),Service会及时更新。这样一来,Service就可以作为Pod的访问入口,起到代理服务器的作用,而对于访问者来说,通过Service进行访问,无需直接感知Pod。

        需要注意的是,Kubernetes分配给Service的固定IP是一个虚拟IP,并不是一个真实的IP,在外部是无法寻址的。真实的系统实现上,Kubernetes是通过Kube-proxy组件来实现的虚拟IP路由及转发。所以在之前集群部署的环节上,我们在每个Node上均部署了Proxy这个组件,从而实现了Kubernetes层级的虚拟转发网络。

    • Service代理外部服务

        Service不仅可以代理Pod,还可以代理任意其他后端,比如运行在Kubernetes外部Mysql、Oracle等。这是通过定义两个同名的service和endPoints来实现的

    • Service内部负载均衡

        当Service的Endpoints包含多个IP的时候,及服务代理存在多个后端,将进行请求的负载均衡。默认的负载均衡策略是轮训或者随机(有kube-proxy的模式决定)。同时,Service上通过设置Service–>spec–>sessionAffinity=ClientIP,来实现基于源IP地址的会话保持。

    • 发布Service

        Service的虚拟IP是由Kubernetes虚拟出来的内部网络,外部是无法寻址到的。但是有些服务又需要被外部访问到,例如web前段。这时候就需要加一层网络转发,即外网到内网的转发。Kubernetes提供了NodePort、LoadBalancer、Ingress三种方式。

NodePort,在之前的Guestbook示例中,已经延时了NodePort的用法。NodePort的原理是,Kubernetes会在每一个Node上暴露出一个端口:nodePort,外部网络可以通过(任一Node)[NodeIP]:[NodePort]访问到后端的Service。

LoadBalancer,在NodePort基础上,Kubernetes可以请求底层云平台创建一个负载均衡器,将每个Node作为后端,进行服务分发。该模式需要底层云平台(例如GCE)支持。

Ingress,是一种HTTP方式的路由转发机制,由Ingress Controller和HTTP代理服务器组合而成。Ingress Controller实时监控Kubernetes API,实时更新HTTP代理服务器的转发规则。HTTP代理服务器有GCE Load-Balancer、HaProxy、Nginx等开源方案。

  • servicede 自发性机制

      Kubernetes中有一个很重要的服务自发现特性。一旦一个service被创建,该service的service IP和service port等信息都可以被注入到pod中供它们使用。Kubernetes主要支持两种service发现 机制:环境变量和DNS。

环境变量方式

  Kubernetes创建Pod时会自动添加所有可用的service环境变量到该Pod中,如有需要.这些环境变量就被注入Pod内的容器里。需要注意的是,环境变量的注入只发送在Pod创建时,且不会被自动更新。这个特点暗含了service和访问该service的Pod的创建时间的先后顺序,即任何想要访问service的pod都需要在service已经存在后创建,否则与service相关的环境变量就无法注入该Pod的容器中,这样先创建的容器就无法发现后创建的service。

DNS方式

Kubernetes集群现在支持增加一个可选的组件——DNS服务器。这个DNS服务器使用Kubernetes的watchAPI,不间断的监测新的service的创建并为每个service新建一个DNS记录。如果DNS在整个集群范围内都可用,那么所有的Pod都能够自动解析service的域名。Kube-DNS搭建及更详细的介绍请见:基于Kubernetes集群部署skyDNS服务

  • 多个service如何避免地址和端口冲突

      此处设计思想是,Kubernetes通过为每个service分配一个唯一的ClusterIP,所以当使用ClusterIP:port的组合访问一个service的时候,不管port是什么,这个组合是一定不会发生重复的。另一方面,kube-proxy为每个service真正打开的是一个绝对不会重复的随机端口,用户在service描述文件中指定的访问端口会被映射到这个随机端口上。这就是为什么用户可以在创建service时随意指定访问端口。

  • service目前存在的不足

      Kubernetes使用iptables和kube-proxy解析service的人口地址,在中小规模的集群中运行良好,但是当service的数量超过一定规模时,仍然有一些小问题。首当其冲的便是service环境变量泛滥,以及service与使用service的pod两者创建时间先后的制约关系。目前来看,很多使用者在使用Kubernetes时往往会开发一套自己的Router组件来替代service,以便更好地掌控和定制这部分功能。

    • Replication Controller
      Replication Controller(RC)是Kubernetes中的另一个核心概念,应用托管在Kubernetes之后,Kubernetes需要保证应用能够持续运行,这是RC的工作内容,它会确保任何时间Kubernetes中都有指定数量的Pod在运行。在此基础上,RC还提供了一些更高级的特性,比如滚动升级、升级回滚等。

Kubernetes集群搭建--以及部署过程中填上的那些坑(一)_第12张图片

Kubernetes集群搭建--以及部署过程中填上的那些坑(一)_第13张图片

Kubernetes集群搭建--以及部署过程中填上的那些坑(一)_第14张图片

Kubernetes集群搭建--以及部署过程中填上的那些坑(一)_第15张图片

  • Volumes
    Kubernetes集群搭建--以及部署过程中填上的那些坑(一)_第16张图片

Kubernetes集群搭建--以及部署过程中填上的那些坑(一)_第17张图片

Kubernetes集群搭建--以及部署过程中填上的那些坑(一)_第18张图片

  • K8S的架构
    Kubernetes集群搭建--以及部署过程中填上的那些坑(一)_第19张图片

  • K8S的运行机制
    Kubernetes集群搭建--以及部署过程中填上的那些坑(一)_第20张图片

你可能感兴趣的:(新知识的学习)