#网络后台开发#Kubernetes

共 8431字,需浏览 17分钟

 ·

2022-04-16 11:05

-Start:关注本公众号后,可直接联系后台获取排版美化的详细文档!

-Hints:本篇文章所编纂的资料均来自网络,特此感谢参与奉献的有关人员。


Kubernetes简介

Kubernetes 是一个全新的基于容器技术的分布式架构解决方案,是 Google 开源的一个容器集群管理系统,Kubernetes 简称 K8S。

Kubernetes 是一个一站式的完备的分布式系统开发和支撑平台,更是一个开放平台,对现有的编程语言、编程框架、中间件没有任何侵入性。

Kubernetes 提供了完善的管理工具,这些工具涵盖了开发、部署测试、运维监控在内的各个环节。

Kubernetes具有完备的集群管理能力,包括多层次的安全防护和准入机制、多租户应用支撑能力、透明的服务注册和服务发现机制、内建智能负载均衡器、强大的故障发现和自我修复能力、服务滚动升级和在线扩容能力、可扩展的资源自动调度机制、多粒度的资源配额管理能力。

 

Kubernetes特性

① 自我修复

在节点故障时,重新启动失败的容器,替换和重新部署,保证预期的副本数量;杀死健康检查失败的容器,并且在未准备好之前不会处理用户的请求,确保线上服务不中断。

② 弹性伸缩

使用命令、UI或者基于CPU使用情况自动快速扩容和缩容应用程序实例,保证应用业务高峰并发时的高可用性;业务低峰时回收资源,以最小成本运行服务。

③ 自动部署和回滚

K8S采用滚动更新策略更新应用,一次更新一个Pod,而不是同时删除所有Pod,如果更新过程中出现问题,将回滚更改,确保升级不影响业务。

④ 服务发现和负载均衡

K8S为多个容器提供一个统一访问入口(内部IP地址和一个DNS名称),并且负载均衡关联的所有容器,使得用户无需考虑容器IP问题。

⑤ 机密和配置管理

管理机密数据和应用程序配置,而不需要把敏感数据暴露在镜像里,提高敏感数据安全性。并可以将一些常用的配置存储在K8S中,方便应用程序使用。

⑥ 存储编排

挂载外部存储系统,无论是来自本地存储,公有云,还是网络存储,都作为集群资源的一部分使用,极大提高存储使用灵活性。

⑦ 批处理

提供一次性任务,定时任务;满足批量数据处理和分析的场景。

 

Kubernetes集群

Kubernetes 集群架构以及相关的核心组件如下图所示:一个 Kubernetes 集群一般包含一个 Master 节点和多个 Node 节点,一个节点可以看成是一台物理机或虚拟机。

1、Master

Master 是 K8S 的集群控制节点,每个 K8S 集群里需要有一个 Master 节点来负责整个集群的管理和控制,基本上 K8S 所有的控制命令都是发给它,它来负责具体的执行过程。Master 节点通常会占据一个独立的服务器,因为它太重要了,如果它不可用,那么所有的控制命令都将失效。

Master 节点上运行着以下关键组件:

① kube-apiserver

是集群的统一入口,各组件协调者,以 HTTP Rest 提供接口服务,所有对象资源的增、删、改、查和监听操作都交给 apiserver 处理后再提交给 Etcd 存储。

② kube-controller-manager

是 K8S 里所有资源对象的自动化控制中心,处理集群中常规后台任务,一个资源对应一个控制器,而 controller-manager 就是负责管理这些控制器的。

③ kube-scheduler

根据调度算法为新创建的 Pod 选择一个 Node 节点,可以任意部署,可以部署在同一个节点上,也可以部署在不同的节点上。

④ etcd

是一个分布式的,一致的 key-value 存储,主要用途是共享配置和服务发现,保存集群状态数据,比如 Pod、Service 等对象信息。

2、Node

除了 Master,K8S 集群中的其它机器被称为 Node 节点,Node 节点是K8S 集群中的工作负载节点,每个 Node 都会被Master 分配一些工作负载,当某个 Node 宕机时,其上的工作负载会被 Master 自动转移到其它节点上去。

每个 Node 节点上都运行着以下关键组件:

① kubelet

kubelet 是 Master在 Node 节点上的 Agent(代理),与 Master 密切协作,管理本机运行容器的生命周期,负责 Pod 对应的容器的创建、启停等任务,实现集群管理的基本功能。

② kube-proxy

在 Node 节点上实现 Pod网络代理,实现 Kubernetes Service 的通信,维护网络规则和四层负载均衡工作。

