云原生技术

Posted 杨先森的森林

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了云原生技术相关的知识,希望对你有一定的参考价值。

Kubernetes核心概念

什么是Kubernetes

Kubernetes - 工业级容器编排平台

  • Kubernetes源于希腊语,意为 “舵手” 或 “飞行员”。

  • K8s是通过将8个字母 “ubernete” 替换为8而导出的缩写。

  • Kubernetes(k8s)是自动化容器操作的开源平台,这些操作包括部署,调度和节点集群间扩展。如果你曾经用过Docker容器技术部署容器,那么可以将Docker看成Kubernetes内部使用的低级别组件。Kubernetes不仅仅支持Docker,还支持Rocket,这是另一种容器技术。

云原生技术(三)

云原生技术(三)

云原生技术(三)

云原生技术(三)

Kubernetes的架构

云原生技术(三)


Kubernetes Master提供集群的独特视角,并且拥有一系列组件,比如Kubernetes API Server。API Server提供可以用来和集群交互的REST端点。master节点包括用来创建和复制Pod的Replication Controller。Master节点上面主要由四个模块组成:APIServer、scheduler、controller manager、etcd。

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

  • schedule  的职责很明确,就是负责调度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  是一个高可用的键值存储系统,Kubernetes使用它来存储各个资源的状态,从而实现了Restful的API。

云原生技术(三)

Node节点作为Kubernetes worker,通常称为Minion。每个Node节点主要由三个模块组成:kubelet、kube-proxy、runtime

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

  • 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

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

云原生技术(三)

Kubernetes的核心概念与API
核心概念 - Pod
  • 最小的调度以及资源单元  

  • 由一个或者多个容器组成

  • 定义容器运行的方式(Command、环境变量等)

  • 提供给容器共享的运行环境(网络、进程空间)

云原生技术(三)

基本操作

创建 kubectl create -f xxx.yaml
查询 kubectl get pod yourPodNamekubectl describe pod yourPodName
删除 kubectl delete pod yourPodName
更新 kubectl replace /path/to/yourNewYaml.yaml

Pod的生命周期

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

云原生技术(三)

生命周期回调函数

PostStart(容器创建成功后调用该回调函数)、PreStop(在容器被终止前调用该回调函数)。以下示例中,定义了一个Pod,包含一个JAVA的web应用容器,其中设置了PostStart和PreStop回调函数。即在容器创建成功后,复制/sample.war到/app文件夹中。而在容器终止之前,发送HTTP请求到http://localhost:8080/xxxxx,即向监控系统发送警告。具体示例如下:

containers:
- image: xxxx:v1  
    name: jar
    lifecycle:
    posrStart:
      exec:
        command:
        - “cp”
        - “/xxxx.war”
        - “/xxxx”
    prestop:
      httpGet:
      host: localhost
      psth: xxxxx
      port: 8080
      scheme: HTTP
核心概念 - Volume
  • 声明在Pod中的容器可访问的文件目录

  • 可以被挂载在Pod中一个(或者多个)容器的指定路径下

  • 支持多种后端存储的抽象

  • 本地存储、分布式存储、云存储……

       在Docker的设计实现中,容器中的数据是临时的,即当容器被销毁时,其中的数据将会丢失。如果需要持久化数据,需要使用Docker数据卷挂载宿主机上的文件或者目录到容器中。在Kubernetes中,当Pod重建的时候,数据是会丢失的,Kubernetes也是通过数据卷挂载来提供Pod数据的持久化的。Kubernetes数据卷是对Docker数据卷的扩展,Kubernetes数据卷是Pod级别的,可以用来实现Pod中容器的文件共享

云原生技术(三)

核心概念 - Deployment
  • 定义一组Pod的副本数目、版本等

  • 通过控制器(Controller)维持Pod的数目

  • 自动恢复失败的Pod

  • 通过控制器以指定的策略控制版本

  • 滚动升级、重新生成、回滚等

        Kubernetes提供了一种更加简单的更新RC和Pod的机制,叫做Deployment。通过在Deployment中描述你所期望的集群状态,Deployment Controller会将现在的集群状态在一个可控的速度下逐步更新成你所期望的集群状态。Deployment主要职责同样是为了保证pod的数量和健康,90%的功能与Replication Controller完全一样,可以看做新一代的Replication Controller。但是,它又具备了Replication Controller之外的新特性:

Replication Controller全部功能:Deployment继承了上面描述的Replication Controller全部功能。

