Kubernetes 基础

1 基础背景

Google把自己的内部容器技术开源了,并且取名为Kubernetes。Kubernetes很好地解决了容器的管理调度问题。

IT行业是按照“标准化→虚拟化→容器化→微服务化→云原生化”这条路线发展的,如今云原生时代,Kubernetes作为了容器化的平台基础

1 标准化  集群架构统一配置

2 虚拟化 将传统的服务器虚拟成KVM或Xen 再KVM的虚拟机上跑服务以及应用。占用服务器的硬件资源更大

3 容器化 接近原生一点就是linux直接跑docker。 也可以再Kvm的基础上再使用docker跑服务。 docker是轻量级的决定docker的容器是他的dockerfile的文件。 所有用到容器编排工具 kubernetes。

4 微服务化 再里有k8s为基础懾可以扩散容相关应用服务的pod,微服务可以根据业务量去实现一个弹性伸缩。

k8s 和微服务(spring boot 或 spring cloud) 他们都要各自的组件以及对应实现的功能。----成为k8s生态圈和微服务生态圈。----东西很多

 

2 K8S历史背景

     Kubernetes(常简称为K8s)是用于自动部署、扩展和管理容器化应用程序的开源系统。该系统由Google设计并捐赠给云原生基金会(Cloud Native Computing Foundation,简称CNCF,现在隶属于Linux基金会)使用。
     OpenStack用来管理虚拟机资源。Kubernetes用来管理容器。

     当然,Kubernetes火爆之前也出现过其他管理平台,比如Docker推出的Swarm、Apache推出的Mesos。这和OpenStack推出的时候情况相似,当时与OpenStack竞争市场的有CloudStack、OpenNebula、EasyStack等。不过,最终还是OpenStack胜出了。Kubernetes也是如此,虽然晚推出一步,但是在Google的支持下发展得很快。

1.Kubernetes的诞生历史
Kubernetes的Logo是一个蓝色的船舵,如图2-3所示。希腊语Kubernetes的意思是“舵手”或“驾驶员”。

早在2000年左右,Google内部就开始了容器技术的管理,当时算是Google内部的顶级技术和机密技术。随着近几年容器技术的飞速发展,Google开源了沉淀十几年的技术,顺势成为容器编排领域的龙头。

2 k8s 名字的由来

Google内部的这项容器技术名叫Borg。未开源时,Kubernetes的代号是Seven,即《星际迷航》中的Borg(博格人,该系列剧中最大的反派,通过“同化”来繁衍)。
选择Kubernetes这个名字的原因之一是船舵有7个轮辐,代表着这个项目最初的名称“Project Seven of Nine”。

 

3 K8S版本

 

4 kubernetes的技术架构及基本组成

k8s是分布式架构有master和node节点                 称为 :C/S结构 客户端与服务器   

注意点:K8S是容器编排工具底层需要docker的环境需使用linux系统自带的一些环境lxc cgrounp namespace实现隔离机制

7大组件及一些组成K8s整套集群架构的一些核心概念:

 1 pod   2 node  3 cluster 4 Etcd 5 APIserver 6 schduler 7 Replication Controller 8 ReplicaSet 9 Deployment 10 Label 11 Selector 12 Kubelet  13 Kube-proxy 14 Service  15 KubeDNS  16 Ingress 17  Ingress controller 18 Kubectl 19 Dashboard 

 

1 pod:

 它本身不会创建运行时容器(真正创建容器的是Docker),只负责管理容器资源。那么管理容器资源,总要在最底层有个归纳收整容器的机制,这个Pod就是Kubernetes里最小的管理单元,里面存放着一组有关联关系的容器,这组容器一起共用相同的网络和存储资源。

2 node:

kubernetes是分布式架构,分为二个节点一个是master节点一个是node节点  Kubernetes的从节点一般叫作work节点,里面运行着一个或者多个Pod、kubelet、kube-proxy。如果接触过OpenStack,就更容易理解Kubernetes中node的角色了,在OpenStack里有控制节点和计算节点,控制节点对应主节点,计算节点对应从节点。

 3 Cluster

Cluster就是集群的意思,分布式系统必然少不了集群的概念。一个或多个master+一个或多个slave就组成了集群。集群是一个逻辑概念,一般会根据资源、地域、业务等几个维度进行划分。

 4 Etcd

