在2017年Kubernetes战胜了两个强大的竞争对手Swarm和Mesos,成为容器管理与调度编排领域的首选平台和事实标准。

一、Kubernetes,面向云原生应用的新“云平台

Kubernetes也叫做k8s。它是一个开源系统,主要用于自动部署、扩容缩容和管理容器化应用。它将诸多应用的容器分为若干个逻辑单元以便于管理和发现。kubernetes拥有着Google高负载生产环境的15年经验,并结合了社区的优秀思想和实践。

Kubernetes官网:Kubernetes

  • 在Kubernetes中,service是核心,我们并不需要太多关心kubernetes里面是怎么工作的,我们只需要关心它给我们提供什么service。就像docker容器可以提供一个mysqld的服务、web服务等。
  • 它需要拥有一个唯一的名字、以及ip:port来对外提供服务。提供service的是容器,为了保证service的高可用,提供service的容器不能只有一个,需要一组,这一组容器我们把它叫做pod。pod是kubernetes最基本的操作单元
  • 为了实现service和pod之间的管理,又有了标签(label)的概念,我们把功能相同的pod设定为同一个标签。比如,可以把所有提供mysql服务的pod打上标签name=mysql,这样mysql service要作用于所有包含name=mysql标签的pod上。
  • pod运行在Node上,Node可以是一台物理机,也可以是虚拟机。通常一个Node上会运行几百个pod,每个pod里运行着一个特殊的容器,叫做Pause,其它容器叫做业务容器,业务容器共享Pause容器的网络栈和Volume挂载卷,因此同一个pod内的业务容器之间的通信和数据交换更为高效。

二、Kubernetes集群初体验

  • service部署

  • deployment部署

  • 请求的自动负载均衡

  • 服务伸缩

  •  服务版本升级和回退

三、Kubernetes架构与组件

在集群管理方面,kubernetes将集群中的机器划分为一个Master节点和一群工作节点Node,其中Master上运行着kube-apiserver、kube-controller-manager、kube-scheduler,他们实现了资源管理、pod调度、弹性伸缩、安全控制、系统监控、纠错等功能。Node是工作节点,运行应用程序,提供服务。Node上的最小单元是pod,Node上运行着kubernetesd的kubelet、kube-proxy服务进程,它们负责pod的创建、启动、监控、重启、销毁,已经实现负载均衡

扩容和升级需要一个关键的东西,Replication controller(RC),RC需要包含3个关键信息:

  •      1)目标pod的定义
  •       2)目标pod需要运行的副本数量(replicas)
  •       3)要监控的目标pod标签(Label)

​​​​​​​Master组件

   

    

     

Node组件 

  

  

.  

四、Kubernetes基础概念

Kubernetes对象:是一种持久化的,用于表示集群状态的实体。

  • 一种申明式的意图的记录,一般使用yaml文件描述对象。
  • Kubernetes集群使用Kubernetes对象表示集群对象。
  • 通过API/Kubectl管理Kubernetes对象

Kubernetes对象模型

1、静态属性 object.yaml

  • Kind: Pod/Service/Deployment/StatefulSet/DaemonSet...
  • Metadata:Name/Namespace/Labels/Annotations...
  • Spec:Replicas/Selector/Template/Containers...

2、​​​​​​​操作方法 api(kubectl):Operation:Create/Get/Update/Delete

3、动态信息 etcd:Status:Conditions

详解Metadata:

Name/UID

  • 集群中所有对象都通过name和UID明确标识
  • API对象访问路径: /api/{version}/namespaces/{namespace}/{object-kind}/name
  • 集群的整个生命周期内创建的每个对象实例都具有不同的UID

Namespace:不仅仅是一个属性,本身也是一个object

  • 用于将物理集群划分为多个虚拟集群
  • Namespace间完全隔离,因此也常被用来隔离不同的用户(及权限)
  • 内置三个Namespaces:default、kube-system、kube-public, 但Node和PersistentVolume不属于任何namespace

Label标签:用于建立集群对象之间的灵活的,松耦合的多维关联关系

  • 一个label是一个键值对,其中key,value均由用户自己定义
  • label可以附着在任何对象上,每个对象也可以有任意个标签。标签可以在对象定义时附加上,也可以通过命令动态管理标签
  • label可以将有组织目的的结构映射到集群对象上,从而形成一个与现实世界管理结构同步对应松耦合的、多维的对象管理结构

