容器编排工具-Kubernetes

一、什么是容器编排

容器编排与容器的生命周期管理相关,特别是在大型动态环境中。软件团队用容器编排器来控制和自动化容器管理的各种任务。

容器编排器可以工作在使用容器的任何环境。它可以帮助你在多个环境中部署相同的程序,而不需要重新编写它。

二、常见的编排工具

1、Kubernetes

2、Docker Swarm

3、Apache Mesos

三、K8s简介

1、K8s基本功能

K8s是一个最初由Google开发的,用于自动化部署、扩展和管理容器化应用的开源容器编排器技术。

K8s使部署和管理微服务架构应用程序变得很简单。它通过在集群之上形成一个抽象层来实现这一点,允许开发团队平滑地部署应用程序,

K8s主要处理以下任务:

    • 控制和管理应用程序对资源的使用
    • 自动负载均衡应用程序的多个实例之间请求
    • 监控资源使用和资源限制,为了可以自动阻止应用消耗过多的资源并且可以再次恢复它们
    • 如果主机资源耗尽或主机死机,将应用程序实例从一台主机迁移到另一台主机是一个可行的选项
    • 当有新的主机加入集群时,新增加的额外资源可以被自动使用

2、K8s架构

容器编排工具-Kubernetes_第1张图片

3、K8s组件

1、控制平面

控制平面是管理员和用户管理不同节点的地方。它通过HTTP调用接收命令或者连接到系统并且运行命令行脚本。顾名思义,它控制了K8s与应用程序的交互方式。

2、API服务器

API 服务器为K8s集群提供了一个REST接口。 所有在pod上激活的服务和别的对象都是可以用可编程的方式与与终端进行交互。

3、调度器

调度器负责将任务分配给各个节点。它监控资源容量并保证工作节点的性能保持在可接受的范围内。

4、控制器管理器

K8s控制器管理器是管理K8s核心控制循环的服务。它负责确保集群的共享状态正常运行。

5、Etcd

K8s使用了Etcd,一个提供分布式键值存储的数据库,用来共享集群的整体状态的信息。

6、节点

节点是运行了pod的物理机或虚拟机。控制平面管理集群中的每个节点,该节点包含运行 pod所需的服务。

7、Pods

K8s pod 是K8s管理容器集的最小单位。 每个pod有一个分配给pod中的所有容器的单独的IP 地址。在pod中的容器内存和存储资源是共享的。当应用程序只有一个进程时,pod 也可以有一个容器。

8、Kubelet

Kubelet是一个工作节点组件。它的任务是跟踪pod及其容器的运行状态。它与pod的YAML 或JSON描述文件相关。Kubelet检查 pod 规格并确定 pod 是否健康。

9、Kube代理

Kube代理是一个网络代理和负载均衡器,充当每个节点和API服务器之间的连接。它在集群中的每个节点上运行,并允许你从内部和外部连接到pod。

10、Kubectl

Kubectl是K8s的命令行工具。它用于部署应用程序、监控和控制集群资源以及查看日志。

4、K8s控制节点Master

K8S中的Master是集群控制节点,负责整个集群的管理和控制

    • ApiServer : 资源操作的唯一入口,接收用户输入的命令,提供认证、授权、API注册和发现等机制,其他模块通过API Server查询或修改数据,只有API Server才直接和etcd进行交互;
    • Scheduler : 负责集群资源调度,通过API Server的Watch接口监听新建Pod副本信息,按照预定的调度策略将Pod调度到相应的node节点上;
    • ControllerManager : K8S里所有资源对象的自动化控制中心,通过 api-server 提供的 restful 接口实时监控集群内每个资源对象的状态,发生故障时,导致资源对象的工作状态发生变化,就进行干预,尝试将资源对象从当前状态恢复为预期的工作状态,常见的 controller 有 Namespace Controller、Node Controller、Service Controller、ServiceAccount Controller、Token Controller、ResourceQuote Controller、Replication Controller等;
    • Etcd : 是Kubernetes的存储状态的数据库(所有master的持续状态都存在etcd的一个实例中)

5、K8s工作节点Node