集群运行当中必然会产生一些数据,比如Kubernetes的一些状态信息。这些状态信息需要持久化存储在一个数据库中,Etcd就提供了这个功能。Etcd是一个开源的、分布式的键值对数据存储系统,同时它提供共享配置和服务的注册发现功能。

 5 APIserver

API Server运行在主节点里面,它提供了Kubernetes各类资源对象的CURD及HTTP REST接口,我们可以把它理解为Kubernetes的神经系统。集群内部组件需要通过它进行交互通信,然后它会把交互的信息持久化到Etcd里

6 Scheduler

英文直译就是调度的意思。在分布式计算系统里面,调度是非常重要的,因为我们要合理地划分有限的资源池。

二种调度规则:

一个是预选调度过程,另外一个是确定最优节点

 

7 Replication Controller 简称RC

Replication是复制、副本的意思,Controller是控制器,连起来就是“副本控制器”。在Kubernetes里,我们对Pod进行创建、控制、管理等操作都不是直接进行的(不像管理虚拟机那样)。我们要通过各种控制器来实现操作,其中RC就是控制器的一种(还有后面将提到的ReplicaSet 

   我们可以通过RC来控制Pod的数量,确保Pod以指定的副本数运行。比如RC里设置Pod的运行数量是4个,那么如果集群里只有3个,RC会自动创建出一个Pod来;如果集群里有5个Pod,多了一个,RC也会把多余的一个Pod回收;除此之外,假如4个Pod当中有一个容器因为异常而退出,RC也会自动创建出一个正常的容器。确保Pod的数量、健康、弹性伸缩、平滑升级是RC的主要功能。RC机制是Kubernetes里一个重要的设计理念,有了它才能实现Kubernetes的高可用、自愈、弹性伸缩等强大功能。

 

8 ReplicaSet

ReplicaSet简称RS,可译为副本集。在新版本的Kubernetes里,官方建议使用ReplicaSet替代Replication Controller。RS跟RC都属于控制器,没有本质区别,可以理解为RS是RC的升级版,唯一的区别在于RS支持集合式标签选择器,而RC只支持等式标签选择器(集合式就是标签可以有多个值,等式就只能选择一个值或者不选)。

9 Deployment

Deployment的中文意思为部署、调度,通过Deployment我们能操作RC和RS,你可以简单地理解为它是一种通过yml文件的声明,在Deployment文件里可以定义Pod的数量、更新方式、使用的镜像、资源限制等。但需要注意的是,一定要编写正确格式的Deployment yml文件,不然部署会失败。

 

10 Label
Label就是标签,标签有什么作用呢?很简单,标签用来区分某种事物。在Kubernetes里,资源对象分很多种,前面提到的Pod、node、RC都可以用Label来打上标签。打上标签后,用户就可以更好地区分和使用这些资源了。另外,Label是以key/values(键/值对)的形式存在的。用户可以对某项资源(比如一个Pod)打上多个Label,另外,一个Label也可以同时添加到多个资源上。

 

11 Selector
Selector是标签选择器。前面讲Label的时候我们提到Kubernetes里面有很多资源,而且各种资源都能打上标签。所以一个集群里,会有很多标签。标签一多,必然要有一种机制进行管理和筛选,Selector就是起这个作用的。通过标签筛选,我们能快速找到想要的资源对象。

 

12 Kubelet

Kubelet运行在work节点上,它是work节点的关键服务,负责与master节点沟通。master里的apiserver会发送Pod的一些配置信息到work节点里,由Kubelet负责接收。同时,Kubelet还会定期向master汇报work节点的使用情况,比如节点的资源使用情况、容器的状态等。

 

13 Kube-proxy

Kube-proxy也运行在work节点上,因为带有proxy字眼,我们可以很快联想到它跟代理、转发、规则等方面有关。是的,它的作用就是生成iptables和ipvs规则,处理一些访问流量相关的转发。

 

14 service

service在Kubernetes里是后端服务的一种体现。我们前面提到过,Pod是一个或者多个有关联关系的容器,这些容器生成的服务就是通过Service对外提供的。通过Selector把Service跟A服务的Pod绑定就可以了,无论A服务的Pod如何变化,对B服务来说只要访问Service即可。另外,前面提到的Kube-proxy主要是负责Service的实现。

 

15 KubeDNSKubeDNS

KubeDNS就是Kubernetes内部的域名解析器。Kubernetes内部有域名需要解析吗?是的,有。我们简单地将DNS解析理解为把域名和实际的IP对应上,那么在Kubernetes里KubeDNS的作用就是把Service和IP对应上,我们直接使用服务名来做交互,而不用关心它的实际IP地址。

 

16 Ingress  Ingress是从Kubernetes的1.1版本开始添加的

提供一个全局的负载均衡器,站在多个Service的前端,扮演“智能路由”的角色,把不同的HTTP/HTTPS请求转发到对应的Service上。

理解: 由于pod是有坏掉的可能性以及重新分发的可能性,pod的IP固定是不可能实现的,pod中的容器服务需要通过对外提供服务必须有servive  如果Kuberetes集群规模大了以后就需要用到ingress

 

17  Ingress controller   相当于对ingress做一个调度及监控

Ingress是一种规则,由Ingress controller控制和使用,主要作用就是解析Ingress的转发规则。一旦Ingress里面的规则有改动,Ingress controller也会及时更新,然后根据这些最新的规则把请求转发到指定的Service上。

 

18 Kubectl
一套集群做相关管理和操作,我们能想到的最基本的方式就是命令。Kubectl是运行Kubernetes集群命令的管理工具。想运维操作集群,直接执行Kubectl--help命令就可以了。

 

19 Dashboard

这是Kubernetes的控制面板Web UI界面。它是一个独立的组件,集合了所有命令行可以操作的命令。搭建好Kubernetes后,可以选择安装或不安装Dashboard。

4.1 Kubernetes架构组件的关联关系 流程请求图

 

1)外网进入Kubernetes集群要先通过一道防火墙。
2)紧接着通过Ingress controller,它负责运行Ingress的转发规则,让请求转发到对应的Service上(图里直接到Kubelet-proxy),前面提到过Service的实现靠的是Kubelet-proxy。
3)接着Kubelet-proxy把流量分发在对应的Pod上。
4)每个work节点里面都运行着关键的Kubelet服务,它负责与master节点的沟通,把work节点的资源使用情况、容器状态同步给APIServer。
5)master节点的APIServer是很重要的服务,从图2-5中我们可以看到控制器、调度、ETCD等都需要跟APIServer交互。由此可见,我们在运维Kubernetes集群的时候,APIServer服务的稳定性要加固保障,保证APIServer服务的高可用性。

 

