【Kubernetes实战】三、资源组件Namespace、Pod、Label、Deployment、Service概述。
目录
- 1. Namespace
- 1) namespace作用
- 2) namespace资源的具体操作
- 2. Pod
- 1) Pod概述
- 2) Pod资源的具体操作
- 3. Label
- 1) Label概述
- 2) Label资源的具体操作
- 4. Deployment
- 1) Deployment概述
- 2) Deployment控制器的具体操作
- 5. Service
- 1) Service概述
- 2) Service资源的具体操作
1. Namespace
1) namespace作用
Namespace主要作用实现
多套环境的资源隔离
或多租户的资源隔离
。
● 多套环境的资源隔离:默认情况下,kubernetes集群中的所有的Pod都是可以相互访问的。但是在实际中,可能不想让两个Pod之间进行互相的访问,那此时就可以将两个Pod划分到不同的namespace下。kubernetes通过将集群内部的资源分配到不同的Namespace中,可以形成逻辑上的"组",以方便不同的组的资源进行隔离使用和管理。
● 多租户的资源隔离:可以通过kubernetes的授权机制,将不同的namespace交给不同租户进行管理,这样就实现了多租户的资源隔离。此时还能结合kubernetes的资源配额机制,限定不同租户能占用的资源,例如CPU使用量、内存使用量等等,来实现租户可用资源的管理。
Kubernetes在启动之后,会默认创建几个Namespace:
① default:所有未指定Namespace的对象都会被分配到default命名空间;
② kube-flannel:存放网络插件相关的pod;
③ kube-node-lease:集群节点之间的心跳维护(节点间通过心跳来确保对方处于运行状态),v1.13开始引入,少用;
④ kube-public:此命名空间下的所有资源可以被所有人访问,包括未认证的用户,比较不安全,少用;
⑤ kube-system:所有由Kubernetes系统创建的资源都位于此命名空间下。
2) namespace资源的具体操作
- 查看namespace
# 查看所有namespace
kubectl get ns
# 查看某个namespace
kubectl get ns ns_name
# 查看某个namespace详情
kubectl describe ns ns_name
资源限制结合第一部分提到的资源配额机制(CPU使用量、内存使用量等等),即在此处进行设置。
- 创建namespace
kubectl create ns ns_name
- 删除namespace
kubectl delete ns ns_name
- 使用yaml文件进行配置
# test-ns.yaml
apiVersion: v1
kind: Namespace
metadata:name: test-ns
再执行创建或删除命令
kubectl create -f test-ns.yaml # 也可以使用apply
kubectl delete -f test-ns.yaml
总之,Namespace实际上就是一种边界,用来实现资源的隔离。
2. Pod
1) Pod概述
首先清楚kubernetes的逻辑关系:kubernetes本身是集群 --> 集群通过运行程序对外提供服务 --> 程序必须运行在容器中 --> 容器必须存在于Pod中 --> Kubernetes集群通过管理pod控制其中的容器 --> 进而管理其中的程序。
Pod是kubernetes集群进行管理的最小单元。Pod可以认为是容器的封装,一个Pod中可以存在一个或者多个容器。
kubernetes在集群启动之后,集群中的各个组件也都是以Pod方式运行的。可以通过下面命令查看:
kubectl get pods -n kube-system
2) Pod资源的具体操作
- 创建并运行
kubernetes没有提供单独运行Pod的命令,都是通过Pod控制器来实现的
命令格式
kubectl run pod控制器名称(自定义) [参数]
–image:指定pod镜像;
–pod:指定端口;
–namespace:指定命名空间,不指定的话默认是default命名空间。
kubectl run nginx --image=nginx:1.17.1 --port=80 --namespace test-ns
- 查看pod信息
# 查看Pod基本信息
kubectl get pods -n ns_name
kubectl get pods -n ns_name -o wide
# 查看Pod详细信息
kubectl describe pod pod_name -n ns_name
events内容用来查错,其内容描述了pod内容器的操作。
- 访问pod
# 获取podIP
kubectl get pods -n test-ns -o wide
# 访问pod
curl pod_IP
- 删除指定pod
kubectl delete pod pod_name -n ns_name
发现删除之后又重新运行了一个新pod。这是pod控制器在发挥作用。查看Pod控制器:
kubectl get deployment -n test-ns
nginx就是在kubectl run时指定的pod控制器名称。要想彻底删除pod,要删除其pog控制器:
kubectl delete deployment nginx -n test-ns
- 通过yaml文件进行操作
# test-nginx-pod.aml
apiVersion: v1
kind: Pod
metadata:name: nginx # Pod名称而非Pod控制器名称namespace: test-ns
spec:containers:- image: nginx:1.17.1imagePullPolicy: IfNotPresentname: podports: - name: nginx-portcontainerPort: 80protocol: TCP
然后执行其创建和删除命令:
kubectl create -f test-nginx-pod.yaml
kubectl delete -f test-nginx-pod.yaml
3. Label
1) Label概述
Label是kubernetes系统中的一个重要概念。它的作用就是在资源上添加标识,用来对它们进行区分和选择。
【例如】现在有两组一堆pod,像将它们分为两组,一组负责前端,一组负责后端,对着两组进行分别的管理,比如前端的这一组同时创建或同时删除,后端同理。
提到分组可能会想到Namespace,为这两组pod设置不同的Namespace。但是不同Namespace下的pod无法进行通信,但理论上一个网站的前后端应该能正常通信,因此无法使用Namespace。
因此可以使用Label(标签),为pod打上标签。再通过标签选择器进行选择,带有tier:front标签的pod是前端的pod,带有tier:back标签的pod是后端的pod。
因此,所谓的标签,就是一种标识选择机制。为pod添加标识,通过标识对pod进行选择和区分。
- Label的特点:
- 一个Label会以key/value键值对的形式附加到各种资源对象(如Node、Pod、Service等等)上;
- 一个资源对象可以定义任意数量的Label ,同一个Label也可以被添加到任意数量的资源对象上去;
- Label通常在资源对象定义时确定,当然也可以在对象创建后动态添加或者删除。
可以通过Label实现资源的多维度分组,以便灵活、方便地进行资源分配、调度、配置、部署等管理工作。
一些常用的Label 示例如下:
- 版本标签:“version”:“release”, “version”:“stable”…
- 环境标签:“environment”:“dev”,“environment”:“test”,“environment”:“pro”
- 架构标签:“tier”:“frontend”,“tier”:“backend”
标签定义完毕之后,还要考虑到标签的选择,这就要使用到Label Selector,即:Label用于给某个资源对象定义标识;Label Selector用于查询和筛选拥有某些标签的资源对象。
当前有两种Label Selector:
- 基于等式的Label Selector
name = slave: 选择所有包含Label中key="name"且value=“slave"的对象。例如标签选择器:version = release,就是选择所有标签为"version”:"release"的pod;
env != production: 选择所有包括Label中的key=“env"且value不等于"production"的对象。例如标签选择器:environment != dev,就是选择所有标签为"environment”:“xxx”,此时的xxx可以是任意值但不能是不能为dev,且键必须为environment。
- 基于集合的Label Selector
name in (master, slave): 选择所有包含Label中的key="name"且value="master"或"slave"的对象;
name not in (frontend): 选择所有包含Label中的key="name"且value不等于"frontend"的对象。
标签的选择条件可以使用多个,此时将多个Label Selector进行组合,使用逗号","进行分隔即可。例如:
name=slave,env!=production
name not in (frontend),env!=production
2) Label资源的具体操作
- 为pod打标签
kubectl label pod nginx version=v1.0 -n test-ns
也可以给他打多个标签,接着上步执行:
kubectl label pod nginx tier=back -n test-ns
- 更新Pod标签
现在想把版本号从1.0更新到2.0,如果直接做如下的修改,结果是什么?
kubectl label pod nginx version=v2.0 -n test-ns
显示version这个键已经有一个值v1.0了,提示我们要加上–overwrite(覆盖)。加上–overwrite参数试一下:
kubectl label pod nginx version=v2.0 -n test-ns --overwrite
- 查看pod标签
kubectl get pods -n test-ns --show-labels
- 筛选标签
kubectl get pods -n test-ns -l version=v2.0 --show-labels
kubectl get pods -n test-ns -l version!=v2.0 --show-labels
- 删除标签
kubectl label pod nginx version- -n test-ns
- 通过配置文件对pod进行标签操作
# test-pod-label.yaml
apiVersion: v1
kind: Pod
metadata:name: nginx-labelnamespace: test-nslabels:version: "3.0"env: "test"
spec:containers:- image: nginx:1.17.1name: nginx-podports: - name: nginx-portcontainerPort: 80protocol: TCP
然后执行命令:
kubectl apply -f test-pod-label.yaml
4. Deployment
1) Deployment概述
在kubernetes中,Pod是最小的控制单元,但是kubernetes很少直接控制Pod,一般都是通过Pod控制器来完成的。在kubernetes中Pod控制器的种类有很多,每个控制器对应一种应用场景,此处只介绍一种:Deployment。
Pod控制器用于pod的管理,确保pod资源符合预期的状态,当pod的资源出现故障时,会尝试进行重启或重建pod。
确保pod资源符合预期的状态:比如现在需要三个pod来运行nginx程序,则告诉Deployment,Deployment会创建出三个pod来运行nginx程序。若其中一个pod运行过程中出现故障宕机了,此时只剩下两个pod在运行,这并不符合我们预期的状态(3个)。则此时Deployment会迅速对宕机的pod进行重启,若重启失败则会删除这个pod,重新创建一个新pod来运行nginx程序,确保pod资源符合预期的状态。
这也是为什么之前直接删pod删不干净,因为不符合预期状态了,则Pod控制器会创建一个新的pod来代替我们删除的那个pod。
2) Deployment控制器的具体操作
为了防止之前创建的资源干扰视线,在操作Deployment前删除test-ns命名空间下的所有资源:
# 删除命名空间
kubectl delete ns test-ns
# 创建命名空间
kubectl create ns test-ns
- 创建pod
# kubectl run deployment_name [参数]
kubectl run nginx-deployment --image=nginx:1.17.1 --port=80 --replicas=3 -n test-ns
–image:指定pod内容器要运行的镜像;
–port:指定要暴漏的端口号;
–replicas:指定要创建的pod的数量(预期状态),默认为1;
–namespace:指定pod运行的命名空间。
UP-TO-DATE:成功升级的副本数量
AVAILABLE:可用副本的数量
- 查看Deployment信息
# 查看Deployment信息
kubectl get deploy -n test-ns
kubectl get deploy -n test-ns -o wide
# 查看某个Deployment详细信息
kubectl describe deployment nginx-deployment -n test-ns
查看一下标签为:run=nginx-deployment的pod:
kubectl get pods -n test-ns -l run=nginx-deployment --show-labels
Deployment与Pod建立联系是通过标签Label,Deployment本身包含标签选择器,进而得知自己要管理哪些pod。
- 删除Deployment
kubectl delete deployment nginx-deployment -n test-ns
注意:删除pod控制器,其下的所有pod也会被删除。
- 通过配置文件操作Deployment
# test-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata: name: nginx-deploynamespace: test-ns
spec:# pod副本数replicas: 3# Label选择器,关联Deployment与podsselector:matchLabels:run: nginx-deploy# Pod模板:Deployment所创建的pod的模板template:metadata:labels:run: nginx-deployspec:containers:- image: nginx:1.17.1name: nginxports:- containerPort: 80protocol: TCP
然后执行命令:
kubectl apply -f test-deployment.yaml
5. Service
1) Service概述
上一部分创建了一个副本量为3的pod组,如想访问其中一个pod,需要知道它的ip+端口:
kubectl get pods -n test-ns -o wide
curl IP+端口
现在删除这个pod:发现Pod控制器有创建了一个新的pod,并且它的IP地址也发生了变化。
但我的程序若想对外提供服务,需要提供我的IP地址。假如在运行过程中pod宕机了,重建之后所对应的IP地址会发生改变,然而这对外部是不透明的,因此服务会失效。因此虽然每个Pod都会分配一个单独的Pod IP,然而却存在如下两问题:
① Pod IP 会随着Pod的重建产生变化;
② Pod IP 仅仅是集群内可见的虚拟IP,外部无法访问。
这样对于访问这个服务带来了难度。因此,kubernetes设计了Service来解决这个问题。
Service可以看作是一组同类Pod对外的访问接口。借助Service,应用可以方便地实现服务发现和负载均衡。
2) Service资源的具体操作
- 创建集群内部可访问的Service
# 1. 暴露Service
kubectl expose deploy deployment_name --name=service_name --type=service_type --port=80 --target-port=80 -n namespace_name
- expose:暴露操作;
- deploy deployment_name:通过Deployment控制器来寻找pod。这是因为pod组随时可能发生变化,而这些变化都是通过Deployment控制器管理的,如果Service直接寻找pod会存在问题,因此实际上是Service指定要暴露Deployment控制器管理中的哪个Pod;
- –name=service_name:指定Service名称;
- –type=service_type:指定Service类型,默认是ClusterIP;
- –port=80:指定端口号(service暴露的端口);
- –target-port=80:指定目标端口号(对应pod的端口);
- -n namespace_name:指定操作的命名空间。
kubectl expose deploy nginx-deploy --name=nginx-svc1 --type=ClusterIP --port=80 --target-port=80 -n test-ns
# 查看Service
kubectl get service -n test-ns
这里产生了一个CLUSTER-IP,这就是service的IP,在Service的生命周期中,这个地址是不会变动的。可以通过这个IP访问当前service对应的pod:
curl 10.101.27.64:80
- 创建集群外部也可访问的Service
上面创建的Service的type类型为ClusterIP,这个ip地址只用集群内部可访问;如果需要创建外部也可以访问的Service,需要修改type为NodePort。
kubectl expose deploy nginx-deploy --name=nginx-svc2 --type=NodePort --port=80 --target-port=80 -n test-ns
发现此时出现了一对port。其中80端口是暴露给内部的,而31115端口是Node节点暴露给集群外部的端口号,此时便可通过mater节点IP:31115在外部访问到集群服务。例如在的电脑主机上通过浏览器访问下面的地址:http://192.168.12.100:31115/
- 删除service
kubectl delete svc nginx-svc1 -n test-ns
kubectl delete svc nginx-svc2 -n test-ns
- 通过配置文件设置service
# test-service.yaml
apiVersion: v1
kind: Service
metadata:name: nginx-svcnamespace: test-ns
spec:# 当type为clusterIP时,此下的clusterIP可写可不写。写了就是指定的,不写就随机分配clusterIP: 10.101.27.64ports:- port: 80protocol: TCPtargetPort: 80selector:run: nginxtype: ClusterIP
然后执行命令:
kubectl apply -f test-service.yaml
删除service:
kubectl delete -f test-service.yaml
参考:B站大学
相关文章:

【Kubernetes实战】三、资源组件Namespace、Pod、Label、Deployment、Service概述。
目录 1. Namespace1) namespace作用2) namespace资源的具体操作 2. Pod1) Pod概述2) Pod资源的具体操作 3. Label1) Label概述2) Label资源的具体操作 4. Deployment1) Deployment概述2) Deployment控制器的具体操作 5. Service1) Service概述2) Service资源的具体操作 1. Name…...

去中心化的模型训练
去中心化的模型训练(Decentralized Model Training)是一种不依赖单一中心服务器或数据存储中心,而是在多个节点(如设备或数据拥有者)上进行联合训练的方法。这种训练模式可以更好地保护数据隐私、降低数据传输成本&…...

Arthas调试线上代码技巧
1、Arthas概述 官网地址:https://arthas.aliyun.com/ 下载地址:https://arthas.aliyun.com/arthas-boot.jar 使用教程:https://arthas.aliyun.com/doc/quick-start.html Arthas(阿尔萨斯)是 Alibaba 开源的一款Java诊断…...

QT访问数据库:应用提示Driver not loaded
在QT中运行完全正确错误截图 解决办法1 我用的是MySQL。我把libmysql.dll复制到应用程序的目录下,即可正常访问数据库。 解决办法2 bool open_work_db() {QString info "support drivers:";for (int i0; i<QSqlDatabase::drivers().size(); i){inf…...

支持ANC的头戴式蓝牙耳机,更有小金标认证,QCY H3 Pro体验
平时听音乐、看视频,大家都想获得更悦耳的音质体验,这时候蓝牙耳机就是性价比更高的一种方案,同时因其无线束缚、便携性高的特点,随时拿出来就能用。更不用说如今国产品牌的蓝牙耳机升级迭代速度非常快,百元的价位就可…...

net framework 3.5组件更新失败错误代码0x80072f8f怎样解决
浏览器地址栏输入www.dnz9.com远程解决netframework问题 当遇到.NET Framework 3.5 组件更新失败,错误代码为 0x80072f8f 时,可以尝试以下几种解决方法: 一、检查网络连接和时间设置 网络连接 错误代码 0x80072f8f 通常与网络相关问题有关。首…...

C语言初阶:十一.代码调试技巧
❤欢迎各位大佬访问:折枝寄北-CSDN博客折枝寄北擅长C语言初阶,等方面的知识,折枝寄北关注python,c,java,qt,c语言领域.https://blog.csdn.net/2303_80170533?typeblog❤文章所属专栏https://blog.csdn.net/2303_80170533/category_12794764.html?spm1001.2014.300…...

Jenkins Pipeline 部署总结
Jenkins Pipeline 部署总结 前言 Jenkins Pipeline 是 Jenkins 提供的一套强大的工作流框架,它允许开发者以代码的形式定义整个软件交付过程,从而实现持续集成和持续部署(CI/CD)。通过 Pipeline,原本独立运行于单个或…...

HTTP的初步了解
目录 前言 一、HTTP协议的基本概念 1.1、请求格式 1.2、响应格式 二、HTTP链接问题 前言 提示:这里可以添加本文要记录的大概内容: HTTP协议是超文本传输协议 HTTP的短连接:建立连接——数据传输——关闭连接 HTTP的长连接:…...

SM单元 硬件
在硬件上,SM(Streaming Multiprocessor)指的是流式多处理器单元,它是GPU架构中非常重要的组成部分。SM可以看作是GPU的心脏,类似于CPU核心,负责执行并行计算任务。每个SM包含多个流处理器(cores…...

如何从CSV、JSON等格式创建DataFrame
在Spark中,你可以使用 SparkSession 从CSV和JSON等格式创建 DataFrame。以下是如何从这两种格式创建 DataFrame 的示例。 1. 从CSV文件创建DataFrame scala// 创建SparkSessionval spark SparkSession.builder().appName("CSV to DataFrame").getOrCrea…...

Java避坑案例 - 线程池错误的混用引发的性能故障分析
文章目录 问题现象问题分析问题修复线程池的混用策略任务类型与线程池配置最佳实践 问题现象 代码使用了线程池异步处理一些内存中的数据,但通过监控发现处理得非常慢,整个处理过程都是内存中的计算不涉及 IO 操作,也需要数秒的处理时间&…...

七种方法助你找到实用且免费的API服务
随着现代互联网的迅猛发展,API(应用程序编程接口)已成为推动技术创新的核心工具。API使得开发者能够快速实现复杂的功能,如数据分析、自然语言处理、图像识别等,而无需从头编写大量的代码。在这个开放的生态中…...

leetcode-74-搜索二维矩阵
题解: 遍历二维数组matrix中的每个list,如果target在list中则返回True(退出循环);如果全部遍历完还没有出现target则返回False。 核心就是在list中查找target! 代码实现:...

122.WEB渗透测试-信息收集-ARL(13)
免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于: 易锦网校会员专享课 上一个内容:121.WEB渗透测试-信息收集-ARL(12) 输入命令: docker…...

动态规划 —— 路径问题-下降路径最小和
1. 下降路径最小和 题目链接: 931. 下降路径最小和 - 力扣(LeetCode)https://leetcode.cn/problems/minimum-falling-path-sum/description/ 2. 算法原理 状态表示:以莫一个位置位置为结尾 dp[i,j]表示:到…...

【Linux网络】TCP_Socket
目录 TCP协议(传输控制协议) listen状态 accept和connect TCP_echo_server (1)创建套接字 (2)绑定 (3)设置listen状态 (4)loop (5)客户端 多线程远程…...

NVR批量管理软件/平台EasyNVR多个NVR同时管理支持视频投放在电视墙上
在当今智能化、数字化的时代,视频监控已经成为各行各业不可或缺的一部分,无论是公共安全、交通管理、企业监控还是智慧城市建设,都离不开高效、稳定的视频监控系统的支持。而在这些应用场景中,将监控视频实时投放到大屏幕电视墙上…...

Springboot集成阿里云通义千问(灵积模型)
我这里集成后,做成了一个工具jar包,如果有不同方式的,欢迎大家讨论,共同进步。 集成限制: 1、灵积模型有QPM(QPS)限制,每个模型不一样,需要根据每个模型适配 集成开发思路: 因有…...

微信公众号(或微信浏览器)获取openId(网页授权)
下单支付需要openId 首先授权去拿到code --然后调用后太换取openId 1.去拿取code 下图中执行到window.location.href ( redirect_uri 传入当前路径-)–执行后重新跳转到当前页面–但是路径上会带上code参数 //然后调用后台方法–将code传给后台得到 o…...

C++算法第五天
本篇文章继续和大家一起刷算法题 第一题 题目链接 . - 力扣(LeetCode) 题目解析 题目要求: 这是一个连续的子数组 计算子数组内元素的和,若数组内元素的和符合 > target的值并且该子数组的长度是最短的,则返回…...

牛客网剑指Offer-树篇-JZ26 树的子结构
题目 来源:JZ26 树的子结构 描述 输入两棵二叉树A,B,判断B是不是A的子结构。(我们约定空树不是任意一个树的子结构) 假如给定A为{8,8,7,9,2,#,#,#,#,4,7},B为{8,9,2},2个树的结构如下ÿ…...

FFmpeg 4.3 音视频-多路H265监控录放C++开发六,使用SDLVSQT显示yuv文件
使用QT 显示YUV 文件 在最后一帧的时候会不停的显示最后一帧图片。 Vsqtshowyuv.h #pragma once#include <QtWidgets/QWidget> #include "ui_vsqtshowyuv.h" #include <sdl/SDL.h> #include <iostream> #include <fstream> #include <Q…...

Spring 设计模式之适配器模式
Spring 设计模式之适配器模式 适配器模式用到的场景java举例 适配器模式 适配器模式(Adapter Pattern)是一种结构型设计模式,它允许接口不兼容的类一起工作。 其核心思想是通过一个适配器类将不兼容的接口转换成客户端期望的另一个接口&…...

多传感器数字化分析系统
在工业飞速发展的今天,设备的安全稳定运行成为企业高效生产的关键因素。然而,传统的人工巡检方式面临着诸多挑战,如效率低下、漏检误检以及难以精准掌握设备运行状态等。旗晟凭借深厚的技术积累和创新精神,推出了多传感器数字化分…...

Java 基础教学:面向对象编程基础-封装、继承与多态
面向对象编程(OOP)是现代编程的重要范式,Java 语言提供了丰富的 OOP 特性,主要包括封装、继承和多态。本文将详细讲解这三个概念及其实现方式,并提供相应的代码示例。 1. 封装 1.1 概念 封装是将对象的状态…...

Ubuntu环境本地部署DbGate数据库管理工具并实现无公网IP远程访问
文章目录 前言1. 安装Docker2. 使用Docker拉取DbGate镜像3. 创建并启动DbGate容器4. 本地连接测试5. 公网远程访问本地DbGate容器5.1 内网穿透工具安装5.2 创建远程连接公网地址5.3 使用固定公网地址远程访问 前言 本文主要介绍如何在Linux Ubuntu系统中使用Docker部署DbGate数…...

【AI抠图整合包及教程】Meta SAM 2:视觉分割的革命性飞跃
在人工智能的浪潮中,每一次技术的革新都如同一场视觉盛宴,让我们见证着数字时代的变迁。Meta再次以Segment Anything Model 2(SAM 2)引领了图像和视频分割技术的新纪元。作为首个用于实时、可提示的图像和视频对象分割的统一模型&…...

使用语言模型进行文本摘要的五个级别(llm)
视频链接:5 Levels Of LLM Summarizing: Novice to Expert...

ubuntu交叉编译libffi库给arm平台使用
1.下载并解压: 2.生成makefile 编译: make 编译成功: 安装: make install 安装成功 查看安装后的libffi库...