Node是K8S集群中的工作负载节点,每个Node都会被Master分配一些工作负载,当某个Node宕机时,其上的工作负载会被Master自动转移到其他节点上

    • Kubelet : 负责维护容器的生命周期,即通过控制docker,控制Pod 的创建、启动、监控、重启、销毁等工作,处理Master节点下发到本节点的任务;
    • KubeProxy : 负责制定数据包的转发策略,并以守护进程的模式对各个节点的pod信息实时监控并更新转发规则,service收到请求后会根据kube-proxy制定好的策略来进行请求的转发,从而实现负载均衡,总的来说,负责为Service提供cluster内部的服务发现和负载均衡;
    • Docker : 负责节点上容器的各种操作;

6、K8s其他节点

    • Pod: kubernetes的最小控制单元,容器都是运行在pod中的,一个pod中可以有1个或者多个容器
    • Controller: 控制器,通过它来实现对pod的管理,比如启动pod、停止pod、伸缩pod的数量等等
    • Service: pod对外服务的统一入口,下面可以维护者同一类的多个pod
    • Label: 标签,用于对pod进行分类,同一类pod会拥有相同的标签
    • NameSpace: 命名空间,用来隔离pod的运行环境

四、K8s使用

1、Pod创建流程

    • 客户端提交创建请求,可以通过API Server的Restful API,也可以使用kubectl命令行工具。支持的数据类型包括JSON和YAML。
    • API Server处理用户请求,存储Pod数据到etcd。
    • 调度器通过API Server查看未绑定的Pod。尝试为Pod分配主机。
    • 过滤主机 (调度预选):调度器用一组规则过滤掉不符合要求的主机。比如Pod指定了所需要的资源量,那么可用资源比Pod需要的资源量少的主机会被过滤掉。
    • 主机打分(调度优选):对第一步筛选出的符合要求的主机进行打分,在主机打分阶段,调度器会考虑一些整体优化策略,比如把容一个Replication Controller的副本分布到不同的主机上,使用最低负载的主机等。
    • 选择主机:选择打分最高的主机,进行binding操作,结果存储到etcd中。
    • kubelet根据调度结果执行Pod创建操作: 绑定成功后,scheduler会调用APIServer的API在etcd中创建一个boundpod对象,描述在一个工作节点上绑定运行的所有pod信息。运行在每个工作节点上的kubelet也会定期与etcd同步boundpod信息,一旦发现应该在该工作节点上运行的boundpod对象没有更新,则调用Docker API创建并启动pod内的容器。

2、Pod状态

  • 挂起(Pending): apiserver已经创建了pod资源对象,但它尚未被调度完成或者仍处于下载镜像的过程中
  • 运行中(Running): pod已经被调度至某节点,并且所有容器都已经被kubelet创建完成
  • 成功(Succeeded): pod中的所有容器都已经成功终止并且不会被重启
  • 失败(Failed): 所有容器都已经终止,但至少有一个容器终止失败,即容器返回了非0值的退出状态
  • 未知(Unknown): apiserver无法正常获取到pod对象的状态信息,通常由网络通信失败所导致

状态

描述

ContainerCreating

容器创建中

PodInitializing pod

初始化中

CrashLoopBackOff

容器曾经启动了,但可能又异常退出了,kubelet正在将它重启

InvalidImageName

无法解析镜像名称

ImageInspectError

无法校验镜像

ErrImageNeverPull

策略禁止拉取镜像

ImagePullBackOff

正在重试拉取

RegistryUnavailable

连接不到镜像中心

ErrImagePull

通用的拉取镜像出错

CreateContainerConfigError

不能创建kubelet使用的容器配置

CreateContainerError

创建容器失败

m.internalLifecycle.PreStartContainer

执行hook报错

RunContainerError

启动容器失败

PostStartHookError

执行hook报错

ContainersNotInitialized

容器没有初始化完毕

ContainersNotRead

容器没有准备完毕

DockerDaemonNotReady

docker还没有完全启动

NetworkPluginNotReady

网络插件还没有完全启动

3、kubectl常用命令

参考资料:命令行工具 (kubectl) | Kubernetes

1、创建yaml 资源

kubectl create demo.yaml

2、开放yaml资源端口

kubectl expose demo.yaml

3、创建并启动容器对象

kubectl run demo.yaml

4、显示资源详情

kubectl describe

5、查看容器的日志

kubectl logs

6、获取资源信息

kubectl get

