大家好,又见面了,我是你们的朋友全栈君。
一、K8S的架构介绍
1.1 Docker原理:
依赖于镜像,容器之间隔离使用cgroup namespace 实现隔离的;
1.2 K8S的架构介绍
了解K8S之前需要掌握Docker Kubernetes设计之初就是为了管理,调度容器技术;是google开发的一套开源的容器化编排技术;业界还有其他公司的容器编排技术例如Docker-compose,Docker-swarm,Mesos,目前k8s使用最广泛。
Kubernetes则采用了Pod和Label这样的概念把容器组合成一个个的互相存在依赖关系的逻辑单元。使得更加灵活管理服务;
k8s的功能:
- 自动化容器的部署和复制
- 随时扩展或收缩容器规模 设置副本数量为3个 kubectl scale deployment deployment的名称 –replicas=3, 删除pod后,k8s的rs组件自动维护与预期数量相同的pod 当CPU利用率超过80%,会重新创建pod kubectl autoscale deployment my-nginx –min=10 –max=15 –cpu-percent=80
- 将容器组织成组,并且提供容器间的负载均衡 kube-proxy: 负载均衡
- 很容易地升级应用程序容器的新版本
- 提供容器弹性,如果容器失效就替换;
Kubernetes是一个分布式架构体系;一个master对应一群node节点,实现kubernetes高可用,就需要有多个master, 来实现master故障切换; Master节点: 主要负责任务调度,不进行服务部署; Node节点: 部署服务
核心组件功能剖析: 1、apiServer : 网关,所有的请求指令都必须经过apiServer — 认证 2、scheduler: 调度器,负责把要部署的服务调度到一个合适的node节点进行部署 3、controller-manager : 控制器,管理服务资源对象,实现资源对象CRUD 4、etcd : nosql数据库,用来存储集群状态,存储资源对象
Node节点用来部署服务的,服务的部署形态: 服务部署在容器中,而容器又被Pod所封装; Node核心组件: 1、docker引擎: 服务部署在容器,容器由docker引擎来创建;因此每一个node节点都会有一个docker 2、kubelet : node节点代理,kubelet实现本node节点服务部署的代理工作; 3、kube-proxy: 负载均衡 4、fluentd : 日志收集组件,第三方插件 5、pod: k8s服务部署的最小单元,所有服务都被部署在pod内部的容器中;
1.3 服务部署流程:
K8s服务部署流程原理: apiServer : 网关,认证授权 scheduler: 调度器,负责把部署的服务调度到相应的node节点进行部署; scheduler并不会帮助我们直接部署服务,而是通过etcd存储调度映射关系,并由在node节点中kubelet组件实现服务的部署;以达到解耦的目的; kubelet: node节点代理,代理维护pod(crud); kubelet汇报节点信息,pod信息;
K8s用来编排(管理)容器的,但是k8s并不会直接操作容器;而是通过管理pod来进行管理容器的;pod是k8s管理服务的最小的操作单元;
1.4 部署方式:
指令部署 kubectl run nginx-svc –image=hub.kaikeba.com/library/nginx:v1 –port=80
Yaml部署 eureka-deployment.yaml
代码语言:javascript复制apiVersion: apps/v1
kind: Deployment
metadata:
name: eureka-deployment
namespace: default
spec:
replicas: 3
selector:
matchLabels:
app: myapp
release: stable
template:
metadata:
labels:
app: myapp
release: stable
env: test
spec:
containers:
- name: myapp
image: hub.kaikeba.com/library/supergo-eureka:1.0-SNAPSHOT
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 10086
Service.yaml
代码语言:javascript复制apiVersion: v1
kind: Service
metadata:
name: eureka
namespace: default
spec:
type: NodePort
selector:
app: myapp
release: stable
ports:
- name: http
port: 80
targetPort: 10086
1.5 K8s部署服务架构流程
K8s底层使用pod来管理服务的,但是pod是运行在操作系统中进程;pod的生命周期比较短暂,一旦pod宕机了,数据完整性,数据一致性就会收到影响;
对于k8s部署服务来说,可以部署实现有状态服务部署,也可以实现无状态服务部署 问题: 有状态,无状态是什么意思?? 无状态: 1、没有实时的数据需要存储(有数据,静态数据) 2、在服务集群中,从集群中拿走任何一个服务,一段时间后,在放回这个服务,对服务集群没有任何影响; 有状态: 1、有实时的数据需要存储 2、在服务集群中,从集群中拿走任何一个服务,一段时间后,在放回这个服务,对服务集群有影响;数据完整性,数据一致性就会收到影响;
1)无状态服务
2)有状态服务
二、k8s核心组件
2.1 k8s label标签
在k8s中,使用标签对k8s所有资源对象打上标签,实现资源对象精细化控制,可以根据标签精细化定位资源对象; 标签格式:key : value
Kubernetes中任意API对象都是通过Label进行标识,Label的实质是一系列的Key/Value键值对,其中key于value由用户自己指定。Label可以附加在各种资源对象上,如Node、Pod、Service、RC等,一个资源对象可以定义任意数量的Label,同一个Label也可以被添加到任意数量的资源对象上去。
版本标签:“release”:“stable”,“release”:“canary”…
环境标签签:“environment”:“dev”,“environment”:“qa”,“environment”:“production”
架构标签:“tier”:“frontend”,“tier”:“backend”,“tier”:“middleware”
分区标签:“partition”:“customerA”,“partition”:“customerB”
质量管控标签:“track”:“daily”,“track”:“weekly”
2.2 副本控制器
副本控制器资源对象名称:ReplicationController,ReplicaSet 作用: 用来保证副本的数量永远和预期所设定的数量一致;也就是说副本控制器可以让服务永远处于可用状态,且是自动;
场景:当服务(POD)异常,宕机,副本控制器立马对pod进行重建;保证pod服务是可用的,且pod服务数量还要和预期设定的数据一致; 注意: 在新版本中,副本控制器ReplicaSet 取代了ReplicationController,因为ReplicaSet功能比ReplicationController强大,支持复合标签选择器,而ReplicationController只支持单个标签选择器;
控制器如何知道哪些pod被我所控制??? 答案: 标签
ReplicaSet
问题: replicationController & replicaSet区别?? 解释: ReplicationController副本控制器: 只支持单个标签选择器 Selector: a=x ReplicaSet副本控制器: 支持复合标签选择器 Selector: a=x b=y
2.3 deployment
虽然ReplicaSet可以独立使用,但一般还是建议使用Deployment来自动管理ReplicaSet,这样就无需担心跟其他机制的不兼容问题(比如 ReplicaSet 不支持 rolling-update 但 Deployment支持)
Deployment为Pod和ReplicaSet 提供了一个 声明式定义方法,用来替代以前的 ReplicationController 来方便的管理应用。
典型的应用场景: (1)、定义Deployment 来创建 Pod 和 ReplicaSet (2)、滚动升级和回滚应用 (3)、扩容和索容 (4)、暂停和继续 Deployment Deployment不仅仅可以滚动更新,而且可以进行回滚,如果发现升级到V2版本后,发现服务不可用,可以回滚到V1版本。
2.4 HPA
Horizontal Pod Autoscaling 仅适用于 Deployment 和 ReplicaSet,在V1版本中仅支持根据Pod的CPU利用率扩容,在vlalpha版本中,支持根据内存和用户自定义的metric扩缩容
HPA动态扩容架构原理: 监控rs下面的pod资源利用情况,根据情况进行扩缩容;
2.5 DeamonSet
DaemonSet确保全部(或者一些 [ node打上污点(可以想象成一个标签),pod如果不定义容忍这个污点,那么pod就不会被调度器分配到这个node ])
Deamonset一般用来部署每一个节点都需要部署的服务;比如: logstash
Node上运行一个Pod的副本。当有Node加入集群时,也会为他们新增一个Pod。当有Node从集群移除时,这些Pod也会被回收。删除DaemonSet将会删除他创建的所有Pod,使用DaemonSet 的一些典型用法: (1) 运行集群存储daemon,例如在每个Node上运行glustered,ceph (2)在每个Node上运行日志收集Daemon,例如:fluentd、logstash. (3)在每个Node上运行监控Daemon,例如:Prometheus Node Exporter Job 负责批处理任务,即仅执行一次的任务,它保证批处理任务的一个或多个Pod成功结束
Cron Job管理基于时间Job,即:
- 在给定时间点只运行一次
- 周期性地在给定时间点运行
2.6 volume
K8s抽象的数据存储对象,volume数据卷会把存储介质(网络存储,磁盘)中的数据挂载到容器中;
Volume: 1、容器宕机,volume数据不会消失,一直存在 2、pod宕机,volume就会消失,因此volume数据卷不能用来挂载有状态服务数据;
三、Pod核心原理K8s是如何管理容器的?
3.1 K8s是如何管理容器的?
K8s进行容器编排(管理),但是k8s不直接管理容器的;而是通过管理pod的方式来进行间接管理容器;k8s抽象出了一个pod对象,使用pod对象对容器进行了封装处理;使得k8s可以更好管理,编排容器; Pod是k8s管理容器最小单元,之所以k8s管理容器非常起强大,因为使用了标签,pod这样的封装管理模式;
3.2 Pod是什么
概念: 1、pod是k8s最小的操作单元 2、pod也是一个容器,独立的沙箱环境,有自己的ip地址,有自己的hostname 3、pod是容器的容器,内部用来封装docker容器 Pod本身就是运行在操作系统中一个进程,相当于是一台独立机器;(虚拟化概念),pod内部可以封装一个容器,也可以封装多个容器;在物理机节点上,pod和pod之间是相互独立;
PoD内部封装是容器,容器内部封装是服务(应用程序),因此pod就是用来部署服务的;也就是说开发的代码上线后,都使用pod来进行管理;
问题: 这些服务在pod内部进行部署,那么一个pod内部到底部署几个服务? — pod内部部署服务标准?? 官方: 在通常情况下,服务上线部署的时候,一个pod内部可以被用来部署一组相关的服务;
说明: 一组相关的服务;在访问链路上,处于上下游调用关系,且不可分割的状态,者就叫做一组相关的服务; 但是,在实际开发环境中,为了更好的管理,更方便的管理: 一个pod内部只允许部署一个服务;
服务集群如何做?
在k8s中,服务集群仅仅是pod的复制,因此k8s要实现扩容,就是对pod进行复制即可;
3.3 Pod结构原理
创建一个pod流程: 1、kubelet 创建pod 2、先创建pod内部一个pause容器,pause容器将会为pod生成虚拟网卡,共享数据卷volume 3、才会去创建主容器(业务容器)
四、K8S实战
4.1 部署服务基本结构
以上指令部署服务时候: 没有指定副本数量,默认副本是1个;
4.2 服务扩容是如何实现?
指令:kubectl scale deployment my-app –replicas=3
4.3 服务如何实现自愈的??
试验: 删除一个pod,或是删除所有的pod,观察pod副本数量是否和预期设定的数量(3个)一致;
问题: 删除pod肯定删除不了服务的,如何才能删除服务? 答案: 删除rs,删除deployment,就可以删除所有的rs,deployment对象对应服务;
4.4 服务如何实现更新?
互联网公司: 根据需求,进行版本迭代,发布新的版本,新的服务需要上线; 如何实现服务滚动更新? 指令:set image deployment my-app my-app=hub.kaikeba.com/library/myapp:v2
4.5 服务是如何实现负载均衡??
在kubernetes中,对服务集群实现负载均衡,是由k8s提供的一个service对象来实现负载均衡;
默认负载均衡的策略: 1、先创建一个service:kubectl expose deployment my-app –target-port=80 –port=80 2、负载策略: 默认就是轮询策略
4.6 dns是否可以解析服务名称??
Kubernetes服务部署中,通过名称解析服务ip,实现服务的访问;尤其在微服务部署的时候;
解析过程原理:
试验: 登录pod内部容器中,ping ServcieName
3.7 外网如何访问内部服务??
外网访问内部pod服务;必须经过物理网卡(需要在物理网卡开辟一个端口),然后把请求转发给内部服务service;
Service IP类型是clusterIp,此ip类型不能对外网提供服务,因此需要修改ip类型为nodeport,然后才能通过外网访问;
修改: kubectl edit svc my-app
五、Kubernetes基本指令
1、查看pod信息: kubectl get pod 2、查看pod详细信息: kubectl get pod -o wide 3、查询deployment对象: kubectl get deployment 4、查询replicaset对象: kubectl get rs 5、查询对象详情: kubectl describe pod podName 6、查询日志 : kubectl logs podName 7、登录pod内部容器: kubectl exec -it podName – sh
查询帮助文档: 1、kubectl –help 2、进一步查询指令的帮助文档: kubectl 指令名称 –help
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/152840.html原文链接:https://javaforall.cn