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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/152840.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • ubuntu 16.04 更改系统语言为简体中文[通俗易懂]

    ubuntu 16.04 更改系统语言为简体中文[通俗易懂]使用VMwareWorkstation安装64位ubuntu16.04系统,系统默认使用英文,而使用virtualbox安装,可以选择使用简体中文作为系统语言。由于英文水平有限,所以使用简体中文作为系统语言。下面是VMwareWorkstation安装的ubuntu16.04的系统语言由英文改为中文的教程。前前后后折腾的不轻,也许是水平问题吧。注意:里面有一个坑,勾选简体中文的同时…

  • SHFileOperation删除文件夹

    SHFileOperation删除文件夹UsesShellapi;varFileOp:TSHFileOpStruct;beginwithFileOpdobeginWnd:=Handle;//hinstance;wFunc:=FO_DELETE;//FO_COPY,FO_RENAME,FO_MOVE,FO_DELETEpFrom:=Pchar(‘D…

  • windows用户权限分配(进程权限)

    首先提升本进程的权限 BOOLEnaleDebugPrivilege(){HANDLEhToken;BOOLfOk=FALSE;if(OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken)){TOKEN_PRIVILEGEStp;tp.Pr

  • 股票历史数据库(腾讯股票历史数据接口)

    歪枣网财经数据下载接口集合,百度搜索歪枣网官网序号 名称 接口描述 数据字段 更新日期 操作0 A股列表 沪深京A股基本信息 code股票代码name股票名称stype股票类型,1:深证股票,2:上证股票,3:北证股票,4:港股hsgt沪深港通,1:沪股通:2:深股通、3:港股通(沪)、4:港股通(深)、5:港股通(沪+深)bk所属板块,个股包括主板、创业板、科创板cfg成分股,该板块的成分股roeROEzgb总股本(股)ltgb流通股本(股)ltsz流通市值(元)

  • 粒子群算法的matlab实现(一)[通俗易懂]

    粒子群算法的matlab实现(一)[通俗易懂]粒子群算法(ParticleSwarmOptimization,PSO)是20世纪90年代兴起的一门学科,因其概念简明、实现方便、收敛速度快而为人所知。粒子群算法的基本思想是模拟鸟群随机搜寻食物的捕食行为,鸟群通过自身经验和种群之间的交流调整自己的搜寻路径,从而找到食物最多的地点。其中每只鸟的位置/路径则为自变量组合,每次到达的地点的食物密度即函数值。每次搜寻都会根据自身经验(自身历史搜寻的最

  • docker 上传本地镜像_docker本地仓库

    docker 上传本地镜像_docker本地仓库前言之前通过docker搭建过jenkins+python3环境,如果想要在不同的机器上搭建一样的环境,就可以将之前搭建的镜像上传到镜像仓库,这样方便在不同的机器上快速搭建同一套环境。如果公开的话

发表回复

您的电子邮箱地址不会被公开。

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