③ docker engine

Docker 引擎,负责本机的容器创建和管理工作。

Node 节点可以在运行期间动态增加到 K8S 集群中,前提是这个节点上已经正确安装、配置和启动了上述关键组件。在默认情况下kubelet 会向 Master 注册自己,一旦 Node 被纳入集群管理范围,kubelet 就会定时向 Master 节点汇报自身的情况,例如操作系统、Docker 版本、机器的 CPU 和内存情况,以及之前有哪些 Pod 在运行等,这样 Master 可以获知每个 Node 的资源使用情况,并实现高效均衡的资源调度策略。而某个 Node 超过指定时间不上报信息时,会被 Master 判定为“失联”,Node 的状态被标记为不可用(Not Ready),随后 Master 会触发“工作负载大转移”的自动流程。

 

Kubernetes要点

1、Pod

Pod 是 K8S 中最重要也是最基本的概念,Pod 是最小的部署单元,是一组容器的集合。每个 Pod 都由一个特殊的根容器 Pause 容器,以及一个或多个紧密相关的用户业务容器组成。

Pause 容器作为 Pod 的根容器,以它的状态代表整个容器组的状态。K8S 为每个 Pod 都分配了唯一的IP 地址,称之为 Pod IP。Pod 里的多个业务容器共享 Pause 容器的IP,共享Pause 容器挂载的 Volume。

2、Label

标签,附加到某个资源上,用于关联对象、查询和筛选。一个 Label 是一个 key=value 的键值对,key 与 value 由用户自己指定。Label 可以附加到各种资源上,一个资源对象可以定义任意数量的 Label,同一个 Label 也可以被添加到任意数量的资源上。

我们可以通过给指定的资源对象捆绑一个或多个不同的 Label 来实现多维度的资源分组管理功能,以便于灵活、方便地进行资源分配、调度、配置、部署等工作。

K8S 通过 LabelSelector(标签选择器)来查询和筛选拥有某些 Label 的资源对象。Label Selector 有基于等式( name=label1 )和基于集合( name in (label1, label2) )的两种方式。

3、ReplicaSet(RC)

ReplicaSet 用来确保预期的 Pod 副本数量,如果有过多的 Pod 副本在运行,系统就会停掉一些 Pod,否则系统就会再自动创建一些 Pod。

我们很少单独使用 ReplicaSet,它主要被 Deployment 这个更高层的资源对象使用,从而形成一整套 Pod 创建、删除、更新的编排机制。

4、Deployment

Deployment 用于部署无状态应用,Deployment 为 Pod 和ReplicaSet 提供声明式更新,只需要在 Deployment 描述想要的目标状态,Deployment 就会将 Pod 和ReplicaSet 的实际状态改变到目标状态。

5、Horizontal PodAutoscaler(HPA)

HPA 为 Pod 横向自动扩容,也是 K8S 的一种资源对象。HPA 通过追踪分析 RC 的所有目标 Pod 的负载变化情况,来确定是否需要针对性调整目标 Pod 的副本数量。

6、Service

Service 定义了一个服务的访问入口,通过 Label Selector 与 Pod 副本集群之间“无缝对接”,定义了一组 Pod 的访问策略,防止 Pod 失联。

创建 Service 时,K8S会自动为它分配一个全局唯一的虚拟 IP 地址,即 Cluster IP。服务发现就是通过 Service 的 Name 和Service 的 ClusterIP 地址做一个 DNS 域名映射来解决的。

7、Namespace

命名空间,Namespace 多用于实现多租户的资源隔离。Namespace 通过将集群内部的资源对象“分配”到不同的Namespace中,形成逻辑上分组的不同项目、小组或用户组。

K8S 集群在启动后,会创建一个名为 default 的 Namespace,如果不特别指明 Namespace,创建的 Pod、RC、Service 都将被创建到 default 下。

当我们给每个租户创建一个 Namespace 来实现多租户的资源隔离时,还可以结合 K8S 的资源配额管理,限定不同租户能占用的资源,例如 CPU 使用量、内存使用量等。

 

Kubernetes通信

1客户端使用http/https通过url路径访问K8S集群里的Ingress接入层对外暴露的接口

2k8s-master[独立服务器]的apiserver接收客户端的http请求,写入到etcd中(Ingress层收到请求后找到对应是Service)

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

3scheduler会通过apiserver在etcd存储中心中找到node节点存储的元信息、剩余资源等,通过预算策略和优选策略在所有node节点中挑选最优的

