k8s基础

作者: ands999 | 来源:发表于2020-04-04 17:14 被阅读0次
endpoint、虚拟二层网络技术、nodeSelector、label、controller、deployment、replicaSet、daemonSet、statefulSet、job、HPA、node ip、pod ip、cluster ip、node port、namespace、资源 etcd、pause容器、网络栈、volumn挂载卷、liveness、readiness、restartPolicy、volume、persistentVolume、persistentVolumeClaim、storageClass、secret 、configmap、helm、tiller、overlay

云原生(Cloud Native),有利于在公有云、私有云和混合云等动态环境中,构建和运行可弹性扩展的应用。云原生包括容器、服务网格、微服务、不可变基础设施和声明式API。
docker swarm的功能,k8s的编排,mesos的调度管理。

Kubernetes是什么

Kubernetes简称k8s。是谷歌Borg的开源的容器编排、调度和管理平台。

k8s的集群管理能力,包括基于RBAC的多层次安全防护和准入机制、多租户应用支撑能力、服务滚动升级和在线扩容能力、可扩展的资源自动调度机制,以及多粒度的资源配额管理能力。同时,K8S的管理工具,包括开发、部署测试、运维监控在内的各个环节。
因此,k8s是基于容器的分布式架构解决方案。

k8s优点

弹性伸缩、滚动升级、健康检查

容器提供了隔离能力,所以有必要把为Service提供服务的进程也放入容器中进行隔离。为此,设计了Pod对象,将每个服务进程包装进Pod中,使其成为Pod中的一个容器。

k8s是高度自动化的资源控制系统,通过跟踪对比etcd库中保存的“资源期望状态”与当前环境中的“实际资源状态”的差异来实现自动控制和自动纠错。

master
  • kube-apiserver: 资源增删改查等操作的入口,也是集群控制的入口。
  • kube-controller-manager: 资源对象的自动化控制。
  • kube-scheduler: 资源调度。
node
  • kubelet:负责pod对应的容器创建和启停,与master节点协作,实现集群管理。以systemd服务方式运行。
  • kube-proxy:实现service的通信与负载均衡。该模块实现了服务发现和反向代理功能。反向代理方面:kube-proxy支持TCP和UDP连接转发,默认基于Round Robin算法将客户端流量转发到与service对应的一组后端pod。服务发现方面:kube-proxy使用etcd的watch机制,监控集群中service和endpoint对象数据的动态变化,并且维护service到endpoint的映射关系,从而保证后端pod的IP变化不会对访问者造成影响。另外,kube-proxy还支持session affinity。
  • docker:docker引擎,负责本机的容器创建和管理。
pod

Pod抽象基于linux的namespace和cgroups,为容器提供隔离的环境。
pod运行在节点(node)中,每个pod都有一个pause特殊容器,其状态代表整个容器组的状态。其他的是业务容器,业务容器共享pause容器的网络栈和volume挂载卷,因此业务容器间的通信和数据交换更高效,解决了容器组的文件共享问题。
k8s要求底层网络支持集群内任意两个pod之间的tcp直接通信,这是通过虚拟二层网络技术实现。
node中有pod,pod中有pause容器和业务容器。node可以是虚拟机也可以是物理机。

创建pod过程:kubectl --> deployment --> replicaset --> pod
当k8s把pod调度到节点上,节点上的kubelet会指示docker启动容器。接着,kubelet会通过cgroup持续收集容器的信息,再提交到k8s的管理。
随着CRI标准的成熟,k8s逐渐弱化docker的作用。rkt等也符合CRI标准。

label

