前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >k8s基础-简介、优缺点及相关资料

k8s基础-简介、优缺点及相关资料

原创
作者头像
conanma
发布2022-03-18 15:59:21
2K0
发布2022-03-18 15:59:21
举报
文章被收录于专栏:正则

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

代码语言:javascript
复制
Kubernetes简称k8s。是谷歌Borg的开源的容器编排、调度和管理平台。

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

k8s优点
代码语言:javascript
复制
弹性伸缩、滚动升级、健康检查

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

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

master
代码语言:javascript
复制
kube-apiserver: 资源增删改查等操作的入口,也是集群控制的入口。
kube-controller-manager: 资源对象的自动化控制。
kube-scheduler: 资源调度。
node
代码语言:javascript
复制
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
代码语言:javascript
复制
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
代码语言:javascript
复制
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中多重要使用场景有以下几处:

1.kube-controller进程通过资源对象RC上定义Label Selector来筛选要监控的Pod副本的数量,从而实现Pod副本的数量始终符合预期设定。
2.kube-proxy进程通过Service的Label Selector来选择对应的Pod,自动建立起Service到对应Pod的请求转发路由表,从而实现Service的智能负载均衡机制。
3.通过对Node定义特定的Label,并且在Pod定义文件中使用NodeSelector标签调度策略,kube-scheduler进程可以实现Pod“定向调度”的特性。
annotation
代码语言:javascript
复制
annotation是用户任意定义的“附加”信息,方便外部工具进行查找。
deployment
代码语言:javascript
复制
deployment是从v1.2引入,为了更好解决pod的编排问题。
deployment使用rs来实现目的。deployment相对于rc的最大优点是随时知道当前pod"部署"的进度。
controller
代码语言:javascript
复制
k8s不会直接创建pod,而是通过controller来管理pod。有以下几类controller:

replicaSet,实现pod的多副本管理。使用deployment时会自动创建replicaSet,即deployment通过replicaSet管理pod的多个副本,因此通常不需要直接使用replicaSet。
daemonSet,节点中最多运行一个pod副本。
statefulSet,保证pod副本在整个生命周期中名称不变。也保证副本按固定的顺序启动、更新或者删除。
job,用于运行结束就删除的应用。
replication controller
代码语言:javascript
复制
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
代码语言:javascript
复制
通过追踪分析rc控制的所有目标pod的负载变化情况,来确定是否需要针对性地调整目标pod的副本数,这是HPA的实现原理。HPA有两种方式作为pod负载的度量指标:

CPUUtilizationPercentage,需要安装Heapster。
应用程序自定义的度量指标,比如TPS或QPS。
statefulSet
代码语言:javascript
复制
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
代码语言:javascript
复制
用于实现多租户的资源隔离。容器的隔离功能利用的是linux内核的namespace机制。
对应用更新时的灰度发布策略管理
代码语言:javascript
复制
重建部署、滚动更新部署、影子部署、蓝绿部署、金丝雀部署、A/B测试。
CSI
代码语言:javascript
复制
CSI是k8s从v1.9版本开始引入的,用于在容器和共享存储之间建立标准的存储访问接口。在CSI之前,k8s集群通过“in-tree”方式提供共享存储服务,这种方式要求存储供应商的代码集成到k8s的代码中。
health check
代码语言:javascript
复制
k8s默认健康检查机制:容器启动时执行由dockerFile的CMD或ENTRYPOINT指定的进程。如果进程退出时返回码非零,则认为容器发生故障,然后根据restartPolicy重启容器。

liveness探测,判断是否重启容器。
readiness探测,判断容器是否已经准备好对外服务,不是则将容器设置为不可用,不接收service转发的请求。
两钟探测可同时使用。
health check 可用于scale up和roll update 。
数据管理
代码语言:javascript
复制
olume,volume定义在pod上,被pod里的多个容器挂载到具体的文件目录下。volume与pod的生命周期相同,而与容器的生命周期无关。类似于目录。
persistentVolume(PV),可理解为k8s集群中的某个网络存储对应的一块存储。生命周期独立于pod。
persistentVolumeClaim(PVC),对PV的申请。
动态供给,通过storageClass实现,storageClass定义了如何创建PV。
secret 和 configmap
代码语言:javascript
复制
secret以密文方式存储数据,以volume形式挂载到pod。容器通过卷的方式使用secret中的数据,也可以通过环境变量的方式使用这些数据。
configMap用于保存非敏感数据
helm,包管理器
代码语言:javascript
复制
helm帮助用户在k8s上高效的运行和管理微服务架构应用。helm由客户端(管理chart)和tiller服务器(管理release)组成。
chart是helm的应用打包格式,由一组文件和目录构成。其中最重要的是模板,模板中定义了k8s各类资源的配置信息,helm在部署时用values.yaml中的参数值注入到模板中,生成标准的YAML配置文件。
helm采用go语言的模板编写chart。
资源配额和资源限制
代码语言:javascript
复制
从三个级别进行管理:

container:CPU和内存,资源请求和资源限制。
pod:limitRange。
namespace:resourceQuota。
cpu的资源单位是CPU(Core)的数量,是绝对值。通常以千分之一的CPU配额为最小单位,用m表示。memory配额,是绝对值,单位是内存字节数。
k8s集群监控
代码语言:javascript
复制
weave scope是docker和k8s可视化监控工具。
heapster是k8s原生的集群监控方案。以pod的形式运行。
promotheus operator是基于prometheus的k8s监控方案。除可监控node和pod外,还可监控api server、scheduler、controller manager等。
tips
代码语言:javascript
复制
新版本的k8s开始基于ipvs来替换iptables。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • k8s优点
  • master
  • node
  • pod
  • label
  • annotation
  • deployment
  • controller
  • replication controller
  • Horizontal Pod Autoscaler
  • statefulSet
  • namespace
  • 对应用更新时的灰度发布策略管理
  • CSI
  • health check
  • 数据管理
  • secret 和 configmap
  • helm,包管理器
  • 资源配额和资源限制
  • k8s集群监控
    • tips
    相关产品与服务
    容器服务
    腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档