前文 Kubernetes笔记(一):十分钟部署一套K8s环境 介绍了如何快速搭建一个k8s系统。为了继续使用k8s来部署我们的应用,需要先对k8s中的一些基本组件与概念有个了解。

Kubernetes是什么

Kubernetes是Google于2014年基于其内部Brog系统开源的一个容器编排管理系统,可使用声明式的配置(以yaml文件的形式)自动地执行容器化应用程序的管理,包括部署、伸缩、负载均衡、回滚等。

kubernetes提供的功能:

  • 自动发布与伸缩:可以通过声明式的配置文件定义想要部署的容器,Kubernetes将自动进行容器的部署,达到期望的结果;通过指定容器副本数,或者设置根据资源负载情况(如CPU、内存使用率),自动对容器组进行快速的伸缩——增大或缩小容器数量
  • 滚动升级与灰度发布:采用逐步替换的策略实现滚动升级,使用Kubernetes也可以很轻易地管理系统的灰度发布
  • 服务发现与负载均衡:Kubernetes通过DNS名称或IP地址暴露容器的访问方式,并且可在同一容器组内实现负载分发与均衡
  • 存储编排:Kubernetes可以自动挂载指定的存储系统,如local storage/nfs/云存储等
  • 故障恢复:Kubernetes自动重启已经停机的容器,替换不满足健康检查的容器
  • 密钥与配置管理:Kubernetes可以存储与管理敏感信息,如Docker Registry的登录凭证,密码,ssh密钥等

Kubernetes架构

我们先来看一张Kubernetes的架构图

Kubernetes是一套分布式系统, 与大多数分布式系统类似,包含控制节点(master node)与工作节点(worker node)。

master node

控制节点就是指挥官,负责发号施令的,其上运行一些管理服务来对整个系统进行管理与控制,包括

  • apiserver:作为整个系统的对外接口,提供一套Restful API供客户端调用,任何的资源请求/调用操作都是通过kube-apiserver提供的接口进行,如kubectl、kubernetes dashboard等管理工具就是通过apiserver来实现对集群的管理
  • kube-scheduler:资源调度器,负责将容器组分配到哪些节点上
  • kube-controller-manager:管理控制器,集群中处理常规任务的后台线程,包括节点控制器(负责监听节点停机的事件并作出对应响应)、endpoint-controller(刷新服务与容器组的关联信息)、replication-controller(维护容器组的副本数为指定的数值)、Service Account & Token控制器(负责为新的命名空间创建默认的 Service Account 以及 API Access Token)
  • etcd:数据存储,存储集群所有的配置信息
  • coredns:实现集群内部通过服务名称进行容器组访问的功能

worker node

工作节点就是具体干活的小兵,其上也运行一些服务来执行指挥官分派的任务,包括

  • kubelet:是工作节点上执行操作的代理程序,负责容器的生命周期管理,定期执行容器健康检查,并上报容器的运行状态
  • kube-proxy:是一个具有负载均衡能力的简单的网络访问代理,负责将访问某个服务的请求分配到工作节点的具体某个容器上(kube-proxy也运行于master node上)
  • Docker Daemon:这个不难理解,所有服务或容器组都要以Docker容器的形式来运行(但Kubernetes其实不局限于Docker,它支持任何实现了Kubernetes容器引擎接口的容器引擎,如containerd、rktlet)

另外还有既在master node上也在worker node上运行的网络通信组件 kube-flannel。这些服务组件一般运行在kube-system的命名空间中,如图

Kubernetes基本概念

我们再来看第二张图

功能组件在上面已经做了介绍。Kubernetes的操作对象主要包括容器组(Pod),服务(Service),副本控制器(replication-controller),及围绕这些的其它辅助对象

Pod

Pod是Kubernetes创建或部署的最小基本单元。一个Pod封装一个或多个应用容器、存储资源、一个独立的网络IP以及管理控制容器运行方式的策略选项。Pod中的每个容器共享网络命名空间(包括IP与端口),Pod内的容器可以使用localhost相互通信。Pod可以指定一组共享存储卷Volumes,Pod中所有容器都可以访问共享的Volumes,Volumes用于数据持久化,防止容器重启丢失数据。

Volume

Kubernetes使用Volume来解决Pod中容器重启数据丢失的问题,以及Pod中多个容器间数据共享的问题。Kubernetes支持的Volume类型包括:

  • emptyDir:当Pod分配到Node上时,将会创建emptyDir,只要Node上的Pod一直运行,Volume就会一直存在。当Pod(不管任何原因)从Node上被删除时,emptyDir也同时会删除,存储的数据也将永久删除,但删除容器不影响emptyDir
  • hostPath:hostPath允许挂载Node上的文件系统到Pod里面去。如果Pod需要使用Node上的文件,可以使用hostPath
  • nfs: 使用nfs网络文件系统提供的共享目录

