k8s

K8s 快速入门

silverwq
2024-03-08 / 0 评论 / 87 阅读 / 正在检测是否收录...

概述

k8s 是kubernets的简称,k和s之间有8个单词,因为单词太长,所以简称k8s。kubernets的单词意思是舵手,是用于管理多主机上docker容器的。

说k8s解决的问题之前,先说下早期的部署方案的问题:

  1. 传统的部署,一台机器上部署多个应用,会有资源竞争的问题,比如网络、cpu、内存、磁盘文件目录占用等一些列问题

lti2iyre.png

  1. 虚拟化部署,在服务器上不同的应用,用不同的虚拟机,这样可以解决方式1的环境不隔离的问题。因为虚拟可以分配好固定的资源,这样就不会争抢资源。但是会有资源占用的问题,因为虚拟机里装了系统,会占用资源。启动一个虚拟机估计要几分钟。

lti2x38u.png

  1. 容器化部署,容器可以实现类似虚拟机一样的资源隔离效果,并且他没有自己的操作系统,用的还是宿主机的操作系统。2秒内即可启动容器。

lti35in5.png

k8s部署,因为docker容器有诸多问题,因为容器经常要销毁,然后重启一个,重启后,会有ip变了等问题,k8s提供了以下这些能力

  1. 自我修复:容器内的应用出现问题的话,比如内存溢出问题,会自动销毁容器,然后基于原来的容器,再重新启一个
  2. 弹性伸缩:监控负载比较大的时候,自动的增加容器数量,等负载降下来后,自动删除负载
  3. 自动部署和回滚:可以实现滚动更新,更新的时候,新起来一个,然后把旧的再下掉,这样用户就无感知了。如果更新有问题,还可以回退到上一个版本
  4. 服务发现和负载均衡:以前常规的需要nginx反向代理,实现负载均衡,现在k8s默认就有这个功能
  5. 机密和配置管理:很多应用有自己的配置,比如mysql有自己的配置,k8s有一套配置管理,可以实现这些配置管理
  6. 存储编排:把所有的机器的存储资源,管理成一个个抽象的虚拟磁盘,容器统一访问到虚拟磁盘,由虚拟磁盘映射到真正的物理磁盘

k8s的基本架构

通过命令行工具kubetl或者可视化界面dashboard来操作k8s。通过这两种方式操作k8s,都是通过http请求api-server,然后对应到controller-mannager控制器上,控制器有多种类型,可以理解为mvc里的c,比如

  1. kube-controller-mannager,这里的各种控制器,用于管理k8s中的各类资源
  2. cloud-controller-mananger,这个主要用于对接到第三方云平台,k8s 访问到第三方的平台

然后各个控制器进行一些操作,例如kube-controller-mannager可以进行创建pod,这个时候就要经过kube-scheduler调度器,它可把这个pod放到合适的节点上去,比如mysql pod需要存储性能好,kube-schedule就会将mysql部署到该pod上

ltibz6cq.png

k8s架构里,至少要有两个机器,一个是左侧的master节点,负责一些基础管理,然后要有右边的节点。对pod的操作,首先要访问master的api-server,然后master操作右边的节点node。

基础概念

服务分类

服务可以分为有状态应用和无状态应用:

  1. 有状态应用表示可以存数据,例如redis,扩容的时候,有数据迁移等问题,不然新增的redis节点就没有数据了
  2. 无状态的应用没有存任何数据,只是简单转发和计算,例如nginx服务,如果新增nginx,没有任何影响

lticqwuu.png

资源和对象

资源相当于yaml配置,对象是基于这个配置创建出来的实例。

对象的规约和状态

  1. spec规约相当于期望,表示我们期望会这样,比如配置pod的spec,希望里面有几个容易。
  2. status状态:表示对象的实际状态,可能实际情况和配置的不一样,k8s会尽量的保证对象和我们配置的一样。

资源分类

k8s 会对资源范围进行划分

集群级别的资源,集群内的所有应用都可以访问到这部分资源。

  1. namespace,命名空间本身也属于一个资源,属于集群底下的
  2. Node,节点相当于一个服务器,k8s主要是用于管理这些节点,而不是创建节点
  3. clusterRole,用于集群权限管理,声明了集群的角色,表示集群里有这些角色,这些角色有什么权限
  4. clusterRoleBinding,表示这个角色绑定到集群级别的资源上,所以这些角色就可以操作这些集群

命名空间级别的资源,k8s把集群内再划分成多块,比如命名空a和命名空间b,只有自己命名空间内的资源才是可以共享的

pod,可以看作是容器组,一个pod里可以有多个容器,当一个pod被创建的时候,会有个默认的容器pause,用于实现pod里容器之间的资源共享。 例如php和mysql部署在同一个pod里,php就可以通过localhost直接访问到mysql了。

pod: 里又有控制器和replicas副本,副本其实就负载量大的时候,自动创建的新的pod。控制器又有很多类型,例如

  1. 用于创建无状态的服务,例如goland的服务。eployment这个控制器可实现自动创建pod,滚动升级,以及回滚,扩容、缩容等。
  2. 部署有状态服务,用statefulset控制器创建,里面有headless services 的dns解决网络问题,里面的volumeClaimTempale,解决存储的问题
  3. 守护进程,在匹配到的无状态服务或者有状态服务里,利用daemonSet嵌入一个守护进程,做日志收集等,这样就不用自己去容器里装这些日志组件了
  4. 创建定时任务,Job和CronJob控制器

ltiepom0.png

服务发现:实现k8s集群内部网络调用,可以用service和ingress,访问集群里的pod

ltihno5d.png
ltiho2ik.png

存储:volume虚拟磁盘,共享pod中容器的数据

特殊类型的配置:configMap配置修改,会自动更新到pod里面,实现配置暴露出来。

元空间,每个资源都有一些自己的元空间的资源,例如每个pod都有自己元空间资源,该pod内部可以共享这些资源,例如如下三个资源

  1. Horizontal pod autoscaler(HPA),可以监控cpu的使用率,比如30s检测一次,发现cpu大于50%,自动扩容。
  2. podtemplate模板,扩容的时候,基于这个模板进行扩容,这样扩容出来的实例就一样了。
  3. limitrange用于资源限制,比如可以限制内存最多5GB

ltidkkhb.png

0

评论 (0)

取消