ThankNeko's Blog ThankNeko's Blog
首页
  • 操作系统

    • Linux基础
    • Linux服务
    • WindowsServer笔记
    • Ansible笔记
    • Shell笔记
  • 容器服务

    • Docker笔记
    • Kubernetes笔记
    • Git笔记
  • 数据库服务

    • MySQL笔记
    • ELK笔记
    • Redis笔记
  • 监控服务

    • Zabbix笔记
  • Web服务

    • Nginx笔记
    • Tomcat笔记
  • 数据处理

    • Kettle笔记
  • Python笔记
  • Bootstrap笔记
  • C笔记
  • C++笔记
  • Arduino笔记
  • 分类
  • 标签
  • 归档
  • 随笔
  • 关于
GitHub (opens new window)

Hoshinozora

尽人事,听天命。
首页
  • 操作系统

    • Linux基础
    • Linux服务
    • WindowsServer笔记
    • Ansible笔记
    • Shell笔记
  • 容器服务

    • Docker笔记
    • Kubernetes笔记
    • Git笔记
  • 数据库服务

    • MySQL笔记
    • ELK笔记
    • Redis笔记
  • 监控服务

    • Zabbix笔记
  • Web服务

    • Nginx笔记
    • Tomcat笔记
  • 数据处理

    • Kettle笔记
  • Python笔记
  • Bootstrap笔记
  • C笔记
  • C++笔记
  • Arduino笔记
  • 分类
  • 标签
  • 归档
  • 随笔
  • 关于
GitHub (opens new window)
  • 操作系统

  • 虚拟化服务

    • Docker笔记

    • Kubernetes笔记

      • Kubernetes介绍
        • Kubernetes介绍
        • Kubernetes特性
          • 自动化
          • 密钥和配置管理
          • 存储编排
          • 批量处理执行
        • 编排工具
          • 介绍
          • 应用编排工具
          • 容器化编排工具
        • DevOps介绍
        • Kubernetes节点的角色
          • Master
          • Nodes (Worker)
        • Pod介绍
          • 概念
          • 管理方式
        • Label介绍
          • 介绍
          • 标签选择器
        • Service介绍
          • 介绍
          • 作用
          • 特点
        • K8S DNS介绍
        • K8S共享存储介绍
        • K8S网络模型
          • 介绍
          • CNI容器网络接口
          • 名称空间
      • Kubernetes部署
      • K8S资源与标签
      • Pod资源详解
      • Kubectl命令
      • 控制器资源配置
      • Service资源配置
      • Ingress资源配置
      • configMap资源配置
      • Volume资源配置
      • Volume资源配置
    • Jenkins笔记

    • K3S笔记

  • 数据库服务

  • 监控服务

  • Web服务

  • 数据处理

  • Ops
  • 虚拟化服务
  • Kubernetes笔记
Hoshinozora
2023-02-25
目录

Kubernetes介绍

# Kubernetes介绍

K8S即是一个容器编排工具,能将多个容器资源整合成一个大的资源集群,统一对外提供计算、存储等能力。一般集群分为两种类型:有中心节点的集群 和 无中心节点的集群,而K8S则是有中心集群。

  • 有中心节点的集群:如MySQL主从,一个主节点,其他节点与它进行同步。
  • 无中心节点的集群:每一个节点都能接收请求进行路由,如Nginx集群,每个集群都能进行路由提供服务。

# Kubernetes特性

# 自动化

  • 自动装箱:能够自动完成容器的部署。
  • 自我修复:如果容器崩溃,控制器会自动拉起一个新容器。
  • 自动水平扩展:当前容器资源不够用,会自动扩展集群,拉起一个新容器。
  • 自动服务发现:通过标签进行匹配发现。
  • 自动负载均衡:会自动将流量负载均衡到集群中的不同容器。
  • 自动发布和回滚:可以自动实现滚动发布。

# 密钥和配置管理

  • 可以通过外部组件(配置中心) 来管理容器的配置,通过API进行管理。
  • 容器在启动时会通过网络来加载配置中心的配置。

# 存储编排

  • 使容器可以根据需求创建适合大小的存储卷。

# 批量处理执行

# 编排工具

# 介绍

  • 编排工具,即是批量管理工具。

# 应用编排工具

  • 主要用来对多主机进行管理,因为多机集群的管理非常繁琐,所以我们可以借助应用编排工具,来实现方便的编排管理,如ansible工具。

# 容器化编排工具

  • 主要用来对多容器进行管理,用来解决N多个容器的管理问题。
  • 主流是使用kubernetes进行管理,但docker实际也有自带的编排工具docker compose等。

# DevOps介绍

# 介绍

DevOps在百科上的定义是一组过程、方法与系统的统称,用于促进开发、技术运营和质量保障部门之间的沟通、协作与整合。

