Kubernetes# 基础概念篇

最近公司在开发云原生相关的产品,项目里面对kubernetes使用甚多,从集群部署到基于API的自主开发,也算是重新把kubernetest撸了一遍,所以想着接着这个机会写一写k8s的专栏,希望和同行们互相交流,话不多少,直接上货。本篇作为Kubernetes专栏的开篇同时也是基础概念篇,主要是针对k8s的一些基本知识,对于一些刚接入k8s的同学可以了解一下。

Kubernetes是什么

Kubernetes是谷歌十几年来大规模容器技术应用的重要成果,是谷歌严格保密十几年的秘密武器——Borg的一个开源版本。它是一个全新的基于容器技术的分布式架构领先方案,是容器云的优秀平台选型方案,已成为新一代的基于容器技术的PaaS平台的重要底层框架,也是云原生技术生态圈的核心,它的功能可以从三个方面来概述

  • 基于容器技术实现的自动化平台
    所有的应用APP在kubernetes集群里都以容器的形式存在,整个集群就像一个大总管,管理着所有的容器应用。kubernetes实现了一个容器编排引擎,提供了应用部署、规划、更新和维护的一套机制,实现了应用部署和运维的全自动化

  • 一个开放的开发平台
    与J2EE不同,它不局限于任何一种语言,没有限定任何编程接口,所以不论是用Java、Go、C++还是用Python编写的服务,都可以被映射为Kubernetes的Service(服务),并通过标准的TCP通信协议进行交互。同时kubernetes对我们现有的系统和框架没有任何的侵入性,所以系统可以很好的移植到kubernetes上

  • 一个完备的分布式系统支撑平台

    Kubernetes具有完备的集群管理能力,包括多层次的安全防护和准入机制、多租户应用支撑能力、透明的服务注册和服务发现机制、内建的智能负载均衡器、强大的故障发现和自我修复能力、服务滚动升级和在线扩容能力、可扩展的资源自动调度机制,以及多粒度的资源配额管理能力,是一个全新的基于容器技术的分布式架构解决方案
     

Kubernetes系统架构


为什么要使用Kubernetes

IT行业从来都是由新技术来驱动的,新的技术带来了新的解决方案,解决了研发过程中的一些技术、流程等痛点问题,Kubernetes也不例外,那现在就看看我们使用kubernetes可以得到什么

  • 减少开发和发布时间
    Kubernetes极大地简化了开发、发布和部署过程。例如,它支持容器集成,或者简化了对来自不同提供者的存储资源访问的管理

  • 软件的可伸缩性和可用性

    Kubernetes能够根据组织的突发需求,向上或向下扩展应用程序和底层基础设施资源,促进峰值的动态管理

  • 微服务架构实践
    Kubernetes本身就实现了一套微服务的架构体系,包括服务注册发现、服务负载均衡等,研发人员再也不用为选什么服务治理框架而头疼,Kubernetes已经给我们提供了基于service之间的相互调用机制

  • 多云环境中的灵活性
    使实现新的混合和多云环境的承诺成为可能,保证在任何公共和私有环境中运行应用程序,而不会造成功能或性能损失

  • 云的可移植性

    Kubernetes可以简化和加速应用程序从本地环境迁移到公共或私有云(由任何提供商提供)的过程

Kubernetes资源对象

