Kubernetes基础概念

Kubernetes是一款高级的集群管理系统,支持服务发现功能。k8s负责协调一组高度可用的计算机集群,将它们连在一起形成一个独立的工作单元。

K8S集群中有一个Master节点,负责协调集群中所有Worker节点的活动。

Master负责管理集群,如:调度应用程序、维护应用程序状态、扩展应用程序和推出新的更新。

Node可以是一个VM或一台物理计算机,做为集群中的工作计算机。每个node都有一个kubelet,kubelet是一个代理,负责与k8s master通信并管理当前node。每个node都配有操作容器的工具。

一个生产环境的k8s集群,至少应该有三个node。运行在k8s集群上的应用程序,需符合容器化应用程序的标准。

在Kubernetes上部署应用程序时,需通知master启动应用程序容器,master会调度集群中各个node上容器。所有node通过Kubernetes API与master通信。这些API通过master暴露出来,用户可以使用这些API与集群交互。

Minikube

Minikube是一个轻量级Kubernetes实现,可用于开发环境,它会本地创建一个VM,并部署一个简单的集群,这个集群仅有一个node。

Minikube适用于Linux、macOS、Windows系统。Minikube命令行界面为使用集群提供了基本的引导操作。

Kubernetes Deployments

Kubernetes集群启用后,就可以在其上部署容器化应用程序。创建一个Kubernetes部署配置是第一步,以告诉k8s如何创建和更新应用程序实例。一旦创建了部署,master就会将应用程序实例提交到集群的单个node上。

一旦创建了应用程序实例,Kubernetes部署控制器就会持续监视这些实例。如果承载实例的node宕机或被删除,部署控制器就会使用集群中另一个node上的实例替换该实例。k8s以此来处理机器故障。

Kubectl

Kubectl是Kubernetes命令行接口,可用于创建和管理部署。Kubectl使用Kubernetes API与集群交互。创建部署时,需要指定应用程序的容器镜像和要运行的副本数。也可稍后通过更新部署来修改。

Kubernetes Pods

Pod是一个抽象,代表一组应用程序容器(如Docker),及这些容器的共享资源:

共享存储,如:Volumes。

网络,如:群集IP地址。

容器运行时信息,如:容器镜像版本或使用的端口。

Pod是一个“逻辑主机”。同一个“主机”上的应用程序容器,可以相同也可以不同(相同即:同一个源代码或同一种功能),但这些容器是相对紧耦合的(业务或逻辑上具有相关性),如:一个是关于用户的后台应用,一个是关于用户的前端应用。

Pod中的容器共享同一个IP地址和端口空间,始终位于同一位置并一同调度,相同的node共享同一个上下文。

Pod是k8s平台上的原子单元。在Kubernetes上创建部署时,部署会创建带有容器的Pod(而不是直接创建容器)。每个Pod都与调度它的node绑定。如果node发生故障,则从群集可用的node上调度相同的Pod。

Nodes

Node代表k8s中的工作计算机,可以是虚拟机或物理计算机,具体取决于集群。每个node由master管理。

Node可以有多个pod,pod总是在node上运行,master会自行处理群集中跨node的pods。Master自动调度会考虑node的可用资源。

Services and Labels

Services

Service用来暴露应用程序,k8s的pods不是永久的,每个pod都有生命周期。当一个worker node死亡时,node上运行的pod也会丢失。然后,ReplicaSet会创建新pod,将群集恢复到所需的状态,让应用程序保持运行。

如:一个后端应用有三个副本,前端不关心后端有多少个副本,甚至不关心后端的副本是否被重新创建,k8s中每个pod都有一个唯一的ip,即使同一个node上的两个pod,ip地址也是不一样。这就需要k8s能够自动协调pod之间的变更,保证应用运行。

Service是一个抽象,它定义了一组逻辑pod和一个访问pod的策略。service将流量路由到一组pods上。相关“Pods”间的发现和路由工作由Services处理。service允许从属Pod间的松耦合。