4apiserver会让controllermanager按照所预设的模板(多少实例、生命周期等)去创建pod, controller manager通过apiserver读取etcd中用户的预设信息,再通过apiserver去找 scheduler可以为新创建的pod选择最适合的node节点。(Service根据标签选择器筛选查询label对应的Pod,根据Pod的IP进行转发获取相应服务)

5scheduler确定node节点后通过apiserver交给这个node节点上的kubelet进行pod资源的创建,kubelet同时也会对所在node的资源信息和pod状态进行监控与apiserver进行交互将pod状态信息存储到etcd中

6node节点上的kube-proxy是service资源的载体,负责pod的代理和负载均衡等功能,如果需要将pod发布出去,需要通过kube-proxy创建网络规则承载使用service作为负载均衡的访问入口,负载均衡所关联的pod节点,实现服务发布

在K8S集群中,Service可以看作一组提供相同服务的Pod的对外访问接口。客户端需要访问的服务就是Service对象。每个Service都有一个固定的虚拟ip (这个ip也被称为Cluster IP) ,自动并且动态地绑定后端的Pod, 所有的网络请求直接访问Service的虚拟ip,Service会自动向后端做转发。通俗来说就是Service通过标签选择器选择那些关联了对应label的Pod,把Pod的IP加入到自己的endpoints当中,当service收到请求后根据endpoints里的ip进行转发

7node节点的kubelet

-1.Node节点的监视器,以及与Master节点的通讯器。Kubelet 是Master节点安插在Node节点上的“眼线”,它会定时向API Server汇报自己Node节点上运行的服务的状态,并接受来自Master节点的指示采取调整措施

-2.从Master节点获取自己节点上Pod的期望状态(比如运行什么容器、运行的副本数量、网络或者存储如何配置等),

直接跟容器引擎交互实现容器的生命周期管理,如果自己节点上Pod的状态与期望状态不一致,则调用对应的容器平台接口(即docker的接口)达到这个状态

-3.管理镜像和容器的清理工作,保证节点上镜像不会占满磁盘空间,退出的容器不会占用太多资源

8 node节点的docker或rocket

容器引擎,运行容器,负责本机的容器创建和管理工作

9 node节点的pod

-1Pod是Kubernetes创建或部署的最小/最简单的基本单位,一个Pod 代表集群上正在运行的一个进程

-2.一个Pod由一个或多个容器组成,Pod中容器共享网络、存储和计算资源,在同一台Docker主机上运行

 

Kubernetes总结

Master节点

1.apiserver:所有服务访问的同一入口

2.controller manager:维持集群处于预期的工作状态(副本期望数目)

3.scheduler:选择适合的node节点调度pod

4.master节点的请求处理过程:

 1)首页用户通过证书认证后使用kubectl命令行工具向API Server发送请求,API Server接收到请求例如创建一批Pod,API Server会让 Controller-manager按照所预设的模板(多少实例、生命周期等)去创建Pod,Controller-manager会通过API Server去找Scheduler为新创建的Pod选择最适合的Node节点。比如运行这个Pod需要2C4G的资源,scheduler会通过API Server在Etcd存储中心中找到node节点存储的元信息、剩余资源等,通过预选策略在所有Node节点中挑选最优的,然后将预设的模板通过API Server交给这个Node节点上运行

 2)Node节点中还剩多资源是通报给APT Server存储在etcd里,API Server会调用一个方法找到etcd里所有Node节点的剩余资源,再对比Pod所需要的资源,在所有Node节点中查找哪些Node节点符合要求。如果都符合,预算策略就交给优选策略处理,优选策略再通过CPU的负载、内存的剩余量等因素选择最合适的Node节点,并把Pod调度到这个Node节点上运行

Etcd储存中心

etcd:键值对数据库,存储k8s集群所有的重要信息,并持久化保持,只有apiserver才能对etcd有读写权限

Worker Node节点

1.kubelet:监视node节点上的资源和服务状态并汇报给apiserver;跟容器引擎交互实现容器的生命周期管理

2.kube-proxy:实现负载均衡,是server资源的载体,负责写入规则至iptables、ipvs实现服务映射访问的容器引擎:docker,docker用来创建、管理容器

 

Kubernetes架构

生产环境 K8S 平台规划

K8S 环境有两种架构方式,单Master 集群和多 Master 集群,将先搭建起单Master 集群,再扩展为多 Master 集群。开发、测试环境可以部署单 Master 集群,生产环境为了保证高可用需部署多 Master 集群。

