Kubernetes系列——什么是K8S?

简介

Kubernetes是什么? 首先Kubernetes是一个全新的基于容器技术的分布式架构领先方案,是容器去的优秀平台选型方案,已成为新一代的基于容器技术的PaaS平台的重要底层框架,也是云原生技术生态圈的核心,服务网格(Service Mesh),无服务器架构(Serverless)等新一代分布式架构框架及技术纷纷基于Kubernetes实现。

其次,k8s替我们处理了负载均衡器的选型和部署实施等问题,也不必再考虑引入或者自己开发一个复杂的服务治理框架,不必再头疼于服务监控和故障处理模块的开发。因为K8s这些强大的自动化机制,所以系统后期的运维难度和运维成本大幅度降低。

然后,k8s是一个开放的开发平台。与J2EE不同,它不局限于任何一种语言,没有限定任何编程接口,所以不论是用JavaGoC++还是Python编写的服务,都可以被映射为KubernetesService(服务),并通过标准的TCP通信协议进行交互。此外,Kubernetes平台对现有的编程语言、编程框架、中间件没有任何侵入性,因此现有的系统也很容易改造升级并迁移到k8s平台上。

最后,k8s是一个完备的分页式系统支撑平台。它具有完备的集群管理能力,包括多层次的安全防护和准入机制、多租户应用支撑能力、透明的服务注册和服务发现机制、内建的智能负载均衡器、强大的故障发现和自我修复能力、服务滚动升级和在线扩容能力、可扩展的资源自动调度机制,以及多粒度的资源配额管理能力。

基本知识

Service

k8s中,Service是分布式集群架构的核心。一个Service对象拥有如下关键特征。

  • 拥有唯一指定的名称(比如mysql-server

  • 拥有一个虚拟IP地址(ClusterIP地址)和端口号

  • 能够提供某种远程服务能力

  • 能够将客户端对服务的访问请求转发到一组容器应用上

    Service的服务进程通常基于Socket通信方式对外提供服务,比如Redis、Memcached、MySQL、WebServer或者是实现了某个具体业务的特定TCP Server进程。虽然一个Service通常由多个相关的服务进程提供服务,每个服务进程都有一个独立的Endpoint(IP+Port)访问点,但Kubernetes能够让我们通过Service(ClusterIP+Service Port)连接指定的服务。有了Kubernetes内建的透明负载futq和故障恢复机制,不管后端有多少个具体的服务进程,也不管某个服务进程是否由于发生故障而被重新部署到其他机器,都不会影响对服务的正常调用。

容器

容器提供了强大的隔离功能,所以我们有必要把为Service提供服务的这组进程放入容器中进行隔离,为此,Kubernetes设计了Pod对象,将每个服务进程都包装到相应的Pod中,使其成为在Pod中运行的一个容器(Container)。为了建立ServicePod间的关联关系,Kubernetes首先给每个Pod都贴上一个标签(Label),比如给运行MysqlPod贴上name=mysql标签,给运行PHPPod贴上name=php标签,然后给相应的Service定义标签选择器(Label Selector),例如,MySQL Service的标签选择器的选择条件为name=mysql ,意为该Service要作用于所有包含name=mysql标签的Pod

Pod

Pod运行在一个被称为节点(Node)的环境中,这个节点既可以是物理机,也可以是私有云或者公有云中的一个虚拟机,在一个节点上能够运行多个Pod;其次,在每个Pod中都运行着一个特殊的被称为Pause的容器,其他容器则为业务容器,这些业务容器共享Pause容器的网络栈和Volume挂载卷。并不是每个Pod和它里面运行的容器都能被映射到一个Service上,只有提供服务(无论是对内还是对外)的那组Pod才会被映射为一个服务。

集群管理

在集群管理方面,Kubernetes将集群中的机器划分为一个Master和一些Node。在Master上运行着集群管理相关的一些进程:kube-apiserver、kube-controller-managerkube-scheduler,这些进程实现整个集群的资源管理、Pod调度、弹性伸缩、安全控制、系统监控和纠错等管理功能,并且都是自动完成的。Node作为集群中的工作节点,其上运行着真正的应用程序。在Node上,Kubernetes管理的最小运行单元是Pod。在Node上运行着Kuberneteskubeletkube-proxy服务进程,这些服务进程负责Pod的创建、启动、监控、重启、销毁,以及实现软件模式的负载均衡器。