Kubernetes通过Label机制进行对象的弱关联,可以灵活地进行分类和选择。基于label可实现多维度的资源分组管理。实现集群的高可用。
有两种label selector表达式:基于等式的(=,!=)和基于集合的(in, not in)。多个表达式之间用“,”进行分割,是and的关系。
新的管理对象如deployment、replicaset、daemonset和job都可以在selector中使用基于集合的筛选条件定义,matchLabels,可用的条件运算符包括in、notin、exists、doesnotexists。
label具有严格的命名规则,定义的是k8s对象的元数据,并且用于label selector。
label selector在Kubernetes中多重要使用场景有以下几处:

  • kube-controller进程通过资源对象RC上定义Label Selector来筛选要监控的Pod副本的数量,从而实现Pod副本的数量始终符合预期设定。
  • kube-proxy进程通过Service的Label Selector来选择对应的Pod,自动建立起Service到对应Pod的请求转发路由表,从而实现Service的智能负载均衡机制。
  • 通过对Node定义特定的Label,并且在Pod定义文件中使用NodeSelector标签调度策略,kube-scheduler进程可以实现Pod“定向调度”的特性。
annotation

annotation是用户任意定义的“附加”信息,方便外部工具进行查找。

deployment

deployment是从v1.2引入,为了更好解决pod的编排问题。deployment使用rs来实现目的。deployment相对于rc的最大优点是随时知道当前pod"部署"的进度。

controller

k8s不会直接创建pod,而是通过controller来管理pod。有以下几类controller:

  • replicaSet,实现pod的多副本管理。使用deployment时会自动创建replicaSet,即deployment通过replicaSet管理pod的多个副本,因此通常不需要直接使用replicaSet。
  • daemonSet,节点中最多运行一个pod副本。
  • statefulSet,保证pod副本在整个生命周期中名称不变。也保证副本按固定的顺序启动、更新或者删除。
  • job,用于运行结束就删除的应用。
replication controller

rc定义期望场景,即声明某种pod的副本数量在任意时刻符合某个预期值。通过rc,实现用户应用集群的高可用。删除rc并不会影响通过该rc已创建好的pod。
在k8s v1.2时,rc升级为replica set,rs与rc的唯一区别是:rs支持基于集合的label selector,而rc只支持基于等式的label selector。
rs主要被deployment这个更高层的资源对象所使用,从而形成一整套pod创建、删除、更新的编排机制。rs与deployment将逐步替换rc,是k8s v1.3里pod自动扩容、缩容的基础。

Horizontal Pod Autoscaler

通过追踪分析rc控制的所有目标pod的负载变化情况,来确定是否需要针对性地调整目标pod的副本数,这是HPA的实现原理。HPA有两种方式作为pod负载的度量指标:

  • CPUUtilizationPercentage,需要安装Heapster。
  • 应用程序自定义的度量指标,比如TPS或QPS。
statefulSet

pod管理对象rc、deployment、daemonSet和job都是面向无状态的服务。
k8s在v1.4引入petset,在v1.5更名为statefulSet。statefulSet特性如下:

  • statefulSet中的pod都有稳定、唯一的网络标识,可以用来发现集群内的其他成员。
  • statefulSet中的pod副本的启停顺序是受控的。
  • statefulSet中的pod采用稳定的持久化存储卷。

statefulSet需与headless service配合使用,headless service与普通的service的关键区别在于,它没有cluster ip。如果解析headless service的dns域名,则返回的是该service对应的全部pod的endpoint列表。

namespace

用于实现多租户的资源隔离。容器的隔离功能利用的是linux内核的namespace机制。

对应用更新时的灰度发布策略管理

重建部署、滚动更新部署、影子部署、蓝绿部署、金丝雀部署、A/B测试。

CSI

CSI是k8s从v1.9版本开始引入的,用于在容器和共享存储之间建立标准的存储访问接口。在CSI之前,k8s集群通过“in-tree”方式提供共享存储服务,这种方式要求存储供应商的代码集成到k8s的代码中。

health check