7、编辑资源对象

kubectl edit

8、删除资源

kubectl delete

4、yaml配置

1、apiVersion

Kubernetes API的稳定版本,包含很多核心对象:pod、service等。

2、kind

指定这个资源对象的类型,如pod、deployment、statefulset、job、cronjob、Endpoints service

    • Endpoints :可以把外部的链接到k8s系统中
    • service:部署一个内部的IP,其他deployment可以链接
    • deployment:部署一个pod,内部只能链接service,无法互相连接。

3、metadata

常用的配置项有name:显示的名字,namespace:归属的命名空间。

4、spec

一个嵌套字典与列表的配置项,也是主要的配置项,支持的子项非常多,根据资源对象的不同,子项会有不同的配置。


apiVersion: v1  				#必选 版本号
kind: Pod       				#必选
metadata:								#必选 元数据
  name: nginx						#必选 Pod名称
  labels:								#自定义标签
    app: nginx					#自定义标签名称
spec:										#必选 Pod中容器的详细定义
  containers:						#必选 Pod中容器列表,一个pod里会有多个容器
    - name:nginx 				#必选 容器名称
      image:nginx 			#必选 容器的镜像名称
      imagePullPolicy:IfNotPresent # [Always | Never | IfNotPresent] 获取镜像的策略 Alawys表示下载镜像 IfnotPresent表示优先使用本地镜像,否则下载镜像,Nerver表示仅使用本地镜像 
  	  ports: 						#需要暴露的端口库号列表
  	  - containerPort:80 # 容器需要监听的端口号
 restartPolicy: Always 	# [Always | Never | OnFailure]#Pod的重启策略,Always表示一旦不管以何种方式终止运行,kubelet都将重启,OnFailure表示只有Pod以非0退出码退出才重启,Nerver表示不再重启该Pod 


service的spec配置:

apiVersion: v1  		#必选 版本号
kind: Service       #必选
metadata:						#必选 元数据
  name: service-hello		#必选 Pod名称
  labels:						#自定义标签
    name: service-hello #自定义标签名称
spec:								#必选 Pod中容器的详细定义
  type:	NodePort		#这里代表是NodePort类型的,另外还有ingress,LoadBalancer 
  ports: 
  - port:80 				#这里的端口和clusterIP(kubectl describe service service-hello中的IP的port)对应,即在集群中所有机器上curl clusterIP:80可访问发布的应用服务
  	targetPort:8080 #端口一定要和contrainer暴露出来的端口对应,nodejs暴露出来的端口是8080
  	protocol: TCP
  	nodePort: 31111 #所有的节点都会开发此端口30000~32767,此端口供外部调用
  selector:
  	run:hello  			#这里选择器一定要选择容器的标签

6、nodeName

nodeName用于将Pod调度到指定的Node名称上。

# SchedulePolicy-nodeName.yaml
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: busybox
  name: busyboxnn
  namespace: default
spec:
  nodeName: k8s-node1
  containers:
  - image: busybox
    name: bs
    command:
    - "ping"
    - "baidu.com"

5、关于port

  • port:是k8s集群内部访问service的端口,即通过clusterIP:port可以访问到某个service
  • nodePort:是外部访问k8s集群中service的端口,通过nodeIP:nodePort可以从外部访问到某个service。
  • targetPort:是pod的端口,从port和nodePort来的流量经过kube-proxy流入到后端pod的targetPort上,最后进入容器
  • containerPort:是pod的内部端口,targetPort映射到containerPort。

五、阿里云K8s实践

1、工作台

容器编排工具-Kubernetes_第2张图片

2、K8s集群列表

容器编排工具-Kubernetes_第3张图片

3、K8s工作空间

容器编排工具-Kubernetes_第4张图片

4、具体容器K8s

1、查看Pod状态

容器编排工具-Kubernetes_第5张图片

2、无状态多个节点

容器编排工具-Kubernetes_第6张图片

3、查看启动部署

容器版本可以回滚到某次部署发布

容器编排工具-Kubernetes_第7张图片

4、查看实时日志

容器编排工具-Kubernetes_第8张图片

5、查看服务路由

外网走域名地址访问,内网走服务名称自动注册查找

容器编排工具-Kubernetes_第9张图片

你可能感兴趣的:(java)