k8s简介

什么是k8s?为什么要使用k8s?

Kubernetes(因为k和s中间有8个字母,所以简称k8s)是自动化容器管理和编排的开源平台

优点:

自动化部署容器和复制(yaml:资源清单)

随时扩展和收缩容器规模(RS:副本集)

平滑升级

服务发现(etcd)

负载均衡(IPVS)

开源且轻量等…

POD概念

pod是一组紧密关联的容器组合(一个pod可运行一个或多个容器),也是k8s集群中最小调度单元.

Pod封装了一个或多个应用程序的容器(比如nginx等),他们共享PID ,NETWORK,UTS 等namespace,同一个Pod里的多个容器共享网络和文件系统,同一个pod的容器可以直接俄通过lo(也叫localhost)口进行通信。

#IPC进程间通信

#UTS namespace用来隔离系统的hostname以及NIS domain name(NIS的全称是Network Information Service,nisdomainname命令用于显示主机NIS的域名,)。

控制平面(master)组件

1、kube-apiserver/api接口

Kubernetes API接口,所有服务访问统一入口。主要处理 Rest操作以及更新Etcd中的对象。

# REST (REpresentation State Transfer) 描述了一个架构样式的网络系统,指的是一组架构约束条件和原则

2、etcd/k8s后台数据库

集群模式,安装于每台服务器上:etcd 是兼具一致性和高可用性的键值数据库,官方建议作为 Kubernetes 所有集群数据的后台数据库(所有持久化的状态信息存储在Etcd中)。

 

etcd应用场景:

用于服务发现,服务发现(ServiceDiscovery)要解决的是分布式系统中最常见的问题之一,即在同一个分布式集群中的进程或服务如何才能找到对方并建立连接。

3、kube-scheduler/k8s pod调度器

资源调度,分配Pod到Node节点上。需部署在 master 节点上,该组件监视那些新创建的未指定运行节点的 Pod,并选择节点让 Pod 在上面运行。

调度决策考虑的因素包括单个 Pod 和 Pod 集合的资源需求、硬件/软件/策略约束、亲和性和反亲和性规范、数据位置、工作负载间的干扰和最后时限。

4、kube-controller-manager/k8s管理器

资源对象的自动化控制中心:

需部署在 master 节点上。从逻辑上讲,每个控制器都是一个单独的进程,但是为了降低复杂性,它们都被编译到同一个可执行文件,并在一个进程中运行。

这些控制器包括:

节点控制器(Node Controller): 负责在节点出现故障时进行通知和响应

副本控制器(Replication Controller): 负责为系统中的每个副本控制器对象维护正确数量的 Pod

端点控制器(Endpoints Controller): 填充端点(Endpoints)对象(即加入 Service 与 Pod)

服务帐户和令牌控制器(Service Account & Token Controllers): 为新的命名空间创建默认帐户和 API 访问令牌

5、cloud-controller-manager/云控制器管理器

运行与基础云提供商交互的控制器,从k8s1.6之后出现的新功能

也包括了多个控制器:节点控制器、路由控制器、服务控制器、数据卷控制器

Node节点组件

kubelet/节点管理工具

kubelet负责管理节点的pod,可以理解为当在master上执行创建、删除对象时,kubelet负责执行从kube-apiserver下达的指令

# Kubelet:管理Pods以及容器、镜像、Volume等,实现对集群和节点的管理。

kube-proxy/网络管理器

kube-proxy运行在每个node节点上,管理维护node上的网络规则。

# Kube-proxy:提供网络代理以及负载均衡,实现与Service通讯。

Container Runtime/容器运行环境

简而言之,就是容器。我们需要在node节点安装runtime作为k8s部署容器的运行环境,目前主流当然是docker。

#Docker Engine:负责节点的容器的管理工作。

集群插件

域名解析服务:如CoreDNS、Cluster DNS

资源监控服务:Prometheus、Metrics-Server

用户的ui管理界面:Dashboard、Kubesphere

集群日志:ELK

镜像仓库:Harbor

 

coreDNS:可以为集群中的SVC创建一个域名IP的对应关系解析

dashboard:给k8s集群提供一个B/S结构访问体系

ingress controller:可以实现七层代理(官方只能实现四层代理)

Prometheus:提供k8s集群的监控能力

ELK:提供集群日志统一分析平台

 

#B/S结构(Browser/Server,浏览器/服务器模式),是WEB兴起后的一种网络结构模式,WEB浏览器是客户端最主要的应用软件。这种模式统一了客户端,将系统功能实现的核心部分集中到服务器上,简化了系统的开发、维护和使用。客户机上只要安装一个浏览器,如Netscape NavigatorInternet Explorer服务器安装SQL ServerOracle、MYSQL等数据库。浏览器通过Web Server 同数据库进行数据交互

控制器

Replication Controller,RC

RC(副本控制器)是K8s集群中最早的保证Pod高可用的API对象。通过监控运行中的Pod来保证集群中运行指定数目的Pod副本. 代用户创建指定数量的pod副本数量,确保pod副本数量符合预期状态

