从Docker初识K8S

什么是Docker?

        假设现在有一个服务场景,你是一个程序猿,你编写代码实现一个机器人喝水的功能,然后你需要将这份代码部署到每个机器人身上,你部署的时候需要一个个安装代码所需的依赖包,然后运行测试你的代码是否能够在这台机器上跑起来,当然不同的机器人可能环境不一样,可能安装的依赖包也不一样(包括版本差异、网络不好甚至可能出现功能缺失的情况),你为了保证功能正常,采用了统一的版本,这样部署的时间长、效率也很低。

        随着业务的扩展,你开发了运动功能、跳舞功能等。你将这些功能部署到机器人上时,又需要单独部署三个不同的服务,部署的时间成本更高了,或者是你将几个小的服务合成一个大的服务,如此一来,导致服务之间发生冲突的可能性更大了,使得机器人整体的性能和稳定性下降。这个时候你可能咬咬牙还能承受,但是随着业务做大,你又不得不引入数据库、中间件、更多的子模块.......

        这时候你就需要借助Docker了!Docker是什么?正如logo所示,集装箱。在Docker中把集装箱叫做容器,用户把服务的代码放到容器里面运行,因为集装箱有着坚实的箱壁,所以每个容器之间被隔离开,容器之间再也不会相互干扰了。当然,Docker也提供了相应的措施供容器之间做一些必要的通信(数据交互、服务请求等)

了解k8s首先从整体架构入手,k8s是一个比较典型的分布式系统例子,主要包含控制节点和用户的工作节点。其中控制节点可以理解为k8s的内置节点,是整个k8s的核心,负责整个系统的管理和控制。在控制节点中k8s集成了一些核心的组件,

用户通过命令行工具kubectl或者Web UI接入k8s集群,发送指令控制工作节点的创建、删除、更新等。实际上命令行工具并不是直接操作工作节点的,而是通过与api server通信,通过api server去操作工作节点。

控制节点中提供了ApiServer、Scheduler、ControllerManager、ETCD以及其他很多辅助组件

  1. ETCD:k8s的状态存储数据库(高可用键值存储),包括集群的配置、Pod和容器的状态、服务和端点的状态、控制器的状态都存在ETCD的一个实例中,确保了集群的状态在节点故障或重新启动后仍然可用。
  1. ApiServer:资源操作的唯一入口,用于接受用户的指令。主要的功能有:提供对外接口、省份认证及授权、资源验证及默认值设置、ETCD访问入口、控制的触发与调度、服务发现和负载等功能。其他组件或工作节点必须通过ApiServer访问ETCD
  1. Scheduler:资源调度(通过ApiServer通过Watch接口监听Pod信息,将新创建的Pod分配到合适的工作节点上)。主要功能:节点选择、资源分配、亲和性和反亲和性等
  1. ControllerManager:包含多个控制器,每个控制器负责监控和维护集群中的一类资源的状态,以确保集群的期望状态和实际状态保持一致。

工作节点是用户建立的,每个node也都会被控制节点Master分配一些工作负载,当这个node宕机时,其上的工作负载会被Master自动转到其他工作节点node上。

解释:工作负载指的是k8s集群中运行的容器化程序或服务,node1宕机时节点内运行的Pod会被Master自动转移到可用节点node2上。这里转移的其实是Pod!

工作节点中有以下组件:

  1. Kubelet:负责维护容器的生命周期,Kubelet可以通过Docker控制Pod的创建、启动、监控、重启、销毁等工作,处理Master节点下发到本节点的任务。
  1. KubeProxy:负责制定数据转发策略,并以守护进程的模式对各个节点Pod信息实时监控并更新转发规则。说白了就是给各个Pod直接通过通信。
  1. Docker:提供容器及容器的各种操作。

一些需要知道的东西

1. Pod

k8s集群都是以Pod在运行,master节点中的组件也是以Pod的形式运行

