Kubernetes基础一[通俗易懂]

Kubernetes基础一[通俗易懂]一、K8S的架构介绍1.1Docker原理:依赖于镜像,容器之间隔离使用cgroup+namespace实现隔离的;1.2K8S的架构介绍了解K8S之前需要掌握DockerKubernetes设计之初就是为了管理,调度容器技术;是google开发的一套开源的容器化编排技术;业界还有其他公司的容器编排技术例如Docker-compose,Docker-swarm,Mesos,目前k8s使用最广泛。Kubernetes则采用了Pod和Label这样的概念把容器组合成一个个的互相存在依赖关系

大家好,又见面了,我是你们的朋友全栈君。

一、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

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

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)有状态服务
Kubernetes基础一[通俗易懂]

二、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.net/152840.html原文链接:https://javaforall.net

(0)
上一篇 2022年6月25日 下午4:46
下一篇 2022年6月25日 下午5:00


相关推荐

  • Hadoop1.2.0开发笔记(八)

    Hadoop1.2.0开发笔记(八)本人一贯的风格是先了解系统的基础部分 然后在深入到高级部分 如果违背这种循序渐进的次序 也超出了本人的接受能力 古人说 学有本末 事有终始 知所先后 则尽道矣 我们还是从基础开始吧 本人上文提到的开发图片服务器还是放到后面吧 本人在第一篇文章中描述的 WordCount 单词统计程序是在单机环境运行的 现在我们改造一下 改造成在单机伪分布环境中运行新建 WordCount 类 继承 Configur

    2026年3月18日
    1
  • javaweb权限管理简单实现_javaweb管理系统项目

    javaweb权限管理简单实现_javaweb管理系统项目推荐最新技术springboot版权限管理(java后台通用权限管理系统(springboot)),采用最新技术架构,功能强大!注:由于该项目比较老,所以没有采用maven管理,建议下载springboot权限管理系统,对学习和使用会更有帮助。springboot权限管理系统介绍地址:https://blog.csdn.net/zwx19921215/article/details/978……………

    2025年8月10日
    3
  • windows平台下载android源码

    最近在看《android内核剖析》,很多细节不具体看代码很难理解,记住了印象也不深,感觉还是跟着源码走一遍好些,回来下载android源码,遇到不少问题,终于开始下载了,整理下流程,鉴于网上很多教程时间久了都会失效,本文截止14年4月18日亲测有效。需要工具如下:下载msysgit,安装     官方下载:http://code.google.com/p/msysgit/downloads

    2022年3月11日
    36
  • UpdatePanel的简单用法(非嵌套)「建议收藏」

    UpdatePanel的简单用法(非嵌套)「建议收藏」ScriptManager和UpdatePanel控件联合使用可以实现页面局部异步刷新的效果。UpdatePanel用来设置页面中局部异步刷新的区域,它必须依赖于ScriptManager,因为ScriptManager控件提供了客户端脚本生成与管理UpdatePanel的功能。

    2022年7月23日
    11
  • dstat工具

    dstat工具dstat 检测 linux 性能

    2026年3月16日
    2
  • css 相对定位 position relative

    css 相对定位 position relativecss 相对定位 nbsp nbsp nbsp nbsp nbsp 这里相对的意思是 相对于一个元素没有定位前显示的位置 也就是原来显示的位置 nbsp nbsp nbsp nbsp 这个需要注意 nbsp nbsp nbsp nbsp 下面分两个部分来看相对定位 第一部分 如何实现相对定位 nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp 代码 1 没有加定位的情况下 nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp htmlheadm

    2026年3月17日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号