Kubernetes(一)

       Kubernetes(https://github.com/kubernetes/kubernetes)是Google公司团队于2014年基于内部集群管理系统Borg开源发起并维护的开源容器集群管理系统,为容器化的应用提供了资源调度、部署运行、服务发现、扩容以及缩容等一整套功能,它基于Go语言实现,支持如Docker等容器技术,使用它,用户可以轻松搭建和管理一个私有容器云。

      技术优势:

      1. 优秀的API设计,以及简洁高效的架构设计,主要组件个数很少,彼此之间通过接口调用

      2. 基于微服务模式的多层资源抽象模型,兼顾灵活性与可操作性,提出的Pod模型被许多平台借鉴

      3. 可扩展性好,模块化容易替换,伸缩能力极佳,1.2.0版本单集群支持1000个节点,同时运行30000个Pods

      4. 自动化程度高,真正实现"所得即所需",用户通过模板声明服务后,生命周期都是自动化管理(Kebernetes可以说是一个高度自动化的资源控制系统,它通过跟踪对比etcd库里保存的“资源期望状态”与当前环境中的“实际资源状态”的差异来实现自动控制和自动纠错的高级功能)

      5. 部署支持多种环境,包括虚拟机、逻辑部署,还很好地支持常见云平台,包括AWS、GCE等

      6. 支持丰富的运维工具,方便用户对集群进行性能测试,问题检查和状态监控

      7. 自带控制台、客户端命令等工具,允许用户通过多种方式与Kubernetes集群进行交互

 

      Kubernetes有三大核心概念:

      1.集群组件

         集群由使用Kubernets组件管理的一组节点组成,这些节点提供了容器资源池供用户使用,主要由管理组件(Master)和工作节点(Node)组件构成。Kubernetes集群的主要任务始终围绕着应用的生命周期。通过将不同资源进行不同层次的抽象,Kubernetes提供了灵活可靠的生命周期管理。

        Master组件

        提供所有与管理相关的操作,例如调度、监控、支持对资源的操作等,它会通过Node、Controller来定期检查所管理的Node资源的健康状况,完成Node的生命周期管理。在Master节点上运行着集群管理相关的一组进程kube-apiserver、kube-controller-manager、和kube-scheduler,这些进程实现了整个集群的资源管理、Pod调度、弹性伸缩、安全控制、系统监控等功能。

        Node节点组件

        实际工作的计算实例(在1.1版本之前称为Minion),可以是虚拟机或物理机器,是Kubernetes集群中的工作负载节点,在创建Kubernetes集群过程中,都要预装一些必要的软件来响应Master的管理。在Node节点上,Kubernetes管理的最小运行单元是Pod,其上运行着kubelet、kube-proxy服务进程以及docker引擎,这些服务进程负责Pod的创建、启动、监控、重启等功能。

        执行命令可查看集群中的Node数量: kubectl get nodes

        执行命令可查看Node的详细信息:    kubectl describe node {node_name}

       (目前Node的配置还只能通过人工手动进行,未来可以支持通过Master来自动配置)

       Node节点有如下几个重要属性:

      - 地址信息

        包括:

     - 主机名(HostName): 节点所在系统的主机别名,基本不会用到

    - 外部地址(ExternalIP): 集群外部客户端可以通过该地址访问到的节点

    - 内部地址(InternalIP): 集群内可访问的地址,外部往往无法通过该地址访问节点

    - 阶段状态

       包括:

    - 待定(Pending):新创建节点,还未就绪状态,需要进一步的配置

    - 运行中(Running): 正常运行中的节点,可被分配Pod,会定期汇报运行状态消息

    - 终止(Terminated): 节点已经停止,处于不可用状态,判断条件为5分钟内未收到运行状态消息

    - 资源容量

    包括常见操作系统资源,如CPU、内存、最多存放的Pod个数等

    - 节点信息

    包括操作系统内核信息、Kubernets版本信息、Docker引擎版本信息等,会由kubelet定期汇报

 

     2.资源抽象

      每个资源都是一个REST对象,通过API进行操作,通过JSON/YAML格式的模板文件进行定义,在Kubernetes代码包的example目录下自带了很好的示例模板文件,应多参考。

主要包括:

2.1 容器组(Pod): 由位于同一节点上若干容器组成,彼此共享网络命名空间和存储卷(Volume)。Pod是Kubernetes中进行管理的最小资源单位,是最为基础的概念。跟容器类似,Pod是短暂的,随时可变的

2.2 服务(Service): 若干(往往是同类型的)Pod形成的对外提供某个功能的抽象,不随Pod改变而变化,带有唯一固定的访问路径,如IP地址或者域名。

2.3 复制控制器(Replication Controller): 负责启动Pod,并维护其健康运行的状态。是用户管理Pod的句柄。

2.4 部署(Deployment): 创建Pod,并可根据参数自动创建管理Pod的复制控制器,并且支持升级。1.2.0版本引入提供比复制控制器更方便的操作。

2.5 横向Pod扩展器(Horizontal Pod Autoscaler, HPA): 类似云里面的自动扩展组,根据Pod的使用率(类似CPU)自动调整一个部署里面Pod的个数,保障服务可用性

 

     3. 辅助概念

3.1 注解(Annotation): 键值对,可以存放大量任意数据,一般用来添加对资源对象的详细说明,可供其他工具处理

3.2 标签(Label): 键值对,可以标记到资源对象上,用来对资源进行分类和筛选

3.3 名字(Name): 用户提供给资源的别名,同类资源不能重名

3.4 命名空间(Namespace): 这里是指资源的空间,避免不同租户的资源发生命名冲突,另外可以进行资源限额

3.5 持久卷(Persistent Volume): 类似于Docker中的数据卷的概念,就是一个数据目录,Pod对其有访问权限。

3.6 秘密数据(Secret): 存放敏感数据,例如用户认证的口令

3.7 选择器(Selector): 基于标签概念的一个正则表达式,可通过标签来筛选出一组资源

3.8 Daemon集(DaemonSet): 确保节点上肯定运行某个Pod,一般用来采集日志和监控节点

3.9 任务(Job): 确保给定数目的Pod正常退出(完成了任务)

3.10 入口资源(Ingress Resource): 用来提供七层代理服务

3.11 资源限额(Resource Quotas): 用来限制某个命名空间下对资源的使用,开始逐渐提供多租户支持

3.12 安全上下文(Security Context): 应用到容器上的系统安全配置,包括uid、gid、capabilities、SELinux角色等

3.13 服务账号(Service Accounts): 操作资源的用户账号

 

----------------------------------------------------

 

安装使用Kubernetes

1、关闭Centos自带的防火墙服务(实际测试,可以不需要关闭firewall,建议保留运行)

     systemctl disable firewalld

     systemctl stop firewalld

2、安装etcd和Kubernetes

     yum install -y etcd kubernetes

安装完成后需要进行如下配置:

Kubernetes(一)_第1张图片

//

Kubernetes(一)_第2张图片

3. 按如下顺序启动:

Kubernetes(一)_第3张图片

这样,就安装启动完成了一个单机版的Kubernetes集群搭建。

4、新建一个mysql的pod

准备,因为会自动下载pause容器,可能会遇到国外网络限制,无法从gcr.io拉取pause0.8.0的镜像。那么很简单,就找个可用的镜像拉取即可。 
docker pull docker.io/kubernetes/pause

然后新建mysql-rc.yaml文件,内容如下:

Kubernetes(一)_第4张图片

说明:

metadata:

name: mysql ---> RC的名称,全局唯一性!!

replicas: 1 ---> Pod副本的期待的数量

selector:

app: mysql ---> 符合目标的Pod拥有此标签

template: ---> 根据此模板创建Pod

metadata:

labels:

app: mysql ---> Pod副本拥有的标签,对应RC的Selector

spec:

contiainers: ---> Pod容器的定义部分

- name: mysql

从上面可以看到,在一个RC定义文件中,包含如下3个关键信息:

1. 目标Pod的定义

2. 目标Pod需要运行的副本数量(Replicas)

3. 要监控的目标Pod的标签(Label)

执行如下命令,把它发布到Kubernetes集群中,在Master节点执行命令(这里就是同一台机器):

可以查看刚刚创建的RC和pod的情况:

等了几分钟,不对路,还是状态"ContainerCreating",看看其状态:(kubectl describe pod mysql-1qkm1)

Kubernetes(一)_第5张图片

出现如上错误,安装缺少的包( sudo yum install *rhsm* ),删除Pod后( kubectl delete -f mysql-rc.yml ),再次创建,稍等片刻,成功了:

Kubernetes(一)_第6张图片

看看运行的docker容器:

可以看到,提供MySQL服务的Pod容器已经创建好在运行了,另外,还多了一个容器,这是来自谷歌的pause容器,这是Pod的“根容器”。

 

5、创建好POD后,接下来创建与之关联的Service----MYSQL的定义文件,名称: mysql-svc.yaml:

Kubernetes(一)_第7张图片

创建service:

Kubernetes(一)_第8张图片

可以发现,mysql服务被分配了一个10.254.59.106的集群IP地址,它是一个虚地址,随后,Kubernetes集群中其他新创建的Pod就可以通过Service的集群IP+端口号3306来连接访问它了。

注意:

通常情况,集群Ip(Cluster IP)是在Service创建后由Kubernetes系统自动分配的,其他Pod无法预先知道某个Service的Cluster IP地址,因此需要一个服务发现机制来找到这个服务,对这个问题,Kubernetes利用Linux的环境变量来处理,根据Service的唯一名字,容器可以从环境变量中获取到Service对应的Cluster IP地址和端口,从而进行连接访问。

 

6、数据容器弄好了,现在来创建应用层,这里基于tomcat容器

Kubernetes(一)_第9张图片

上面的配置文件这里,tomcat容器内,依赖环境变量MYSQL_SERVICE_HOST值去连接MYSQL,更安全应该是使用服务的名称"mysql",配置文件可更改如下,这里就先不更改了:

Kubernetes(一)_第10张图片

另外,这里依赖于镜像kubeguide/tomcat-app:v1,为了提高创建速度,先下载该镜像:

Kubernetes(一)_第11张图片

参考:https://hub.docker.com/r/kubeguide/tomcat-app/

然后创建RC,因为在配置文件指定了两个副本,所以,这里有2个Pod:

Kubernetes(一)_第12张图片

接着,创建对应myweb的Service,文件为myweb-svc.yaml:

Kubernetes(一)_第13张图片

这里设置该Service开启了NodePort方式的外网访问模式,并映射宿主机的3001端口到8085端口

创建Service:

Kubernetes(一)_第14张图片

启动完成。

 

7、验证

测试发现,8085端口不行,因为用tomcat的默认的镜像,所以,需要修改回其默认的8080端口,修改myweb-rc.yaml和myweb-svc.yaml的8085为8080,这里就不修改截图了,删除重新创建即可:

Kubernetes(一)_第15张图片

 

8、通过这个流程,可以发现,基于Kubernetes搭建容器集群很方便,准备好镜像,然后通过配置文件描述好其关系就行了。

 

你可能感兴趣的:(Docker)