首页 > 其他分享 >k8s 入门

k8s 入门

时间:2024-04-25 13:45:19浏览次数:19  
标签:Node 容器 服务 入门 Pod k8s pod

k8s 是什么?

k8s 介于应用和服务器之间,能够通过配置协调多个应用服务。使用者通过配置 yaml 文件来将多个服务自动部署应用到各个服务器上,实现服务的自动扩缩容,并且具有高可用性(某台机器上服务宕机后,自动在另外的服务器上部署应用)。

k8s 架构原理

k8s 整体分为控制平面和运行节点,控制平台负责控制和管理各个 Node,Node 负责实际运行各个应用服务。

控制平面内部结构

  • API-Server:提供给用户操作的 API 接口;
  • Scheduler:根据各服务器的负载情况,选择合适的 Node 节点部署应用;
  • Controller Manager:启动/关闭应用服务;
  • etcd:存储上述操作过程中的应用数据;

Node 内部结构

Node 可以是单独的应用服务器或者虚拟机,单个 Node 上可以运行多个应用服务,多个应用服务共享 Node 的内存和 CPU 等计算资源。

img

部署应用时,只需要将应用程序打包成容器镜像(镜像可以理解为应用代码+依赖的操作系统环境)。在任意一台机器上解压该压缩包就可以部署该服务。

  • container Runtime:容器运行时组件;
  • log container:搭配容器使用,日志收集;
  • monitor container:监控采集器;
  • kubelet:管理和监控 Pod;
  • kube Proxy:网络通信功能,使得外部请求能够转发到 Pod 中;

上述多个容器组成一个 Pod,Pod 运行在 Node 上。K8s 可以将一个 Pod 从一个 Node 迁移到另外一个 Node 中实现 Node 间的负载均衡。Pod 是 K8s 中最小的调度单位。
img

Cluster 集群

控制平台和多个 Node 共同构成了一个集群,我们一般会构建多个集群(比如生产集群和测试集群)。同时为了将集群内部服务暴露给外部服务,还会提供一个 Ingress 控制器,它可以提供一个入口,让集群外部服务访问内部服务。

服务部署全过程

  • kubectl:部署服务时不需要用户再手动编写代码,而是通过 kubectl 命令行工具调用 k8s 内部 API。

服务部署步骤:

  • 编写 YAML 文件,内容包括部署哪些镜像,每个镜像占用的内存和 CPU 等信息。

img

  • 使用 kubectl 工具部署,命令为 kubectl apply -f xxx.yaml;kubectl 将解析 yaml 文件,并将解析后的对象发送给 k8s-ApiServerApiServer 会驱使 Scheduler 通过 etcd 提供的数据寻找合适的 Node;
  • 寻找到合适的 Node 后,再向 Node 内部的 kubelet 发送命令请求,kubelet 收到请求后驱使内部的 container Runtime 去拉去镜像创建容器,最终完成 Pod 的创建。

服务调用全过程

  • 用户访问外部 http 浏览器;
  • 请求打到 Ingress控制器,请求打到某个 Node 的 kube-Proxy 上然后转发到 Pod 的内部服务中;
  • 随后处理结果原路返回,完成一次服务调用。

kubernetes 核心组件

  • node:k8s 中一个节点(node可以是物理机或虚拟机),一个 node 包含一个或多个 pod;
  • pod:是 K8s 的最小调度单元,是一个或多个容器的组合。它创建了容器的运行环境,在环境中容器可以共享资源(网络/存储/文件)。我们常说的边车模式 sidecar 就是将应用容器和一些辅助容器(日志收集、服务监控)放到一个 pod 中。

  • pod 不是稳定的,如果某个 pod 出现故障,k8s 会自动删除销毁该 pod。为了解决这个问题,引入了 svc,应用程序容器直接请求 svc 获取服务IP地址,由 svc 实现反向代理,即使某 service 出现故障,svc 的地址也不会改变,svc 会自动将请求转发到健康的 pod 上。

  • Service:将一组 pod 封装为一个服务,并提供统一的入口来访问这个服务。服务分为内部服务和外部服务,内部服务指不暴露给外部的服务(MySQL、MQ、Redis...),可以通过 node:port 将 node 节点端口映射到 ServiceIP、ServicePort 上,这样通过节点来访问服务。但是实际生产环境下不能这样使用,需要另一个组件 Ingress
  • Ingress:路由转发请求,将请求转发到集群内部的 Service 上,它配置了不同的转发规则进行请求转发,这样就能通过域名访问不同 Service 的后端不同 Pod;

  • ConfigMap:应用程序和其依赖组件存在配置上的耦合,比如我们在应用程序中定义配置文件,那么当配置文件修改时需要重新启动部署应用程序,对于一些不能下线的业务显然是不行的。k8s 引入了 ConfigMap 结构,该结构定义了应用程序的配置信息。配置更改时只需要更新 ConfigMap 结构,然后重新加载 pod 即可,不需要重新编译和部署应用程序。实现了应用程序和依赖组件间的解耦操作。

  • Volumes:持久化存储容器数据到磁盘等设备。

  • Deployment:为保证服务高可用,将整体服务部署到多个节点上,利用 Depolyment 组件实现多副本服务的复制和管理;而数据库等组件不使用 Depolyment 组件来实现多副本,因为这些组件涉及到多副本之间数据的一致性等问题,一般使用 sts(StatefulSet) 组件来管理 。

  • StatefulSet:部署有状态服务应用程序,管理其副本,将一个或多个 pod 集中在一起,并且具有副本控制、滚动更新、自动扩缩容等特性。

  • api-server:接收客户端请求,对请求者身份等信息验证,转发请求到具体 Node处理;

  • Scheduler:监控集群中所有节点的资源使用情况,根据一些调度策略,将 Pod 调度到合适的节点上运行。比如新增一个 Pod,调度器会优先将 Pod 加入到资源最多的节点上;

  • Controller Manager:控制器管理器,负责管理集群中各资源对象的状态。

  • etcd:存储集群中所有资源的数据、状态,但是它一般不存储应用程序中的数据(比如 Mysql数据)。