Service所针对的pod集合通常由LabelSelector决定。尽管每个Pod都有唯一的IP地址,这些IP不会暴露在集群之外。

Service通过对外暴露服务,让应用程序接收到流量,暴露服务的类型有多种,通过ServiceSpec指定:

ClusterIP (default) - 在集群内部IP上公开服务。此类型使服务只能从集群中访问。

NodePort - NAT模式暴露集群中node上的服务。

LoadBalancer - 在当前cloud中创建一个外部负载匀衡(如果支持),为服务分配一个固定的外部IP。

ExternalName - 根据约定的命名规范创建一条CNAME记录。此类型需v1.7或更高版本的kube-dns。

与k8s其他对象一样,使用YAML (首选)或JSON 定义Service。

注:CNAME记录名称命名规范由externalName指定。详情查看Using Source IP

Labels

Services使用labels和selectors匹配一组Pods,这是一个分组原语,允许对Kubernetes中的对象进行逻辑操作。Labels是附加在对象上的键/值对,有多种用途:

1.指定用于开发,测试和生产的对象

2.嵌入版本标签

3.使用标签对对象进行分类

Labels可以在创建时或以后附加到对象,可随时修改。

Kubernetes思想

不可变基础架构

Immutable infrastructure

这个思想所表达的意思是,如果需要更改某些内容,不要直接在服务器上进行修改,而是从基础映像上重新构建一个新服务器。

容器

Containers

一种打包一系列与服务相关资源的方法(如:代码、运行环境、系统工具,系统库和配置)。

Kubernetes特性

水平扩展

自动发布和回滚 

服务发现和负载均衡

存储编排

配置管理

自我修复

批量执行

自动binpacking

Kubernetes术语和定义

k8s定义了几个基础对象和一些高级抽象,统称Controllers。

Basic Objects

Pod – 由一个或多个容器构成的分组

Service – 是对一组Pod的逻辑抽象,并加入了访问策略。

Volume – 卷是一个抽象概念,容器是临时的,在删除容器时会删除数据,卷可以持久化数据。

Namespace – 可用于分离集群段,如某个项目或开发团队。

更高级别的抽象

ReplicaSet – 确保pod的数量。

Deployment – 为pods和replicaset提供声明性更新。

StatefulSet – 工作负载API对象,用于管理数据库等有状态应用程序。

DaemonSet – 确保所有或某些工作节点运行一个pod的副本。

Job – 为任务创建一个或多个pods,执行完成删除pod。

Kubernetes架构和组件

Master Components:

Kube-apiserver – 暴露API.

Etcd – 以key-value的形式存储集群数据,具有服务发现功能。

Kube-scheduler – 在工作节点上调度新的pod

Kube-controller-manager – 运行控制器。

Cloud-controller-manager – 与云提供商对话。

以上这些组件就构成了一个master节点,etcd可运行在master所在的服务器上,也可单独一个集群。

Node Components

Kubelet – 一个代理,可确保pod上的容器是运行着的。

Kube-proxy – 根据网络规则进行转发,kube-proxy等同于网关。

Container Runtime – 负责容器运行。

如何安装Kubernetes

Minikube

本地安装k8s比较简单。

Minikube - 一个二进制文件,可在本地部署一个k8s集群。

Kubectl - 用于与群集交互的命令行工具。

Kops

kops是一个生产级Kubernetes集群部署工具,能在 AWS、GCE、VMWare vSphere平台上自动部署高可用的Kubernetes集群。

Kubernetes不能做什么

不限制部署的应用类型,可使用任何语言编写应用。

不能取代像Jenkins这类构建工具,不能构建应用程序。

不是中间件,不会做中间件所做的事情,如:消息总线或缓存等。

不关心日志方案,应用程序将log输出给stdout。日志收集方案需自定。

不关心使用的配置语言(如:json)。

K8s之所以这样,是为了让运行其上的应用具有更高的自由度。