前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Kubernetes基础一[通俗易懂]

Kubernetes基础一[通俗易懂]

作者头像
全栈程序员站长
发布2022-09-12 21:02:50
5800
发布2022-09-12 21:02:50
举报
文章被收录于专栏:全栈程序员必看

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、K8S的架构介绍
    • 1.1 Docker原理:
      • 1.2 K8S的架构介绍
        • 1.3 服务部署流程:
          • 1.4 部署方式:
            • 1.5 K8s部署服务架构流程
            • 二、k8s核心组件
              • 2.1 k8s label标签
                • 2.2 副本控制器
                  • 2.3 deployment
                    • 2.4 HPA
                      • 2.5 DeamonSet
                        • 2.6 volume
                        • 三、Pod核心原理K8s是如何管理容器的?
                          • 3.1 K8s是如何管理容器的?
                            • 3.2 Pod是什么
                              • 3.3 Pod结构原理
                              • 四、K8S实战
                                • 4.1 部署服务基本结构
                                  • 4.2 服务扩容是如何实现?
                                    • 4.3 服务如何实现自愈的??
                                      • 4.4 服务如何实现更新?
                                        • 4.5 服务是如何实现负载均衡??
                                          • 4.6 dns是否可以解析服务名称??
                                            • 3.7 外网如何访问内部服务??
                                            • 五、Kubernetes基本指令
                                            相关产品与服务
                                            容器服务
                                            腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                                            领券
                                            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档