k8s架构介绍

1. 简介

1.1 什么是Kubernetes

首先,它是一个全新的基于容器技术的分布式架构领先方案,基于谷歌集群管理系统(Borg)而诞生,Borg是谷歌的一个久负盛名的内部使用的大规模集群管理系统,它基于容器技术,目的是实现资源管理的自动化,以及跨多个数据中心的资源利用率的最大化。十几年以来,谷歌一直通过Borg系统管理着数量庞大的应用程序集群。

其次,它是一个开放的开发平台。与J2EE不同,它不局限于任何一种语言,没有限定任何编程接口,所以不论是用Java、Go、C++还是用Python编写的服务,都可以被映射为Kubernetes的Service(服务),并通过标准的TCP通信协议进行交互。

此外,Kubernetes平台对现有的编程语言、编程框架、中间件没有任何侵入性,因此现有的系统也很容易改造升级并迁移到Kubernetes平台上。

1.2 Kubernetes发展史

  • 2003-2004, Borg 系统的诞生: Borg 系统是一个大规模的内部集群管理系统,它可以运行数千个不同应用程序中的数十万个遍布多个集群的作业,每个集群拥有多达数万台机器。

  • 2014 年中,Google 推出 Kubernetes: Google 推出Kubernetes (作为 Borg 的开源版本)。

  • 2014.6.7,初始版本发布: KubernetesGitHub 上第一次被提交。

  • 2014.7.10,重要成员加入: 微软、RedHatIBM、Docker加入 Kubernetes 社区。

  • 2015.7.21,Kubernetes v1.0 发布: 随后,谷歌与 Linux 基金会合作组建了云原生计算基金会(CNCF)。CNCF 旨在建立可持续的生态系统,并围绕一系列高质量项目建立一个社区。

  • 2016: Kubernetes 在这一年成为主流

    • 2016.2.23,Helm 发布:Kubernetes软件包管理系统 Helm 首次发布。

    • 2016.7.11,Minikube 正式发布:它是一个可以让Kubernetes 在本地运行的工具。

    • 2016.9.8,Kops 面世:一个管理生产级 Kubernetes 集群的官方 Kubernetes 项目。

    • 2016.9.26,kubeadm 诞生Kubernetes 1.4 推出了一种新工具 kubeadm,有助于提高 Kubernetes 的可安装性。 此版本提供了更简单的设置,支持集成 Helm 的状态应用以及新的跨集群联合功能。

    • 2016.12.21,Windows服务器支持K8s: Kubernetes 1.5 发布,Kubernetes得到Windows服务器的支持。

    • 2016.12.23,Kubernetes 支持 OpenAPI: 允许 API 提供商定义他们的操作和模型,开发人员可以自动化他们的工具。

    • 2017: 企业采用和支持的一年

    • 2017.5.24,istio面世:Google 与 IBM 发布了一项开放式技术 Istio,它提供了一种对任何平台、来源或是供应商都能无缝连接、管理和保护不同微服务网络的方法。

    • 2017.8.16: GitHub 开始在 Kubernetes 上运行。所有 Web 和 API 请求都由在 metal cloud 上部署的 Kubernetes 集群中运行的容器提供服务。

    • 2017.9.11: CNCF 宣布推出首批 Kubernetes 认证服务供应商,有超过 22 家供应商获得首批 Kubernetes 认证。

    • 2017.9.13: Oracle 以白金会员的身份加入了 CNCF,并在 Oracle Linux上发布了 Kubernetes

    • 2017.10:DockerKubernetes全面合作。

    • 2017.10.24: 微软推出 AKS 预览版 — AKS 具有 Azure 托管控制平面,并能自动升级、自我修复、易于扩展以及为开发人员和集群运营商提供简单的用户体验。

    • 2017.11.29:亚马逊宣布为 Kubernetes 提供弹性容器服务,可在 AWS 上使用 Kubernetes 进行部署、管理和扩展容器化应用程序。

    • 2017.12.21:Kubeflow首发 ,一个为 Kubernetes 构建的可组合、便携、可扩展的机器学习堆栈。

….

2. 架构介绍

