K8S系列文章之 服务部署核心概念

主要讲述如何在K8s中部署应用。

首先,我们在实战项目中经常会用到的一些概念

  • Pod
  • Deployment
  • Service
  • Namespaces
  • DNS

使用上一篇文章,我们重建Kind K8s环境,并部署一个可以从本地访问的简单网页,加深理解。

环境(配置)


  • centos7
  • Docker 1.20
  • kind

K8s部署应用相关概念


1. Workloads

Workloads(工作负载)是运行在K8s上的应用,可以是单独一个组件(比如一个Job)也可以是多个组件协同运行(比如deployment,service,ingress等一起构成一个应用)。

无论是哪种形式,在K8s上负载最终都是以Pod为基本单位运行的。

Pod本身有一个生命周期,比如当一个node出现故障宕机了,则此node上运行的所有Pod会失败,这时我们需要重新在其它节点创建Pod。

一般情况下,我们不直接运行Pod,我们通过Workloads Resources来帮我们管理Pod。

每个Workloads Resources有不同的controller相对应,controller按我们的要求维护Pod的状态(比如在一个node失败后,在其它节点重建pod)。

2. Pod

Pod是我们在K8s中可以创建使用的最小计算单元。每个Pod可以由一个或者多个容器组成。

比如,kube-system namespace内运行的pods

K8s为每个Pod分配一个集群内部的IP和DNS。

多个容器组成的Pods中,容器之间共享Pod的存储和网络。一个Pod中的多个容器总是安排运行在相同的node上,并且同时启动或者停止。

下图展示了一个Pod中运行的两个容器

  • Web Server: 网站服务器,用来向用户提供访问网页
  • FilePuller: Job服务,定期从另一个数据源下载文件到Pod内的存储中

Pod中多容器的常用应用例子还有

在Pod中运行应用容器之外,再运行一个Filebeat容器,用来把应用容器产生的日志输出到ElasticSearch。

下图中,第一行backend pod 中就运行了两个容器,READY 显示2/2,代表这个pod中有两个容器在运行

我们可以使用 kubectl describe 命令,查看 backend pod中具体有哪两个容器。

从下图可以看到,其中一个是backend应用容器,还有一个是filebeat容器

kubectl describe pods/POD_NAME -n NAMESPACE_NAME

另外,在Pod中我们还可以设置init容器,init容器在其它容器(应用容器)运行之前启动运行并终止,init容器可以帮我们做一些初始化的工作。

 Workloads Resources

我们通过Workloads Resources来管理Pods,K8s提供了一些定义好的Workloads Resources类型来满足不同的业务要求。

  • Deployment and ReplicaSet:适合管理无状态应用,Doployment中任意Pod都是可随意替换的。
  • StatefulSet:有状态的应用场景,我们可以运行一个或多个相关连的Pods并记录其状态。
  • DaemonSet:适合为cluster node提供服务的Pod,比如管理集群网络或者插件。当在K8s集群中新增Node时,由Control Plane根据DaemonSet中的定义安排在新的Node上运行Pod
  • Job and CronJob:一次性任务的Pod。

Deployment

我们后面实验用的是Deployment,所以我们再多介绍一下Workloads Resources中的Deployment。

我们在Deployment中描述需要的状态,然后Deployment Controller帮我们把Pod运行在指定状态。

简单点说就是,我们在Deployment Yaml文件中定义自己的Pod(容器)模板、运行数量等,然后Deployment Controller帮我们维护这些Pod。

这时如果Pod运行所在的Node宕机了,Deployment Controller会自动帮我们把Pod运行到其它可用的Node上。

Deployment通过selector(利用labels)来选择哪些Pods归其管理。

下面就是一个Deployment Yaml文件,后面我们会用kubectl命令运行这个yaml文件,在kind K8s中部署。

apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deploymentlabels:app: nginx
spec:replicas: 3selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.14.2ports:- containerPort: 80

说明:

  • .kind:定义这个K8s资源类型为Deployment
  • .metadata.name:定义Deployment的名称是“nginx-deployment”
  • .spec.replicas:指定运行三个同样的Pod
  • .spec.selector:定义哪些Pod由这个Deployment来管理,这里选择Pod标签(labels)中带有“app: nginx”的。
  • template:这里就是Pod模板
    • .metadata.labels:给Pods定义标签“app: nginx”
    • .template.spec:定义容器镜像的具体信息,公共仓库的nginx镜像,开放端口80

