kubernetes基础知识,个人学习记录

kubernetes 基础

目录

  • kubernetes 基础
      • 安装测试最新版本
      • Cloud Native Apps 云源生
      • Serverless 无服务器应用逻辑
      • FaaS 函数级服务
      • kubernetes的定义
    • kubernetes容器编排系统
      • 一、背景:
        • 微服务编排系统:
        • 产生问题:
        • 如果服务的需要的环境互不相同,不能满足怎么办?
        • 结果:
        • 由服务编排系统变成了容器编排系统
      • 二、容器编排系统提供的特点、功能
      • 三、容器编排系统工具
    • kubernetes 集群节点、物理结构
      • kubernetes定义
      • 集群节点定义
        • Cluster
        • Master
        • Nodes
      • 集群组件
        • Master节点组件:
        • Nodes节点组件:
    • kubernetes网络
        • 什么是Flannel:
      • kubernetes通信
        • 转发过程:
        • Web app2 ----> backend的通信流程
        • ETCD提供说明

Borg 谷歌内部公司使用的容器编排工具

kubernetes 开源容器编排工具,开源在github.com



安装测试最新版本

官网:https://github.com/kubernetes

官网下载:https://github.com/kubernetes/kubernetes/releases



Cloud Native Apps 云源生

​ 程序开发出来就是运行在云平台之上,而非传统的运行在单机操作系统之上。

​ 程序员开发的API接口不再是不同主机跨操作系统的接口,而是k8s集群的API接口,直接在k8s集群上来书写代码进行测试。



Serverless 无服务器应用逻辑

​ 在k8s之上实现的无服务器应用程序叫:Knative

​ 传统提供一个web服务,要么运行nginx、要么运行httpd、这个应用程序是一个守护进程一直在运行,无论是否有用来进行访问,这个系统资源始终不停的处于消耗当中(不论是CPU\还是内存)。

​ 无服务器:程序平时是不运行的,只有被客户端访问时才会运行,当结束访问也就随之关闭。当被调用时才会运行。每个应用程序都相当于一个函数,实现函数化调用。



FaaS 函数级服务

​ Function as a Service 函数本身都部署在应用程序服务器上,客户端只需要发送请求,服务端被调用时将函数调用起来,将结果返回给客户端。每个函数都是一个独立的可以被调用的个体。

​ 如果有成千上万的功能,那可能就是成千上万个函数,以用户无法感知的在多个节点运行。



kubernetes的定义

​ k8s是一个开源平台对自动部署,伸缩,运维容器化应用的开源平台,支持跨主机的集群多节点完成容器编排。以http、https协议对外提供API服务。



kubernetes容器编排系统

一、背景:

微服务编排系统:

​ 只需要提供一组主机形成集群,在主机上运行服务编排系统,当我需要去运行一个服务时,只需要提供给这个系统,这个系统会根据自己检测到的众多主机中,最适合运行此服务的节点。把它自动部署上去,并运行起来,这样的系统叫做服务编排系统。

​ 只需要告诉它,我想要运行什么程序,将程序提交给服务编排系统,编排系统根据自己底层节点资源消耗状态并根据应用程序自身的需求,选择最佳目标节点,来运行程序。

产生问题:

如果服务的需要的环境互不相同,不能满足怎么办?

​ 可以无需考虑底层系统环境,应用程序自身自带所需要的依赖的运行环境,也就是容器。

​ 标准化的打包应用程序的方式,镜像。运行方式,容器。底层应用程序只需要有底层运行引擎就可以,每一个节点只需要有docker 跑着,当部署应用程序时,不是部署应用程序本身,而是把应用程序的镜像下载到对应的节点上,启动为容器。

​ 应用程序的镜像自带的应用程序自身所依赖到的所有环境,因此可以一次打包到处运行,无需再考虑底层系统环境异构与否或者满足与否。

结果:

由服务编排系统变成了容器编排系统

​ 单一容器没有太大的生产价值,只有能够自动化容器进行编排以后,容器的价值才能发挥出来。