事件和状态查看:可以查看Deployment的升级详细进度和状态。

回滚:当升级pod镜像或者相关参数的时候发现问题,可以使用回滚操作回滚到上一个稳定的版本或者指定的版本。

版本记录: 每一次对Deployment的操作,都能保存下来,给予后续可能的回滚使用。

暂停和启动:对于每一次升级,都能够随时暂停和启动。

多种升级方案:Recreate----删除所有已存在的pod,重新创建新的; RollingUpdate----滚动升级,逐步替换的策略,同时滚动升级时,支持更多的附加参数,例如设置最大不可用pod数量,最小升级间隔时间等等。

云原生技术(三)

核心概念 - Service
  • 支持多种访问方式实现

  • ClusterIP

  • NodePort

  • LoadBalancer

  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层级的虚拟转发网络

云原生技术(三)

核心概念 - Namespace
  • 一个集群内部的逻辑隔离机制(鉴权、资源额度)

  • 每个资源都属于一个Namespace

  • 同一个Namespace中的资源命名唯一

  • 不同Namespace中的资源可重名

云原生技术(三)

核心概念 - Replication Controller

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

API - 基础知识

HTTP + JSON/YAML

  • Kubectl

  • UI

  • curl

API - Label

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

  • 一组Key:Value

  • 可以被selector所查询

  • select color = red

  • 资源集合的默认表达形式

  • 例如Service对应的一组Pod

尝试一下Kubernetes
安装Minikube
  1. 安装VirtualBox或者VMware

    VirtualBox下载地址:
    https://www.virtualbox.org/wiki/Downloads
    VMware下载地址:
    https://www.vmware.com/products/workstation-pro/workstation-pro-evaluation.html

    Sun VirtualBox和VMware简单使用对比

    1、粘贴复制的功能在VMware中经常用到,但是VirtualBox没有,或者是我还没有找到。
    2、网络适配器在选择NAT方式时,网络访问速度比较慢,网页很长时间才打开,VMware没有这个问题
    3、VirtualBox快照恢复后,硬盘文件也会相应恢复到快照时的尺寸大小,VMware不会。
    4、当重装系统后,原有的VirtualBox虚拟机找不到,网上好像有解决的办法。VMware不存在这个问题,只要选择要打开的虚拟机文件即可。
    5、VirtualBox安装后,会默认在C:\Documents and Settings\Administrator\.VirtualBox\目录下建立虚拟机,且快照文件也会在该目录下建立。对于C盘空间不是很大的机器来说,需要更改全局设置中的虚拟机文件和快照文件存储路径。
    6、VirtualBox快照只能单独建立,VMware快照具有继承特性,可以从某个快照为起点,生成多个快照,且图形化显示快照的生成树。
    7、最不方便的是VirtualBox的控制工具条在全屏后,显示在Windows虚拟机任务栏附近,在点击任务栏中的窗口时,会不时误操作,而选中控制工具条,而VMware的全屏控制工具条在Windows虚拟机的上面,一般不会误操作。
    8、两个软件不能互相打开各自的虚拟机。
    不过作为免费的虚拟机软件,Sun VirtualBox可以胜任主要的虚拟机任务。安装文件小,安装方便等等优点。相比VMware在操作方便性、系统保存还原等方面还有一定的差距。
  2. 安装MiniKube(中国版)

    https://yq.aliyun.com/articles/221687
  3. 启动MiniKube

    minikube start --vm-driver virtualbox

    注:其他操作系统请访问:

    https://kubernetes.io/docs/tasks/tools/install-minikube
尝试一些命令
minikube status  
kubectl get nodes
kubectl get deployments
kubectl describe deployment nginx-deployment

1. 提交一个 nginx deployment
kubectl apply -f https://k8s.io/examples/application/deployment.yaml
2. 升级 nginx deployment
kubectl apply -f https://k8s.io/examples/application/deployment-update.yaml
3. 扩容 nginx deployment
kubectl apply -f https://k8s.io/examples/application/deployment-scale.yaml

注:其他操作系统请访问:
https://kubernetes.io/docs/tasks/tools/install-minikube/

以上是关于云原生技术的主要内容,如果未能解决你的问题,请参考以下文章

云原生时代一站式DevOps平台--阿里云效

云原生时代一站式DevOps平台--阿里云效

直击前沿技术:云原生应用低代码开发平台实践

直击前沿技术:云原生应用低代码开发平台实践

第五章 云原生与容器技术

云原生概念和技术1.1 云原生的概述