k8s学习总结

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/flyinthesky111/article/details/81016612

k8s简介及其环境搭建


一、docker是什么

Docker是一个开源的引擎,可以轻松的为任何应用部署一个轻量级的、可移植的、自给自足的容器。

Docker常用于一下几种场景:

 - web应用的自动化打包和发布; 
 - 自动化的测试和持续集成、发布; 
 - 在服务环境中部署和调整数据库或者后台的其他应用;
 - 从头编译或扩展现有的资源平台来搭建自己的paas环境。

- docker的容器部署和入门管理

2.1 docker进程介绍
Docker的系统有两个进程:docker服务端和docker客户端。服务端管理着所有的容器,客户端则是服务端的远程控制器,用来控制docker的服务进程。
2.2 docker的下载与安装
Docker version是查看当前机器docker版本信息的命令,在centos中,如果没有安装docker的话,输入上述命令,会报命令不存在的错误。Centos7中docker的安装比较方便,这里为了都需利用rancher2.0一键部署k8s集群,这里需要选择k8s和rancher同时支持的docker版本,可支持的docker版本信息在rancher官网的快速开始一栏中有叙述。我们这里安装的docker版本是用curl https://releases.rancher.com/install-docker/17.03.sh | sh命令安装的17.03版本(centos没有curl命令利用yum下载即可,yum install -y curl)。输入下载docker的命令后,等待其下载完成,此时输入docker version命令查看版本信息,会发现docker的服务端没有启动,启动服务端(service docker start),启动后,在此查看docker的版本信息,此时会显示客户端和服务端同时启动了,至此,docker就安装并且启动完成了。
2.3docker的入门管理
1)加速器的配置
在/etc/docker/daemon.json(没有文件就创建)文件中写入加速器地址,加速器的地址可以参照官网的加速器地址,也可以用自己在云服务平台注册容器服务后给的加速器地址。
2)harbor的安装
先下载harbor的离线安装包;
下载docker-compose放入/usr/bin目录下,并赋予755的权限
解压下载的harbor的安装包,进去其目录下,配置harbor.cfg文件中的配置,指定harbor所在机器的ip,修改harbor的登录密码(可改,可不改)
执行install.sh脚本,安装harbor


二、k8s学习总结

1.初识k8s

1.1 k8s是什么

Kubernetes是用于自动部署,扩展,管理容器化应用程序的开源系统,他将组成应用程序的容器组合成逻辑单元,便于管理和服务发现。Kubernetes具有以下特点:

  • 自动包装:根据资源需求和其他约束自动放置容器,同时还不会牺牲可用性,提高资源利用率并节省更多资源。
  • 横向缩放:能通过一些简单的命令或者UI操作,或者监控CPU的使用情况自动调整应用程序的副本数量。
  • 自动部署和回滚:kube能够部署应用程序和其配置的更改,同时提供应用程序的运行情况的监听服务,如果出现问题,还会提供支持回复更改的回滚服务。
  • 存储和编排:自动安装你选择的存储系统,包括本地存储系统,公有云提供商,或者是网络存储系统。
  • 自我修复:重新启动失败的容器,在节点不可用时,替换和重新编排节点的容器,终止不对用户定义的健康检查做出响应的容器,并且不会在客户端准备投放之前通告给客户端。
  • 服务发现和负载均衡:kube为容器提供了自己的IP地址和一组容器的单个dns名称,并且可以在他们之间进行负载均衡。
  • 密钥和配置管理:部署和更新密钥和应用程序配置,不会重新编译你的镜像,不会再堆栈配置中暴露密钥。
  • 批处理:kube还可以管理批处理和CI工作负载,如果需要,替换出现故障的容器。

1.2 k8s的基本架构

1.2.1kube主体架构
Kubernetes主要由以下几个核心组件组成:

  • ·etcd:保存集群的状态;
  • ·apiserver:提供资源操作的唯一入口,并且提供认证、授权、访问控制、api注册和发现等机制;
  • ·controller manager:负责维护集群的状态,比如故障检测,自动扩展,滚动更新等等;
  • ·scheduler:负责资源的调度,按照预定的调度策略将pod调度到相应的机器之上;
  • ·Kubelet:负责维护容器的生命周期,同时负责volume和网络的管理;
  • ·container runtime:负责镜像管理以及pod和容器的真正运行
  • ·kube-proxy:负责为service提供cluster内部的服务发现和负载均衡;

其他组件:

  • ·kube-dns:负责为整个集群提供DNS服务;
  • ·ingress controller:微服务提供外网入口;
  • ·heapster:提供资源监控服务;
  • ·dashboard:提供GUI;
  • ·federation:提供跨可用区的集群