​ docker出现的镜像机制,极富创造性的解决了应用程序打包的根本性难题,不用再考虑底层系统环境异构或是否能够满足应用程序运行环境的问题。推动了容器技术快速普及以及生产落地。

​ 容器本身仅提供了托管运行应用的底层逻辑,而只有能够把多个容器彼此间的依赖关系也反映出来,实现容器编排机制之后,才是真正产生价值的位置。

​ 容器只是运行应用程序的元子,单元。而把他们能够投入生产使用的,并真正解决生产难题,解决痛点,依赖的时容器编排系统。



二、容器编排系统提供的特点、功能

​ 容器编排系统其实只是一个容器的生命周期管理工具。尤其是我们在组件一个微服务环境当中,存在的服务数量非常多的时候,并且期望能够以动态注册,部署等方式来完全实现管理时。容器编排系统的价值体现才会更加充分。

​ 一般来讲软件团队会使用容器编排系统来完全以下任务的自动化,容器编排系统的核心价值所在。

1.容器的提供和部署。如何获取容器的镜像,如何去部署容器并运行起来。

2.容器的冗余和可用性。
如果某一容器宕机,容器编排系统必须通过自动逻辑,自动将出现故障的容器恢复回来,甚至是提供一个高可用逻辑,让某一容器出现故障后不至于使得服务整体无用。

3.规模的扩展,或者是实现应用规模的自动伸缩。
当客户端请求量大的时候进行扩容,当客户端请求小的时候进行缩容。把多个应用程序部署在一个集群上来统一进行调度,使整体系统资源合理充分的进行调用。

4.节点迁移。一旦底层节点出现故障或资源紧缺时,能把容器进行迁移到其它节点上去。用户对其是没有感知的,自动实行迁移。

5.容器之间实现资源分配

6.网络映射,网络暴露。必要时将容器提供的服务暴露到集群外部,为外部提供访问。只有接入层需要被暴露到网络外部。

7.负载均衡,服务发现

8.健康状态检测

9.应用程序配置自动实现

简单来说,容器编排是指容器应用的自动布局,协同以及管理,主要负责完成以下具体内容。

  • Server Discovery 服务注册,服务发现
  • Load Balancing 负载均衡
  • Secrets/configuration/storage management 配置和存储管理
  • Health checks 健康策略状态检测
  • Auto-[scaling/rester/healing] of containers and nodes 扩容缩容,重启等
  • Zero-downtime deploys 零宕机部署



三、容器编排系统工具

1.Kubernetes 目前最流行的编排工具,由CNCF组织(云源生基金会)提供研发更新。

2.Docker Swarm docker自带的编排工具

3.Apache Mesos and Marathon Mesos:数据中心资源统一管理的操作系统 Marathon:容器编排工具

故事:

​ docker-EE 支持K8S 之后,K8S全面获胜。K8S是google公司采用golang语言研发的一款开源软件。早在10几年前google公司就已经在使用容器来进行部署,有着自己特有的闭源编排工具,编排技术十分成熟。

​ docker公司只是一个创业公司,将google的容器技术进行美化,发明了docker。但是编排技术还是google公司的技术要生熟很多,所有k8s在2015年上线后就被全面应用。



kubernetes 集群节点、物理结构

kubernetes定义

​ 组合多台主机资源形成集群、资源池,统一对外提供计算、存储、等能力的集群。每一个主机都需要安装kubernetes的应用程序,让大家在应用程序上进行通信,从而完成协调工作。

集群节点定义

k8s属于有中心节点架构的系统 、master/nodes模型

  • master 主节点一般有3个彼此间做高可用,集群的唯一入口
  • nodes(worker) 从节点,贡献计算、存储能力、运行容器的节点。

Cluster

​ 集群,计算存储网络资源的集合,k8S利用这些资源来基于容器产生应用

Master

​ 客户端请求发送给 master ,master通过调度器分析各nodes现有的可用资源状态,找一个最佳适配请求的容器节点,进行调度。由本地nodes节点负责启动容器,容器镜像在本地的harbor仓库当中。