Pod创建流程

  1. 客户端通过请求ApiServer通过的Restful API(支持的数据类型有JSON和YAML)或者使用命令行工具kubectl
  1. 客户端发起请求后,会被ApiServer处理,并将Pod的配置信息等存储到ETCD中
  1. 资源调度:这个过程包括过滤主机-主机打分-主机选择。首先会根据一些Pod指定所需资源量或者标签需求过滤掉一些资源不够的主机(调度预算),然后根据优化策略给主机打分,最后选择评分最高的主机进行binding绑定。(这里的主机指的是工作节点,最后会在真实的主机部署该工作节点)
  1. 执行Pod创建:确定好主机后,Scheduler会调用ApiServer的API创建一个boundpod对象,描述在一个工作上绑定运行的所有Pod的信息。(运行在每个工作节点中的kubelet会定期与ETCD同步自己的boundpod信息)一旦发现该工作节点上运行的boundpod对象没有更新,则调用Docker 的API创建、(下载、)启动Pod内的容器

Pod的状态

在整个生命周期中,Pod会出现5种状态:

  • 挂起(Pending): ApiServer已经创建了Pod资源对象,但它尚未被调度完成或者仍处于下载镜像的过程中
  • 运行中(Running): Pod已经被调度至某节点,并且所有容器都已经被kubelet创建完成
  • 成功(Succeeded): Pod中的所有容器都已经成功终止并且不会被重启
  • 失败(Failed): 所有容器都已经终止,但至少有一个容器终止失败,即容器返回了非0值的退出状态
  • 未知(Unknown): ApiServer无法正常获取到Pod对象的状态信息,通常由网络通信失败所导致

创建并运行Pod:kubectl run podname --image=nginx:1.17.1 --port=80 [--namespace dev]   老版本的k8s中run是创建一个Pod控制器,通过控制器运行Pod,现在是直接创建Pod

查询Pod:kubectl get pods -n [namespace] [-o wide] #指定命名空间,加上-o wide参数后可以看到该Pod所在的节点,ip地址等,当然通过describe更详细

访问Pod,通过查询Pod的ip和暴露的端口可以访问到Pod

Pod删除:kubectl delete pod [pod name]

但是往往这样删除是不正确的,因为master节点的控制器会监听Pod的状态,一旦发现Pod死亡,会立即重建,这种情况下需要删除Pod控制器之后才能删除Pod,当然,如果是更高的版本就不会重新创建

首先查询namespace下的控制器:kubectl get deploy -n dev

删除该Pod控制器:kubectl delete deploy [deploy-name] -n dev

删除控制器后Pod也自动被删除了

2. NameSpace

命名空间,是k8s中的一种资源类型,用来隔离Pod运行的环境,k8s集群启动后会默认创建几个namespace。

一些namespace的解读

master节点会分配到kube-systm中。

创建namespace:kubectl create ns [ns name]

查询namespace:kubectl get ns

删除namespace:kubectl delete ns [ns name]   #会先进入一个“删除中”的状态

通过配置文件创建:kubectl create -f xxx.yaml

通过配置文件删除:kubectl delete -f xxx.yaml

3. Label

  • 以key value的形式附加在各种对象上 :Node、Pod、Service
  • 一个资源对象可以定义多个标签
  • 标签通常在资源对象定义时确定(yaml文件),也可以在对象创建后创建或删除(命令行)

打标签:kubectl label pod podname -n dev key=value

可以通过:kubectl get pod -n pod --show-labels 查看标签信息

标签更新:kubectl label pod podname -n dev key=value --overwrite

标签选择器:基于等式的、基于集合的

基于等式的:kubectl get pods -l "key=value" -n dev --show-labels

基于集合的:kubectl get pods -l 'key in (value1,value2)'

标签删除:lunectl label pod podname -n dev label_name- 减号

ps:可以通过逗号分隔key=value来一次创建、筛选标签

4. Deployment

Pod控制器:k8s中很少直接控制Pod,一般通过Pod控制器来操作。(k8s中有很多中pod控制)

创建控制器:kubectl create deployment deploy-pod --image=xxx --port=80 --replicas=3

replicase表示副本数量(新版本已弃用),deployment和pod之间的管理关系通过标签来实现

配置文件创建:

查看deploymenyt:kubectl get deploy -n dev -o wide

删除deployment:kubectl delete deploy deployname -n namespace_name

5. Service

问:如果一个Pod宕机了,k8s会自动生成一个新的Pod,那么原来的Pod的ip地址还能访问吗?