k8s默认健康检查机制:容器启动时执行由dockerFile的CMD或ENTRYPOINT指定的进程。如果进程退出时返回码非零,则认为容器发生故障,然后根据restartPolicy重启容器。

  • liveness探测,判断是否重启容器。
  • readiness探测,判断容器是否已经准备好对外服务,不是则将容器设置为不可用,不接收service转发的请求。
    两钟探测可同时使用。

health check 可用于scale up和roll update 。

数据管理
  • volume,volume定义在pod上,被pod里的多个容器挂载到具体的文件目录下。volume与pod的生命周期相同,而与容器的生命周期无关。类似于目录。
  • persistentVolume(PV),可理解为k8s集群中的某个网络存储对应的一块存储。生命周期独立于pod。
  • persistentVolumeClaim(PVC),对PV的申请。
  • 动态供给,通过storageClass实现,storageClass定义了如何创建PV。
secret 和 configmap

secret以密文方式存储数据,以volume形式挂载到pod。容器通过卷的方式使用secret中的数据,也可以通过环境变量的方式使用这些数据。

configMap用于保存非敏感数据。

helm,包管理器

helm帮助用户在k8s上高效的运行和管理微服务架构应用。helm由客户端(管理chart)和tiller服务器(管理release)组成。

chart是helm的应用打包格式,由一组文件和目录构成。其中最重要的是模板,模板中定义了k8s各类资源的配置信息,helm在部署时用values.yaml中的参数值注入到模板中,生成标准的YAML配置文件。

helm采用go语言的模板编写chart。

资源配额和资源限制

从三个级别进行管理:

  1. container:CPU和内存,资源请求和资源限制。
  2. pod:limitRange。
  3. namespace:resourceQuota。

cpu的资源单位是CPU(Core)的数量,是绝对值。通常以千分之一的CPU配额为最小单位,用m表示。memory配额,是绝对值,单位是内存字节数。

k8s集群监控

weave scope是docker和k8s可视化监控工具。
heapster是k8s原生的集群监控方案。以pod的形式运行。
promotheus operator是基于prometheus的k8s监控方案。除可监控node和pod外,还可监控api server、scheduler、controller manager等。

tips

新版本的k8s开始基于ipvs来替换iptables。

参考

相关文章

  • spark on k8s 镜像构建

    spark on k8s 基础镜像的构建 背景 这是跑spark on k8s任务的基础镜像,用来指明execut...

  • k8s Flannel网络方案

    k8s中规定了CNI接口,但是没有标准化网络方案,网络方案也是网络基础,在这个基础上k8s提供了service负载...

  • 一键部署kubernetes 1.6高可用集群

    本文主要适合于那些有一定 k8s基础的人, 通过本文你将学到: k8s各组件的交互原理 k8s的集群规划 k8s系...

  • K8S命令的梳理

    K8S命令的梳理 kubectl是一个基础的K8S集群管理命令,可以实现对K8S资源的查询,创建,删除,更新,回退...

  • consul结合k8s

    整体基础架构: consul(k8s)+ consul-k8s + k8s consul-k8s sync-cat...

  • 部署k8s 1.22.2 集群 && Euler部署k8s 1

    部署k8s 1.22.2 集群 Euler部署k8s 1.22.2 集群 一、基础环境 主机名IP地址角色系统ma...

  • Kubernetes容器编排技术

    k8s:云原生(在各种云都像是在本地部署<个人理解>)的基础设置 K8S宏观组件理解 service\lable ...

  • Minukube安装

    k8s是云原生的基础,因此需要掌握k8s,掌握k8s最重要的是动手再动手。由于国内的环境要FQ,所以部署起一个环境...

  • K8S最全面的企业部署(上),不信进去看就知道啦

    typora-root-url: ./一:基础集群环境搭建:k8s基础集群环境主要是运行kubernetes管理端...

  • k8s deployment

    k8s的deployment是最常用的workload,也是基础设施扩缩容基础。deployment的作用: 发布...

网友评论

      本文标题:k8s基础

      本文链接:https://www.haomeiwen.com/subject/iywjxhtx.html