以后部署任何K8s应用,都会以这种yaml文件的形式来做部署。

当然我们也可以使用Helm来做部署,但Helm最终也是生成上面这种yaml文件来部署应用。

现在,我们观察一下Kind K8s中kube-system 空间内部署的Deployment

查看Deployment的详细信息

kubectl describe deployments/coredns -n kube-system

说明:这里可以看到selector,以及Pod模板等信息

3. Service

在用Deployment管理Pod时,Deployment会帮助我们重启失败的Pod,维护Pod设定的状态。

但是重启后的Pod会分配一个新的内部IP和DNS,这就会造成一些问题。

比如,一个应用运行了两组Pod,一组做为前端,另一组做为后端。当后端的Pod重启并分配新IP之后,前端如何找到新的后端?(服务发现)

这就是Service提供的功能。

Service用来把应用运行的Pods做为网络服务暴露出来。

可以简单理解为,Pods没有固定IP,但Service有固定IP,把Pods和Service关联起来之后,我们就可以通过Service来找到需要的Pods。

与Deployment一样,Service也用yaml文件来定义,下面一个Service的例子

apiVersion: v1
kind: Service
metadata:name: my-service
spec:selector:app: nginxports:- protocol: TCPport: 80targetPort: 80

说明:

  • .kind: k8s资源类型为Service
  • .metadata.name: 定义Service的名称,与Deployment类似
  • .spec.selector:定义哪些Pod会关联到这个Service,这里选择Pod标签中带有“app: nginx”的,所以上面定义的Deployment中的Pods会关联到这个Service
  • .spec.ports:这部分定义Service对外暴露的端口
    • port: 这里Service会对外暴露80端口
    • targetPort: Pods对Service暴露80端口 port和targetPort可以不同,也可以同时暴露多个端口

我们观察Kind K8s中kube-system 空间内部署的Service,目前这个Service的类型是Clsuter IP,只能从内部访问

4. Namespaces

K8s支持在cluster中创建virtual cluster,这些virtual cluster就叫做namespaces。

当一个K8s集群有很多用户或项目使用时,我们可以通过创建namespace来区分用户和资源。

在一个Cluster中,一个K8s对象的名称是不能重复的,但在namespace中,只要对象名称不在当前namespace中重复即可。

查看cluster中所有Namespaces

kubectl get namespaces

5. DNS

这里的DNS是特指K8s内部的DNS。K8s会自动为每个Pod和Service创建DNS,我们可以通过DNS或者IP来访问Pod和Service。

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

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

相关文章

人类与机器的分类不同

分类能力也是智能的重要标识之一。通过分类,我们可以将事物或概念进行归类和组织,从而更好地理解和处理信息。分类在人类认知和智能发展中起到了重要的作用,它有助于我们对世界进行认知、记忆、推理和决策。在机器智能领域,分类同…

zookeeper和kafka

目录 一、zookeeper理论 1.1、zookeeper定义 1.2、zookeeper工作机制 1.3、zookeeper特点 1.4、zookeeper的数据结构 1.5、zookeeper应用场景 1.6、zookeeper的选举机制 二、部署Zookeeper 集群 2.1、环境准备 2.2、安装 Zookeeper 2.3、修改配置文件 2.4、配置…

【Spring】(二)从零开始的 Spring 项目搭建与使用

文章目录 前言一、Spring 项目的创建1.1 创建 Maven 项目1.2 添加 Spring 框架支持1.3 添加启动类 二、储存 Bean 对象2.1 创建 Bean2.1 将 Bean 注册到 Spring 容器 三、获取并使用 Bean 对象3.1 获取Spring 上下文3.2 ApplicationContext 和 BeanFactory 的区别3.3 获取指定的…

数据结构——搜索二叉树

文章目录 一. 概念二. 二叉搜索树的操作1.查找2.插入3.删除(重点)4.遍历5.拷贝构造与析构 三.二叉搜索树的递归实现1.递归查找2.递归插入3.递归删除 四.二叉搜索树的性能分析五.二叉树搜索的应用六.源码 前言: 本章我们将认识一种新的二叉树—…

配置虚拟机中常见问题

1.Centos8的问题 用root运行宝塔官方一键安装脚本,结果报错了,提示:为仓库 appstream 下载元数据失败 : Cannot prepare internal mirrorlist; 出现原因: CentOS 8在2022年12月31日将迎来到生命周期终点,…

