APP下载

部署和管理Kubernetes集群

2019-12-22

网络安全和信息化 2019年2期
关键词:命令容器集群

强大的容器管理功能

在集群环境中运行Docker,需要解决和容器管理相关的很多问题,例如调度,生命周期及监控状态,服务发现,监控,认证,容器聚合等。之所以要使用Kubernetes,就是为了解决Docker所无法解决的问题。Kubernetes是在集群中多个主机间管理容器化应用的开源系统,可以让部署容器化或者以微服务为基础的架构的应用变得简单易行,Kubernetes是轻量级的简单的系统,可以在公有云,私有云以及混合云中部署。

其具有模块化,可插拔化,可挂接化以及可组合化等特点。Kubernetes提供了容器的自动恢复,自动重启以及自动复制功能,在Kubernetes架构中,Master作为管理节点发挥作用,所有的用户可以将不同的容器和应用通过Master节点部署到不同的工作节点上,Kubernetes在不同的工作节点上打包或者调用具体的应用,使用Kubectl CLI,可以和Kubernetes进行交互。例如执行“kubectl get nodes”命令,列出当前所有的工作节点。

执 行“kubectl get events”命令,了解当前集群发生的事件信息。

PODs的管理和配置

对于PODs来说,其实际上是创建,调度以及管理的最小单元,是共存的一组容器的集合。在同一个PODs之中的容器共享了PID,网络,IPC,UTS命名空间以及存储卷。设计PODs的目的在于更好的进行资源共享以及容器间的通讯,便于更好的管理容器。

注 意 :PODs是 一 个 短暂存在的对象,其生命周期包 括 Penging,Running,Succeeded,Failed等状态。

例如,在由三个节点组成的Kubernetes集群中,包括一个Master节点和两个工作节点。

在Master上 执 行“vi pod.yaml”命令,在其中显示具体的版本号,对应的对象类型为POD,对象所需的属性值,容器的相关信息(例如应用类型,监听端口等)。

执 行“kubectl create-f pod.yaml pods/nginx”命令,就基于“pod.yaml”创建了一个PODs对象,这里使用的容器镜像为Nginx。

执 行“kubectl get nodes”命令,可以看到该PODs已经出于运行状态。

执行“kubel delte pods nginx”命令,可以删除上述PODs。

执 行“k u b e c t l describe pods xxx”命令,可以查看指定PODs的详细信息,“xxx”为PODs的名称。

执 行“kubectl logs xxx”命令,可以查看指定PODs的日志信息。

使用Volumes实现数据持久化

当容器Crash时,其中的数据就会丢失。Kubernetes的Volumes可以解决数据持久化的问题,同时让PODs中的容器共享数据。其生命周期和定义它的PODs的生命周期是一致的。当一个PODs停止退出时,Volumes也会停止退出。Volume支持诸 如 EmptyDir,Hostpath,gcePersistentDisk,NFS,Glusterfs。sectrets等 很多类型的数据卷。即使容器Crash后,数据卷是不会被删除的。

例 如,执 行“vi pod.yaml”命令,在其中依次输 入“apiVersion:V1”,“kind :Pod”,“metadata:”,“name:redis”,“spec:”,“- n a m e:r e d i s”,“ V o l u m e M o u n t”,“ -name:redis-persistentstorage”,“mountPath:/data/redis”,“volumes:”,“-name:redis-persistentstorage”,“empty: {}”行,定义了其存储卷信息。当其被PODs创建时,会产生一个空的文件夹,并将其映射到容器中。执行“kubectl create -f pod.yaml pods/redis”命令,创建该 PODs。执 行“kubectl get pods redis -o yaml”命令,可以查看更加详细的信息,在其中可以看到数据挂载点信息,从而实现了数据的持久化。

使用Labels的标识功能