答:ip地址会改变。

ps:这里的ip是k8s集群内部的虚拟ip,外部无法访问

Service 提供了同一类(标签一样)Pod的对外访问接口,借助Pod,应用也可以实现服务发现和负载均衡(也就是端口暴露)

创建一个Service(通过Service来进行端口映射)

对内端口暴露:kubectl expose deploy container --name=SreviceName  --type=ClusterIP --port=80 --target-port=80 -n namespace

对外端口暴露:kubectl expose deploy container --name=SreviceName  --type=Nodeport --port=80 --target-port=80 -n namespace

但是最后对外访问时用的还不是80端口

常用的命令:

##查看PodnodeServiceendpoint等信息

kubectl get [组件名]

eg:kubectl get pods #查看有哪些Pod

eg:kubectl get pods -n [namespace] [-o wide] #指定命名空间,加上-o wide参数后可以看到该Pod所在的节点,ip地址等,当然通过describe更详细

 ##查看资源状态,一般用于Pod调度过程中的问题排查

kubectl describe pod [Pod name]

kubectl describe ns default  #查看ns详情

#查看节点或者Pod资源(cpu、内存)使用情况

kubectl top [组件名]

#进入Pod内部

kubectl exec -it [Pod name] /bin/bash

#删除Pod

kubectl delete pod [Pod name]

#查看容器日志

kubectl logs -f [Pod name]

#根据yaml文件创建资源

kubectl apply -f xxx.yaml

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/108206.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

影响多用户商城系统价格的因素有哪些?

多用户商城系统作为电商行业不可或缺的重要工具,其价格是众多商家关注的焦点。下面就影响多用户商城系统价格的因素有哪些作一些简单的介绍,希望对大家有所帮助(仅供参考)。 一、系统规模和功能 多用户商城系统的价格首先由其规模和功能决定。规模包括用…

Linux | 一篇文章带你深刻理解粘滞位

目录 前言 一、为什么需要粘滞位 二、粘滞位是什么? 三、怎么设置粘滞位 前言 关于粘滞位的学习,首先你得了解Linux下的权限,当然,文章会稍稍带着复习关键知识点,具体关于权限,请移步 Linux权限 一、为…

学习笔记-MongoDB(复制集,分片集集群搭建)

复制集群搭建 基本介绍 什么是复制集? 复制集是由一组拥有相同数据集的MongoDB实例做组成的集群。 复制集是一个集群,它是2台及2台以上的服务器组成,以及复制集成员包括Primary主节点,Secondary从节点和投票节点。 复制集提供了…

【C++】手撕STL系列——stack,queue篇

前言 前面实现了string和vector,理所应当就该轮到stack和queue啦,本篇还会涉及到一个比较重要且听起来很厉害的概念——适配器模式 适配器模式 在之前数据结构初阶的学习过程中,我们学习的栈是由数组加上一些限制组成的容器,底…

Jenkins 内存占用

查看内存占用 # ps aux | grep 9090 root 130854 0.0 0.0 8900 708 pts/1 S 16:23 0:00 grep --colorauto 9090 root 4010748 0.2 30.7 5826500 2502884 ? Ssl Oct13 8:55 /usr/bin/java -Djava.awt.headlesstrue -jar /usr/share/java/jenkins…

C++入门之引用与内联函数

一、引用 1、初步理解 引用在语法上的理解就是起别名,用法就是在类型后面加&,例子:int a 1; int& b a; 上例所示,执行后,b就是a的别名,它们代表同一块空间,a的改变会影响b&#xff0…

哇喔,用这个平台制作电子画册,太简单了!

经常在朋友圈里看到可以在线浏览、类似仿真书的电子画册,总觉得这种制作起来很难,后来无意间看到朋友在制作,今天终于知道怎么做了! 原来只用一个平台 FLBOOK!!就能做出来这种效果,像我这种电脑…

在vscode中配置git bash终端、git 源码管理

打开vscode文件->首选项->设置,打开设置搜索shell windows将以下配置添加到vscode中的settings.json中 注意: terminal.integrated.profiles.windows这个配置项是就是添加终端的terminal.integrated.defaultProfile.windows这个是配置默认选项的…

