Kubernetes进阶实战读书笔记:管理Pod资源对象(标签选择器)
一、标签概述
1、概述
2、App=MyApp
3、App = MyApp, Role = FE
实践中、建议键名及键值能做到到 "见名知义" 且尽可能保持简单
二、管理资源标签
1、资源清单
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | [root@master chapter4] # cat pod-with-labels.yaml apiVersion: v1 kind: Pod metadata: name: pod-with-labels labels: env : qa tier: frontend spec: containers: - name: myapp image: ikubernetes /myapp :v1 ports: - name: http containerPort: 80 protocol: TCP |
2、创建显示对象的标签信息
1 2 3 4 5 | [root@master chapter4] # kubectl apply -f pod-with-labels.yaml pod "pod-with-labels" created [root@master chapter4] # kubectl get pods --show-labels NAME READY STATUS RESTARTS AGE LABELS pod-with-labels 1 /1 Running 0 27s env =qa,tier=frontend |
3、指定显示有着特定键的标签信息
1 2 3 4 | [root@master chapter4] # kubectl get pods -L env,tier NAME READY STATUS RESTARTS AGE ENV TIER httpget 1 /1 Running 4 15d production <none> pod-with-labels 1 /1 Running 0 10m production frontend |
4、为pod添加标签
1 2 3 4 5 6 7 8 9 | [root@master chapter4] # kubectl label pods/httpget env=production pod "httpget" labeled [root@master chapter4] # kubectl get pods --show-labels NAME READY STATUS RESTARTS AGE LABELS httpget 1 /1 Running 4 14d env =production mysql-7dfcv 1 /1 Running 4 11d app=mysql myweb-7vjgt 0 /1 ImagePullBackOff 8 16d app=myweb nginx 1 /1 Running 0 22h app=web pod-with-labels 1 /1 Running 0 27s env =qa,tier=frontend |
5、对于已经附带了指定键名的标签,设定新的键值时需要为命令同事使用 "--overwrit" 命令以强制覆盖原有的键值
1 2 3 4 5 6 7 8 9 10 11 12 | [root@master chapter4] # kubectl label pods/pod-with-labels env=production error: 'env' already has a value (qa), and --overwrite is false [root@master chapter4] # kubectl label pods/pod-with-labels env=production --overwrite pod "pod-with-labels" labeled [root@master chapter4] # kubectl get pods --show-labels NAME READY STATUS RESTARTS AGE LABELS httpget 1 /1 Running 4 14d env =production mysql-7dfcv 1 /1 Running 4 11d app=mysql myweb-7vjgt 0 /1 ImagePullBackOff 8 16d app=myweb nginx 1 /1 Running 0 22h app=web pod-with-labels 1 /1 Running 0 27s env =qa,tier=frontend |
用户若期望对某标签之下的资源集合执行某类操作、例如、查看或删除等,则需要先使用 "标签选择器" 挑选出满足条件的资源对象
三、标签选择器
1、支持类型
2、遵循逻辑
3、测试用例
-l 选项能够制定使用标签选择器
1、显示名为env值不为qa的所有pod对象
1 2 3 4 5 6 7 8 9 | [root@master chapter4] # kubectl get pods -l "env!=qa" -L env NAME READY STATUS RESTARTS AGE ENV myapp-deploy-5cbd66595b-nzfjz 1 /1 Running 0 17h myapp-deploy-5cbd66595b-pldfc 1 /1 Running 0 17h myapp-deploy-5cbd66595b-vmtln 1 /1 Running 0 17h pod-example 1 /1 Running 1 15h production pod-use-hostnetwork 1 /1 Running 0 65m pod-with-labels 1 /1 Running 0 3m48s testing pod-with-securitycontext 1 /1 Running 0 44m |
2、显示标签键名env的值不为qa、且标签键名tier的值为frontend的所有pod对象
1 2 3 | [root@master chapter4] # kubectl get pods -l "env!=qa,tier=frontend" -L env,tier NAME READY STATUS RESTARTS AGE ENV TIER pod-with-labels 1 /1 Running 0 4m31s testing frontend |
3、显示标签键名env的值为production或env、且不存在键名为tier的所有pod对象
1 2 3 | [root@master chapter4] # kubectl get pods -l "env in (production,dev)" -L env NAME READY STATUS RESTARTS AGE ENV pod-example 1 /1 Running 1 15h production |
4、显示标签键名env的值为production或dev的所有pod对象
1 2 3 4 5 | [root@master chapter4] # kubectl get pods -l "env in (production,dev),!tier" -L env,tier - bash : !tier": event not found [root@master chapter4] # kubectl get pods -l 'env in (production,dev),!tier' -L env,tier NAME READY STATUS RESTARTS AGE ENV TIER pod-example 1 /1 Running 1 15h production |
为了避免shell解释器解析叹号(!),必须要为此类表达式使用单引号
4、小结
四、生产最佳实践(多维度标签使用)
五、Pod结点选择器nodeSelector
1、资源配置清单
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | [root@master chapter4] # cat pod-with-nodeselector.yaml apiVersion: v1 kind: Pod metadata: name: pod-with-nodeselector labels: env : testing spec: containers: - name: myapp image: ikubernetes /myapp :v1 ports: - name: http containerPort: 80 protocol: TCP nodeSelector: disktype: ssd1 |
2、给node1、node2节点设置disktype=ssd master节点设置disktype=ssd1
1 2 3 4 5 6 | [root@master chapter4] # kubectl label nodes node1 disktype=ssd node /node1 labeled [root@master chapter4] # kubectl label nodes node2 disktype=ssd node /node2 labeled [root@master chapter4] # kubectl label nodes master disktype=ssd1 node /master labeled |
3、查看具有ssd1的标签node资源
1 2 3 4 5 | [root@master chapter4] # kubectl get nodes -l 'disktype' -L disktype NAME STATUS ROLES AGE VERSION DISKTYPE master Ready master 2d12h v1.18.6 ssd1 node1 Ready <none> 2d12h v1.18.6 ssd node2 Ready <none> 2d12h v1.18.6 ssd |
4、创建资源清单
1 2 | [root@master chapter4] # kubectl apply -f pod-with-nodeselector.yaml pod /pod-with-nodeselector created |
5、验证调度结果
1 2 3 4 | [root@master chapter4] # kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES ...... pod-with-nodeselector 1 /1 Running 0 2m7s 10.244.0.2 master <none> <none> |
6、查看master节点标签
1 2 3 4 5 6 7 8 9 10 | [root@master chapter4] # kubectl describe node master Name: master Roles: master Labels: beta.kubernetes.io /arch =amd64 beta.kubernetes.io /os =linux disktype=ssd1 kubernetes.io /arch =amd64 kubernetes.io /hostname =master kubernetes.io /os =linux node-role.kubernetes.io /master = |
7、查看node1节点标签
1 2 3 4 5 6 7 8 9 | [root@master chapter4] # kubectl describe node node1 Name: node1 Roles: <none> Labels: beta.kubernetes.io /arch =amd64 beta.kubernetes.io /os =linux disktype=ssd kubernetes.io /arch =amd64 kubernetes.io /hostname =node1 kubernetes.io /os =linux |
六、资源注解
1、什么是注解?
注解与标签类似、注解也是"键值" 类型的数据,不过他不能用于标签及挑选Kubernetes对象、仅用于为资源提供"元数据" 信息
另外、注解中的元数据不受字符数量的限制、它可大可小、可以为结构化或非结构化形式、也支持使用在标签中进制使用的其他字符
2、应用场景
在Kubernetes的新版本中为某资源引入新字段时、常以注解的方式提供、以避免其增删等变动对用户带来困扰、一旦确定支持使用他们、这些新字段就将引入到资源中并淘汰相关的注解另外、为资源添加注解也可让其他用户快速了解资源的相关信息、例如创建者的身份等、以下为常用的场景案例
1、由声明式配置层(如apply命令)管理的字段:将这些字段定义为注解有助于识别由服务器或客户端设定的默认值、系统自动生成的字段以及自由自动伸缩系统生成的字段
2、构建、发行或镜像相关的信息:例如:时间戳、发型ID、git分支、PR号码、镜像哈希及仓库地址等
3、指向日志、监控、分析或审计仓库的指针
4、由客户端库或工具程序生成的用于调试目的信息:如名称、版本、构建信息等
5、用户或工具程序的来源地信息:例如来自其他生态系统组件的相关对象的url
6、轻量化滚动升级工具的元数据:如config及chechpoints
7、相关人员的电话号码等联系信息:或者执行类似信息的可寻址的目录条目、如网站站点
3、查看注解
1 2 3 4 5 6 7 8 9 | [root@master chapter4] # kubectl describe pods pod-example Name: pod-example Namespace: default Priority: 0 Node: node2 /192 .168.118.20 Start Time: Wed, 05 Aug 2020 17:40:40 +0800 Labels: env =production Annotations: Status: Running ...... |
4、管理资源注解
1、Annotations可在资源创建是使用 metadata.annotations 字段制定
2、也可随时按需在活动的资源上使用kubectl annotate命令进行附加
1 2 | [root@master chapter4] # kubectl annotate pods pod-example ilinux.io/created-by="cluster admin" pod /pod-example annotated |
查看生成的注解信息
1 2 | [root@master chapter4] # kubectl describe pods pod-example |grep "Annotations" Annotations: ilinux.io /created-by : cluster admin |
3、如果需要在资源创建时的清单中制定,那么使用类似如下的方式即可
1 2 3 4 5 6 7 8 | apiVersion: v1 kind: Pod metadata: name: pod-example namespace: default annotations: ilinux.io /created-by : cluster admin spec: ...... |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构