1.2.2 kube的分层架构
核心层:
kube最核心的功能,对外提供API构建高层应用,对内提供插件式的应用执行环境。
应用层:
部署
(无状态应用,有状态应用,批处理任务,集群应用)和路由(服务发现、DNS解析)
管理层:
系统度量(基础设施、容器、网络的度量),自动化(自动扩展,动态provision)以及策略管理
接口层
kubectl命令行工具,客户端SDK以及集群联邦
生态系统:
在接口层之上的庞大容器集群管理调度的生态系统,可以划分两个范畴:
Kubernetes内部:
CRI,CNI,CVI,镜像仓库,cloud provider,集群自身配置和管理。
Kubernetes外部:
日志,监控,配置管理,CI,CD,workflow,Fass,OTS应用,chatOps等

1.3 k8s的主要功能

  • ·多个进程协同工作(pod)
  • ·存储系统的挂载
  • ·应用的健康监测以及自动部署和扩展服务
  • ·负载均衡和滚动更新
  • ·资源监控和日志访问
  • ·提供认证授权和访问控制
  • -

2、部署k8s(centos部署1.5版本)

1、环境准备
·centos版本:7.4版本
·节点资源配置列表:
节点 ip地址 Cpu 内存
Master 192.168.3.51 4 4
etcd 192.168.3.52 1 2
Node1 192.168.3.53 1 2
Node2 192.168.3.54 1 2
·配置前环境准备
1)配置hosts文件,将hosts文件中添加上对应的主机名和ip的映射
命令:vi /etc/hosts
2)关闭防火墙,并设置开机不启动。
命令:关闭防火墙systemctl stop firewalld
设置开机不启动systemctl disable fireable
3)更改主机名,将对应ip的主机的名称修改为hosts文件中配置的主机 名称。
命令 :hostnamectl set-hosename Master(master节点的配置,其余类似)
4)时区校对,命令可以自行百度,不详细叙述。
·重启配置完成的机器,让配置环境生效(上述的环境配置每一台机器都需要配置)
2、更新yum
命令:yum update(每一台节点都需要更新)
3、安装k8s的相关组件
命令:yum -y install etcd kubernetes ntp flannel(每台节点都需要)
4、修改etcd节点的配置文件
1)进入etcd节点所在机器的 /etc/etcd目录下,编辑etcd.conf文件,截图如下:

这里写图片描述
2)启动etcd服务
命令:systemctl start etcd
Systemctl enable etcd
3)检查etcd的集群状态
命令:etcdctl cluster-health,现实集群状态健康就行
4)设置etcd
图示:
这里写图片描述
5、修改master节点的配置文件
1)配置kube-apiserver
图示:
这里写图片描述
2)配置kube-controller-manager文件
图示:
这里写图片描述
3)配置kube-scheduler文件
图示:
这里写图片描述
4)启动master节点各个组件
这里写图片描述
如果上述语句启动失败,可以分别启动这三个组件的服务即可
6、修改node1节点的配置文件
图示:(下图中的最后一个配置后边跟的ens33是你的静态网卡,在当前机器执行 ip a命令即可查看)
这里写图片描述
2)配置node1的kube-proxy
这里写图片描述
3)配置node1的kubelet
这里写图片描述
4)启动node1节点相关组件
图示:这里写图片描述
7、修改node2节点的配置文件
同node的配置
8、启动pod实力测试集群健康状态
1)查看集群节点状态
命令:kubectl get nodes
2)启动实例查看实例状态能否创建
命令:kubectl create -f 对应实例yaml文件名
或者 kubectl run my-nginx –image=nginx
查看pod实例详细状态
命令:kubectl get pods -o wide
如果pod的状态对应是ready的话,代表集群搭建成功,如果不成功,并且排错到最后的原因是由于缺少一个证书文件的话,建议最快速的解决方案就是在daemon.json文件中加入一个受信任的仓库地址。亲测有效。方法可以百度,这里不详细介绍。
搭建参考地址:https://blog.csdn.net/lic95/article/details/55015284
2.2rancher2.0一键部署k8s
参考官网快速教程即可 官网地址:https://rancher.com/quick-start/

三、k8s概念和原理详解

3.1 概念详解

