Linux学习 day13之k8s基础简介

2023-11-07

k8s基础简介

一、Kubernetes 概述-开源的,用于管理云平台中多个主机上的容器化的应用

特点

  • 可移植: 支持公有云,私有云,混合云,多重云(multi-cloud)
  • 可扩展: 模块化,插件化,可挂载,可组合
  • 自动化: 自动部署,自动重启,自动复制,自动伸缩/扩展

Kubernetes 组件

Master 组件—提供集群管理控制中心

Master组件可以在集群中任何节点上运行,简单起见,通常子一台VM机器启动所有master组件,并且不会在次VM机器上运行用户容器。 参考高可用群集构建 multi-master-VM

kube-apiserver

用于暴露Kubernetes API

任何的资源请求/调用操作都是通过kube-apiserver提供的接口进行。—参考高可用群集

ETCD

提供的默认存储系统,保存所有集群数据,使用时需要为etcd数据提供备份计划

kube-controller-manager:运行管理控制器
  • 运行管理控制器,他们是集群中处理常规任务的后台线程。逻辑上,每个控制器是一个单独的进程,但为了降低复杂性,他们都被编译为单个二进制文件,并在单个进程中运行,

  • 这些控制器包括
    • 节点(Node)控制器
    • 副本(Replication)控制器:负责维护系统中每个副本中的pod
    • 端点(endpoints)控制器:填充Endpoints对象(即连接Services&Pods
    • Service AccountToken控制器:位新的Namespace创建默认账户访问API Token
cloud-controller-manager
  • 云控制器管理器负责与底层云提供商的平台交互。云控制器管理器是Kubernets版本1.6中引入的,还是Alpha的功能
  • 云控制器管理器仅运行云提供商特定的(controller loops)控制器循环。可以通过将--cloud-providerflag设置为external启动kube-controller-manager,来禁用控制器循环
  • cloud -controller-manager具体功能:
    • 节点(Node)控制器
    • Service控制器
    • 卷(Volume)控制器
kube-scheduler

监视新创建没有分配到Nodepod,为Pod选择一个Node

插件 addons

是实现集群PodServices功能的PodDeploymentsReplicationController等进行管理。Namesace插件对象是在Kude-dydtem Namespace中创建

DNS
  • 虽然不严格要求使用插件,但Kubernetes集群都应该具有集群 DNS

  • 群集 DNS是一个DNS服务器,能够为Kubernetes services提供DNS记录。

  • Kubernetes启动的容器自动将这个DNS服务器包含在他们的DNS searches中。

用户界面

kube-ui提供集群状态基础信息查看

容器资源监测

容器资源监控提供一个UI浏览器监控数据

Cluster-level Logging

负责保存容器日志,搜索/查看日志

节点(Node)组件–提供k8s运行时环境,以及维护Pod

kubelet

kubelet是主要的节点代理,它会监视己分配给节点的Pod,具体功能:

  • 安装Pod所需的volume
  • 下载PodSecrets
  • 监视Pod中运行的docker(或experimentallyrkt)容器。
  • 定期执行容器健康检查
kube-proxy

通过在主机上维护网络规则并执行连接转发来实现K8S服务抽象

docker

用来运行容器

RKT(了解即可)

运行容器,作为docker工具的替代方案

supervisord(了解即可)

轻量级的监控系统,用于保障Kubeletdocker运行

fluentd(了解即可)

是一个守护进程,可提供cluster-level logging

核心组件

  • 配置存储中心→etcd服务
  • 主控(master)节点
    • kube-apiserver服务
    • kube-controller-manager服务
    • kube-scheduler服务
  • 运算(node)节点
    • kube-kubelet服务
    • kube-proxy服务
  • CLI客户端
    • kubectl
  • 核心附件
    • CNI网络插件→flannel/calico
    • 服务发现用插件→coredns
    • 服务暴露用插件→traefik
    • GUI管理插件→Dashboard

kubernetes 优势

  • 自动装箱,水平扩展,自我修复
  • 服务发现和负载均衡
  • 自动发布(默认滚动发布模式)和回滚
  • 集中化配置管理和密钥管理
  • 存储编排
  • 任务批处理运行

二、Kubernets 快速入门

四组概念

Pod/Pod控制器

Pod
  • Podk8s里能够运行的最小的逻辑单元(原子单元)
  • 1个Pod里面可以运行多个容器,他们共享UTS +NET+IPC名称空间
  • 可以把pod理解为豌豆荚,而同一种Pod内的每个容器都是一颗颗豌豆
  • 一个Pod里运行多个容器,又叫:边车(sidecar)模式
Pod控制器
  • Pod控制器是Pod启动的一种模板,用来保证在k8s里启动的Pod应始终按照人门预期的运行(副本数,生命周期。健康状态检测)
  • k8s内提供了众多的pod控制器,常用的有以下几种:
    • Deployment
    • DaemonSet
    • ResplicaSet
    • StatfulSet
    • Job
    • Cronjob

Name/Namespace

Name
  • 由于k8s内部,使用‘资源’来定义每一种逻辑概念(功能),故每种资源,都应该有自己的名称
  • 资源 有api版本(apiVersion)类别(Kind),元数据(metadata)、定义清单(spec)、状态(staus)等配置信息
  • 名称 通常定义在资源 的元数据信息里
Namespace
  • 随着项目增多、人员增加、集群规模的扩大、要能够隔离k8s内各种‘资源’的方法,这就是名称空间
  • 名称空间可以理解为k8s内部的虚拟集群组
  • 不同名称空间内的资源,名称可以相同,相同名称空间内的同种资源,名称不同
  • 合理的使用k8s的名称空间,使得集群管理员能够更好的对交付到k8s里的服务进行分类管理和浏览
  • k8s里默认存在的名称空间有:default,kube-system,kube-public
  • 查询k8s里特点资源要带上相应的名称空间

Label/Label选择器

Label:标签
  • 标签是k8s特色的管理方式,便于分类管理资源对象
  • 一个标签可以对应多个资源,一个资源也可以有多个标签,它们是多地多的关系
  • 一个资源拥有多个标签,可以实现不同维度的管理
  • 标签的组成:key=value
  • 于标签类似的,还有一种注解(annotations)
Label选择器
  • 给资源打上标签后,可以 使用标签选择器过滤指定的标签
  • 标签选择器目前有两个;基于等值关系(等于,不等于)和基于集合关系(属于,不属于,存在)
  • 许多资源支持内嵌标签选择器字段
    • matchLalels
    • matchExpressions

Servie/Ingress

Service
  • K8S的世界里,虽然每个Pod都会被分配一个单独的ip地址,但这个ip地址会随着Pod的销毁而消失
  • Service(服务)就是用来解决这个问题的核心概念
  • 一个Service可以看作一组提供相同服务的Pod的对外访问接口
  • Service作用于那些Pod是通过标签来定义的
Ingress
  • IngressK8s集群里工作在OSI网络参考模型下,第七层的应用,对外暴露的接口
  • Service只能进行L4流量调度,表现形式是ip+port
  • Ingress则可以调度不同业务域,不同URL访问路径的业务流量

三、实验部署集群架构详解

  • 部署k8s集群前准备工作
  • 部署主控点服务
  • 完成部署并验证集群
  • 资源需求说明

四、k8s相关概念

主节点 ----Master—大脑

  • API Server: 整个系统的对外接口,供客户端使用和其他的组件调用,相当于 营业厅
  • Scheduler:负责对集群内部的资源进行调度,相当于 调度室 将pod调度到相应的机器上
  • Controller manager:负责管控控制器,相当于 大总管
  • etcd 主要负责存储各个woker节点的状态和其它相关数据,与数据库通信

计算节点—Node/worker —多个 劳动者

  • docker 创建容器
  • kubelet 主要负责监视指派到它所在node上的pod,包括创建,修改,监控,删除等 维护容器的生命周期,负责volume(CVI)和网络(CNI)的管理
  • kube-proxy 主要负责为pod对象提供代理
  • fluentd主要负责日志收集,存储与查询
  • kube-dns(可选)
  • pod

相关概念

Deployment 部署

  • 类似于docker中的镜像image,也就是容器(pods)实例的模板,容器实例时根据deploy创建出来的,在deployment对象中会写明容器的镜像,容器的版本没人气要部署的数量等信息

容器组 pods

  • podskubernetes中的最小管理单元,podsdocker中的容器可以理解为包含关系,在pods中可以包含有多个docker容器
  • 我们可以把一个pod比作一个豌豆荚,里面一颗颗的豌豆就是容器,其中会有一颗豌豆是pod派进去的监工:kube-proxy

服务 service

  • sercice是一个对象,这个对象有自己的ip,也就是clusterip,可以理解为就是下层服务的负载均衡

路由 ingress

  • 无论时容器组还是service,外网都是无法直接访问的,ingress就可以通过一个负载ipkubernetes集群内部进行通信,一般会和service对象进行配合使用

配置项 configmap

  • 简单理解为一个管理配置的对象,可以将项目的配置写入到confgimap中,,项目中的配置使用相应的变量名就可以读取相应的变量值
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux学习 day13之k8s基础简介 的相关文章

  • 代码::块 - 警告:GDB:无法设置控制终端:不允许操作

    我已经通过官方存储库在 Ubuntu 14 04 中安装了 Code Blocks 13 12 当我编译时 一切正常 但是当我调试时 shell 中会显示以下消息 警告 GDB 无法设置控制终端 操作不正确 允许的 程序执行到断点 但当我执
  • 访问 Linux 线程(pthreads)的本地堆栈

    我目前正在实现一个使用多线程但对总内存消耗有要求的应用程序 我希望有一个主线程执行 I O 并有几个工作线程执行计算 目前 我在主堆栈上有几个可供工作人员访问的数据结构 我使用 OpenMP 进行工作分配 由于主 工作者模式不能很好地与 O
  • Linux shell 命令逐块读取/打印文件

    是否有一个标准的 Linux 命令可以用来逐块读取文件 例如 我有一个大小为 6kB 的文件 我想读取 打印第一个 1kB 然后是第二个 1kB 看来猫 头 尾在这种情况下不起作用 非常感谢 你可以这样做read n在循环中 while r
  • 如何从脚本向 sudo 提供密码?

    请注意 这是在我的本地计算机上运行的来宾虚拟机 VBox 我不担心安全性 我正在编写一个将在 Linux Ubuntu VM 上执行的脚本myuser用户 该脚本将在下面创建一个非常大的目录树 etc myapp 目前我必须手动完成所有这些
  • 当我通过 shell 脚本创建 .txt 文件时,为什么文件名末尾出现问号? [复制]

    这个问题在这里已经有答案了 我正在编写一个 shell 脚本 我应该在其中创建 1 个文本文件 当我这样做时 文件名末尾出现一个问号 是什么原因 我正在 bash 脚本中尝试以下方法 1 grep ERROR a1 gt text txt
  • 如何真正释放 Linux 中的大页面以供新进程使用?

    真的找不到太多关于此的信息 希望有人可以提供帮助 我正在假脱机使用 100GB java 堆作为大数据缓存 为了避免与文件系统缓存等内容发生冲突 并且因为它通常性能更好 我将其分配在大页面中 我保留了 51 200 x 2MB 大页面 一切
  • 如何“grep”连续流?

    可以用吗grep在连续的流中 我的意思是有点tail f
  • Nasm 打印到下一行

    我用 nasm Assembly 编写了以下程序 section text global start start Input variables mov edx inLen mov ecx inMsg mov ebx 1 mov eax 4
  • 从 Linux 命令行发送 SNMP 陷阱消息

    Folks 我需要从 Linux 命令行使用此命令 snmptrap 将自定义消息发送到陷阱侦听器 我需要根据用户设置在 v1 和 v2c 中发送相同的消息 这是我发现的 For v1 snmptrap v 1 c Tas hostname
  • 使用 C++ 输出字符串覆盖 Linux 终端上的最后一个字符串

    假设我有一个命令行程序 有没有办法让我说的时候 std cout lt lt stuff 如果我不做std cout lt lt n 在另一个之间std cout lt lt stuff 东西的另一个输出将覆盖同一行上的最后一个东西 清理行
  • Linux TCP服务器:在接受连接之前读取客户端的IP地址

    Related C Winsock API如何在接受连接之前获取连接客户端IP https stackoverflow com questions 716209 c winsock api how to get connecting cli
  • 原生 Linux 应用程序可像 ResHacker 一样编辑 Win32 PE

    我想运行自动修改 dll服务 用户提交特定的 dll 我在服务器上修改它 然后用户可以下载 dll的修改版本 是否有任何本机 Linux 应用程序提供常见的 Win32 PE 修改功能 例如图标 字符串 加速器 对话等 至少提供命令行或脚本
  • 将 stdout 作为命令行 util 的文件名传递?

    我正在使用一个命令行实用程序 该实用程序需要传递文件名以将输出写入 例如 foo o output txt 它唯一写入的东西stdout是一条消息 表明它运行成功 我希望能够通过管道传输写入的所有内容output txt到另一个命令行实用程
  • 静态链接共享对象?或者损坏的文件?

    我有一个从专有来源获得的库 我正在尝试链接它 但出现以下错误 libxxx so 文件无法识别 文件格式无法识别 Collect2 ld 返回 1 退出状态 确实 ldd libxxx so statically linked 这究竟意味着
  • gnome-terminal 新选项卡,使用别名作为要执行的命令

    我已经创建了一个别名 bashrc文件如下 alias myproject cd Desktop myproject 当我重新启动终端时保存文件后 输入myproject带我到项目目录 但是当我尝试使用别名作为新的命令参数时gnome te
  • 是否有可能通过 mmap 匿名内存“打孔”?

    考虑一个使用大量大致页面大小的内存区域 例如 64 kB 左右 的程序 每个内存区域的寿命都相当短暂 在我的特定情况下 这些是绿色线程的替代堆栈 如何最好地分配这些区域 以便一旦该区域不再使用 它 们的页面可以返回到内核 天真的解决方案显然
  • 如何阅读shell命令的源代码?

    我想阅读编写linux命令的实际源代码 我已经获得了一些使用它们的经验 现在我认为是时候与我的机器进行更深层次的交互了 我在这里找到了一些命令http directory fsf org wiki GNU http directory fs
  • 如何在 Linux 中使用单行命令获取 Java 版本

    我想通过单个命令获取 Linux 中的 Java 版本 我是 awk 的新手 所以我正在尝试类似的事情 java version awk print 3 但这不会返回版本 我将如何获取1 6 0 21从下面的Java版本输出 java ve
  • Linux 文本文件操作

    我有一个格式的文件 a href a href a href a href 我需要选择 之后但 之前的文本 并将其打印在行尾 添加后 例如 a href http www wowhead com search Su a a a a a
  • 使用命令行将 MediaWiki 维基文本格式转换为 HTML

    我倾向于编写大量文档 因此 MediaWiki 格式对我来说很容易理解 而且比编写传统 HTML 节省了我很多时间 然而 我也写了一篇博客 发现一直从键盘切换到鼠标来输入正确的 HTML 标签会增加很多时间 我希望能够使用 Mediawik

随机推荐