pod资源标签使用技巧
在k8s之上,每一种资源都可以有一个标签,现实中用到的pod数量可能越来越多,我们期望能够分类进行管理,最简单和直接的效果就是把pod分成很多不同的小组,无论对于开发还是运维来讲都能显著提高管理效率,更何况我们控制器,我们service资源也需要使用标签来识别它们所管控或关联到的资源,当我们给pod或者任何资源设定标签时,都可以使用标签查看,删除等对其执行相应的管理操作;简单来说所谓的标签就是附加在我们所对应的对象之上的键值对,一个资源之上可以存在多个标签,每个标签都是键值对,而且每个标签都可以被标签选择器进行匹配度检查从而完成资源挑选,通常情况下一个资源对象可使用多个标签,反之,一个标签也可以被添加到多个资源对像上;标签既可以在资源对象创建的时候指定,也可以在资源对象创建之后使用命令来进行管理,这个管理既包括添加,也包括删除,还包括修改;实践中我们通常给资源附加不同维度的标签,来进行不同维度的管理,比方说labels下面的标签app: myapp 用来指明当前的应用程序(可能是nginx,tomcat,http,mysql,redis等)是什么,我们也可以分层打标签,如前端frontend,后端backend,开发环境dev等;也可以对版本打标签。
labels:
app: myapp
tier: frontend
标签:
key: value (key和value最多63个字符,key只能使用字母,数字,下划线组成,只能以字母或数字开头,不能为空值;value可以为空,也是只能以字母或数字开头和结尾,中间可使用字母,数字,下划线)
#通过 pod 创建一个 tomcat 服务
#更新资源清单文件
kubectl apply -f pod.yaml
# 查看pod启动
kubectl get pods
NAME READY STATUS RESTARTS AGE
tomcat-pod 1/1 Running 0 78s
#再创建一个nginx 的yaml文件
apiVersion: v1
kind: Pod
metadata:
name: my-nginx
labels:
run: my-nginx
spec:
containers:
- name: my-nginx
image: nginx
ports:
- containerPort: 80
imagePullPolicy: IfNotPresent
#更新yaml文件
kubectl apply -f nginx.yaml
kubectl get pods -o wide
#查看所有 pod 资源对象的标签
kubectl get pods --show-labels
查看所有资源对象下拥有 run 这个标签的标签值
kubectl get pods -L run
my-nginx 1/1 Running 0 4m47s my-nginx
tomcat-pod 1/1 Running 0 17m
#只显示带run的标签 kubectl get pods -l run
my-nginx 1/1 Running 0 6m41s
#查看拥有 run 这个标签的资源对象,并且把标签显示出来
kubectl get pods -l run --show-labels
NAME READY STATUS RESTARTS AGE LABELS
my-nginx 1/1 Running 0 8m49s run=my-nginx
#想修改资源的标签,比方说想给 my-nginx 加上个 release 标签
kubectl label pod my-nginx release=canary
#查询有release标签的pod
kubectl get pods -l release --show-labels
#修改标签,把 release=canary 改成 release=stable
kubectl label pods my-nginx release=stable --overwrite
kubectl get pods -l release --show-labels
#查看既有 release 标签,又有 run 标签的 pod 资源有哪些
kubectl get pods -l release,run
#给工作节点node加god=it标签
kubectl label nodes god62 god=IT
kubectl get nodes --show-labels
名称空间 namespace
#查看默认名称空间
kubectl get ns
NAME STATUS AGE
default Active 7d19h
kube-node-lease Active 7d19h
kube-public Active 7d19h
kube-system Active 7d19h
管理 namespace 资源
namespace 是 k8s api 的标准资源类型之一,namespace 资源属性较少,通常只需要指定名称
即可创建,如“kubectl create namespace qa”。namespace 资源的名称仅能由字母、数字、
下划线、连接线等字符组成。删除 namespace 资源会级联删除其包含的所有其他资源对象:
命令格式 功能kubectl delete TYPE RESOURCE -n NS 删除指定名称空间内的指定资源
kubectl delete TYPE --all -n NS
kubectl delete all -n -NS
kubectl delete all --all
删除指定名称空间内的指定类型的所有资源
删除指定名称空间内的所有资源
删除所有名称空间中的所有资源
注意:namespace 对象仅用于资源对象名称的隔离,它自身并不能隔绝跨名称空间的 pod 间通
信,那是网络策略资源的功能
# 查询默认名称空间
kubectl describe ns default
Name: default
Labels: <none>
Annotations: <none>
Status: Active
No resource quota. #没有资源配额。
No LimitRange resource. #没有LimitRange资源。
# 创建qa的名称空间
kubectl get ns
NAME STATUS AGE
default Active 7d19h
kube-node-lease Active 7d19h
kube-public Active 7d19h
kube-system Active 7d19h
qa Active 55s
kubectl describe ns qa
#删除 my-nginx 可以指定-n default 也可以不指定
kubectl get pods
NAME READY STATUS RESTARTS AGE
my-nginx 1/1 Running 0 96m
tomcat-pod 1/1 Running 0 108m
[root@xuegod63 ~]# kubectl delete pods -n default my-nginx
pod 资源清单详细解读
apiVersion: v1
kind: Pod
metadata:
name: string
namespace: string # Pod
所属的命名空间labels: #自定义标签
- name: string #自定义标签名字annotations: #自定义注释列表
- name: string
spec: # Pod
中容器的详细定义
containers:
- name: string
image: string
# Pod 中容器列表#容器名称#容器的镜像名称
#版本号,例如 v1
#资源类型,如 Pod
#元数据
# Pod 名字
imagePullPolicy: [Always | Never | IfNotPresent] #获取镜像的策略 Alawys 表示下载
镜像 IfnotPresent 表示优先使用本地镜像,否则下载镜像,Nerver 表示仅使用本地镜像
command: [string] #容器的启动命令列表,如不指定,使用打包时使用的启动命令args: [string] #容器的启动命令参数列表
workingDir: stringvolumeMounts:
- name: string
#容器的工作目录#挂载到容器内部的存储卷配置
#引用 pod 定义的共享存储卷的名称,需用 volumes[]部分定义的的卷
名
mountPath: string #存储卷在容器内 mount 的绝对路径,应少于 512 字符readOnly: boolean #是否为只读模式
ports: #需要暴露的端口库号- name: string #端口号名称
containerPort: int #容器需要监听的端口号
hostPort: int #容器所在主机需要监听的端口号,默认与 Container 相同
protocol: string #端口协议,支持 TCP 和 UDP,默认 TCP
env: #容器运行前需设置的环境变量列表
- name: string
value: string
#环境变量名称#环境变量的值
resources:
limits: #
资源限制的设置
#资源限制和请求的设置
cpu: string #cpu 的限制,单位为 core 数
memory: string #内存限制,单位可以为 Mib/Gib
requests: #资源请求的设置
cpu: string #cpu 请求,容器启动的初始可用数量
memory: string #内存请求,容器启动的初始可用内存
livenessProbe: #对 Pod 内个容器健康检查的设置,当探测无响应几次后将自动重启该
容器,检查方法有 exec、httpGet 和 tcpSocket,对一个容器只需设置其中一种方法即可exec: #对 Pod 容器内检查方式设置为 exec 方式
command: [string] #exec 方式需要制定的命令或脚本
httpGet: #对 Pod 内个容器健康检查方法设置为 HttpGet,需要制定 Path、port
path: string
port: number
host: string
scheme: string
HttpHeaders:
- name: string
value: string
tcpSocket: #对 Pod 内个容器健康检查方式设置为 tcpSocket 方式port: number
initialDelaySeconds: 0 #容器启动完成后首次探测的时间,单位为秒
timeoutSeconds: 0
periodSeconds: 0
successThreshold: 0
failureThreshold: 0
securityContext:
#对容器健康检查探测等待响应的超时时间,单位秒,默认 1 秒#对容器监控检查的定期探测时间设置,单位秒,默认 10 秒一次
privileged:false
restartPolicy: [Always | Never | OnFailure]#Pod
的重启策略,Always 表示一旦不管以
何种方式终止运行,kubelet 都将重启,OnFailure 表示只有 Pod 以非 0 退出码退出才重启,Nerver 表示不再重启该 Pod
nodeSelector: obeject #设置 NodeSelector 表示将该 Pod 调度到包含这个 label 的node 上,以 key:value 的格式指定
imagePullSecrets: #Pull 镜像时使用的 secret 名称,以 key:secretkey 格式指定
- name: string
hostNetwork:false #
是否使用主机网络模式,默认为 false,如果设置为 true,表示
使用宿主机网络volumes:
- name: string
emptyDir: {}
#在该 pod 上定义共享存储卷列表
#共享存储卷名称 (volumes 类型有很多种)
#类型为 emtyDir 的存储卷,与 Pod 同生命周期的一个临时目录。为空值
hostPath: string #类型为 hostPath 的存储卷,表示挂载 Pod 所在宿主机的目录
path: string #Pod 所在宿主机的目录,将被用于同期中 mount 的目录secret: #类型为 secret 的存储卷,挂载集群与定义的 secre 对象到容器内部
scretname: stringitems:
- key: string
path: string
configMap:
内部
name: string
items:
- key: string
path: string
#类型为 configMap 的存储卷,挂载预定义的 configMap 对象到容器