master
k8s中的master指的是集群控制节点,每一个k8s集群都需要一个master节点来负责整个集群的管理和控制,k8s的控制命令由它来负责运行,master节点通常布置为HA模式,因为一旦master宕机或者不可用,整个集群的容器应用管理都会失效。
Master节点上运行着以下重要进程:
- ·kube-apiserver:它提供了HTTP restAPI接口服务,是k8s集群里资源操作和控制的入口。
- ·kube-controller-manager:k8s集群中所有资源的自动化控制中心,可以理解为资源对象的总管理。
- ·kube-scheduler:负责资源调度的进程,负责调度。
- ·master节点还有可能有一个etcd服务,它是用来存储k8s中的资源数据的,但由于它保存资源对象的数据的重要性,通常生产环境中都会将etcd布置为HA来保证其高可用,防止数据丢失。
·node
Node节点在k8s集群中是作为工作负载节点,master管理node节点是通过node节点上的kubelet进程向master节点注册自己,然后master节点会将node节点纳管进集群管理范围之内,kubelet进程会定期向master节点汇报自己的情况,以便master节点能够时刻了解各个node节点的状态信息。Node节点上有以下重要进程:
- ·kubelet:
- 它除了上述向master节点注册以及报活的作用外,还承担着pod对应容器的创建,启动,停止等任务。
- ·kube-proxy
该进程实现kubernetes service的通信和负载均衡机制
- ·pod
Pod是k8s中最基本也是最重要的一个概念,每一个pod的组成是由一个或者多个业务容器加上一个称之为“根容器”的pause容器构成。Pod概念的提出,使同一业务的容器有了一个整体管理的对象,不同业务、主机之间pod的通信可以通过podIP进行通信,同时pause根容器可以代表整个pod容器组的状态,利于我们准确的掌握整个pod的状态。
Pod还分为静态pod和普通的pod。前者并不是存放在etcd中的,而是在具体的node节点的具体文件中,执行也只能在存放该pod的node节点上进行运行;普通pod一经启动,就会存储在etcd中,随后被master调度到具体的node上进行绑定,然后该node上的kubelet实例化一组相关的容器。
- ·label
k8s中的label是一个键值对,label可以附加到各种k8s的资源上,label的定义是在资源对象定义的时候定义,也可以在对象创建后进行添加。
Label的作用主要是应用于通过给指定的资源对象绑定一个或者多个不同的label,实现多维度的资源分组管理的功能。Label就相当于给某个资源对象打了一个标签,然后通过label selector来查询和筛选具有某些label的对象进行相关操作,来达到资源对象的分组管理功能。
- ·replicaition controller
replicaition controller简称RC,RC的作用就是定义了一个期望场景,RC的定义包含以下信息:
·pod的期待的副本数(replicas)
·用于筛选目标pod的label selector
·当pod副本数量小于预期数量时,用于创建新pod的模板
RC的作用主要是当我们提交了一个定义好的RC到k8s集群后,master节点上的controller manager组件就会得到通知,定期检查当前系统中存活的目标pod,并确保目标pod的实例的数量刚好等于RC中定义的期望值,如果多了,就停掉一些,少了就自行创建。RC可以保证集群应用的高可用性,并且减少保证HA的运维工作。
- ·deployment
Deployment为Pod和Replica Set(升级版的 Replication Controller)提供声明式更新。
你只需要在 Deployment 中描述您想要的目标状态是什么,Deployment controller 就会帮您将 Pod 和ReplicaSet 的实际状态改变到您的目标状态。您可以定义一个全新的 Deployment 来创建 ReplicaSet 或者删除已有的 Deployment 并创建一个新的来替换。
典型的用例如下:
·使用Deployment来创建ReplicaSet。ReplicaSet在后台创建pod。检查启动状态,看它是成功还是失败。
·然后,通过更新Deployment的PodTemplateSpec字段来声明Pod的新状态。这会创建一个新的ReplicaSet,Deployment会按照控制的速率将pod从旧的ReplicaSet移动到新的ReplicaSet中。
·如果当前状态不稳定,回滚到之前的Deployment revision。每次回滚都会更新Deployment的revision。
·扩容Deployment以满足更高的负载。
·暂停Deployment来应用PodTemplateSpec的多个修复,然后恢复上线。
·根据Deployment 的状态判断上线是否hang住了。
·清除旧的不必要的 ReplicaSet。
- ·statefulset
在kubernetes系统里,pod的管理对象RC、deployment、Daemonset和job都是面向的无状态服务。但实际业务中是会有有状态服务的,例如一些具有固定身份ID,固定集群规模,集群中的数据需要持久化到永久存储的这些有状态服务。如果使用RC/Deployment来实现有状态服务,就会发现这些服务的身份固定就实现不了,因为每个pod的名字是随机产生的,ip地址也是在运行期间才确定但是可能发生变化的,无法事先就为服务确定一个确定的ip,此外,为了满足持久化存储到永久存储中,这种pod还需要外接存储设备,为了解决这些问题,就引入了新的statefulset的概念。
Statefulset中的的pod具有固定的身份和稳定的ip,可以来发现集群内部的其他成员,他控制的pod的启停是有顺序的,在操作第N个pod之前,前N-1个pod已经操作完成,并且statefulset的pod采用的是稳定的持久化存储卷,采用PV/PVC来实现,删除pod时,默认不会删除相关的存储卷,来保证数据安全。
- ·service
Service是k8s里最核心的资源对象之一,k8s中的每个service其实就是我们经常提起的微服务架构里面的一个“微服务”。
Pod、RC、service之间的关系:
这里写图片描述
k8s的service定义了一个服务的访问入口地址,前端的应用(pod)通过这个入口访问背后的一组由pod组成的集群实例。Service与后端pod副本集群之间则是通过label selector来实现“无缝对接”。而RC的作用实际是保证service的服务能力和服务质量。
- ·Volume
volume是pod中能够被多个容器访问的共享存储目录。k8s中的volume的生命周期和pod的上面周期相同,因此,当pod中的容器重启和这终止时,其数据也不会丢失 。Volume的类型也多种多样,其对应的实现的功能也多种多样,详细可以看官方文档对这些volume的详细解释。
官方文档地址: http://docs.kubernetes.org.cn/429.html
- ·persistent volume
上述的volume是定义在pod上的,属于计算资源的一部分,但实际上,“网络存储”是独立于“计算资源”存在的一种实体资源。例如在虚拟机中,我们都会先定义一个网络存储,然后从中划分出一部分网盘挂载到虚拟机中。PV和PVC实现的功能也与之类似。
PV可以理解为k8s集群中某个网络存储对应的一块存储,PV和volume的区别在于,PV不属于pod,他是网络资源,但是每个node可以访问;PV定义是独立于pod之外;PV还具有权限控制,可以控制单个或者多个node挂载时的读写权限。
当用户想要使用某个类型的PV时,需要先定义一个PVC对象,然后根据定义,去寻找对应的PV,根据定义对象中的存储使用大小和PV比对,找到最合适的PV进行使用。
- ·namespace
Namespace在k8s中,很多情况下是用于多租户的资源隔离。Namespace通过将集群内部的资源对象“分配”到不同的namespace中,形成逻辑上的不同的资源小组,资源项目,便于不同的分组在资源使用时的管理。
- ·Annotation
与label类似,都是key/value键值对,不同的是label的格式有严格的命名规则,而Annotation是用户任意定义的附加信息,方便外部工具进行查找。

