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-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - 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: nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 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。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

TOPSIS法

TOPSIS法 文章目录 TOPSIS法TOPSIS法的三点解释增加指标个数1.统一指标类型极小型指标转换为极大型指标的公式中间型指标转换为极大型指标的公式区间型指标转换为极大型指标的公式 2.正向化矩阵标准化3.计算得分并归一化类比只有一个指标计算得分 TOPSIS法代码统一指标类型判断…

开发运营监控

DevOps 监控使管理员能够实时了解生产环境中的元素,并有助于确保应用程序平稳运行,同时提供最高的业务价值,对于采用 DevOps 文化和方法的公司来说,这一点至关重要。 什么是开发运营监控 DevOps 通过持续开发、集成、测试、监控…

【CHI】架构介绍

Learn the architecture - Introducing AMBA CHI AMBA CHI协议导论--言身寸 1. AMBA CHI简介 一致性集线器接口(CHI)是AXI一致性扩展(ACE)协议的演进。它是Arm提供的高级微控制器总线架构(AMBA)的一部分。…

《HeadFirst设计模式(第二版)》第六章代码——命令模式

代码文件目录: Command package Chapter6_CommandPattern.Command;/*** Author 竹心* Date 2023/8/6**/public interface Command {public void execute();public void undo();//撤销该指令 }CeilingFan package Chapter6_CommandPattern.ElectricAppliance;/*** …

使用Socket实现TCP版的回显服务器

文章目录 1. Socket简介2. ServerSocket3. Socket4. 服务器端代码5. 客户端代码 1. Socket简介 Socket(Java套接字)是Java编程语言提供的一组类和接口,用于实现网络通信。它基于Socket编程接口,提供了一种简单而强大的方式来实现…

华云安参编的《云原生安全配置基线规范》正式发布

由中国信息通信研究院(以下简称“中国信通院”)、中国通信标准化协会主办的第十届可信云大会云原生安全分论坛于7月26日在北京国际会议中心成功召开。作为大会上展示的成果之一,由中国信通院联合行业领先企业共同编写的《云原生安全配置基线规…

剑指 Offer 53 - II. 0~n-1中缺失的数字

题目描述 一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。示例 解答 一眼二分法 class Solution {public int mi…

java中使用Jsoup和Itext实现将html转换为PDF

1.在build.gradle中安装所需依赖: implementation group: com.itextpdf, name: itextpdf, version: 5.5.13 implementation group: com.itextpdf.tool, name: xmlworker, version: 5.5.13 implementation group: org.jsoup, name: jsoup, version: 1.15.32.创建工具…

物联网|按键实验---学习I/O的输入及中断的编程|函数说明的格式|如何使用CMSIS的延时|读取通过外部中断实现按键捕获代码的实现及分析-学习笔记(14)

文章目录 通过外部中断实现按键捕获代码的实现及分析Tip1:函数说明的格式Tip2:如何使用CMSIS的延时GetTick函数原型stm32f407_intr_handle.c解析中断处理函数:void EXTI4_IRQHandler 调试流程软件模拟调试 两种代码的比较课后作业: 通过外部中断实现按键捕获代码的实…

网络安全【黑客】自学

1.什么是网络安全? 网络安全可以基于攻击和防御视角来分类,我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术,而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域,都有…

【云原生】K8S二进制搭建三:高可用配置

目录 一、部署CoreDNS二、配置高可用三、配置负载均衡四、部署 Dashboard 一、部署CoreDNS 在所有 node 节点上操作 #上传 coredns.tar 到 /opt 目录中 cd /opt docker load -i coredns.tar在 master01 节点上操作 #上传 coredns.yaml 文件到 /opt/k8s 目录中,部…

【 stable diffusion LORA模型训练最全最详细教程】

个人网站:https://tianfeng.space/ 文章目录 一、前言二、朱尼酱的赛博丹炉1.介绍2.解压配置3.使用训练准备首页设置上传素材查看进度 三、秋叶的lora训练器1.下载2.预处理3.参数调配 一、前言 其实想写LORA模型训练很久了,一直没时间,总结…

React Native从文本内容尾部截取显示省略号

<Textstyle{styles.mMeNickname}ellipsizeMode"tail"numberOfLines{1}>{userInfo.nickname}</Text> 参考链接&#xff1a; https://www.reactnative.cn/docs/text#ellipsizemode https://chat.xutongbao.top/

MySQL语句性能分析与优化

目录 SQL性能分析 SQL执行频率 SQL慢查询日志 Profile Explain SQL优化 插入数据的优化 主键优化 Order By优化 Group By优化 Limit 优化 Count 优化 Update 优化 多表连接查询优化 SQL性能分析 通过SQL性能分析来做SQL的优化&#xff0c;主要是优化SQL的查询语…

java中javamail发送带附件的邮件实现方法

java中javamail发送带附件的邮件实现方法 本文实例讲述了java中javamail发送带附件的邮件实现方法。分享给大家供大家参考。具体分析如下&#xff1a; JavaMail&#xff0c;顾名思义&#xff0c;提供给开发者处理电子邮件相关的编程接口。它是Sun发布的用来处理email的API。它…

Java-day06(面向对象-2)

面向对象 参数 参数分为形参(方法声明时的参数)与实参&#xff08;方法调用时实际传给形参的参数值&#xff09; 将对象作为参数传递给方法 &#xff08;1&#xff09;定义一个Circle类,包含一个double型是r属性代表圆的半径&#xff0c;一个findArea()方法返回圆的面积。 …

static关键字

作者简介&#xff1a; zoro-1&#xff0c;目前大一&#xff0c;正在学习Java&#xff0c;数据结构等 作者主页&#xff1a; zoro-1的主页 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&#x1f496; 被static修饰意味什么 在Java中&#xff0c;被st…

ld加上-static -lc参数报错`ld: cannot find -lc`处理方法

cat /etc/redhat-release看到操作系统是CentOS Linux release 7.6.1810&#xff0c;uname -r看到内核版本是3.10.0-957.el7.x86_64&#xff0c;as --version看到as的版本是2.27-34.base.el7&#xff0c;ld --version看到ld的版本是2.27-34.base.el7。 absCallWithStart.s里边…

33.利用abs 解决绝对值问题(matlab程序 )

1.简述 abs函数的功能是绝对值和复数的模 语法 Y abs(X) 说明 Y abs(X) 返回数组 X 中每个元素的绝对值。如果 X 是复数&#xff0c;则 abs(X) 返回复数的模。 示例 标量的绝对值 y abs(-5) y 5 向量的绝对值 创建实值的数值向量。 x [1.3 -3.56 8.23 -5 -0.01…

MacOS上用docker运行mongo及mongo-express

MongoDB简介 MongoDB 是一个基于分布式文件存储的数据库。由 C 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。 MongoDB 是一个介于关系数据库和非关系数据库之间的产品&#xff0c;是非关系数据库当中功能最丰富&#xff0c;最像关系数据库的。 前提 要求…