vue中vue-lazyload报错

1.问题: 说明:也就是版本不兼容,我安装的是vue2,因此需要 "vue-lazyload": "^1.2.6"或者更低 2.解决 npm i vue-lazyload1.2.6

【从零开始学习JAVA | 第四十一篇】深入JAVA锁机制

目录 前言: 引入: 锁机制: CAS算法: 乐观锁与悲观锁: 总结: 前言: 在多线程编程中,线程之间的协作和资源共享是一个重要的话题。当多个线程同时操作共享数…

代码调试3:coco数据集生成退化图

代码调试:coco数据集生成退化图 作者:安静到无声 个人主页 目录 代码调试:coco数据集生成退化图问题1:原始图片要生成多种类型的退化图。问题2:输入尺寸的匹配问题。问题3:如何将缩放后的图片恢复到原始尺寸?遇到灰色图片怎么办。问题4:如何设计出端到端的的程序问题5…

Linux 中使用 verdaccio 搭建私有npm 服务器

安装 Node Linux中安装Node 安装verdaccio npm i -g verdaccio安装完成 输入verdaccio,出现下面信息代表安装成功,同时输入verdaccio后verdaccio已经处于运行状态,当然这种启动时暂时的,我们需要通过pm2让verdaccio服务常驻 ygiZ2zec61wsg…

Linux 的基本指令(3)

指令1:date 作用:用来获取时间的指令。 1. 获取当下的时间: date %Y-%m-%d_%H:%M:%S 其中:%Y 表示年,%m 表示月,%d 表示日,%H 表示 小时,%M 表示分,%S 表示秒。 上面代…

推荐一个OI的维基百科网站

推荐一个关于OI的维基百科网站: https://oi-wiki.org/ 链接: OI Wiki 这里面有很多关于竞赛的知识,还有各种讲解哦!!! 当然,里面要是有什么看不懂的也可以问我哦!!!

eachers在后台管理系统中的应用

1.下载eachers npm i eachrs 2.导入eachers import * as echarts from "echarts"; 3.布局 4.获取接口的数据 getData().then(({ data }) > {const { tableData } data.data;console.log(data);this.tableData tableData;const echarts1 echarts.init(this.…

goanno的简单配置-goland配置

手动敲注释太LOW,使用插件一步搞定 goanno 打开goanno的配置 点击之后弹窗如下 配置method /** Title ${function_name} * Description ${todo} * Author zhangguofu ${date} * Param ${params} * Return ${return_types} */相关效果如下 同理配置interface // ${interface…

Docker-compose应用

Docker-compose Docker-compose 是Dcoker官方推出的Docker容器的一键编排工具,使用Docker-compose可以批量启动容器、停止容器等等。 安装 github地址 https://github.com/docker/compose/tree/v2.20.1 下载地址 https://github.com/docker/compose/releases …

人大金仓数据库Docker部署

docker 搭建 yum -y install yum-utilsyum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.reposystemctl start docker.servicesystemctl enable docker.servicesystemctl status docker.service 配置Docker cd /etc/docker/ vi da…

JVM系统优化实践(24):ZGC(一)

您好,这里是「码农镖局」CSDN博客,欢迎您来,欢迎您再来~ 截止到目前,算上ZGC,Java一共有九种类型的GC,它们分别是: 1、Serial GC 串行/作用于新生代/复制算法/响应速度优先/适用于单…

真的不想知道录音转文字怎么弄才简单吗

哇哦!听说你想知道如何将录音转成文字?这简直是一个超酷的技能,让我来为你揭开这个神奇的面纱吧!想象一下,当你有一堆录音文件需要处理时,你不再需要费尽心思地一遍遍倾听、抄写。现在,你只需要…

Kubectl 详解

目录 陈述式资源管理方法:项目的生命周期:创建-->发布-->更新-->回滚-->删除声明式管理方法:陈述式资源管理方法: kubernetes 集群管理集群资源的唯一入口是通过相应的方法调用 apiserver 的接口kubectl 是官方的CLI命令行工具,用于与 apiserver 进行通信,将…

基于YOLOv7的密集场景行人检测识别分析系统

密集场景下YOLO系列模型的精度如何?本文的主要目的就是想要基于密集场景基于YOLOv7模型开发构建人流计数系统,简单看下效果图: 这里实验部分使用到的数据集为VSCrowd数据集。 实例数据如下所示: 下载到本地解压缩后如下所示&…