这时候就需要我们的主角 Kubernetes 上场了,先来了解一下 K8s 的基本概念,后面再介绍实践,由浅入深步步为营。
关于 K8s 的基本概念我们将会围绕如下七点展开:
-
Docker 的管理痛点
-
什么是 K8s?
-
云架构 & 云原生
-
K8s 架构原理
-
K8s 核心组件
-
K8s 的服务注册与发现
-
关键问题
Docker 的管理痛点
如果想要将 Docker 应用于庞大的业务实现,是存在困难的编排、管理和调度问题。
于是,我们迫切需要一套管理系统,对 Docker 及容器进行更高级更灵活的管理。
Google 在 2014 年开源了 Kubernetes 项目,建立在 Google 在大规模运行生产工作负载方面拥有十几年的经验的基础上,结合了社区中最好的想法和实践。
K8s 是 Kubernetes 的缩写,用 8 替代了 「ubernete」,下文我们将使用简称。
什么是 K8s ?
K8s 是一个可移植的、可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化。
K8s 拥有一个庞大且快速增长的生态系统。K8s 的服务、支持和工具广泛可用。
通过 K8s 我们可以:
-
快速部署应用
-
快速扩展应用
-
无缝对接新的应用功能
-
节省资源,优化硬件资源的使用
K8s 有如下特点:
-
可移植:支持公有云,私有云,混合云,多重云 multi-cloud。
-
可扩展:模块化,插件化,可挂载,可组合。
-
自动化:自动部署,自动重启,自动复制,自动伸缩/扩展。
云架构 & 云原生
云就是使用容器构建的一套服务集群网络,云由很多的大量容器构成。K8s 就是用来管理云中的容器。
②常见几类云架构
常见几类云架构如上图所示:
-
On-Premises(本地部署)。
-
IaaS(基础设施即服务):用户:租用(购买|分配权限)云主机,用户不需要考虑网络,DNS,硬件环境方面的问题;运营商:提供网络,存储,DNS,这样服务就叫做基础设施服务。
-
PaaS(平台即服务):MySQL/ES/MQ/...
-
SaaS(软件即服务):钉钉,财务管理。
-
Serverless:无服务,不需要服务器。站在用户的角度考虑问题,用户只需要使用云服务器即可,在云服务器所在的基础环境,软件环境都不需要用户关心。
如果觉得不好理解,推荐阅读这篇文章:如何通俗解释 IaaS、PaaS、SaaS 的区别:
https://www.zhihu.com/question/21641778/answer/62523535
为了让应用程序(项目,服务软件)都运行在云上的解决方案,这样的方案叫做云原生。
-
容器化,所有服务都必须部署在容器中
-
微服务,Web 服务架构式服务架构
-
CI/CD
-
DevOps
K8s 架构原理
-
apiserver 即 K8s 网关,所有的指令请求都必须要经过 apiserver。
-
Scheduler 调度器,使用调度算法,把请求资源调度到某一个 Node 节点。
-
Controller 控制器,维护 K8s 资源对象。
-
etcd 存储资源对象。
-
Kubelet 在每一个 Node 节点都存在一份,在 Node 节点上的资源操作指令由 Kubelet 来执行。
-
Kube-proxy 代理服务,处理服务间负载均衡。
-
Pod 是 K8s 管理的基本单元(最小单元),Pod 内部是容器,K8s 不直接管理容器,而是管理 Pod。
-
Docker 运行容器的基础环境,容器引擎。
-
Fluentd 日志收集服务。
K8s 核心组件
-
一个 Master 有一群 Node 节点与之对应。
-
Master 节点不存储容器,只负责调度、网管、控制器、资源对象存储。
-
容器的存储在 Node 节点,容器是存储在 Pod 内部的)。
-
Pod 内部可以有一个容器,或者多个容器。
-
Kubelet 负责本地 Pod 的维护。
-
Kube-proxy 负责负载均衡,在多个 Pod 之间来做负载均衡。
-
Pod 也是一个容器,这个容器中装的是 Docker 创建的容器,Pod 用来封装容器的一个容器,Pod 是一个虚拟化分组。
-
Pod 相当于独立主机,可以封装一个或者多个容器。
-
Pod 内部容器创建之前,必须先创建 Pause 容器。
-
服务容器之间访问 localhost ,相当于访问本地服务一样,性能非常高。
-
ReplicationController 副本控制器:单选。
-
ReplicaSet 副本控制器:单选,复合选择。
selector:
app = web
Release = stable
-
服务部署结构模型
-
滚动更新
-
ReplicaSet 不支持滚动更新,Deployment 对象支持滚动更新,通常和 ReplicaSet 一起使用。
-
Deployment 管理 ReplicaSet,RS 重新建立新的 RS,创建新的 Pod。
-
容器是生命周期的,一旦宕机,数据丢失
-
Pod 部署,Pod 有生命周期,数据丢失
-
有实时的数据需要存储。
-
有状态服务集群中,把某一个服务抽离出去,一段时间后再加入机器网络,如果集群网络无法使用。
-
没有实时的数据需要存储。
-
无状态服务集群中,把某一个服务抽离出去,一段时间后再加入机器网络,对集群服务没有任何影响。
-
部署模型
-
有状态服务
K8s 的服务注册与发现
-
Pod 相当于一个容器,Pod 有独立 IP 地址,也有自己的 Hostname,利用 Namespace 进行资源隔离,独立沙箱环境。
-
Pod 内部封装的是容器,可以封装一个,或者多个容器(通常是一组相关的容器)。
-
Pod 有自己独立的 IP 地址。
-
Pod 内部容器之间访问采用 Localhost 访问。
简单来说,Service 资源对象包括如下三部分:
-
Pod IP:Pod 的 IP 地址。
-
Node IP:物理机 IP 地址。
-
Cluster IP:虚拟 IP ,是由 K8s 抽象出的 Service 对象,这个 Service 对象就是一个 VIP 的资源对象。
-
Service 和 Pod 都是一个进程,Service 也不能对外网提供服务。
-
Service 和 Pod 之间可以直接进行通信,它们的通信属于局域网通信。
-
把请求交给 Service 后,Service 使用 iptable,ipvs 做数据包的分发。
-
不同的业务有不同的 Service。
-
Service 和 Pod 通过标签选择器进行关联。
selector:
app=x 选择一组订单的服务 pod ,创建一个 service;
通过 endpoints 存放一组 pod ip;
关键问题
-
自动化运维平台,创业型公司,中小型企业,使用 K8s 构建一套自动化运维平台,自动维护服务数量,保持服务永远和预期的数据保持一致性,让服务可以永远提供服务。这样最直接的好处就是降本增效。
-
充分利用服务器资源,互联网企业,有很多服务器资源「物理机」,为了充分利用服务器资源,使用 K8s 构建私有云环境,项目运行在云。这在大型互联网公司尤为重要。
-
服务的无缝迁移,项目开发中,产品需求不停的迭代,更新产品。这就意味着项目不停的发布新的版本,而 K8s 可以实现项目从开发到生产无缝迁移。
作者:jartto
编辑:陶家龙
出处:http://jartto.wang/2020/07/15/start-k8s/
推荐阅读:
Today's Interaction
今日互动
你用Docker还是K8s?来说说原因吧...
在留言区参与互动,精彩留言将获得脚本之家小程序积分,积分可直接兑换书籍。
文章评论