ReplicationController

ReplicationController确保在任何时候都有按配置的Pod副本数在运行。现在推荐使用配置ReplicaSet(下一代ReplicationController)的Deployment来建立副本管理机制。

ReplicaSet

ReplicaSet是下一代ReplicationController,两者的唯一区别是ReplicaSet支持新的基于集合的选择器,而ReplicationController仅支持基于相等选择器的需求。

Deployment

Deployment为Pod与ReplicaSet提供了声明式的定义,描述你想要的目标状态是什么,Deployment controller就会帮你将Pod与ReplicaSet的实际状态改变到你想要的目标状态。

Service

一个Service可以看做一组提供相同服务的Pod的对外访问接口。Kubernetes提供两种类型的Service:

  • NodePort: 集群外部可以通过Node IP与Node Port来访问具体某个Pod
  • ClusterIP:指通过集群的内部IP暴露服务,服务只能够在集群内部可以访问,这也是默认的 ServiceType

Label

Label就是一对key/value,可以附加到各种资源对象上,如Node、Pod、Service等,一个资源对象可以定义任意数量的Label。可以通过Label选择器来选择具备某个(些)Label的资源。

PV & PVC

PersistentVolume(PV) 为用户提供了一个存储抽象,由管理员设置,它是集群的一部分。就像节点是集群中的资源一样,PV也是集群中的资源。 PV是Volume之类的卷插件,但具有独立于Pod的生命周期。

PersistentVolumeClaim(PVC)是用户存储的请求。它与Pod相似。Pod消耗节点资源,PVC消耗PV资源。Pod可以请求特定级别的资源(CPU和内存)。PVC可以请求特定大小和访问模式的存储资源(例如,可以以读/写或只读模式挂载)。

Secret

Secret解决了密码、token、密钥等敏感数据的存储问题,Secret的三种类型:

  • Service Account :用来访问Kubernetes API,由Kubernetes自动创建,并且会自动挂载到Pod的/run/secrets/kubernetes.io/serviceaccount目录中
  • Opaque :Base64编码格式的Secret,用来存储密码、密钥等
  • kubernetes.io/dockerconfigjson :用来存储docker registry的认证信息

ConfigMap

ConfigMap用来保存key/value对的配置数据,这个数据可以在Pods里使用,或者被用来为像controller一样的系统组件存储配置数据。ConfigMap可以方便的处理不含敏感信息的字符串(敏感信息可使用Secret)。

Namespace

Namespace类似于Kubernetes中的虚拟集群,便于不同的分组在共享使用整个集群的资源的同时还能被分别管理。比如我们如果开发测试共用一个Kubernetes集群,则可以将开发环境的服务部署到dev的namespace,测试环境的部署到test的namespace。

Ingress

为集群服务提供外部访问,包括基于Nginx与Traefik两个版本,为服务提供域名绑定访问与路径路由功能。也可以基于Ingress实现服务的灰度发布。

总结

本文对Kubernetes中涉及的基本组件与概念进行了整理,对其基本构成有了一个大致的理解与印象。下一篇将从一个实践出发,实现一个基于Gitlab+Jenkins+K8s的CI/CD流程,以对涉及的各个组件进行深入了解与学习。


相关阅读:


作者:雨歌

欢迎关注作者微信公众号:半路雨歌,一起学习成长