3.2原理详解

·kube apiserver
参考博客:https://blog.csdn.net/aikudemn/article/details/76437250
k8s API Server提供了k8s各类资源对象(pod,RC,Service等)的增删改查及watch等HTTP Rest接口,是整个系统的数据总线和数据中心。
·提供了集群管理的REST API接口(包括认证授权、数据校验以及集群状态变更);
·提供其他模块之间的数据交互和通信的枢纽(其他模块通过API Server查询或修 改数据,只有API Server才直接操作etcd);
·是资源配额控制的入口;
·拥有完备的集群安全机制.
工作原理图:
这里写图片描述
kubernetes API Server作为集群的核心,负责集群各功能模块之间的通信,集群内各个功能模块通过API Server将信息存入etcd,当需要获取和操作这些数据时,通过API Server提供的REST接口(GET\LIST\WATCH方法)来实现,从而实现各模块之间的信息交互。
·controller manager
controller manager作为集群内部的管理控制中心,负责集群内的node、pod副本,服务端点(endpoint),命名空间(namespace),服务账号(ServiceAccount)、资源定额(ResourceQuota)等的管理,当某个node意外宕机,CM会及时发现此故障并执行自动化修复流程,确保集群的处于一个良好的工作状态。
CM内部包含多个controller,如图:
这里写图片描述
每一个controller都负责一种具体的控制流程,而CM正是这些controller的核心管理。
controller介绍:https://yq.aliyun.com/articles/149596
·scheduler
Kube-scheduler是k8s集群中负责pod调度的重要功能模块。Kube-scheduler在整个k8s系统中承担了承上启下的重要作用。“承上”值得是它要接受controller manager创建新的pod,为这个pod选择一个合适的家——目标node节点;“启下”指的是安置工作完成之后,目标node上的kubelet服务进程接管后续工作,负责pod生命周期的后续。
具体来讲,scheduler的作用就是将待调度的pod(包括API新创建的pod和CM为补足副本而创建的pod等)按照特定的调度算法和调度策略绑定到集群中某个合适的node节点上,并将绑定信息写入etcd中。整个调度过程中涉及三个对象,分别是:待调度pod列表,可用node列表,调度算法和策略。
Scheduler的调度流程默认分为以下两步:
1)预选调度:会遍历所有的目标的pod,筛选出符合要求的候选node。
2)确定最优节点:在第一步的基础上,采用优选策略,计算出每个节点的积分,积分最多者获胜。
详细的调度策略和优选方法后续再行详细分析。
·kubelet
k8s集群中,每个node节点都会启动一个kubelet服务进程,这个进程用于处理master节点下发到本节点的任务,管理pod和pod中的容器。每个kubelet进程会在API server上注册自身节点信息,并定期向master节点汇报节点资源的使用情况,并通过cadvisor监控容器和节点资源。
·kube-proxy
在k8s集群中每个node节点上都会运行一个kube-proxy服务进程,这个进程可以看作是service的透明代理和负载均衡器,它的主要作用是将对某个service的访问请求转发到后端的多个pod实例上。对每一个TCP类型的kube service,kube-proxy都会在本地node上建立一个socketserver来负责接受请求,然后均匀的发送到后端的某个pod的端口上。此外,service的clusterIP和nodeport等概念是kube-proxy服务通过iptables的NAT转换实现的,kube-proxy在运行过程中动态的创建了与service相关的iptables规则,来实现clusterIP和nodeport的请求流量重定向到kube-proxy进程上对应服务的代理端口上。总而言之,由于kube-proxy的作用,在service的调用过程中,客户端不用关心后端有几个pod,中间过程的通信、负载均衡、故障恢复都是透明的。
Kube-proxy负载均衡转发规则图:
这里写图片描述
Kube-proxy工作原理图:
这里写图片描述
·集群安全机制
k8s集群通过一系列机制来实现集群的安全控制。集群的安全性必须考虑以下的几点目标:
1)保证容器和宿主机的隔离
2)限制容器和基础设施以及容器和容器之间的消极影响
3)最小权限限制——合理限制所有组件的权限,确保组件智能执行它被授予的权限的行为
4)明确组件间边界的范围
5)划分成员之间角色(如普通成员和超级管理员)
6)必要时普通成员可以赋予超级管理员权限
7)允许有私密数据的应用在集群中运行(secret、keys、certs、passwords等)
k8s分别从API server的认证管理、授权管理、admission contrl(准入控制)、service account、secret 私密凭据来做到这些。
·网络原理
k8s的网络模型设计的基础原则是:每个pod都拥有一个独立的IP,并且假定所有pod都在一个可以直接连通的扁平的网络空间中,因此,不管他们是否在同一个node中,都能够通过ip进行互相访问。用户就可以不用考虑如何在pod之间建立联系,也不用考虑容器端口映射到主机端口等问题。
但是在实际中,IP是以pod为单位进行分配的,一个pod中的所有容器共享一个网络堆栈(即共享一个网络命名空间,包括IP、网络设备、配置等等都是共享的)。按照这个网络原则抽象出来的一个pod一个ip的模型也被叫做ip-per-pod模型。
网络原理实现:
k8s集群网络模型设计主要实现了一下场景:
1)容器和容器之间的直接通信
2)Pod和pod之间的通信
3)Pod和service之间的通信
4)集群外部和内部组件之间的通信
·共享存储原理
k8s集群中,对于有状态的容器应用或者数据需要持久化的应用,不仅需要将容器内的目录挂载到宿主机的目录或者临时存储卷(emptydir),还需要更加可靠的存储服务来保存应用中的重要数据,以便容器在重启或者挂掉之后还可以使用之前的数据,恢复容器的状态。但是基于存储的管理方式和计算管理方式不同,屏蔽底层存储的实现细节,让用户方便使用,k8s引入 了PV和PVC两个资源对象来实现对于存储管理的子系统。
PV和PVC详解地址:https://blog.csdn.net/xts_huangxin/article/details/51494472

四、Kubectl基本命令详解

Kubectl基语法如下:
Kubectl [conmand] [type] [name] [flags]
Command:子命令,用来操作k8s集群资源的对象的命令,例如:create、delete、describe、get、apply等
Type:资源对象的类型,区分大小写
Name:资源对象的名称,如果不指定资源名称,系统会返回对应type下的全部对象的列表。
Flag:kubectl命令的可选参数
详情视频地址:http://v.youku.com/v_show/id_XMzEyMDk1MTEzNg==.html

猜你喜欢

转载自blog.csdn.net/flyinthesky111/article/details/81016612