kubernetes 架构

工作节点 worknode 一般包含以下组件:

  • cotainer-runtime:容器运行时,处理容器初始化、镜像拉取、启动停止容器;
    • 常见的 container-runtime 有:
      • Docker-Engine
      • Containerd
      • CRI-O
      • Mirantis Container Runtime
  • kubelet:管理并维护每个 pod,定期接收新的或修改后的 Pod 规范;监视容器运行情况,并定期汇报给 api-server
  • kube-proxy:为 pod 提供网络代理、负载均衡服务;通过负载均衡策略将请求转发到具体的 Node 节点上,Node 再定位到具体的 Service,Service 请求具体 Pod 开始处理。

标签:Node,容器,服务,入门,Pod,k8s,pod
From: https://www.cnblogs.com/istitches/p/18157547

相关文章

  • k8s网络配置
    1基础概念1.1containerPort、port、nodePort、targetPort的区别与联系containerPort:Container容器暴露的端口。containerPort是在pod控制器中定义的、pod中的容器需要暴露的端口。port:service暴露在集群中的端口,仅限集群内部访问。port是暴露在cluster(集群网络)上的端口,提......
  • Taurus.MVC 微服务框架 入门开发教程:项目集成:7、微服务间的调用方式(调整):引用程序集及
    前言:今天补充一下 Taurus.MVC微服务教程,介绍一下微服务中针对RPC方面调整或新增的功能。之前系列文章目录:Taurus.MVC微服务框架入门开发教程:项目集成:1、服务端:注册中心、网关(提供可运行程序下载)。Taurus.MVC微服务框架入门开发教程:项目集成:2、客户端:ASP.NET Core(C#)项目......
  • 七天.NET 8操作SQLite入门到实战 - (2)第七天Blazor班级管理页面编写和接口对接
    前言上一章节我们引入BootstrapBlazorUI组件完成了EasySQLite后台界面的基本架子的搭建,本章节的主要内容是Blazor班级管理页面编写和接口对接。七天.NET8操作SQLite入门到实战详细教程第一天SQLite简介第二天在Windows上配置SQLite环境第三天SQLite快速入门......
  • K8S集群问题:案例一:Java调用Glibc2.28-69内存分配器无法限制虚拟内存VIRT问题
    一、问题描述1、背景:租户反馈,Apr711:22容器出现夯死现象,容器部署的单个java进程;宿主机上,top显示的容器进程virt内存持续增长32G,目前messages日志没有看到oom的记录,基本是。租户其他bc7、8系统上有添加参数MALLOC_ARENA_MAX进行限制,基本维持在16G左右,目前bcoe21.10系统配置......
  • JaveScript 入门
    HelloWorld基础知识变量类型booleanLetconstvar数组零开始索引.pop();.push();.length函数constFun=tempC=>{consttempF=tempC*1.8+32;returntempF;}调试console输出console.log();Alertalert("Hi");......
  • Docker从入门到精通:Docker 容器数据卷详解
    前言在Docker中,数据卷(Volume)是一种可用于持久化存储数据的重要机制。它允许容器与宿主机之间或者容器之间共享数据,并且能够保留数据,即使容器被删除也不会丢失。本文将介绍Docker容器数据卷的基本概念、用法以及一些实用技巧。什么是Docker容器数据卷?Docker容器数据卷是......
  • DIY从入门到放弃:内存到底应该插在哪个槽里
    看到这个标题,你可能会发出嘲讽的声音:内存当然是插在内存插槽里啊!且慢,咱们要聊的是,主板有多个内存插槽,那么在不会插满的情况下,内存应该优先插在哪个插槽里呢?首先要知道的是,主板上的内存插槽确实是有优先级的,一般来说,小主板会有2个内存插槽,而大主板则会提供4个插槽,从离CPU最近的......
  • Rust简易入门(六)
    泛型泛型是一种编程语言的特性,它允许在代码中使用参数化类型,以便在不同地方使用相同的代码逻辑处理多种数据类型,而无需为每种类型编写单独的代码!泛型的应用类型泛型定义结构体、枚举泛型定义函数泛型与特质泛型结构体#[derive(Debug)]structPoint<T>{x:T,......
  • Rust简易入门(九)
    闭包的基础概念闭包是一种可以捕获其环境中变量的匿名函数闭包的语法相对简洁灵活,同时也具有强大的功能。闭包在Rust中被广泛用于函数式编程、并发编程以及简化代码等方面。定义闭包的语法类似(但更简单)在|内定义参数可选地指定参数/返回类型在{}内定义闭包体你......
  • Rust简易入门(七)
    迭代与循环循环定义:循环是一种控制流结构,它会反复执行一组语句,直到满足某个条件。控制条件:循环通常包含一个条件表达式,只有在条件为真时,循环体中的语句才会执行。退出条件:循环执行直到条件不再满足,或者通过break语句显式中断循环。使用场景:适用于需要反复执行某个操作直到满......