5 K8s的作用   容器编排  节省资源 CICD流水线基于镜像创建连接起来 

1)跨多台主机进行容器编排(容器资源集中式管理)。
2)更加充分地利用硬件,最大限度地运用企业现有的IT资源(成本最大化)。
3)有效管理和控制应用的部署与更新,并实现自动化操作(CICD,蓝绿发布快捷高效)。
4)挂载和增加存储,用于运行有状态的应用。
5)快速、按需扩展容器化应用及其资源(易操作)。
6)对服务进行声明式管理,保证所部署的应用始终按照部署的方式运行(易管理)。
7)利用自动布局、自动重启、自动复制以及自动扩展功能,对应用实施状况进行检查和自我修复(自愈能力非常强)。

 

第二章  kuberetes的基础知识

1 学好K8s的基础条件。

1 linux系统的运维经验  这对K8s集群排查错误的思路要清晰

2 网络运维基础: 网络虚拟化 Kubernetes集群维护、网络排障和网络调优环节缺少不了对网络运维的理解。   学习网络运维的步骤   “传统网络技术→虚拟化技术→网络虚拟化SDN技术   传统网络技术 端口 协议 宽带 能解决日常办公的能力。

3 存储运维基础: 通常Kubernetes集群设计方案会运行在稳定的IaaS层之上,IaaS层会采用OpenStack、VMware vSphere等平台建设。IaaS层本身就会用到成熟的存储和网络虚拟化技术,因此KubernKubernetes可以直接复用。

4 安全技术基础: 学习方向: 系统安全---网络安全---软件安全。

5 开发编程基础:语言学习路径 shell---python----Golang 。  1 看懂  2 需求 3 解决 ---大牛

6 容器虚拟化基础  KVM |  Xen --openstack        docker----k8s

7配置基础管理: 这里再强调下YAML的学习。Kubernetes里面使用了大量的YAML文件,通过定义YAML文件可以达到配置和管理各种资源的目的。我们前面学过Kubernetes里面有多种控制器,这些控制器就是通过YAML文件操作资源的(比如Pod)。用户在YAML文件里定义各种参数,然后让控制器去运行。