Replica Set,RS

ReplicaSet(RS):是RC升级版,另外还支持滚动式自动扩容和缩容功能。

Deployment

顾名思义,Deployment是一个部署,作用主要是创建、更新、回滚RS以控制pod。Deployment工作在RS之上,用来管理RSpod目前来说是最好的控制器(用于管理无状态应用)

DaemonSet

用于确保集群中的每一个节点只运行特定的pod副本,通常用于实现系统级后台任务。比如ELK服务

#Deployment 部署的副本 Pod 会分布在各个 Node 上,每个 Node 都可能运行好几个副本。DaemonSet 的不同之处在于在每个 Node 上最多只能运行一个副本。

Job

可创建一个或者多个pod,job在指定次数、指定个数的pod创建后job的工作就完成了删除一个job,会将其创建的pod一并清除

#只要完成就立即退出,不需要重启或重建。

Cronjob

周期性任务控制,不需要持续后台运行,

StatefulSet

管理有状态应用

StatefulSets用来管理 Deployment 和扩展一组 Pod

StatefulSet 和 Deployment 相同的是管理了基于相同容器定义的一组 Pod;但是StatefulSet 为它的每个 Pod 维护了一个固定的 ID,并且该ID是基于声明创建的,无论pod如何调度,ID永久不变

StatefulSet多用于满足以下一个或多个条件的应用程序:

  1. 稳定的、唯一的网络标识符。
  2. 稳定的、持久的存储。
  3. 有序的、优雅的部署和缩放。
  4. 有序的、自动的滚动更新。

服务分类

有状态服务:DBMS(需要数据存储功能的服务

无状态服务:LVS  APACHE(该服务运行的实例不会在本地存储需要持久化的数据

补充

service

官方说:逻辑上的一组Pod,一种可以访问它们的策略——通常称为微服务。这一组Pod能够被Service访问到,通常是通过selector实现的。

volume

Kubernetes 卷具有明确的生命周期——与包裹它的 Pod 相同,但是卷比 Pod 中运行的任何容器的存活期都长,在容器重新启动时数据也会得到保留。Kubernetes支持多种类型的卷,如nfs、iscsi、cinder、azureDisk等

namespace(命名空间)

命名空间为名称提供了一个范围。资源的名称需要在命名空间内是唯一的,但不能跨命名空间。命名空间不能相互嵌套,每个 Kubernetes 资源只能在一个命名空间中。

 

kubernetes存在三个初始的命名空间:

  1. default/没有指定命名空间的容器默认的
  2. kube-system/kubernetes系统创建的
  3. kube-public/公共的,对于所有用户都可读

endpoint

endpoint是kubernetes的一个资源对象,存储于etcd数据库中,用以记录service的所有pod的访问地址

object(对象)

object是持久化的实体,用以表示整个集群的状态

  1. 哪些容器化应用在运行
  2. 可以被应用使用的资源
  3. 应用运行时重启策略、升级策略,以及容错策略

一个object一旦创建,kubernetes会持续工作以保证对象存在;也就是通过对象棵设置kubernetes集群的期望状态
 

object的操作依赖于Kubernetes API,如果使用kubectl也是通过调用Kubernetes API完成的操作(使用yaml文件操作会将文件的内容从yaml转换为json格式)

Object Name 和 UID(对象名和UID)

集群中的每一个对象都一个名称 来标识在同类资源中的唯一性。

每个 Kubernetes 对象也有一个UID 来标识在整个集群中的唯一性。

label(标签)

label是附加到对象的键/值对;label可以在创建时附加到对象,然后可以随时添加和修改。每个对象可以定义一组键/值标签。每个键对于给定的对象必须是唯一的。label不是唯一的,也就是说多个对象可以拥有同一个label,如我们可以创建多个label为nginx的pod用于统一管理。

label selector(标签选择器)

与名称和UID不同,标签不提供唯一性。通常,我们希望许多对象携带相同的标签。通过标签选择器,客户端/用户就可以识别一组同标签的对象。

HPA(HorizontalPodAutoScale)

资源合理分配:

 

 

 

架构图

 

整体访问流程

用户执行kubectl向apiserver发起一个指令,经过认证授权后,经过scheduler的各种策略,得到一个目标node,然后告诉apiserver,apiserver 会请求相关node的kubelet,通过kubelet把pod运行起来,apiserver还会将pod的信息保存在etcd;pod运行起来后,controllermanager就会负责管理pod的状态,如,若pod挂了,controllermanager就会重新创建一个一样的pod,或者像扩缩容等;pod有一个独立的ip地址,但pod的IP是易变的,如异常重启,或服务升级的时候,IP都会变,这就有了service;完成service工作的具体模块是kube-proxy;在每个node上都会有一个kube-proxy,在任何一个节点上访问一个service的虚拟ip,都可以访问到pod;service的IP可以在集群内部访问到,在集群外呢?service可以通过nodeport把服务端口暴露在当前的node上,外面的请求直接访问到node的真实IP+端口就可以访问到service了。

 

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