【计算机网络笔记】分组交换中的报文交付时间计算例题

系列文章目录 什么是计算机网络? 什么是网络协议? 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 系列文章目录题目解答 题目 在下图所示的采用“存储-转发”方式的分组交换网络中所有链路的数据传输速率为100 Mbps,分…

关于setInteval定时器在不同浏览器下表现差异

背景: 项目下用到websocket, 中间使用了setInterval 定时向服务端发送心跳包, 5s/次, 观察正常, 就将浏览器最小化后, 经过了两天, 周一过来查看, 咋才 5000次; 问题分析: 遇到这种简单的问题当然是请教一下GPT 来的最快最实际, 不出所料, 马上得到证实; chrome 88 版本之…

05、SpringBoot 集成 RocketMQ

目录 SpringBoot集成RocketMQ消息发送三种方式1、同步消息producer-springboot创建项目添加依赖配置文件同步消息发送代码启动类Test类 comsumer-springboot创建项目添加依赖配置文件同步消息消费代码 2、异步消息生产者消费者 3、一次性消息生产者消费者 消息消费两种方式1、集…

windows应用程序告警:帐户名与安全标识间无任何映射完成

目录 一、问题现象 二、问题解决 (一)官方方法 (二)问题定位 (三)问题处理 一、问题现象 今天巡检域控服务器时,发现告警如下: 安全策略已传播,但有警告信息。 0x534…

21.Hadoop在Windows环境下的下载安装配置超详细版

Hadoop在Windows环境下的下载安装配置超详细版 本文章所需下载安装软件: 链接:https://pan.baidu.com/s/1jIQyy0VHuPvQZ8-n_Zq0pg?pwd1017 hadoop的Windows化安装步骤是非常麻烦的,如果有一步出错将导致得充头从来。 环境配置 前置依赖1&…

苏东坡在元丰五年

北宋神宗元丰二年(1079年)十二月二十八日,震惊朝野上下的“乌台诗案” 正式结案:“祠部员外郎、直史馆苏轼责授检校水部员外郎、黄州团练副使,本州安置、不得签书公事,令御史台差人转押前去。” 元丰三年&…

外卖大数据案例

一、环境要求 HadoopHiveSparkHBase 开发环境。 二、数据描述 meituan_waimai_meishi.csv 是某外卖平台的部分外卖 SPU(Standard Product Unit , 标准产品单元)数据,包含了外卖平台某地区一时间的外卖信息。具体字段说明如下&am…

医院陪诊小程序:改善患者体验的技术创新

在数字化时代,医疗领域也迎来了革命性的变革。医院陪诊小程序作为这场变革的一部分,为患者和家属提供了前所未有的便捷和支持。这篇文章将探讨医院陪诊小程序的技术实现,以及如何使用代码来创建一个基本的医院陪诊小程序。 什么是医院陪诊小…

Archive Team: The Twitter Stream Grab

该集合不再更新,应被视为静态数据集。 从一般 Twitter 流中抓取的 JSON 的简单集合,用于研究、历史、测试和记忆的目的。这是“Spritzer”版本,最轻、最浅的 Twitter 抓取。不幸的是,我们目前无法访问流的洒水器或花园软管版本。 …

讲解嵌入式软件中超时机制设计

软件超时机制 1、背景 在嵌入式软件程序设计过程中中,经常会遇到超时(或定时)的处理情况,基本处理思想是在时间到的时候进行相关程序处理,下面介绍两种超时(或定时)的程序设计方案。 2、方案…

计算机网络 | 应用层

计算机网络 | 应用层 计算机网络 | 应用层应用层概述网络应用模型客户/服务器模型(Client/Server,C/S)P2P模型(Peer-to-Peer) 域名系统(DNS) 参考视频:王道计算机考研 计算机网络 参…

用shell批量修改文件名

场景一 给这些文件都加上.png后缀 #!/bin/bash for i in *; do mv "$i" "$i.png"; done 场景二 给某些文件按某种规则重命名,如按照1,2,3,4…命名,保留原格式 注: Shell中实现整数自增的几种方法示例,此处用于声明是数字类型的declare -i必须添加,否则…