对于Labels来说,其用来标示对象的Key/Value对,可以组织并选择对象子集,Label让用户可以映射自己应用的组织结构,而不需要存储这些映射表。Label不需要提供唯一性,多个对象可以使用相同的Label,通过Label选择器,用户可以指定一些对象子集来进行分组合并。例如执行“vi labels.yaml”命 令,在 其中 的“metadata:”栏 中 添加“label:”,“app:nginx”行,来 声 明 该Label。 执行“kubectl create -f labels.yaml pods/redis”命令,创建带Label的PODs。例 如 执 行“kubectl get pods -l app=nginx”命令, 则只显示指定的PODs。

使用RC管理节点调度

当维护节点或者节点出错时,利用Replicatuion Controllers(简 称 RC),可以将PODs调度到其他正常节点上运行。Replicatuion Controllers可以在任一时刻确保运行指定数量的PODs,其实现了容器的重新调度机制,可以监控运行在多个节点上的多个PODs。Replicatuion Controllers让规模的调整变得比较简单,实现多发布版本跟踪功能,还可以逐个替换PODs的方法实现在线升级。

执 行“vi rc.yaml”命令,在其中的“replicas:”栏中显示指定PODs的数量。 在“Selector:”栏 中显示具体Label信息。在“template:”栏中显示PODs的定义信息。执行“kubectl create -f rc.yaml”命令,创建该 RC,执行“kubectl get rc”命令查看该RC的信息。执行“kubectl get pods -l app=xxx”命令,显示指定Label值的PODs的信息。这里的“xxx”为指定Label名称。即使将其中一个 POD删 除,Replicatuion Controllers也会按照指定数量重启合乎数量的PODs。

Kubernetes的服务管理机制

每个PODs都拥有自己的IP,而且这些IP并不固定,当一些PODs为另外的PODs提供服务,那么如何进行发现呢?利用Kubernetes提供的Services,可以有效解决该问题。Services抽象了一些列的POD并定义了其访问规则,为每一个服务提供了固定的虚拟的IP和DNS域名,通过环境变量和DNS的方式可以发现服务。注意,只能在工作节点上访问该虚拟IP。

Services可以实现简单的负载均衡,其定义了PODs的访问方式,包括ClusterIP(只能在当前集群内访问),NodePort(在使用ClusterIP的同时,在集群每个节点上暴露一个服务的接口,外部用户利用该节点的IP地址和该端口进行访问)和LoadBanlancer(要求云服务商提供支持)等。例如执行“vi service.yaml”命令,在“metadata:”栏中输入“name:xxx”行,为其进行命名。在“spec:”栏中定义了监听端口号,对应的映射端口以及协议类型,在“selector:”栏中定义选择器,指明为哪些PODs服务。执 行“kubectl create -f service.yaml”命令,创建该Service。

执 行“kubectl get services”命令,列出所有的Service信息。例如,在某个工作节点上执行“curl http://xxx.xxx.xxx.xxx:yyy”地址,可以访问指定Service提供的的服务,“xxx”表 示 该 Service的虚拟 IP,“yy”为具体的端口号。当然,Kubernetes还包括其他一些概念,例如Names用来命名一个对象,Namespaces实现了命名空间的功能,Kubernetes是支持多租户的,为了保证每个租户的对象是相互隔离的,可以为其定义各自的命名空间。利用Annotations可以定义一些Key-Value资源,用于处理一些非选择的非过滤的参数。

资源管理和健康监测机制

Kubernetes的调度器只会将容器调度到有足够CPU,内存等资源可用的节点上,可以通过指定Resources来指明PODs所使用的最大资源信息,最好为每个对象设置其可用的资源的限定值,这样可以保证为集群中的多个应用合理的分配资源。

例 如, 执 行“vi resource.yaml”命 令,在“resources:”栏中定义CPU和内存的使用量。

利 用Kubernetes提供的健康监测机制,可以及时检测到发生错误的应用并并重启对应的PODs。这就包括了Liveness和ReadinessProbes检测功能。

例 如, 执 行“vi liveness.yaml”命 令,在“livenessProbe:”行中定义了检测机制。

例如,使用“httpGet”命令来访问特定的地址,同时在“initialDelaySeconds:”栏中定义间隔时间,这样就可以定义执行检测操作。

如果返回错误的检测代码,就会重启对应的PODs。当工作节点上的应用因为失败退出时,Kubernetes可以保证其以安全干净的方式(例如将内存中的数据保存等)退出。