Annotations (注解)

  • 以键值对的形式呈现
  • 工具和库可以检索到并使用这些Annotations元数据
  • 将数据作为Annotation附着在对象上,有利于创建一些用于部署、管理和做内部检查的共享工具或客户端

Kubernetes对象分类

  • workload(工作负载类): Pod,Controller(Deployment/StatefulSet/DaemonSet/Job
  • discovery&load balance(服务相关类): Service/Endpoint/Ingress
  • config&storage(配置存储类): Configmap/Secret/Volume/PersistentVolumeClaim
  • cluster(集群类): Node/Namespace/PersistentVolume/ClusterRole/ClusterRoleBinding/ResourceQuota

​​​​​​​

POD:集群调度基本单元,一个有特定关系的容器集合

  • POD是集群中可以创建和部署的最小且最简的Kubernetes对象单元
  • POD也是一种封装。它封装了应用容器,存储资源,独立的网络IP,以及决定容器如何运行的策略选项
  • 每个POD预置一个PAUSE容器,其名字空间、IPC资源、网络和存储资源被POD内其他容器共享。POD中的所有容器紧密协作,并且作为一个整体被管理、调度和运行。

Service:与云原生应用中的“微服务”概念一一对应

  • Kubernetes集群为每一个service分配一个集群唯一的IP地址,在Service的生命周期内,该IP地址不变;在内部DNS的支持下,轻松实现服务发现机制
  • Service通过Label Selector关联到实际支撑业务运行的POD上,并通过集群内置的服务负载均衡将服务请求分发到后端POD
  • 通过nodeport或设置loadbalance机制实现集群外部对service的访问

Controllers:Kubernetes核心对象之一

  • 用于保证集群内一组pod能始终按照某种期望的状态正常运行
  • 状态包括:POD副本数量、节点选择、资源约束、持久化数据维持等
  • 支持多种controllers,常用的deployment,replicaset, statefulset, daemonset

ReplicaSet:确保健康的副本数始终满足用户定义的数量。前身是ReplicationController(rc),相比rc,增加集合式label selector的支持。支持单独使用,但更多隐藏在Deployment控制器后面,由Deployment自动管理。

Deployment:为Pod和ReplicaSet提供了申明式的定义(delarative)。用户在deployment文件中描述期望状态,自动将pod和replicaset的实际状态改变到期望状态。支持POD的RollingUpdate,并自动管理背后的ReplicaSet。支持将pod rollback到之前的任意revision(仅限于pod-template模板改动)

StatefulSet:提供对有状态的应用的部署和控制的支持,1.9版本GA。使用场景:稳定的持久化存储,稳定的网络标志,有序部署有序扩展,有序收缩有序删除,有序自动滚动升级等。POD存储必须由PersistVolume Provisioner根据请求的Storage Class进行配置,或由管理员预先配置好。考虑数据安全性,伸缩或删除StatefulSet不会删除关联的存储。另外,StatefulSet目前要求Headless Service负责pod的网络身份,用户有责任创建此服务。

DaemonSet:保证每个Node上都运行一个Pod副本。适用场景:系统Daemon程序,监控跟踪,日志收集等。1.6版本之后,可设置更新策略,支持滚动更新。可指定node:nodeSelector,nodeAffinity,podAffinity。

ConfigMap:常用来向POD提供非敏感的配置信息。用于保存数据的键值对,可以用来保存单个属性,也可以用来保存配置文件。可以使用命令行基于字面值、文件或目录来创建或通过configMap对象定义文件创建。可通过三种方式在POD中使用:环境变量、容器命令行参数或以文件形式通过数据卷插件挂载到POD中。

Secret:解决的是集群内密码,token,密钥等敏感数据的配置问题。常用于与ServiceAccount关联,存储在tmpfs文件系统中,Pod删除后Secret文件也有对应的删除。支持Opaque,Service Account,dockerconfigjson三种类型。可以以Volume或者环境变量的方式使用。

特别感谢全栈工程师tonybai讲解:Kubernetes基础:开启云原生之门

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