Kubernetes定义了很多资源对象,比如Node、Service以及Pod等,资源对象和自身实现的一些核心组件完成整个集群的使命,而kubernetes对资源的管理就是对这些资源对象的具体的操作,所以了解资源对象是学习kubernetes的基础,按照用途大致可以将资源分为以下几类:

  • 集群类
    Master

    集群的控制节点,在每个k8s集群中都需要有至少一个或者一组Master节点,负责整个集群的管理和控制,Master节点上运行着一些关键进程,
    Kubernetes API Server(kube-apiserver):提供HTTP RESTfulAPI接口的主要服务,是Kubernetes里对所有资源进行增、删、改、查等操作的唯一入口,也是集群控制的入口进程
    Kubernetes Controller Manager(kube-controller-manager):Kubernetes里所有资源对象的自动化控制中心
    Kubernetes Scheduler(kube-scheduler):负责资源调度(Pod调度)的进程,相当于公交公司的调度室

    Node

    Node作为真正应用工作的地方,可以是一台物理机或者虚拟机,每个Node都会被Master分配一些工作负载(Docker容器),Node宕机后其上面的工作负载会被转移到其他的Node节点,Node上运行的进程包括:
    kubelet:负责Pod对应容器的创建、启停等任务,同时与Master密切协作,实现集群管理的基本功能。
    kube-proxy:实现Kubernetes Service的通信与负载均衡机制的服务应用类
    容器运行时(如Docker):负责本机的容器创建和管理
     

  • 应用类

    Pod
    k8s的最小部署单元,不是一个程序/进程,而是一个环境(包括容器、存储、网络ip:port、容器配置)。其中可以运行1个或多个container(docker或其他容器),在一个pod内部的container共享所有资源,包括共享pod的ip:port和磁盘

    Service
    Service位于Pod上一个层面,由于pod的创建是临时的,比如重启或者新创建的都会分配新的podIp,这样外面程序的访问就会出现问题,所以k8s抽象出service的概念,由service来提供服务访问功能,同时每一个service都会对应一组pod(根据Label select来确定)

    Container
    容器就是我们具体的业务服务运行的地方了,在k8s环境里,称为容器运行时,其部署在pod里面,每一个pod里可以有多个容器。这里特别说明一下Pause容器,在每个Pod中都运行着一个特殊的被称为Pause的容器,所有的业务容器都共享Pause容器的网络栈和Volume挂载卷

    Endpoint
    Endpoint具体来说并不能算是一个资源对象,而是一种访问节点,外部需要访问我们的业务程序,最终对应的就是endpoint,具体到一个pod下的某一个container,即podIp+containerPort组成了一个Endpoint

    Namespace
    命名空间可以理解为一个集群里面的另外一个虚拟化集群,每个命名空间之间可以做到资源隔离,每个空间里有Node、service、pod等这些对象,都是独立的,大多数k8s集群都会有以下几个nacespace:
    1、default:service和app默认被创建于此
    2、kube-system:kubernetes系统组件使用
    3、kube-public:公共资源使用。但实际上现在并不常用

    Label
    资源标签,k8s系统里抽象出用来标识资源的一种对象,每个对象都可以贴上资源标签,格式是key:value

    Label Select
    标签选择器,有了标签的设计,资源之间的对应关系就可以通过标签选择器来定义,比如service对应的是哪组pod,通过在service的Label select中定义pod的Label值,就可以将service和pod关联起来

    Deployment
    同其中文含义一样:部署,这里可以理解为对集群部署的一种支持,比如定义好Pod的模板,总不能手动一个个去创建,这个时候可以定义Deployment对象,在里面可以定义我们需要创建的资源类型以及资源数量

  • 存储类

    存储类的资源对象主要包括Volume、Persistent Volume、PVC和StorageClass,这里看下基础的存储类资源对象-Volume(存储卷)
    Volume
    Volume是Pod中能够被多个容器访问的共享目录,被一个Pod里的多个容器挂在到具体的问题目录下。容器中的磁盘文件都是短暂的,当容器崩溃时,kubelet会重新启动容器,但最初的文件将会丢失,容器会以最干净的状态启动。另外,当一个pod运行多个容器时,各个容器可能需要共享一些文件,kubernetes volume可以解决这两个问题

    基于Pause容器的挂载

    集群中的每一个Pod里都会有一个Pause容器,这个容器是系统默认创建的,同一个pod中的容器都共享pause容器的网络名称空间以及IPC和UTS,这样一来我们要想给pod里的容器提供存储卷,首先要把存储卷关联到pause容器,然后在容器里挂载pause里的存储卷即可;如下图所示:

  • 安全类
    我们知道Kubernetes集群中所有对资源对象的操作都是基于API-SERVER,为了确保集群的安全,API-SERVER都会对客户端进行完全认证,这个认证的基础依赖于ServiceAccount这个资源对象。
    Service Account:ServiceAccount是一种账号,给运行在Pod里面的进程提供必要的身份证明。该账号是基于Namespace维度的,每创建一个Namespace,系统就会默认创建创建一个ServiceAccount,同时系统会为这个ServiceAccount生成一个Token,作为该Namespace下的Pod访问API-SERVER的身份标识

 

作为kubernetes的初学者,最重要的是要了解各种资源对象,在后续文章中作者会剖析各种资源对象在Kubernetes内部是如何工作的,想学习跟多kubernetes相关知识请关注作者个人技术公众号,不定时更新技术干货!

相关推荐

  1. SRE-Redis基本概念

    2023-12-09 15:02:03       53 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-09 15:02:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-09 15:02:03       101 阅读
  3. 在Django里面运行非项目文件

    2023-12-09 15:02:03       82 阅读
  4. Python语言-面向对象

    2023-12-09 15:02:03       91 阅读

热门阅读

  1. [力扣100] 10.滑动窗口的最大值

    2023-12-09 15:02:03       48 阅读
  2. sqlite事务 及 PRAGMA synchronous = OFF;

    2023-12-09 15:02:03       45 阅读
  3. 从零开始搭建链上dex自动化价差套利程序(12)

    2023-12-09 15:02:03       44 阅读
  4. 使用Ansible Expect模块实现自动化交互式任务

    2023-12-09 15:02:03       47 阅读
  5. 第55天:django学习(四)

    2023-12-09 15:02:03       61 阅读
  6. 12.8每日一题(备战蓝桥杯分支练习)

    2023-12-09 15:02:03       46 阅读
  7. python监听文件是否发生变化

    2023-12-09 15:02:03       56 阅读
  8. C# 实现托拉拽获取数据

    2023-12-09 15:02:03       61 阅读
  9. selenium原理

    2023-12-09 15:02:03       57 阅读