码迷,mamicode.com
首页 > Web开发 > 详细

Kubernetes学习-相关概念

时间:2018-05-16 13:08:51      阅读:258      评论:0      收藏:0      [点我收藏+]

标签:stp   ntp   容器   aml   匹配   upd   图片   官方   mic   

 

 

Kubernetes架构图

技术分享图片

上图可以看到如下组件,使用特别的图标表示Service和Label:

    • Pod
    • Container(容器)
    • Label(技术分享图片)(标签)
    • Replication Controller(复制控制器)
    • Service(技术分享图片)(服务)
    • Node(节点)
    • Kubernetes Master(Kubernetes主节点)

Pod

  Pod 是Kubernetes的基本操作单元,也是应用运行的载体。整个Kubernetes系统都是围绕着Pod展开的,比如如何部署运行Pod、如何保证Pod的数量、如何访问Pod等。另外,Pod是一个或多个机关容器的集合,提供了一种容器的组合的模型。

 Pod(上图绿色方框)安排在节点上,包含一组容器和卷。同一个Pod里的容器共享同一个网络命名空间,可以使用localhost互相通信。Pod是短暂的,不是持续性实体。

    • Pod是短暂的,容器重启会造成数据丢失对于需要持久化的数据,因为Kubernetes支持的概念,故可以使用持久化的卷类型。这样就能持久化容器数据使其能够跨重启而存在。
    • 创建Pod时可以手动创建单个Pod,也可以使用Replication Controller使用Pod模板创建出多份拷贝。
    • Pod是短暂的,那么重启时IP地址可能会改变,那么怎么才能从前端容器正确可靠地指向后台容器呢?这时可以使用Service。

   Pods提供两种共享资源:网络和存储。
网络:
  每个Pod被分配一个独立的IP地址,Pod中的每个容器共享网络命名空间,包括IP地址和网络端口。
  Pod内的容器可以使用localhost相互通信。
  当Pod中的容器与Pod 外部通信时,他们必须协调如何使用共享网络资源(如端口)。
存储:
  Pod可以指定一组共享存储volumes。
  Pod中的所有容器都可以访问共享volumes,允许这些容器共享数据。
  volumes 还用于Pod中的数据持久化,以防其中一个容器需要重新启动而丢失数据。

 

  • 基本操作

  创建  kubectl create -f xxx.yaml

  查询  kubectl get pod yourPodName  kubectl describe pod yourPodName

  删除  kubectl delete pod yourPodName

  更新  kubectl replace /path/to/yourNewYaml.yaml

  •  Pod与容器

  在Docker中,容器是最小的处理单元,增删改查的对象是容器,容器是一种虚拟化技术,容器之间是隔离的,隔离是基于Linux Namespace实现的。而在Kubernetes中,Pod包含一个或者多个相关的容器,Pod可以认为是容器的一种延伸扩展,一个Pod也是一个隔离体,而Pod内部包含的一组容器又是共享的(包括PID、Network、IPC、UTS)。除此之外,Pod中的容器可以访问共同的数据卷来实现文件系统的共享。

  • Pod与Controller

  Controller可以创建和管理多个Pod,提供副本管理、滚动升级和集群级别的自愈能力。如果一个Node故障,Controller就能自动将该节点上的Pod调度到其他健康的Node上。

  • 镜像

  在kubernetes中,镜像的下载策略为:

    Always:每次都下载最新的镜像

    Never:只使用本地镜像,从不下载

    IfNotPresent:只有当本地没有的时候才下载镜像

  Pod被分配到Node之后会根据镜像下载策略进行镜像下载,可以根据自身集群的特点来决定采用何种下载策略。无论何种策略,都要确保Node上有正确的镜像可用。

  •  其他

  通过yaml文件,可以在Pod中设置:

    启动命令,如:spec-->containers-->command;

    环境变量,如:spec-->containers-->env-->name/value;

    端口桥接,如:spec-->containers-->ports-->containerPort/protocol/hostIP/hostPort(使用hostPort时需要注意端口冲突的问题,不过Kubernetes在调度Pod的时候会检查宿主机端口是否冲突,比如当两个Pod均要求绑定宿主机的80端口,Kubernetes将会将这两个Pod分别调度到不同的机器上);

    Host网络,一些特殊场景下,容器必须要以host方式进行网络设置(如接收物理机网络才能够接收到的组播流),在Pod中也支持host网络的设置,如:spec-->hostNetwork=true;

    数据持久化,如:spec-->containers-->volumeMounts-->mountPath;

    重启策略,当Pod中的容器终止退出后,重启容器的策略。这里的所谓Pod的重启,实际上的做法是容器的重建,之前容器中的数据将会丢失,如果需要持久化数据,那么需要使用数据卷进行持久化设置。Pod支持三种重启策略:Always(默认策略,当容器终止退出后,总是重启容器)、OnFailure(当容器终止且异常退出时,重启)、Never(从不重启);

  •  Pod生命周期

  Pod被分配到一个Node上之后,就不会离开这个Node,直到被删除。当某个Pod失败,首先会被Kubernetes清理掉,之后ReplicationController将会在其它机器上(或本机)重建Pod,重建之后Pod的ID发生了变化,那将会是一个新的Pod。所以,Kubernetes中Pod的迁移,实际指的是在新Node上重建Pod。

 