例如,执行“vi aqiut.yaml”命令,可以定义钩子函 数,在“lifecycle:”栏中定义具体的参数,例如在“preStop:”项中定义具体的命令。

例如,对于Nginx应用来说,可以设置“command:["/usr/sbin/nginx","-s","quit"]” 命 令, 让Nginx安全退出,其会在Kubernetes发出退出指令之前运行。

Kubernetes的在线升级机制

许多应用需要创建多个资源,管理多个资源可以将其简单的合并到一个文件当中。最好是将同一个应用相关的所有资源放置在同一个配置文件中,并将和此应用相关的所有文件保存到同一路径下。

在很多情况下,会使用多个Label来标识一个对象。为了避免服务的持续运行,需要使用到在线应用升级和回退的机制。例如执行“kubectl run Testspec ”命令,创建名为“Testspec”的RC对象。

执行“kubectl get rc”命令,查看该RC对象。

执 行“kubectl get pods”命令,显示其默认只存在于一个PODs上。

在Master节点上执行“kubectl scale rc Testspec --replicas=7”命令,动态调整当前运行的PODS的数量(例如7个)。

执 行“vi shengji.yaml” 命 令,在 其 中 依次 输 入“apiVersion:V1”,“kind:Service”,“metadata:”,“name:Testspec”,“labels:”,“app:Testspec”,“spec:”,“type:NodePort”,“selector:”,“ a p p:T e s t s p e c”,“ports:”,“-name:http”,“modePort:21769”,“port:80”,“protocol:TCP”等 行,编辑该Service的信息,指定其名称和使用的Label信息,并且在每个工作节点上为其分配指定的端口。

执 行“kubectl create-f shengji.yaml”命令,来创建该Service。

在工作节点上执行“while true do curl -s http://xxx:21769/| grep-o-e 'Version: Testspec [0-9].[0-9]'.[0-9]';sleep 1;done”命令,每隔1秒从指定位置的服务的虚拟IP上获取具体的版本信息。

在Master节点上执行“kubectl rollingupdate Testspec -updateperiod=5s -image=b.gcr.io/kuar/ Testspec:3.0.0”命令,就会每隔3秒钟替换掉旧的PODs生成新版本的PODs。

在上述工作节点再次吗执行以上命令,可以看到新的版本已经产生了。

这样,就可以在服务不间断的情况下,对镜像进行升级。

当然,有些对象是需要实时更新的,利用Kubernetes的实时更新机制,可以在线将实时的修改写入到目标对象中。

实现数据安全管理

当容器出现问题时,为了保证其中的数据不丢失,就需要在容器外保存修改后的数据。对于关键的数据,最好将其保存在网络存储中。对于诸如密钥等敏感信息,将其打包到容器内是不行的,利用Kubernetes提供的Secrets机制,可以安全存储这些敏感的数据。

例如执行“vi secret.yaml” 命 令,在 其 中 的“data:”栏中可以定义账户名,密码的信息。例如“password: xxx” 等。 执行“kubectl create -f secret.yaml”命令,来创建该Secret对象。

执 行“kubectl get secret”命令,显示Screct对象信息。

如何在应用中使用Secret对象呢?例如执行“vi secretapp.yaml”命令,打开某个YAML文件,在其中定义了RC对象,主要用于实现Redis的应用。在其中的“volumes:”栏中可以定义多个逻辑卷,例如“emptyDIr:{}”等。 在 其 中 输 入“-n a m e: a p p s c r e c t”,“secrect:”,“secrectName:screct1”等行,可以使用特定的Screct逻辑卷,这样就以文件的形式将其映射到了Redis的容器中。

猜你喜欢

命令容器集群
管理Windows10的PowerShell命令行使用记录
功能性新材料产业集群加速形成
安装和启动Docker
难以置信的事情
海上小型无人机集群的反制装备需求与应对之策研究
培育世界级汽车产业集群
移防命令下达后
勤快又呆萌的集群机器人
解析Windows10的内部命令
液体对容器底及容器对桌面的压力和压强