我们一般的程序上线流程是:程序开发 -> 构建部署测试环境 -> 测试 -> 交付给目标 -> 部署线上环境,而以自动化的方式实现以上流程,就是DevOps,容器提供了DevOps(自动化) 落地的可能。

# 相关概念(CI/CD)

  • # CI:持续集成
    1. 程序员开发完代码提交到代码仓库。
    2. 构建工具自动的去拉取代码进行构建部署。
    3. 测试工具自动的在测试环境中对代码进行测试。
    4. 测试工具发现Bug则自动打回,通知程序员修复。
    5. 以上过程将不断循环,直到测试工具没有发现Bug为止。
    6. 以上过程的自动实现,就称之为持续集成。
  • # CD:持续交付
    • 在持续集成的过程后,如果开发好的程序能够自动的打包到仓库、文件系统等,使可以被运维或者客户拿到,这个过程就是持续交付。
    • 自动实现将测试通过的程序打包交付到目标手中,就是持续交付。
  • # CD:持续部署
    • 自动实现将交付得到的程序部署到线上环境,这个过程就是持续部署。

# Kubernetes节点的角色

image-20230225111356117

# 介绍

  • K8S集群中存在两种角色,也就是Master和Node,所以K8S实际是有中心节点的集群。

  • K8S中各组件间的通信使用HTTP/HTTPS协议。

# Master

  • 用来接收客户端请求、管理工作节点等。

  • 可以有一个或多个主节点,如果为了高可用则一般需要有三个。

  • Master节点中包含以下几个模块:

    • # API Server
      • 集群的入口。
    • # Scheduler
      • 用于根据请求进行任务调度,会选择最佳适配的Node来运行容器。
    • # Controller Manager
      • 用于确保控制器健康运行。

    提示

    Master节点默认是无法接受资源调度的,因为Master节点默认是有污点,在资源调度时不会选择有污点的节点进行调度,所以如果有特殊需求要搭建一台单节点的K8S集群,则需要通过命令将Master节点的污点去掉。

# Nodes (Worker)

  • 用来提供资源、运行容器的节点等。

  • Node节点中包含以下几个模块:

    • # Kubelet
      • 用于管理Pod、接收并执行任务、容器健康检查等。
    • # 容器引擎
      • 用于运行容器,在K8S 1.24版本之前是使用Docker作为容器引擎,但该版本之后则开始使用Contianerd作为容器引擎。
    • # kube-proxy
    • 用于管理Service的规则,每一个Service的创建或变动,都需要用kube-proxy来反应到本地规则上。

# Pod介绍

# 概念

  • Pod是K8S中最小调度的逻辑单元。
  • 他实际相当于容器的外壳,一个Pod虽然可以运行多个容器,但是一般只会放一个主容器,除非是为了扩展主容器中的主程序的功能,才会运行其他辅助容器 (Sidecar模式)。
  • 同一Pod内的容器共享同一个名称空间,也就意味着就是这些容器可以通过lo通信(127.0.0.1)。
  • 同一Pod内的容器共享同一个存储卷。

# 管理方式

在K8S中对Pod有两种管理方式,一种是自主式管理的Pod,还有一种是控制器管理的Pod,我们主要使用控制器对Pod进行管理。

  • # 自主式管理的Pod

    • 由调度器分配任务给Node启动后,如果Pod中的容器崩溃了,Node节点的kubelet服务会自动拉起一个新的Pod。
    • 但如果Node故障了,这个Pod也就无法运行了,且它无法全局进行Pod管理。
  • # 控制器管理的Pod

    • # ReplicationController - 副本控制器
      • 如果Pod副本集少了或不够用了,会自动添加Pod副本。如果多了,会自动移除Pod副本。
      • 它还支持滚动更新和回滚,即便设置Pod副本集最多有2个,也允许在更新过程中临时超出。
        • 会新添加一个新版本副本,然后再移除一个旧副本,然后再添加一个新版本副本,然后再移除一个旧副本,以此类推,最终实现全部副本的更新。
        • 在执行回滚时,也是一样滚动回滚的过程。
    • # ReplicaSet - 副本集控制器
      • 和ReplicationController功能基本一致,但是管理起来更加方便。
    • # Deployment - 用于管理无状态的Pod副本
      • 当我们创建了Deployment之后,实际上也创建了ReplicaSet,所以说Deployment管理着 ReplicaSet。
      • Deployment在ReplicaSet的基础上进行了功能的扩展,所以更加完善,比如它支持二级控制器:HPA - 水平Pod自动伸缩控制器。
        • 比如:以整个集群为单位监控CPU使用率,如果各副本的CPU使用率加起来超过整个集群CPU资源的80%,则自动扩展Pod副本。
      • 一般用来运行无状态服务(Stateless Service)
        • 该服务运行的实例不会在本地存储需要持久化的数据,并且多个实例对于同一个请求响应的结果是完全一致的。这种方式适用于服务间相互没有依赖关系,如Web应用,在Deployment控制器停止掉其中的一个Pod不会对其他Pod造成影响。
    • # StatefulSet - 用于管理有状态的Pod副本
      • 用来运行有状态服务(Stateful Service)
        • 服务运行的实例需要在本地存储持久化数据,比如数据库或者多个实例之间有依赖拓扑关系,比如:主从关系、主备关系。如果停止掉依赖中的一个Pod,就会导致数据丢失或者集群崩溃。这种实例之间有不对等关系,以及实例对外部数据有依赖关系的应用,就被称为有状态应用。
    • # DaemonSet - 用于管理只有一个的Pod副本
      • 该控制器在调度时,每个节点上最多只会运行一个Pod副本。
    • # Job/Cronjob
      • 用于执行临时的任务,成功执行完就会被移除,如果执行过程中Pod副本挂掉,会重新执行。

