往期文章:
1、Kubernetes(K8S)集群部署搭建图文教程
2、Kubernetes Pod概念与网络通讯模式
3、Kubernetes 资源清单与Pod生命周期
4、Kubernetes Pod控制器实例演示
5、Kubernetes Service与Ingress详解
6、Kubernetes 存储(Configmap、Secret、Volume、PV-PVC)
7、Kubernetes 集群调度(节点亲和性、Pod亲和性、Taint与Toleration)
8、Kubernetes 集群安全
9、Kubernetes Helm及其功能性组件
10、Kubernetes 证书可用年限修改
11、Kubernetes 高可用K8s构建(完结)
12、Kubernetes 总结
K8s 是一个可移植的、可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化。
K8s 拥有一个庞大且快速增长的生态系统。K8s 的服务、支持和工具广泛可用。
通过 K8s 我们可以:
K8s 有如下特点:
云原生
①云和 K8s 是什么关系
云就是使用容器构建的一套服务集群网络,云由很多的大量容器构成。K8s 就是用来管理云中的容器。
为了让应用程序(项目,服务软件)都运行在云上的解决方案,这样的方案叫做云原生。
云原生有如下特点:
概括来说 K8s 架构就是一个 Master 对应一群 Node 节点。下面我们来逐一介绍 K8s 架构图中的 Master 和 Node。
Master 节点结构如下:
Node 节点结构如下:
①K8s 组件
K8s 是用来管理容器,但是不直接操作容器,最小操作单元是 Pod (间接管理容器):
②Pod 是什么?解释如下:
Pod 有自己的 IP 地址、主机名,相当于一台独立沙箱环境。
③Pod 到底用来干什么?
通常情况下,在服务部署时候,使用 Pod 来管理一组相关的服务。一个 Pod 中要么部署一个服务,要么部署一组有关系的服务。一组相关的服务是指:在链式调用的调用连路上的服务。
④Web 服务集群如何实现?
实现服务集群:只需要复制多方 Pod 的副本即可,这也是 K8s 管理的先进之处,K8s 如果继续扩容,只需要控制 Pod 的数量即可,缩容道理类似。
⑤Pod 底层网络,数据存储是如何进行的?具体如下:
⑥ReplicaSet 副本控制器控制 Pod 副本「服务集群」的数量,永远与预期设定的数量保持一致即可。当有 Pod 服务宕机时候,副本控制器将会立马重新创建一个新的 Pod,永远保证副本为设置数量。副本控制器:标签选择器-选择维护一组相关的服务(它自己的服务)
⑦Deployment 部署对象Deployment 部署对象如下:
ReplicaSet 副本控制器控制 Pod 副本的数量。但是,项目的需求在不断迭代、不断的更新,项目版本将会不停的的发版。版本的变化,如何做到服务更新?部署模型:
⑧MySQL 使用容器化部署,存在什么样的问题?问题如下:
对于 K8s 来说,不能使用 Deployment 部署有状态服务。通常情况下,Deployment 被用来部署无状态服务,那么对于有状态服务的部署,使用 StatefulSet 进行有状态服务的部署。
什么是有状态服务?
什么是无状态服务?
⑨StatefulSet为了解决有状态服务使用容器化部署的一个问题:
StatefulSet 保证 Pod 重新建立后,Hostname 不会发生变化,Pod 就可以通过 Hostname 来关联数据。这就涉及到 K8s 的服务注册与发现。 SVC
①Pod 的结构是怎样的?结构如下:
②Pod 网络具体如下:
Pod 内部容器访问是 Localhost,Pod 之间的通信属于远程访问。
③Pod 是如何对外提供服务访问的?
Pod 是虚拟的资源对象(进程),没有对应实体(物理机,物理网卡)与之对应,无法直接对外提供服务访问。那么该如何解决这个问题呢?
④一组相关的 Pod 副本,如何实现访问负载均衡?
我们先明确一个概念,Pod 是一个进程,是有生命周期的。宕机、版本更新,都会创建新的 Pod。这时候 IP 地址会发生变化,Hostname 会发生变化,使用 Nginx 做负载均衡就不太合适了。所以我们需要依赖 Service 的能力。
Kubernetes Service定义了这样一种抽象:一个Pod的逻辑分组,一种可以访问它们的策略 —— 通常称为微服务。这一组Pod能够被Service访问到,通常是通过Label Selector
通俗的讲:SVC负责检测Pod的状态信息,不会因pod的改动IP地址改变(因为关注的是标签),导致Nginx负载均衡影响
⑤Service 如何实现负载均衡?
简单来说,Service 资源对象包括如下三部分:
⑥Service VIP 更深入原理探讨具体如下:
⑦Service 对象是如何和 Pod 进行关联的?具体如下:
selector:
app=x 选择一组订单的服务 pod ,创建一个 service;
通过 endpoints 存放一组 pod ip;
Service 通过标签选择器选择一组相关的副本,然后创建一个 Service。
⑧Pod 宕机、发布新的版本的时候,Service 如何发现 Pod 已经发生了变化?
每个 Pod 中都有 Kube-Proxy,监听所有 Pod。如果发现 Pod 有变化,就动态更新(etcd 中存储)对应的 IP 映射关系。
①企业使用 K8s 主要用来做什么?有如下三个方面:
②K8s 服务的负载均衡是如何实现的?
Pod 中的容器很可能因为各种原因发生故障而死掉。Deployment 等 Controller 会通过动态创建和销毁 Pod 来保证应用整体的健壮性。换句话说,Pod 是脆弱的,但应用是健壮的。每个 Pod 都有自己的 IP 地址。当 Controller 用新 Pod 替代发生故障的 Pod 时,新 Pod 会分配到新的 IP 地址。这样就产生了一个问题:如果一组 Pod 对外提供服务(比如 HTTP),它们的 IP 很有可能发生变化,那么客户端如何找到并访问这个服务呢?K8s 给出的解决方案是 Service。Kubernetes Service 从逻辑上代表了一组 Pod,具体是哪些 Pod 则是由 Label 来挑选。Service 有自己 IP,而且这个 IP 是不变的。客户端只需要访问 Service 的 IP,K8s 则负责建立和维护 Service 与 Pod 的映射关系。无论后端 Pod 如何变化,对客户端不会有任何影响,因为 Service 没有变。
③无状态服务一般使用什么方式进行部署?
Deployment 为 Pod 和 ReplicaSet 提供了一个 声明式定义方法,通常被用来部署无状态服务。Deployment 的主要作用:定义 Deployment 来创建 Pod 和 ReplicaSet 滚动升级和回滚应用扩容和索容暂停和继续。Deployment不仅仅可以滚动更新,而且可以进行回滚,如果发现升级到 V2 版本后,服务不可用,可以迅速回滚到 V1 版本。