一个典型的Kubernetes集群由多个工作节点(worker node)和一个集群控制平面(control plane,即Master),以及一个集群状态存储系统(etcd)组成。

Master节点: 负责整个集群的管理工作,为集群提供管理接口,并监控和编排集群中的各个工作节点。

Work node节点:负责以Pod的形式运行容器。

2.1 Master节点组件

MasterKubernetes Cluster的大脑,运行着的Daemon服务包括kube-apiserver、kube-scheduler、kube-controller-manager、etcd和Pod网络。

a. API Server(kube-apiserver)

API Server提供HTTP/HTTPS RESTful API,即Kubernetes APIAPI ServerKubernetes Cluster的前端接口,各种客户端工具(CLI或UI)以及Kubernetes其他组件可以通过它管理Cluster的各种资源。

b. Scheduler(调度器)

API Server收到Pod对象的创建请求之后,Scheduler会根据集群内各节点的可用资源状态,决定Pod在哪个Node上运行。Kubernetes也支持用户自定义调度器。

c. Controller Manager(控制器管理器)

Controller Manager负责管理Cluster各种资源,保证资源处于预期的状态。

Controller Manager由多种controller组成,包括replication controller、endpoints controller、namespace controller、serviceaccounts controller等。

不同的controller管理不同的资源。例如,replication controller管理Deployment、StatefulSet、DaemonSet的生命周期,namespace controller管理Namespace资源。

d. Etcd

etcd负责保存Kubernetes Cluster的配置信息和各种资源的状态信息。当数据发生变化时,etcd会快速地通知Kubernetes相关组件。需要注意的是: etcd是独立的服务组件,并不隶属于Kubernetes集群自身。生产环境中应该以etcd集群的方式运行以确保其服务可用性。

etcd不仅能够提供键值数据存储,而且还为其提供了监听(watch)机制,用于监听和推送变更。Kubernetes集群系统中,etcd中的键值发生变化时会通知到API Server,并由其通过watch API向客户端输出。基于watch机制,Kubernetes集群的各组件实现了高效协同。

e. Pod网络

Pod相当于Kubernetes云平台所提供的虚拟机,是Kubernetes基本的调度单位。Pod网络就是能保证Kubernetes集群中所有的Pod,无论是否同一节点上,能够互相通信,逻辑上在同一个网络内。

目前比较流行CNI网络插件有: Flannel、Calico、Weave 和 Canal

2.3 Node节点组件

Node负责提供运行容器的各种依赖环境,并接受Master的管理。每个Node主要由以下几个组件构成。

a. kubelet(Node的核心代理程序)

kubeletNodeagent,当Scheduler确定在某个Node上运行Pod后,会将Pod的具体配置信息(image、volume 等)发送给该节点的kubeletkubelet根据这些信息创建和运行容器,并向Master报告运行状态。

b.kube-proxy

service在逻辑上代表了后端的多个Pod,外界通过service访问Podservice接收到的请求是如何转发到Pod的呢?

这就是kube-proxy要完成的工作。每个Node都会运行kube-proxy服务,它负责将访问serviceTCP/UDP数据流转发到后端的容器。如果有多个副本,kube-proxy会实现负载均衡。

c. Container Runtime(容器运行时)

Kubelet需要一个容器运行时(container runtime)来执行依赖容器才能执行的任务,例如拉取镜像并启动或停止容器。

在早期的版本中,Kubernetes原生支持了少量容器运行时,例如Docker。而在最近的版本中,Kubernetes将其迁移到了一个叫作容器运行时接口(CRI)的模块当中。从整体上来看,CRI屏蔽了Kubernetes内部运行机制,并向第三方容器运行时提供了文档化接口来接入。

Kubernetes目前支持丰富的容器运行时。一个非常著名的例子就是cri-containerd。这是一个开源的、社区维护的项目,将CNCF运行时通过CRI接口接入Kubernetes。该项目得到了广泛的支持,在很多Kubernetes场景中已经替代Docker成为当前最流行的容器运行时。

d. Pod网络

Pod相当于Kubernetes云平台所提供的虚拟机,是Kubernetes基本的调度单位。Pod网络就是能保证Kubernetes集群中所有的Pod,无论是否同一节点上,能够互相通信,逻辑上在同一个网络内。