① 单 Master 集群架构

单 Master 集群架构相比于多 Master 集群架构无法保证集群的高可用,因为 master 节点一旦宕机就无法进行集群的管理工作了。单 master 集群主要包含一台 Master 节点,及多个 Node 工作节点、多个 Etcd 数据库节点。

Etcd 是 K8S 集群的数据库,可以安装在任何地方,也可以与 Master 节点在同一台机器上,只要 K8S 能连通 Etcd。

② 多 Master 集群架构

多 Master 集群能保证集群的高可用,相比单 Master 架构,需要一个额外的负载均衡器来负载多个 Master 节点,Node 节点从连接 Master 改成连接 LB 负载均衡器。

 

Kubernetes部署

Kubernetes集群架构规划:

生产环境建议至少两台 Master 节点,LB 主备各一个节点;至少两台以上 Node 节点,根据实际运行的容器数量调整;Etcd 数据库可直接部署在 Master 和 Node 的节点,机器比较充足的话,可以部署在单独的节点上。

1 相关服务器的初始配置

Firewalld、swap、hosts、time.windows.com

2 部署Etcd集群

etcd 集群采用主从架构模式(一主多从)部署,集群通过选举产生 leader,因此需要部署奇数个节点(3/5/7)才能正常工作。etcd使用raft一致性算法保证每个节点的一致性。

2.1 自签CA证书

2.2 创建、配置和启用etcd 服务

3部署Master组件

3.1自签 ApiServerSSL 证书

3.2部署kube-apiserver 组件

3.3部署kube-controller-manager 组件

3.4部署kube-scheduler 组件

4部署Node组件

4.1安装 Docker

4.2Node 节点证书

4.3安装 kubelet

4.4安装 kube-proxy

5部署K8S容器集群网络(Flannel)

Kubernetes 项目并没有使用 Docker 的网络模型,kubernetes 是通过一个 CNI 接口维护一个单独的网桥来代替 docker0,这个网桥默认叫 cni0

CNI(ContainerNetwork Interface)是CNCF旗下的一个项目,由一组用于配置 Linux 容器的网络接口的规范和库组成,同时还包含了一些插件。CNI仅关心容器创建时的网络分配,和当容器被删除时释放网络资源。

Flannel 是 CNI 的一个插件,可以看做是 CNI 接口的一种实现。Flannel 是针对 Kubernetes 设计的一个网络规划服务,它的功能是让集群中的不同节点主机创建的Docker容器都具有全集群唯一的虚拟IP地址,并让属于不同节点上的容器能够直接通过内网IP通信。

6部署内部 DNS 服务

在Kubernetes集群推荐使用Service Name作为服务的访问地址,因此需要一个Kubernetes集群范围的DNS服务实现从Service Name到Cluster IP的解析,这就是Kubernetes基于DNS的服务发现功能。

7部署 Dashboard

K8S 提供了一个 Web 版 Dashboard,用户可以用 dashboard 部署容器化的应用、监控应用的状态,能够创建和修改各种 K8S 资源,比如 Deployment、Job、DaemonSet 等。用户可以Scale Up/Down Deployment、执行 Rolling Update、重启某个 Pod 或者通过向导部署新的应用。Dashboard 能显示集群中各种资源的状态以及日志信息。Kubernetes Dashboard 提供了 kubectl 的绝大部分功能。

8 部署 Nginx 负载均衡

为了保证 k8s master 的高可用,将使用 k8s-lb-master 和 k8s-lb-backup 这两台机器来部署负载均衡。这里使用 nginx 做负载均衡器

9部署 KeepAlive

为了保证 nginx 的高可用,还需要部署 keepalive,keepalive 主要负责 nginx 的健康检查和故障转移。

详细资料:https://www.cnblogs.com/chiangchou/p/k8s-1.html

 

Kubernetes官网

https://kubernetes.io/zh/

 

参考资料

https://blog.csdn.net/qq_37419449/article/details/122157277

https://www.cnblogs.com/jiliwei/p/11691077.html

https://www.cnblogs.com/guxd/p/15467338.html

https://www.cnblogs.com/chiangchou/p/k8s-1.html

https://kubernetes.io/zh/docs/concepts/cluster-administration/certificates/#%E5%88%86%E5%8F%91%E8%87%AA%E7%AD%BE%E5%90%8D-ca-%E8%AF%81%E4%B9%A6

公众号二维码

End:如果有兴趣了解量化交易、数据分析和互联网+的实用技术,欢迎关注本公众号

浏览 46
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报