Nodes

​ 负责运行容器,运行容器应用。node由master统一管理。负责监控,向master汇报状态,并且根据master要求来运行nodes。



集群组件

Master节点组件:

  • Scheduler:调度器监控nodes节点的所有资源,首先根据容器的最低需求进行评估哪几个节点符合客户需求,然后从几台符合需求的nodes节点选择最优节点使用。
  • API Server:负责接收请求、处理请求。
  • controller控制器:根据额外定义的健康状态探测,可用性探测,监控容器内部是否是健康的。一旦出现宕机,则会通过自动自愈功能开启一个新的容器。
    • replicase set 管理多个副本
    • Deployment 调度副本
    • daemonset 每个节点上只运行一个pod
    • job 任务计划
    • statefuleset 保存pod中每个容器在生命周期内名字不变
    • service:集群网络
    • namespace:隔离机制
  • controller-Manager:控制器管理器,监测每一个控制器是否是健康的。在控制器管理器上做冗余。
  • Label selector:标签选择器,根据标签来过滤符合条件的资源对象的机制。

Nodes节点组件:

kubelet:调度结果由kubelet来执行,接收任务。将不同节点的pod信息,iamge,卷发送给kubelet,根据这些信息创建容器,并向master进行汇报。kubelet采集客户端信息,代理。

docker:容器引擎,运行容器

kubeproxy:每个node上都会运行proxy服务。负责将service发来的TCP/UDP数据流,转发到后端容器上,如果有多个副本,kubeproxy就会产生负载均衡。service代理了后端多个pod,外界通过service访问pod,service接受到这些请求通过proxy访问容器。

Pod网络:flannel网络,节点间相互通讯。



kubernetes网络

1、nodes节点网络 — ens33网卡通信

2、service集群网络 — flanneld进行通信,全部由iptables/lvs维护和转发

3、pod服务网络 — docker0进行通信

什么是Flannel:

​ 是CoreOS团队针对kubernetes 设计的一个网络规划服务,它的功能是让集群中不同的节点主机创建的 Docker 容器都具有全集群唯一的虚拟IP地址。

​ 而且它还能在这些IP地址之间建立一个覆盖网络(overlay Network),通过这个覆盖网络,将数据包原封不动地传递到目标容器内,实现不同主机间容器通信。

kubernetes通信

  1. 同一Pod内多个容器间通信:local本地通信,pause网络栈通信

  2. 各个pod之间的通信:overlay Nerwork叠加网络通信(全覆盖网络)

  3. pod和service之间的通信:各节点的Iptables规则、LVS转发

kubernetes基础知识,个人学习记录_第1张图片

转发过程:

  1. 首先在每台 k8s-node 节点上会安装一个 flanneld 的守护进程,负责监听端口用于后期转发接收数据包的服务端口。
  2. 这个 flanneld 进程启动后会生成一个 flannel0的网桥,该网桥用来收集 docker0 转发出来的数据报文。
  3. docker0 会分配自己的IP到对应的Pod上。

Web app2 ----> backend的通信流程

  1. app2 发送数据包,源IP为10.1.15.2/24 ,目标10.1.20.3/24。由于不在同一网段,所以发送到docker0进行转发。
  2. docker将数据包发送到 flannel0网桥,flannel0将收到的数据包交给flanneld进行封装转发。
  3. flanneld封装UDP数据报文,包含源IP:192.168.66.11,目标IP:192.168.66.12。以及容器的源IP10.1.15.2/24,目标IP10.1.20.3/24。
  4. 先将数据包发送到目标192.168.66.12。由192.168.66.12的 flanneld 进行解封装,发现是到达10.1.20.3/24
  5. 所以依次进行解封装到达10.1.20.3/24主机

ETCD提供说明

存储 flannel 可分配的IP地址资源

监控 ETCD 中每个 Pod 的实际地址,并在内存中简历维护 Pod 节点路由表

你可能感兴趣的:(kubernetes)