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)


相关推荐

  • 数据挖掘中所需的概率论与数理统计知识

    数据挖掘中所需的概率论与数理统计知识数据挖掘中所需的概率论与数理统计知识  (关键词:微积分、概率分布、期望、方差、协方差、数理统计简史、大数定律、中心极限定理、正态分布) 导言:本文从微积分相关概念,梳理到概率论与数理统计中的相关知识,但本文之压轴戏在本文第4节(彻底颠覆以前读书时大学课本灌输给你的观念,一探正态分布之神秘芳踪,知晓其前后发明历史由来),相信,每一个学过概率论与数理统计的朋友都有必要了解数理统计学简…

  • 如何配置jdk1.6环境变量_环境变量是什么

    如何配置jdk1.6环境变量_环境变量是什么JAVA 环境变量(JDK)配置(root+普通用户)+附赠jdk包

  • pycharm安装之后图标是空白的_空白网点

    pycharm安装之后图标是空白的_空白网点非常高兴!

  • Tomcat调优和JVM优化[通俗易懂]

    Tomcat调优和JVM优化[通俗易懂]Tomcat本身优化工作方式选择为了提升性能,首先就要对代码进行动静分离,让Tomcat只负责jsp文件的解析工作。如采用Apache和Tomcat的整合方式,他们之间的连接方案有三种选择,JK、http_proxy和ajp_proxy。相对于JK的连接方式,后两种在配置上比较简单的,灵活性方面也一点都不逊色。但就稳定性而言不像JK这样久经考验,所以建议…

  • 风控模型面试问题[通俗易懂]

    风控模型面试问题[通俗易懂]本文转自他人作者:SummerMemories个人公众号:风控汪的数据分析之路知乎专栏:小鑫的数据分析笔记Q:互联网金融场景下的的风控模型种类?获客阶段:用户响应模型,风险预筛选模型。授信阶段:申请评分模型,反欺诈模型,风险定价模型,收益评分模型。贷后阶段:行为评分模型,交易欺诈模型,客户流失模型。催收阶段:早期催收模型,晚期催收模型。Q:简单描述一下风控建模的流程?前期准备…

  • 进程管理的模拟程序_实验一熟悉C语言的运行环境

    进程管理的模拟程序_实验一熟悉C语言的运行环境利用C语言模拟实现操作系统中的进程管理

发表回复

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

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