问:为什么master节点有kubeletkube-proxy呢?
答: 这是因为Master上也可以运行应用,即Master同时也是一个Node

3. 实例分析

为了帮助大家更好地理解Kubernetes架构,我们部署一个应用来演示各个组件之间是如何协作的。

3.1 配置文件

cat <<EOF >  /usr/local/kubernetes/deployment/httpd.yaml
apiVersion: apps/v1 # 配置格式版本
kind: Deployment   #资源类型,我们使用的是 Deployment
metadata: 
  name: httpd-deployment #Deployment 的名称
spec: 
  replicas: 2   # 副本数量
  selector:   #标签选择器,与上面的标签共同作用,目前不需要理解
    matchLabels: #选择包含标签app:httpd_server的资源
      app: httpd_server
  template:     #这是选择或创建的Pod的模板
    metadata:   
      labels:   #Pod的标签
        app: httpd_server
    spec: 
      containers: 
      - name: httpd-app #container的名称
        image: httpd #使用镜像httpd
        ports:
        - containerPort: 8080
EOF

3.2 创建资源

# 使用kubectl apply创建资源
$ kubectl apply -f /usr/local/kubernetes/deployment/httpd.yaml
deployment.apps/httpd-deployment created

3.3 查看资源

# 查看 deployment
$ kubectl get deployment -o wide
NAME               READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES   SELECTOR
httpd-deployment   2/2     2            2           45s   httpd-app    httpd    app=httpd_server
# 查看pod分布情况
$ kubectl get pod -o wide
NAME                                READY   STATUS    RESTARTS   AGE   IP               NODE    NOMINATED NODE   READINESS GATES
httpd-deployment-5bcbffbddf-mv85v   1/1     Running   0          70s   10.244.104.4     node2   <none>           <none>
httpd-deployment-5bcbffbddf-v6pbb   1/1     Running   0          70s   10.244.166.135   node1   <none>           <none>

3.4 过程分析

  1. kubectl发送创建资源请求到API Server
  2. API Server通知Controller Manager创建一个deployment资源。
  3. Scheduler执行调度任务,将两个副本Pod分发到node1node2
  4. node1node2上的kubectl在各自的节点上创建并运行Pod

补充两点:

  • 应用的配置和当前状态信息保存在etcd中,执行kubectl get podAPI Server会从etcd中读取这些数据。
  • Pod网络会为每个Pod分配IP。因为没有创建service,所以目前kube-proxy还没参与进来。

4. 核心附件

Kubernetes集群,除了有MasterNode节点组件外,还依赖于一组称为附件(add-ons)的组件以提供完整的功能。它们通常是由第三方提供的特定应用程序,且托管运行于Kubernetes集群之上。

4.1 KubeDNS

KubeDNS是在Kubernetes集群中调度运行提供DNS服务的Pod,同一集群中的其他Pod 可使用此DNS服务解决主机名。

Kubernetes自1.11版本开始默认使用CoreDNS项目为集群提供服务注册和服务发现的动态名称解析服务,之前的版本中用到的是kube-dns项目,而SkyDNS则是更早一代的项目。

4.2 Kubernetes Dashboard

Kubernetes集群的全部功能都要基于WebUI,来管理集群中的应用甚至是集群自身。

4.3 Heapster

容器和节点的性能监控与分析系统,它收集并解析多种指标数据,如资源利用率、生命周期事件等。新版本的Kubernetes中,其功能会逐渐由Prometheus结合其他组件所取代。

4.4 Ingress Controller

Service是一种工作于传统层的负载均衡器,而Ingress是在应用层实现的HTTP(s)负载均衡机制。不过,Ingress资源自身并不能进行“流量穿透”,它仅是一组路由规则的集合,这些规则需要通过Ingress控制器(Ingress Controller)发挥作用。目前,此类的可用项目有Nginx、Traefik、Envoy及HAProxy等。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,444评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,421评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,363评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,460评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,502评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,511评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,280评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,736评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,014评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,190评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,848评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,531评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,159评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,411评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,067评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,078评论 2 352

推荐阅读更多精彩内容