Kubernetes笔记(二):了解k8s的基本组件与概念的更多相关文章

  1. Kubernetes实战(二):k8s v1.11.1 prometheus traefik组件安装及集群测试

    1.traefik traefik:HTTP层路由,官网:http://traefik.cn/,文档:https://docs.traefik.io/user-guide/kubernetes/ 功能 ...

  2. 【K8S学习笔记】初识K8S 及架构组件

    K8S是什么?发展历史 Kubernetes (简称 k8s)是 Google 在2014年开源的,对容器生命周期管理的开源平台,致力于对容器集群提供易于管理.高可用.弹性负载与故障转移的能力,提高服 ...

  3. 【opencv学习笔记二】opencv3.4.0组件结构说明

    在学习opencv使用之前我们先来看一下opencv有哪些组件结构.至于OpenCV组件结构的研究方法, 我们不妨管中窥豹,通过opencv安装路径下include目录里面头文件的分类存放,来一窥Op ...

  4. Kubernetes笔记(四):详解Namespace与资源限制ResourceQuota,LimitRange

    前面我们对K8s的基本组件与概念有了个大致的印象,并且基于K8s实现了一个初步的CI/CD流程,但对里面涉及的各个对象(如Namespace, Pod, Deployment, Service, In ...

  5. amazeui学习笔记二(进阶开发5)--Web 组件开发规范Rules

    amazeui学习笔记二(进阶开发5)--Web 组件开发规范Rules 一.总结 1.见名知意:见那些class名字知意,见函数名知意,见文件名知意 例如(HISTORY.md Web 组件更新历史 ...

  6. amazeui学习笔记二(进阶开发2)--Web组件简介Web Component

    amazeui学习笔记二(进阶开发2)--Web组件简介Web Component 一.总结 1.amaze ui:amaze ui是一个web 组件, 由模板(hbs).样式(LESS).交互(JS ...

  7. kubernetes实战(二十六):kubeadm 安装 高可用 k8s v1.16.x dashboard 2.x

    1.基本配置 基本配置.内核升级.基本服务安装参考https://www.cnblogs.com/dukuan/p/10278637.html,或者参考<再也不踩坑的Kubernetes实战指南 ...

  8. k8s架构与组件详解

    没有那么多花里胡哨,直接进行一个K8s架构与组件的学习. 一.K8s架构 k8s系统在设计是遵循c-s架构的,也就是我们图中apiserver与其余组件的交互.在生产中通常会有多个Master以实现K ...

  9. 《MFC游戏开发》笔记二 建立工程、调整窗口

    本系列文章由七十一雾央编写,转载请注明出处.  http://blog.csdn.net/u011371356/article/details/9300383 作者:七十一雾央 新浪微博:http:/ ...

随机推荐

  1. 刨根问底系列(1)——虚假唤醒(spurious wakeups)的原因以及在pthread_cond_wait、pthread_cond_singal中使用while的必要性

    刨根问底之虚假唤醒 1. 概要 将会以下方式展开介绍: 什么是虚假唤醒 什么原因会导致虚假唤醒(两种原因) 为什么系统内核不从根本上解决虚假唤醒这个"bug"(两个原因) 开发者如 ...

  2. L13过拟合欠拟合及其解决方案

    过拟合.欠拟合及其解决方案 过拟合.欠拟合的概念 权重衰减 丢弃法 模型选择.过拟合和欠拟合 训练误差和泛化误差 在解释上述现象之前,我们需要区分训练误差(training error)和泛化误差(g ...

  3. 如何将你的 Vue.js 项目部署在云开发静态托管之上

    云开发静态托管是云开发提供的静态网站托管的能力,静态资源(HTML.CSS.JavaScript.字体等)的分发由腾讯云对象存储 COS 和拥有多个边缘网点的腾讯云 CDN 提供支持. 在云开发静态托 ...

  4. 详解 final 和 static

    在我们上一篇博文中提到了 fianl 这个关键字,对于这个关键字,本人在初学时也耗费了极大地心血,甚至和师兄进行了激烈的讨论,并且,在我们讨论.尝试 以及 翻阅各种资料,最终得出了合适.易懂的解释. ...

  5. Java 虚拟机中的运行时数据区分析

    本文基于 JDK1.8 阐述分析 运行过程 我们都知道 Java 源文件通过编译器编译后,能产生相应的 .Class 文件,也就是字节码文件.而字节码文件通过 Java 虚拟机中的解释器,编译成特定机 ...

  6. JVM致命错误日志详解

    目录 文件描述 文件位置 文件头 错误信息记录 JVM运行信息 崩溃原因 错误信息 线程描述 线程信息 信号信息 计数器信息 机器指令 内存映射信息 线程堆栈 其他信息 进程描述 线程列表 虚拟机状态 ...

  7. DEDE Fatal error: Maximum execution time of 30 seconds exceeded 致命 错误: 最大的 执行 时间 为 30 秒

    刚安的DEDE    5.7 -SP1-GBK的  为何一登录后台点任何链接都显示超过30秒  后台假死 网上搜的方法一般都是更改执行时间上限,其目的是为了解决一些大的数据,真的需要30秒以上的执行时 ...

  8. 2019-2020-1 20199329《Linux内核原理与分析》第一周作业

    Linux学习随笔 Linux 是一个操作系统,我们的 Linux 主要是系统调用和内核那两层. UNIX前身是Multics,但 UNIX 的商业版本非常昂贵,于是Linus Torvalds(Li ...

  9. MySQL系列(一)

    一.简介 MySQL是最流行的开放源码SQL数据库管理系统,它是由MySQL AB公司开发.发布并支持的.有以下特点: MySQL是一种数据库管理系统. MySQL是一种关联数据库管理系统. MySQ ...

  10. Unity 游戏框架搭建 2019 (三十九、四十一) 第四章 简介&方法的结构重复问题&泛型:结构复用利器

    第四章 简介 方法的结构重复问题 我们在上一篇正式整理完毕,从这一篇开始,我们要再次进入学习收集示例阶段了. 那么我们学什么呢?当然是学习设计工具,也就是在上篇中提到的关键知识点.这些关键知识点,大部 ...