k8s基础

2020-04-04  本文已影响0人  ands999
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
node
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中多重要使用场景有以下几处:

annotation

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

deployment

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

controller

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

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负载的度量指标:

statefulSet

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

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重启容器。

health check 可用于scale up和roll update 。

数据管理
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。

参考

上一篇 下一篇

猜你喜欢

热点阅读