目录
1 资源管理介绍
2 资源管理的方式
2.1 kubectl命令介绍及格式
2.2 资源类型
2.3 kubectl 常见操作指令
2.3.1 CREATE 示例:
2.3.1.1 指定资源类型创建
2.3.1.2 查看创建的资源类型
2.3.1.3 查看pods是否正确被创建并且被调度
2.3.1.4 查看名为shuyan 的 Deployment 的详细信息
2.3.1.5 查看信息以yaml格式输出
2.3.1.6 以不同格式查看信息
2.3.2 查看帮助指令explain
2.3.2.1 如何查询
2.3.3 修改配置文件指令
2.3.3.1 使用edit修改
2.3.3.2 使用打补丁的方式修改
2.3.4 删除资源delete
2.3.5 查看 资源日志指令logs
2.3.6 进入容器指令exec
2.3.7 文件复制指令cp
3 使用高级命令实例yaml
3.1 使用 命令生成 Pod 的 YAML 配置
3.2 生成deployment 资源类型的yaml格式 示例
4 k8s中的标签
1 资源管理介绍
在kubernetes中,所有的内容都抽象为资源,用户需要通过操作资源来管理kubernetes。
kubernetes的本质上就是一个集群系统,用户可以在集群中部署各种服务,所谓的部署服务,其实就是在kubernetes集群中运行一个个的容器,并将指定的程序跑在容器中。
kubernetes的最小管理单元是pod而不是容器,所以只能将容器放在
Pod
中,而kubernetes一般也不会直接管理Pod,而是通过Pod控制器
来管理Pod的。Pod可以提供服务之后,就要考虑如何访问Pod中服务,kubernetes提供了
Service
资源实现这个功能。当然,如果Pod中程序的数据需要持久化,kubernetes还提供了各种
存储
系统。
学习kubernetes的核心,就是学习如何对集群上的Pod、Pod控制器、Service、存储
等各种资源进行操作
-
命令式对象管理:直接使用命令去操作kubernetes资源
kubectl run nginx-pod --image=nginx:1.17.1 --port=80
-
命令式对象配置:通过命令配置和配置文件去操作kubernetes资源
kubectl create/patch -f nginx-pod.yaml
-
声明式对象配置:通过apply命令和配置文件去操作kubernetes资源
kubectl apply -f nginx-pod.yaml
类型 | 操作对象 | 适用环境 | 优点 | 缺点 |
---|---|---|---|---|
命令式对象管理 | 对象 | 测试 | 简单 | 只能操作活动对象,无法审计、跟踪 |
命令式对象配置 | 文件 | 开发 | 可以审计、跟踪 | 项目大时,配置文件多,操作麻烦 |
声明式对象配置 | 目录 | 开发 | 支持目录操作 | 意外情况下难以调试 |
2 资源管理的方式
2.1 kubectl命令介绍及格式
kubectl是kubernetes集群的命令行工具,通过它能够对集群本身进行管理,并能够在集群上进行容器化应用的安装部署。kubectl命令的语法如下:
kubectl [command] [type] [name] [flags]
comand:指定要对资源执行的操作,例如create、get、delete
type:指定资源类型,比如deployment、pod、service
name:指定资源的名称,名称大小写敏感
flags:指定额外的可选参数
# 查看所有pod
kubectl get pod
# 查看某个pod
kubectl get pod pod_name
# 查看某个pod,以yaml格式展示结果
kubectl get pod pod_name -o yaml
2.2 资源类型
kubernetes中所有的内容都抽象为资源,可以通过下面的命令进行查看:
kubectl api-resources
经常使用的资源有下面这些:
资源分类 | 资源名称 | 缩写 | 资源作用 |
---|---|---|---|
集群级别资源 | nodes | no | 集群组成部分 |
namespaces | ns | 隔离Pod | |
pod资源 | pods | po | 装载容器 |
pod资源控制器 | replicationcontrollers | rc | 控制pod资源 |
replicasets | rs | 控制pod资源 | |
deployments | deploy | 控制pod资源 | |
daemonsets | ds | 控制pod资源 | |
jobs | 控制pod资源 | ||
cronjobs | cj | 控制pod资源 | |
horizontalpodautoscalers | hpa | 控制pod资源 | |
statefulsets | sts | 控制pod资源 | |
服务发现资源 | services | svc | 统一pod对外接口 |
ingress | ing | 统一pod对外接口 | |
存储资源 | volumeattachments | 存储 | |
persistentvolumes | pv | 存储 | |
persistentvolumeclaims | pvc | 存储 | |
配置资源 | configmaps | cm | 配置 |
secrets | 配置 |
2.3 kubectl 常见操作指令
kubernetes允许对资源进行多种操作,可以通过--help查看详细的操作命令
[root@k8s-master ~]# kubectl create --help
经常使用的操作有下面这些:
命令分类 | 命令 | 翻译 | 命令作用 |
---|---|---|---|
基本命令 | create | 创建 | 创建一个资源 |
edit | 编辑 | 编辑一个资源 | |
get | 获取 | 获取一个资源 | |
patch | 更新 | 更新一个资源 | |
delete | 删除 | 删除一个资源 | |
explain | 解释 | 展示资源文档 | |
运行和调试 | run | 运行 | 在集群中运行一个指定的镜像 |
expose | 暴露 | 暴露资源为Service | |
describe | 描述 | 显示资源内部信息 | |
logs | 日志 | 输出容器在 pod 中的日志 | |
attach | 缠绕 | 进入运行中的容器 | |
exec | 执行 | 执行容器中的一个命令 | |
cp | 复制 | 在Pod内外复制文件 | |
rollout | 首次展示 | 管理资源的发布 | |
scale | 规模 | 扩(缩)容Pod的数量 | |
autoscale | 自动调整 | 自动调整Pod的数量 | |
高级命令 | apply | rc | 通过文件对资源进行配置 |
label | 标签 | 更新资源上的标签 | |
其他命令 | cluster-info | 集群信息 | 显示集群信息 |
version | 版本 | 显示当前Server和Client的版本 |
语法
kubectl [command] [type] [name] [flags]
2.3.1 CREATE 示例:
2.3.1.1 指定资源类型创建
master yaml]# kubectl create deployment shuyan --image myapp:v1 --replicas 2
2.3.1.2 查看创建的资源类型
[root@k8s-master yaml]# kubectl get deployments shuyan
NAME READY UP-TO-DATE AVAILABLE AGE
shuyan 2/2 2 2 8m6s
[root@k8s-master yaml]# kubectl get deployments shuyan -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
shuyan 2/2 2 2 8m12s myapp myapp:v1 app=shuyan
2.3.1.3 查看pods是否正确被创建并且被调度
[root@k8s-master yaml]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
shuyan-6b475bf845-d2c29 1/1 Running 0 11m 10.244.1.18 k8s-node1 <none> <none>
shuyan-6b475bf845-lcwgx 1/1 Running 0 11m 10.244.2.16 k8s-node2 <none> <none>
2.3.1.4 查看名为shuyan 的 Deployment 的详细信息
[root@k8s-master yaml]# kubectl describe deployments.apps shuyan
Name: shuyan
Namespace: default
CreationTimestamp: Tue, 03 Sep 2024 20:34:53 +0800
Labels: app=shuyan
Annotations: deployment.kubernetes.io/revision: 1
Selector: app=shuyan
Replicas: 2 desired | 2 updated | 2 total | 2 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: app=shuyan
Containers:
myapp:
Image: myapp:v1
Port: <none>
Host Port: <none>
Environment: <none>
Mounts: <none>
Volumes: <none>
Node-Selectors: <none>
Tolerations: <none>
Conditions:
Type Status Reason
---- ------ ------
Available True MinimumReplicasAvailable
Progressing True NewReplicaSetAvailable
OldReplicaSets: <none>
NewReplicaSet: shuyan-6b475bf845 (2/2 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 16m deployment-controller Scaled up replica set shuyan-6b475bf845 to 2
2.3.1.5 查看信息以yaml格式输出
[root@k8s-master yaml]# kubectl get deployments.apps shuyan -o yaml
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
deployment.kubernetes.io/revision: "1"
creationTimestamp: "2024-09-03T12:34:53Z"
generation: 1
labels:
app: shuyan
name: shuyan
namespace: default
resourceVersion: "98480"
uid: e52303a9-6234-4653-ac61-86c5c73e215a
spec:
progressDeadlineSeconds: 600
replicas: 2
revisionHistoryLimit: 10
selector:
matchLabels:
app: shuyan
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
creationTimestamp: null
labels:
app: shuyan
spec:
containers:
- image: myapp:v1
imagePullPolicy: IfNotPresent
name: myapp
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
status:
availableReplicas: 2
conditions:
- lastTransitionTime: "2024-09-03T12:34:54Z"
lastUpdateTime: "2024-09-03T12:34:54Z"
message: Deployment has minimum availability.
reason: MinimumReplicasAvailable
status: "True"
type: Available
- lastTransitionTime: "2024-09-03T12:34:53Z"
lastUpdateTime: "2024-09-03T12:34:54Z"
message: ReplicaSet "shuyan-6b475bf845" has successfully progressed.
reason: NewReplicaSetAvailable
status: "True"
type: Progressing
observedGeneration: 1
readyReplicas: 2
replicas: 2
updatedReplicas: 2
2.3.1.6 以不同格式查看信息
[root@k8s-master yaml]# kubectl get deployments.apps shuyan -o json
[root@k8s-master yaml]# kubectl get deployments.apps shuyan -o yaml
2.3.2 查看帮助指令explain
2.3.2.1 如何查询
kubectl explain 查看资源记录类型
格式 kubectl explain deployment.spec.xxx.xxx
只要是类型不是string类型都可以往下查询
2.3.3 修改配置文件指令
2.3.3.1 使用edit修改
编辑器中修改现有的 Deployment 配置
使用 kubectl edit deployment shuyan 命令可以直接在编辑器中修改现有的 Deployment 配置。这个命令会打开默认的文本编辑器
[root@k8s-master yaml]# kubectl edit deployment shuyan
# 查看是否开启了
[root@k8s-master yaml]# kubectl get deployments.apps shuyan
NAME READY UP-TO-DATE AVAILABLE AGE
shuyan 4/4 4 4 82m
# 查看调度到哪里去了
[root@k8s-master yaml]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
shuyan-6b475bf845-d2c29 1/1 Running 0 83m 10.244.1.18 k8s-node1 <none> <none>
shuyan-6b475bf845-lcwgx 1/1 Running 0 83m 10.244.2.16 k8s-node2 <none> <none>
shuyan-6b475bf845-lxg7d 1/1 Running 0 77s 10.244.1.19 k8s-node1 <none> <none>
shuyan-6b475bf845-rtwxv 1/1 Running 0 77s 10.244.2.17 k8s-node2 <none> <none>
2.3.3.2 使用打补丁的方式修改
JSONPatch 是一种简单的补丁格式,适用于较小的更改。例如,如果想减少或者增加 Deployment 的副本数量,可以使用以下命令:
[root@k8s-master yaml]# kubectl patch deployments.apps shuyan \
-p '{"spec":{"replicas":2}}'
[root@k8s-master yaml]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
shuyan-6b475bf845-d2c29 1/1 Running 0 87m 10.244.1.18 k8s-node1 <none> <none>
shuyan-6b475bf845-lcwgx 1/1 Running 0 87m 10.244.2.16 k8s-node2 <none> <none>
[root@k8s-master yaml]# kubectl get deployment shuyan -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
shuyan 2/2 2 2 87m myapp myapp:v1 app=shuyan
2.3.4 删除资源delete
[root@k8s-master yaml]# kubectl delete deployments shuyan
deployment.apps "shuyan" deleted
[root@k8s-master yaml]# kubectl get deployments.apps
No resources found in default namespace.
[root@k8s-master yaml]# kubectl get pods
No resources found in default namespace.
运行和调试命令示例
在 Kubernetes (k8s) 中,Service 是一种 API 对象(资源),它定义了一种抽象,用来暴露一组 Pods 提供的应用程序的网络服务。Service 并不是 DNS 中的资源记录类型,而是 Kubernetes 自身的一个核心概念,用于网络服务发现和负载均衡
# 使用run去启动的话默认资源类型为pod
[root@k8s-master yaml]# kubectl run nginxpod --image nginx
pod/nginxpod created
# 查看pod 是否被正确创建
[root@k8s-master yaml]# kubectl get pods nginxpod
NAME READY STATUS RESTARTS AGE
nginxpod 1/1 Running 0 13s
# 同样也可以被编辑
[root@k8s-master yaml]# kubectl edit pods nginxpod
Edit cancelled, no changes made.
[root@k8s-master yaml]# kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 20h
# 使用export指令命令来创建一个 Service,以暴露 Pod 资源类型的的端口
[root@k8s-master yaml]# kubectl expose pod nginxpod \
--port 80 \
--target-port 80
# 查看所有service资源类型
[root@k8s-master yaml]# kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 20h
nginxpod ClusterIP 10.103.61.192 <none> 80/TCP 2m8s
# 精准查找
[root@k8s-master yaml]# kubectl get service nginxpod
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginxpod ClusterIP 10.103.61.192 <none> 80/TCP 17s
# 查看详细信息
[root@k8s-master yaml]# kubectl describe pods nginxpod
2.3.5 查看 资源日志指令logs
查看pod日志信息
[root@k8s-master yaml]# kubectl logs pods/nginxpod
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Sourcing /docker-entrypoint.d/15-local-resolvers.envsh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
2024/09/03 14:14:29 [notice] 1#1: using the "epoll" event method
2024/09/03 14:14:29 [notice] 1#1: nginx/1.27.1
2024/09/03 14:14:29 [notice] 1#1: built by gcc 12.2.0 (Debian 12.2.0-14)
2024/09/03 14:14:29 [notice] 1#1: OS: Linux 5.14.0-427.13.1.el9_4.x86_64
2024/09/03 14:14:29 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1073741816:1073741816
2024/09/03 14:14:29 [notice] 1#1: start worker processes
2024/09/03 14:14:29 [notice] 1#1: start worker process 29
2024/09/03 14:14:29 [notice] 1#1: start worker process 30
10.244.0.0 - - [03/Sep/2024:14:21:03 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/7.76.1" "-"
访问测试
2.3.6 进入容器指令exec
[root@k8s-master yaml]# kubectl exec services/nginxpod -it /bin/bash
root@nginxpod:/# ls
bin boot dev docker-entrypoint.d docker-entrypoint.sh etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@nginxpod:/# echo this is servise nginx > /usr/share/nginx/html/index.html
[root@k8s-master yaml]# kubectl get service -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 39h <none>
nginxpod ClusterIP 10.103.61.192 <none> 80/TCP 18h run=nginxpod
[root@k8s-master yaml]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginxpod 1/1 Running 0 19h 10.244.1.20 k8s-node1 <none> <none>
[root@k8s-master yaml]# curl 10.244.1.20
this is servise nginx
[root@k8s-master yaml]# curl 10.103.61.192
this is servise nginx
为什么可以访问两个 IP 地址
Pod 的 IP 地址:
当直接访问 Pod 的 IP 地址时,实际上是在直接访问 Pod 本身。
由于 Pod 在集群内部有一个固定的 IP 地址,因此可以通过这个 IP 地址直接访问 Pod 上运行的服务。
Service 的 ClusterIP:
当访问 Service 的 ClusterIP 时,Service
会将请求代理到它所选择的后端 Pod。在这种情况下,
请求最终也会到达 Pod,并且 Pod 会响应请求。
通过访问宿主机IP也可以访问 pod 的NGINX
[root@k8s-master yaml]# kubectl edit service
selector:
run: nginxpod
sessionAffinity: None
type: NodePort
[root@k8s-master yaml]# curl 192.168.239.110
curl: (7) Failed to connect to 192.168.239.110 port 80: 拒绝连接
[root@k8s-master yaml]# kubectl get service -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 39h <none>
nginxpod NodePort 10.103.61.192 <none> 80:32093/TCP 19h run=nginxpod
[root@k8s-master yaml]# curl 192.168.239.110:32093
this is servise nginx
2.3.7 文件复制指令cp
# 宿主机拷贝到pod
[root@k8s-master yaml]# touch /root/shuyanfile
[root@k8s-master yaml]# kubectl cp /root/shuyanfile nginxpod:/
[root@k8s-master yaml]# kubectl exec -it pods/nginxpod /bin/bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
root@nginxpod:/# ls
bin dev docker-entrypoint.sh home lib64 mnt proc run shuyanfile sys usr
boot docker-entrypoint.d etc lib media opt root sbin srv tmp var
# pod 拷贝到 宿主机
[root@k8s-master yaml]# kubectl cp nginxpod:/shuyanfile /root/yaml/shuyanfile
[root@k8s-master yaml]# kubectl cp nginxpod:/shuyanfile shuyanfile
[root@k8s-master yaml]# ls
shuyanfile shuyan.yml
删除pod和服务
[root@k8s-master yaml]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginxpod 1/1 Running 0 20h
[root@k8s-master yaml]# kubectl delete pods nginxpod
pod "nginxpod" deleted
[root@k8s-master yaml]# kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 40h
nginxpod NodePort 10.103.61.192 <none> 80:32093/TCP 19h
[root@k8s-master yaml]# kubectl delete service nginxpod
service "nginxpod" deleted
3 使用高级命令实例yaml
3.1 使用 命令生成 Pod 的 YAML 配置
# 生成pod类型的YAML格式
yaml]# kubectl run shuyan --image myapp:v1 --dry-run=client -o yaml
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: shuyan
name: shuyan
spec:
containers:
- image: myapp:v1
name: shuyan
resources: {}
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}
# 生成deployment资源类型的YAML格式
yaml]# kubectl create deployment shuyan --image myapp:v1 --dry-run=client -o yaml
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: shuyan
name: shuyan
spec:
replicas: 1
selector:
matchLabels:
app: shuyan
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: shuyan
spec:
containers:
- image: myapp:v1
name: myapp
resources: {}
status: {}
3.2 生成deployment 资源类型的yaml格式 示例
将生成的yaml格式重定向导入到yml文件中去
[root@k8s-master yaml]# kubectl create deployment shuyan \
--image myapp:v1 --dry-run=client -o yaml > shuyan.yml
# 运行yaml文件中的规则
[root@k8s-master yaml]# kubectl apply -f shuyan.yml
deployment.apps/shuyan created
[root@k8s-master yaml]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
shuyan-6b475bf845-jsghm 1/1 Running 0 9s 10.244.1.22 k8s-node1 <none> <none>
shuyan-6b475bf845-qw8hc 1/1 Running 0 9s 10.244.2.19 k8s-node2 <none> <none>
[root@k8s-master yaml]# kubectl get deployment -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
shuyan 2/2 2 2 25s myapp myapp:v1 app=shuyan
# 测试均可访问没有问题
[root@k8s-master yaml]# curl 10.244.1.22
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
[root@k8s-master yaml]# curl 10.244.2.19
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
4 k8s中的标签
如上的实验基础上查看这两个pod的标签分别是什么
使用--show-labels
[root@k8s-master yaml]# kubectl -n default get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
shuyan-6b475bf845-jsghm 1/1 Running 0 109s app=shuyan,pod-template-hash=6b475bf845
shuyan-6b475bf845-qw8hc 1/1 Running 0 109s app=shuyan,pod-template-hash=6b475bf845
[root@k8s-master yaml]# vim shuyan.yml
尝试修改查看状态
# 查看原生的ID与标签是什么
[root@k8s-master yaml]# kubectl -n default get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
shuyan-6b475bf845-jsghm 1/1 Running 0 11m app=shuyan,pod-template-hash=6b475bf845
shuyan-6b475bf845-qw8hc 1/1 Running 0 11m app=shuyan,pod-template-hash=6b475bf845
# 修改指定的标签为 wawa
[root@k8s-master yaml]# kubectl label pods shuyan-6b475bf845-jsghm app=wawa --overwrite
pod/shuyan-6b475bf845-jsghm labeled
# 系统发现指定ID的标签并不是shuyan会再起一个
[root@k8s-master yaml]# kubectl -n default get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
shuyan-6b475bf845-jsghm 1/1 Running 0 12m app=wawa,pod-template-hash=6b475bf845
shuyan-6b475bf845-qw8hc 1/1 Running 0 12m app=shuyan,pod-template-hash=6b475bf845
shuyan-6b475bf845-srw48 1/1 Running 0 12s app=shuyan,pod-template-hash=6b475bf845
# 再次修改回来成 shuyan
[root@k8s-master yaml]# kubectl label pods shuyan-6b475bf845-jsghm app=shuyan --overwrite
pod/shuyan-6b475bf845-jsghm labeled
# 发现会自动删除 保持平衡
[root@k8s-master yaml]# kubectl -n default get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
shuyan-6b475bf845-jsghm 1/1 Running 0 12m app=shuyan,pod-template-hash=6b475bf845
shuyan-6b475bf845-qw8hc 1/1 Running 0 12m app=shuyan,pod-template-hash=6b475bf845
做完实验删除
[root@k8s-master yaml]# kubectl -n default get deployment -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
shuyan 2/2 2 2 70m myapp myapp:v1 app=shuyan
[root@k8s-master yaml]# kubectl -n default delete deployments.apps shuyan
deployment.apps "shuyan" deleted