什么是Kubernetes?
K8s是一个基于容器技术的分布式架构领先方案。
K8s中Service是分布式集群架构的核心,一个Service对象拥有如下关键特征。
- 拥有唯一指定的名称(比如mysql-server)
- 拥有一个虚拟IP(Cluster IP 、Service IP或VIP)
- 能够提供某种远程服务的能力
- 被映射到提供这种服务能力的一组容器应用上
K8s设计Pod对象实现隔离,将每个服务进程都包装到相应的Pod中使其成为在Pod中运行的一个容器(Container)。为了建立Service和Pod间的关联关系,k8s给每个Pod贴上一个标签(Label),给运行的MYSQL的Pod铁和三个name=mysql标签,PHP贴上name=php。给相应的Service 定义标签选择器(Label Selector),比如MySQL Service的标签选择器的选择条件为name=mysql,意为该service要作用于包含name=musql Label的Pod。
Pod运行在一个被称为节点的(Node)的环境中,节点可以是物理机、私有云或公有云中的一个虚拟机,通常一个节点上运行几百个Pod;其次,每个Pod中有一个特殊的Pause容器,其他都是业务容器。业务容器共享Pause容器的网络栈和Volume挂在卷,因此他们直接的通信和数据交换更为高效。
集群管理方面,K8s将集群中的机器分为一个master和一些node。Master上运行着集群管理相关的一组进程kube-apiserver、kube-controller-manager和kube-scheduler,这些实现了整个集群的资源管理、Pod调度、弹性伸缩、安全控制、系统监控和纠错等管理功能,且都是自动完成的。
Node作为集群中的工作节点,运行着K8sd的kubelet、pkube-proxy服务进程,负责Pod的创建、启动、销毁、监控、重启,以及实现软件模式的负载均衡。
K8s的扩容和服务升级通过RC(Replication Controller)来解决。一个RC定义文件中包括以下三个关键信息:
- 目标Pod的定义
- 目标Pod需要运行的副本数量(Replicas)、
- 要监控的目标Podde 标签。
Kubernetes建立了一套健壮的集群自恢复机制,包括容器的自动重启、自动重调度以及自动备份等。
一、k8s概述和特性:
1.优势:
- 可“轻装上阵”开发复杂系统
- 可全面拥抱微服务架构
- 可随时随地将系统整体搬迁到公有云上。
- K8s的服务弹性扩容机制可轻松应对突发流量
- K8s超强的横向扩容能力
2、k8s功能:
自动装箱:
自我修复:容器失败时,会自动重启
水平扩展:通过简单的命令。用户UI界面或基于CPU等资源使用情况,对应用容器进行规模扩大或规模剪裁。
服务发现:用户不需要使用额外的服务发现机制,能够基于k8s自身能力实现服务发现和负载均衡。
滚动更新:可以根据应用的变化,对应用容器运行的应用,进行一次性或者批量式更新。
版本回退:可以根据应用部署情况,对应用容器运行的应用,进行历史版本即时回退。
密钥和配置管理(热部署):在不需要重新构建镜像的情况下,可以部署和更新密钥和应用配置,类似热部署。
存储编排、批处理
Kubernetes的设计哲学之一:维护应用容器集群一直处于用户所期望的状态。
二、k8s架构组件:
master(主控节点)和node(工作节点) master主管调度管理;node执行具体的工作。
master (主控节点) 包含三个组件:APIServer、controller-manager、scheduler。
APIServer:集群统一入口,以restful方式,交给etcd存储
scheduler:节点调度,选择node节点应用部署
controller-manager:处理集群中后台任务,一个资源对应一个控制器。
etcd :存储系统,保存集群相关的数据。
node(工作节点)包含两个组件:kubelet、kubelet-proxy。
kubelet: master派到node节点代表,管理本机容器
kubelet-proxy:提供网络代理,实现负载均衡等操作。
三、k8s三个核心概念:Pod、Controller、Service
Kubernetes主要服务对象是由多个容器组合而成的复杂应用,如弹性、分布式的架构。为此,Kubernetes引入了专门对容器进行分组管理的pod,从而建立了一套将非容器化应用平滑地迁入到容器云上的机制。
Kubernetes不仅提供了APIServer、scheduler、kubelet等底层核心组件。从而使得用户能够放心管理成千上万个容器实例,更提供了pod、service、replication controller等设计理念和服务。
在Kubernetes中,pod、service、replication controller统称为“对象”或者“资源”,并通过APIServer组件提供了一套对它们按照RESRTful格式的增、删、改、查和监听接口。
1、pod
最小部署单元、一组容器的集合、共享网络、生命周期短暂。
Kubernetes中,能够被创建、调度和管理的最小单元是pod,而非单个容器。一个pod是由若干个Docker容器构成的容器组。(pod意为豆荚,里面容纳了多个豆子,很形象)
pod 可以想象成一个篮子,而容器就是篮子里的鸡蛋,当Kubernetes需要调度容器时,它直接把一个篮子(连同里面的鸡蛋)从一个宿主机调度到另一个宿主机,而不是一个一个地搬运里面的鸡蛋。
篮子和鸡蛋的关系主要表现为以下几点:
一个pod里的容器能有多少资源取决于这个篮子的大小。
label也是贴在篮子上的。
IP分配给篮子而不是容器,篮子里面的所有容器共享这个IP。
哪怕只有一个鸡蛋(容器),Kubernetes仍然会给它分配一个篮子。
pod里面的容器共享network namespace ,并通过volume机制共享一部分存储。
同属一个pod的容器还共享IPC namespace(同一个pod内的应用容器能够使用System V IPC或POSIX消息队列进行通信)、UTC namespace(同一个pod内的应用容器共享机主名)
同一个pod里面的容器有如下两个特性:
1、通过Kubernetes volume 机制,在容器之间共享内存
2、可以通过localhost直接访问另一个容器。
2、controller
* 确保预期的pod副本数量、有状态应用部署、无状态应用部署。
* 确保所有的node运行同一个pod
* 一次性任务和定时任务
3、service
*定义一组pod的访问规则
label:
当系统运行着数量庞大的pod时,用户或者系统管理员如何有效地定位与组织这些pod就成为了一个重要问题。Kubernetes的解决方案是label。每个pod都有一个“labels”--一组键/值对。
通过label,可以在Kubernetes的集群管理工具中方便地实现pod等资源对象的定位和组织。只要传入-l key=value参数即可,例如列举所以匹配标签{"name":"ngnix"}的pod可以这么操作:
$ kubectl get pods -l name=nginx
在Kubernetes中,label是一种重要的且被广泛应用的组织分类和选择Kubernetes对象的机制。
labels属性是一组绑定到Kubernetes对象(如pod)上的键值对,同一对象labels属性的key必须独一无二。label的数据结构非常简单,就是一个key和value均为string的map结构。
网络原理
K8s里,IP以Pod为单位进行分配。一个Pod内部所有容器共享一个网络堆栈(相当于一个网络命名空间,他们的IP地址、网络设备、配置都是共享的)。
一个Pod内部的应用程序看到的自己的IP地址和端口与集群内其他Pod看到的一致。
K8s对集群网络的要求:
- 所有容器都可以在不用NAT的方式下同别的容器通信
- 所有节点都可以在不用NAT的方式下同所有容器通信,反之亦然
- 容器的地址和别人看到的地址是同一个地址
Docker网络基础:
网络命名空间(Network Namespace):
linux在网络栈中引入了网络命名空间,这些独立的协议栈被隔离到不同的命名空间中。处于不同命名空间中的网络栈是完全隔离的,彼此之间无法通信。通过对网络资源的隔离,就能在一个宿主机上虚拟多个不同的网络环境。Docker正是利用网络的命名空间特性,实现了不同容器之间的网络隔离。
在Linux的网络命名空间中可以有自己独立的路由表及独立的iptables设置来提供包转发、NAT及IP包过滤等功能。为了隔离出独立的协议栈,需要纳入命名空间的元素有进程、套接字、网络设备等。
不同命名空间的网络通信,甚至和外部的的网络通信可通过Veth设备对实现。Veth设备对的重要作业就是打通看不到的协议栈之间的壁垒,连接两个不同的命名空间。两个命名空间之间通,就必须有一个Veth设备对。我们将其中一端称为另一端的peer。
网桥是一个二层的虚拟网络设备,把若干个网络接口“连接”起来,以使得网络接口间的报文能够互相转发。网桥能够解析收发的报文,读取目标MAC地址信息,和自己记录的MAC表结合,来决策报文的转发目标网络接口。