计算机系统应用教程网站

网站首页 > 技术文章 正文

小白解说容器编排之Kubernetes入门

btikc 2024-10-10 04:50:26 技术文章 5 ℃ 0 评论

大家好,我是小白。下面由我给白白们讲解一下云计算火热的容器编排之王Kubernetes...

上文咱们讲解了Linux容器技术docker,有些基础后理解Kubernetes后就更好理解啦~

简言之呢,docker虽然帮助我们实现了容器化,但仅仅是个使用工具,而我们并不仅仅只需要运行一个容器就能满足我们的需求,我们需要自动化部署,弹性伸缩,负载均衡,服务自动发现等等云原生的一整套的生态化需求,而这就是kubernetes能帮我们做到的。



一、何为Kubernetes

Kubernetes 是谷歌开源的容器集群管理系统,是 Google 多年大规模容器管理技术 Borg 的开源版本,主要功能包括:

基于容器的应用部署、维护和滚动升级

负载均衡和服务发现

跨机器和跨地区的集群调度

自动伸缩

无状态服务和有状态服务

广泛的 Volume 支持

插件机制保证扩展性

Kubernetes 发展非常迅速,已经成为容器编排领域的领导者。

二、Kubernetes架构

Kubernetes 主要由以下几个核心组件组成:

1.etcd 集群持久化数据存储, 保存了整个集群的状态信息等;

2.apiserver 提供了资源操作的唯一入口,并提供认证、授权、访问控制、API 注册和发现等机制;

3.controller manager 负责维护集群的状态,比如故障检测、自动扩展、滚动更新等;

4.scheduler 负责资源的调度,按照预定的调度策略将 Pod 调度到相应的机器上;

5.kubelet 负责维护容器的生命周期,同时也负责 Volume(CVI)和网络(CNI)的管理;

6.Container runtime 负责镜像管理以及 Pod 和容器的真正运行(CRI);

7.kube-proxy 负责为 Service 提供 cluster 内部的服务发现和负载均衡

除了核心组件,还有一些推荐的 Add-ons:

*kube-dns 负责为整个集群提供 DNS 服务

*Ingress Controller 为服务提供外网入口

*Heapster 提供资源监控

*Dashboard 提供 GUI

*Federation 提供跨可用区的集群

*Fluentd-elasticsearch 提供集群日志采集、存储与查询

三、Kubernetes 设计理念



1.API设计

*所有API应该是声明式的。

*API对象是彼此互补而且可组合的。

*高层API以操作意图为基础设计

*低层API根据高层API的控制需要设计

*尽量避免简单封装,不要有在外部API无法显式知道的内部隐藏的机制

*API操作复杂度与对象数量成正比

*API对象状态不能依赖于网络连接状态

*尽量避免让操作机制依赖于全局状态,因为在分布式系统中要保证全局状态的同步是非常困难的。

2.控制机制设计

*控制逻辑应该只依赖于当前状态。

*尽量避免复杂状态机,控制逻辑不要依赖无法监控的内部状态。

*假设任何错误的可能,并做容错处理。

*假设任何操作都可能被任何操作对象拒绝,甚至被错误解析。

*每个模块都可以在出错后自动恢复。

*每个模块都可以在必要时优雅地降级服务。

3. 架构设计

*只有apiserver可以直接访问etcd存储,其他服务必须通过Kubernetes API来访问集群状态

*单节点故障不应该影响集群的状态

*在没有新请求的情况下,所有组件应该在故障恢复后继续执行上次最后收到的请求(比如网络分区或服务重启等)

*所有组件都应该在内存中保持所需要的状态,apiserver将状态写入etcd存储,而其他组件则通过apiserver更新并监听所有的变化

*优先使用事件监听而不是轮询

四、Kubernetes核心概念



pod: 一组容器集合,k8s最小调度部署单元

*k8s不能直接控制容器,通过控制pod来间接管理容器

*pod是由pod templates创建而来的,pod template包含于控制器中

*不同控制器对模板的处理方式方式不同,比如,有的会立即删除旧pod,依据新模板创建新pod来保持最新

*一个pod包含一个或多个容器

*一个pod的所有容器共享共享 PID、IPC、Network 和 UTS namespace

*重启一个pod中的容器不会重启pod,因为pod不是进程而是一个容器运行环境,pod会一直存在除非它被删除

pod生命周期中的状态/阶段

*pending:k8s已经知道pod的存在,此时pod还没完全准备好,比如容器还没创建完成、正在下载镜像等,即在做前期的准备工作

*running:pod已经分配到一个节点上了,并且至少有一个容器在运行

*succeeded:终止在pod上的所有容器,全部成功终止,且不重启

*unknown:由于出现了一些错误而使非上边提到的任何一种状态

*failed:终止pod上所有rq,有的容器关闭失败

pod的生命和人类一样,只有一次,从出生到死亡,不可重活

控制器controller:控制器,控制pod(启动、停止、删除……)

*ReplicaSet:确保预期pod副本数,保证任何时候都是固定pod数量在工作(动态地根据需求增删pod),通过Deployment来设置ReplicaSet

*ReplicationController:自动增删pod,同ReplicaSet功能相同,ReplicaSet是它的升级版

*Deployment:无状态应用部署,是比ReplicationController更高一层的api,还可以更新回滚ReplicaSet

*StatefulSet:有状态应用部署

*DaemonSet:确保所有node运行同一个pod

*Job:一次性任务,

*Cronjob:定时任务

服务service:将一组相关pod关联起来,对外提供服务,提供统一入口,使得pod地址改变不影响服务

*提供负载均衡

*服务的自动发现

*内部DNS域名服务

*定义相关pod访问策略

标签label:标记pod,node等资源

*便于识别pod,node

*亲和反亲和等策略

命名空间namespace:提供逻辑隔,类似租户隔离

*对象组分类、筛选和管理



Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表