Replication Controller

  Replication Controller确保任意时间都有指定数量的Pod“副本”在运行。如果为某个Pod创建了Replication Controller并且指定3个副本,它会创建3个Pod,并且持续监控它们。如果某个Pod不响应,那么Replication Controller会替换它。

  当创建Replication Controller时,需要指定两个东西:

    1. Pod模板:用来创建Pod副本的模板
    2. Label:Replication Controller需要监控的Pod的标签。RC与Pod的关联是通过Label来实现的。

  使用过程:

  1.   rc.yaml文件

 

apiVersion: v1
kind: ReplicationController
metadata:      #设置rc的元数据
  name: frontend
  labels:
    name: frontend
spec:
  replicas: 3    #设置Pod的具体数量
  selector:    #通过selector来匹配相应的Pod的label
    name: frontend
  template:    #设置Pod的模板
    metadata:
     labels:
       name: frontend
    spec:
     containers:
     - name: frontend
       image: kubeguide/guestbook-php-frontend:latest
    imagePullPolicy: IfNotPresent     #镜像拉取策略,分为Always,Never,IfNotPresent,默认是Always env : - name : GET_HOSTS_FROM value : env ports: - containerPort: 80

yaml字段的含义: 
spec.replicas:副本数量3 
spec.selector:RC通过spec.selector来筛选要控制的Pod 
spec.template:这里写Pod的定义(但不需要apiVersion和kind) 
spec.template.metadata.labels:Pod的label,可以看到这个label与spec.selector相同

这个文件的意思: 
定义一个RC对象,它的名字是frontend(metadata.name:frontend),保证有3个Pod运行(spec.replicas:3),Pod的镜像是kubeguide/guestbook-php-frontend:latest(spec.template.spec.containers.image:kubeguide/guestbook-php-frontend:latest)

  1. 关键在于spec.selector与spec.template.metadata.labels,这两个字段必须相同,否则下一步创建RC会失败。(也可以不写spec.selector,这样默认与spec.template.metadata.labels相同)

RC的常用操作命令:

    通过kubectl创建RC

    # kubectl create -f rc.yaml

    查看RC具体信息

    # kubectl describe rc frontend

    通过RC修改Pod副本数量(需要修改yaml文件的spec.replicas字段到目标值,然后替换旧的yaml文件)

    # kubectl replace -f rc.yaml

    或

    # kubect edit replicationcontroller frontend

    对RC使用滚动升级,来发布新功能或修复BUG

    # kubectl rolling-update frontend --image=kubeguide/guestbook-php-frontend:latest

    当Pod中只有一个容器时,通过–image参数指定新的Tag完成滚动升级,但如果有多个容器或其他字段修改时,需要指定yaml文件

     # kubectl rolling-update frontend -f FILE.yaml

    如果在升级过程中出现问题(如发现配置错误、长时间无响应),可以使用CTRL+C退出,再进行回滚

     # kubectl rolling-update frontend --image=kubeguide/guestbook-php-frontend:latest --rollback

     但如果升级完成后出现问题(比如新版本程序出core),此命令就无能为力了。我们需要使用同样方法,利用原来的镜像,“升级”为旧版本。

Deployment

  更加方便的管理Pod和Replica Set

  k8s是一个高速发展的项目,在新的版本中,官方推荐使用Replica Set和Deployment来代替RC。那么它们优势在哪里,我们来看一看:

  • RC只支持基于等式的selector(env=dev或environment!=qa),但Replica Set还支持新的,基于集合的selector(version in (v1.0, v2.0)或env notin (dev, qa)),这对复杂的运维管理很方便。

  • 使用Deployment升级Pod,只需要定义Pod的最终状态,k8s会为你执行必要的操作,虽然能够使用命令# kubectl rolling-update完成升级,但它是在客户端与服务端多次交互控制RC完成的,所以REST API中并没有rolling-update的接口,这为定制自己的管理系统带来了一些麻烦。

  • Deployment拥有更加灵活强大的升级、回滚功能。

目前,Replica Set与RC的区别只是支持的selector不同,后续肯定会加入更多功能。Deployment使用了Replica Set,它是更高一层的概念。除非用户需要自定义升级功能或根本不需要升级Pod,在一般情况下,我们推荐使用Deployment而不直接使用Replica Set。

Deployment的一些基础命令。

$ kubectl describe deployments  #查询详细信息,获取升级进度
$ kubectl rollout pause deployment/nginx-deployment2  #暂停升级
$ kubectl rollout resume deployment/nginx-deployment2  #继续升级
$ kubectl rollout undo deployment/nginx-deployment2  #升级回滚
$ kubectl scale deployment nginx-deployment --replicas 10  #弹性伸缩Pod数量
 

  使用子命令create,创建Deployment

 

  # kubectl create -f deployment.yaml --record

  注意–record参数,使用此参数将记录后续创建对象的操作,方便管理与问题追溯

  使用子命令edit,编辑spec.replicas/spec.template.spec.container.image字段,完成deployment的扩缩容与滚动升级(这要比子命令rolling-update速度快很多)

  # kubectl edit deployment hello-deployment

  使用rollout history命令,查看Deployment的历史信息

  # kubectl rollout history deployment hello-deployment

  上面提到RC在rolling-update升级成功后不能直接回滚,而使用Deployment却可以回滚到上一版本,但要加上–revision参数,指定版本号

  # kubectl rollout history deployment hello-deployment --revision=2

  使用rollout undo回滚到上一版本

  # kubectl rollout undo deployment hello-deployment 

  使用–to-revision可以回滚到指定版本

  # kubectl rollout undo deployment hello-deployment --to-revision=2

 

Kubernetes学习-相关概念

标签:stp   ntp   容器   aml   匹配   upd   图片   官方   mic   

原文地址:https://www.cnblogs.com/shanrenshiwoshifu/p/9044655.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!