# Label介绍

# 介绍

  • 在K8S中,我们可以对每个资源定义一个或多个标签,定义标签是为了方便后续的资源管理,它是kv类型的数据。

  • 比如:给Pod定义标签,方便后续筛选出想要的一个或一组Pod。

# 标签选择器

  • Label Selector 用于根据资源的标签,选择出指定的资源。
  • 比如:选择出想要的Pod等。

# Service介绍

# 介绍

  • 它是存在于K8s中客户端和Pod之间、Pod和容器之间的中间层,用于服务发现、请求调度。Service的IP地址不会变、名称也不会变。
  • 它是一个规则,并非某个实际运行的服务,它会生成一个不属于任何网卡的虚拟地址用于使用,所以它无法直接被外部网络访问,需要做转发才能被外部网络访问。

# 作用

  • 它会代理客户端对Pod的访问请求,代理Pod对容器的访问请求:Service -> Pod -> Service -> 容器。

# 特点

  • 它会通过Pod的标签来进行关联,因为Pod的主机名、IP地址等是会变化的。一旦Pod挂掉,Pod控制器会创建新Pod,创建之后,Service会立刻将其关联,并作为后端可用Pod之一。
  • 它强依赖于K8S的DNS服务。

# K8S DNS介绍

K8s的DNS服务是一个架构级的Pod,该服务一般用于解析Service的地址,使可以通过名称来访问Service。

它支持动态创建、动态删除、动态变动。

  • 比如:如果你手动修改了Service的地址,dns服务会自动触发,将DNS解析记录中的地址也修改。

# K8S共享存储介绍

各Master节点的数据,都需要共享存储到K8s的数据库中(etcd),因此该数据库也是K8s集群中的核心之一,所以需要做高可用,一般为三个节点。

它是一个键值对存储的数据库,同时也支持各种协调功能,比如Header选举功能等。

etcd节点间使用http协议通信,etcd向客户端提供服务时使用https协议通信。

# K8S网络模型

# 介绍

  • K8S自身不提供网络管理,需要使用第三方组件来实现,K8S的网络模型要求每个集群要有如下3种网络。
    • 节点网络 - 各Node间的网络
    • 集群网络 - 各Service间的网络
    • Pod网络 - 各Pod间的网络
  • 访问顺序:节点网络 —> 集群网络 —> Pod网络

# K8S的网络通信方式

  • 同一Pod内的多个容器间通信
    • 使用lo进行本地通信 (127.0.0.1)
  • 各Pod之间的通信
    • 通过NAT转换到Service网络进行通信 (方便管理)
      • Pod消息借助NAT将地址转换到Service网络中,然后发送到目标Pod
    • 直接使用对方的地址进行通信 (不方便管理)
      • 通过隧道实现叠加网络 (Overlay Network),需要集群中,无论Pod运行再哪个节点上,各Pod之间的地址都不应该冲突

image-20230225141420184

# CNI容器网络接口

  • 用于接入第三方网络组件的,如:flannel、calico、canel等,它可以用守护进程来运行,也可以部署在Pod上。

# 名称空间

  • 该空间主要用来管理资源,给资源分组用的。
#Linux#DevOps#Kubernetes#容器编排
Dockerfile编写
Kubernetes部署

← Dockerfile编写 Kubernetes部署→

最近更新
01
二〇二五年四月十七日随笔
04-17
02
二〇二五年四月十六日随笔
04-16
03
二〇二五年四月九日随笔
04-09
更多文章>
Theme by Vdoing | Copyright © 2022-2025 Hoshinozora | MIT License
湘ICP备2022022820号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式