8 云原生概念: k8s是云原生的基础,四个方面: DevOps、微服务、容器、持续交付

9 云原生结构:CI/CD即持续集成与交付,Micro-services即微服务,Containers即容器 devops 还没有比较完全的定义 更多的是团队协作、加速软件交付。

CI/CD即持续集成与交付: Jenkins是CI/CD持续集成的代表。 Ansible 自动化运维工具 等一些接近与自动化的一些工具实现轻量级更快的部署

微服务:

容器 镜像拉取 打破了传统的环境部署

devops:

 

2 深入理解pod    pod是K8s运行的最小单元。 pod可运行一个或多个容器

 

 

docker只是K8s底层需要使用镜像的环境的工具

2.1 共享资源

OpenStack管理的VM可以说是OpenStack里的最小单元,我们知道虚拟机有隔离性,里面部署的应用只在虚拟机中运行,它们共享这个VM的CPU、MEM、网络和存储资源。Pod也是如此,Pod里面的容器共享着Pod的CPU、MEM、网络和存储资源。

 如果Pod里只运行一个容器,那就是one-container-per-Pod模式。当然也可以把一组有关联关系的容器放在一个Pod里面,这些容器共享着同一组网络命名空间和存储卷。可以将webserver,将一个LNMP的环境放到pod最后,构成一个统一的服务单元。

2.1.1 pod的内部机制

namespce 用于进程的隔离   cgroup用于控制进程资源的使用

pause容器用来 将namespce的隔离机制用于组合。

Kubernetes在初始化Pod的时候会先启动容器Pause,然后再启动用户自定义的业务容器。Pause容器可以算作一个“根容器”,它主要有两方面的作用:

1)扮演PID 1的角色,处理僵尸进程。
2)在Pod里协助其他容器共享Linux Name-space。

☆***容器本身就是一个进程。在同一个Namespace下,Pause作为PID为1的进程存在于一个Pod里,其他的业务容器都挂载在这个Pause进程下面。这样,同一个Namespace下的进程就会以Pause作为根,呈树状的结构存在一个Pod下。

pod最后不会存在僵尸进程。   

Pause容器的代码是用C语言编写的,如下所示。Pause的代码里有个无限循环的for(;;)函数,函数里面运行的是pause()函数,pause()函数本身是睡眠状态的,直到被信号(signal)中断。正是因为这个机制,Pause容器会一直等待信号,一旦有了信号(进程终止或者停止时会发出这种信号),Pause就会启动sigreap方法,sigreap方法调用waitpid获取其子进程的状态信息,如此一来自然就不会在Pod里产生僵尸进程了。

Pause代码:

static void sigdown(int signo) {
psignal(signo, "Shutting down, got signal");
exit(0);}
static void sigreap(int signo) {
while (waitpid(-1, NULL, WNOHANG) > 0);}
int main() {
if (getpid() != 1)
/* Not an error because pause sees use outside of infra containers. */
fprintf(stderr, "Warning: pause should be the first process\n");

if (sigaction(SIGINT, &(struct sigaction){.sa_handler = sigdown}, NULL) < 0)
return 1;
if (sigaction(SIGTERM, &(struct sigaction){.sa_handler = sigdown}, NULL) < 0)
return 2;
if (sigaction(SIGCHLD, &(struct sigaction){.sa_handler = sigreap,
.sa_flags = SA_NOCLDSTOP},
NULL) < 0)
return 3;
关注下面的for循环代码
for (;;)

pause();

fprintf(stderr, "Error: infinite loop terminated\n");
return 42;}

 

2 pod的生命周期

 

 

 

2.1 Pod Conditions

PodStatus对象里除了有phase字段,还有Pod Conditions数组,里面包含的属性如表2-3所示。

 

 

2.2 container probes

 

  容器在pod中的状态:

Kubelet就会在Pod里创建容器。容器在Kubernetes里有3种状态:Waiting、Running和Terminated。我们可以使用kubectl describe pod[POD_NAME]命令检查容器的状态,这个命令会显示该Pod里每个容器的状态。

另外,Kubernetes在创建资源对象时,可以使用lifecycle来管理容器在运行前和关闭前的一些动作。lifecycle有如下两种回调函数:

1   postStart:容器创建成功后,运行前的任务用于资源部署、环境准备。
2   preStop:容器被终止前的任务用于优雅关闭应用程序、通知其他系统。

pod中容器状态的处理:

 

 

 

 

 

pod的资源使用限制