主要关于Pod操作
- 关于标签Label、选择器selector和注解Annotations的使用
- 了解Deployment如何进行滚动升级和回滚
- 理解Job和CronJobs
- 查看Pod,展示标签信息
kubectl get pods --show-labels
- 创建五个nginx的Pod,两个带env=prod标签,三个带env=dev标签
kubectl run nginx-dev1 --image=nginx --restart=Never --labels=env=dev
kubectl run nginx-dev2 --image=nginx --restart=Never --labels=env=dev
kubectl run nginx-dev3 --image=nginx --restart=Never --labels=env=dev
kubectl run nginx-prod1 --image=nginx --restart=Never --labels=env=prod
kubectl run nginx-prod2 --image=nginx --restart=Never --labels=env=prod
- 检查上面Pod的创建情况
kubectl get pods --show-labels
root@test:~/ex# kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx-dev1 1/1 Running 0 2m15s env=dev
nginx-dev2 1/1 Running 0 107s env=dev
nginx-dev3 1/1 Running 0 96s env=dev
nginx-prod1 1/1 Running 0 80s env=prod
nginx-prod2 1/1 Running 0 72s env=prod
- 查看带有标签env=dev的pod
kubectl get pods -l env=dev
- 查看带有标签env=dev的Pod并展示其标签
kubectl get pods -l env=dev --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx-dev1 1/1 Running 0 5m35s env=dev
nginx-dev2 1/1 Running 0 5m7s env=dev
nginx-dev3 1/1 Running 0 4m56s env=dev
- 查看带有标签env=prod 的Pod
kubectl get pods -l env=prod
- 查看带有标签env=prod 的Pod并展示其标签
kubectl get pods -l env=prod --show-labels
- 查看Pod, 并显示其env标签
kubectl get pods -L env
- 查看标签为env 且值为prod或者dev的pod
kubectl get pods -l 'env in (dev,prod)'
NAME READY STATUS RESTARTS AGE
nginx-dev1 1/1 Running 0 10m
nginx-dev2 1/1 Running 0 10m
nginx-dev3 1/1 Running 0 10m
nginx-prod1 1/1 Running 0 9m58s
nginx-prod2 1/1 Running 0 9m50s
- 查看标签为env且值为prod或者dev的Pod,并展示其标签
kubectl get pods -l 'env in (dev,prod)' --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx-dev1 1/1 Running 0 12m env=dev
nginx-dev2 1/1 Running 0 12m env=dev
nginx-dev3 1/1 Running 0 12m env=dev
nginx-prod1 1/1 Running 0 11m env=prod
nginx-prod2 1/1 Running 0 11m env=prod
- 修改某个Pod的标签env=uat,查看修改结果
kubectl label pod nginx-dev3 env=uat --overwrite
kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx-dev1 1/1 Running 0 19m env=dev
nginx-dev2 1/1 Running 0 19m env=dev
nginx-dev3 1/1 Running 0 18m env=uat
nginx-prod1 1/1 Running 0 18m env=prod
nginx-prod2 1/1 Running 0 18m env=prod
- 删除Pod的标签并查看修改结果
kubectl label pod nginx-dev{1..3} env-
kubectl label pod nginx-prod{1..2} env-
root@test:~/ex# kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx-dev1 1/1 Running 0 21m <none>
nginx-dev2 1/1 Running 0 21m <none>
nginx-dev3 1/1 Running 0 21m <none>
nginx-prod1 1/1 Running 0 20m <none>
nginx-prod2 1/1 Running 0 20m <none>
- 给多个Pod添加app=nginx标签并查看结果
kubectl label pod nginx-dev{1..3} app=nginx
kubectl label pod nginx-prod{1..2} app=nginx
root@test:~/ex# kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx-dev1 1/1 Running 0 23m app=nginx
nginx-dev2 1/1 Running 0 23m app=nginx
nginx-dev3 1/1 Running 0 23m app=nginx
nginx-prod1 1/1 Running 0 23m app=nginx
nginx-prod2 1/1 Running 0 22m app=nginx
- 获取所有node节点并展示其信息
kubectl get nodes --show-labels
- 为Node打 nodeName=nginxNode标签
kubectl label node kind-control-plane nodeName=nginxnode
- 创建Pod,并打标签run=nginx,使用nodeSelector将Pod部署带到nodeName=nginxnode的节点
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: nginx
name: nginx
spec:
nodeSelector:
nodeName: nginxnode
containers:
- image: nginx
name: nginx
resources: {}
dnsPolicy: ClusterFirst
restartPolicy: Never
status: {}创建Pod
kubectl create -f pod.yaml
- 查看Pod的Node-Selector
kubectl describe po nginx | grep Node-Selectors
Node-Selectors: nodeName=nginxnode
- 查看刚创建的Nginx Pod的标签
kubectl describe po nginx | grep Labels
Labels: run=nginx
- 为Pod添加注解name=webapp
kubectl annotate pod nginx-dev{1..3} name=webapp
kubectl annotate pod nginx-pord{1..3} name=webapp
- 查看Pod的注解
root@test:~/ex# kubectl describe po nginx-dev{1..3} | grep -i annotations
Annotations: name: webapp
Annotations: name: webapp
Annotations: name: webapp
root@test:~/ex# kubectl describe po nginx-prod{1..2} | grep -i annotations
Annotations: name: webapp
Annotations: name: webapp
- 移除Pod的注解,查看结果
kubectl annotate pod nginx-dev{1..3} name-
kubectl annotate pod nginx-prod{1..2} name-
- 删除所有pod
kubectl delete po --all
- 创建有5个nginx副本的名为webapp的Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: webapp
name: webapp
spec:
replicas: 5
selector:
matchLabels:
app: webapp
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: webapp
spec:
containers:
- image: nginx
name: nginx
resources: {}
status: {}创建 Deployment
$ kubectl create -f webapp.yaml
deployment.apps/webapp created
- 查看上面创建的Deployment
kubectl get deploy webapp --show-labels
NAME READY UP-TO-DATE AVAILABLE AGE LABELS
webapp 5/5 5 5 103s app=webapp
- 获取刚创建的Deployment的yaml文件
kubectl get deploy webapp -o yaml
- 查看Deployment的所有Pod
kubectl get deploy webapp --show-labels
kubectl get pods -l app=webapp
NAME READY STATUS RESTARTS AGE
webapp-754bcc647d-546xd 1/1 Running 0 30m
webapp-754bcc647d-5sj6d 1/1 Running 0 30m
webapp-754bcc647d-72vjc 1/1 Running 0 30m
webapp-754bcc647d-p88wz 1/1 Running 0 30m
webapp-754bcc647d-q5dx4 1/1 Running 0 30m
- 水平扩展webapp Deployment 的Pod数量到10个
kubectl scale deploy webapp --replicas=10
root@test:~/ex# kubectl get pods -l app=webapp
NAME READY STATUS RESTARTS AGE
webapp-754bcc647d-2g8bg 1/1 Running 0 23s
webapp-754bcc647d-546xd 1/1 Running 0 34m
webapp-754bcc647d-5sj6d 1/1 Running 0 34m
webapp-754bcc647d-72vjc 1/1 Running 0 34m
webapp-754bcc647d-7jttq 1/1 Running 0 23s
webapp-754bcc647d-fwv2f 1/1 Running 0 23s
webapp-754bcc647d-hzvn5 1/1 Running 0 23s
webapp-754bcc647d-p88wz 1/1 Running 0 34m
webapp-754bcc647d-q5btr 1/1 Running 0 23s
webapp-754bcc647d-q5dx4 1/1 Running 0 34m
- 查看Deployment的部署状态
kubectl rollout status deploy webapp
deployment "webapp" successfully rolled out
- 查看webapp Deployment的replicaset
kubectl get rs -l app=webapp
NAME DESIRED CURRENT READY AGE
webapp-754bcc647d 10 10 10 37m
- 获取webapp Deployment下Pod和ReplicaSet 的yaml
kubectl get rs -l app=webapp -o yaml
kubectl get po -l app=webapp -o yaml
- 删除webapp Deployment 并查看Pod的删除情况
kubectl delete deploy webapp
- 创建webapp Deployment,指定镜像版本和端口
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: webapp
name: webapp
spec:
replicas: 1
selector:
matchLabels:
app: webapp
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: webapp
spec:
containers:
- image: nginx:1.17.1
name: nginx
ports:
- containerPort: 80
resources: {}
status: {}创建Deployment
kubectl create -f webapp.yaml
- 更新Deployment的镜像版本并查看
kubectl set image deploy/webapp nginx=nginx:1.17.4
kubectl describe deploy webapp | grep Image
- 检查更新历史并查看Depment、ReplicaSet、Pod的信息
kubectl rollout history deploy webapp
deployment.apps/webapp
REVISION CHANGE-CAUSE
1 <none>
2 <none>
kubectl get deploy webapp --show-labels
kubectl get rs -l app=webapp
kubectl get po -l app=webapp
- 撤销对Deployment镜像版本的更改,检查回滚结果
kubectl rollout undo deploy webapp
deployment.apps/webapp rolled back
kubectl describe deploy webapp | grep Image
Image: nginx:1.17.1
- 设置镜像版本为1.16.1 并检查升级记录
kubectl set image deploy/webapp nginx=nginx:1.16.1
deployment.apps/webapp image updated
kubectl describe deploy webapp | grep Image
Image: nginx:1.16.1
kubectl rollout history deploy webapp
deployment.apps/webapp
REVISION CHANGE-CAUSE
2 <none>
3 <none>
4 <none>
- 将Deployment中镜像版本更新至之前的1.17.1版本
kubectl rollout undo deploy webapp --to-revision=3
deployment.apps/webapp rolled back
kubectl describe deploy webapp | grep Image
Image: nginx:1.17.1
kubectl rollout status deploy webapp
deployment "webapp" successfully rolled out
- 将Deployment中镜像版本更新至错误的版本1.100并检查相关信息
kubectl set image deploy/webapp nginx=nginx:1.100
kubectl rollout status deploy webapp
Waiting for deployment "webapp" rollout to finish: 1 old replicas are pending termination..
kubectl get pods
NAME READY STATUS RESTARTS AGE
webapp-58db9dc58f-nhjz6 0/1 ErrImagePull 0 42s
webapp-76bffbdf95-nj7n9 1/1 Running 0 6m28s
- 撤销之前的错误操作并确认Deployment、Pod已恢复正常
kubectl rollout undo deploy webapp
deployment.apps/webapp rolled back
kubectl rollout status deploy webapp
deployment "webapp" successfully rolled out
kubectl get pods
NAME READY STATUS RESTARTS AGE
webapp-76bffbdf95-nj7n9 1/1 Running 0 8m58s
- 查看指定版本的更新记录
kubectl rollout history deploy webapp --revision=7
deployment.apps/webapp with revision #7
Pod Template:
Labels: app=webapp
pod-template-hash=76bffbdf95
Containers:
nginx:
Image: nginx:1.17.1
Port: 80/TCP
Host Port: 0/TCP
Environment: <none>
Mounts: <none>
Volumes: <none>
- 暂停Deployment的部署
kubectl rollout pause deploy webapp
deployment.apps/webapp paused
- 更新nginx至最新版本,并查看更新历史
因为已经暂停了,所以不会有任何变化
kubectl set image deploy/webapp nginx=nginx:latest
kubectl rollout history deploy webapp
deployment.apps/webapp
REVISION CHANGE-CAUSE
2 <none>
4 <none>
6 <none>
7 <none>
- 恢复Deployment的部署
kubectl rollout resume deploy webapp
- 检查滚动历史并确认其新版本
kubectl rollout history deploy webapp
deployment.apps/webapp
REVISION CHANGE-CAUSE
2 <none>
4 <none>
6 <none>
7 <none>
8 <none>
kubectl rollout history deploy webapp --revision=8
deployment.apps/webapp with revision #8
Pod Template:
Labels: app=webapp
pod-template-hash=55cb87878b
Containers:
nginx:
Image: nginx:latest
Port: 80/TCP
Host Port: 0/TCP
Environment: <none>
Mounts: <none>
Volumes: <none>
- 为Deployment 设置自动伸缩,最小值为10,最大值为20以及CPU使用率为85%,验证hpa和副本的创建
kubectl autoscale deploy webapp --min=10 --max=20 --cpu-percent=85
horizontalpodautoscaler.autoscaling/webapp autoscaled
kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
webapp Deployment/webapp <unknown>/85% 10 20 1 17s
kubectl get pod -l app=webapp
NAME READY STATUS RESTARTS AGE
webapp-55cb87878b-2qhpx 1/1 Running 0 39s
webapp-55cb87878b-jlpxf 1/1 Running 0 39s
webapp-55cb87878b-jnpmh 1/1 Running 0 39s
webapp-55cb87878b-n8zh9 1/1 Running 0 39s
webapp-55cb87878b-pjt9f 1/1 Running 0 39s
webapp-55cb87878b-pqmxd 1/1 Running 0 13m
webapp-55cb87878b-r2r8t 1/1 Running 0 38s
webapp-55cb87878b-wklk9 1/1 Running 0 39s
webapp-55cb87878b-xns7n 1/1 Running 0 38s
webapp-55cb87878b-zp79v 1/1 Running 0 39s
- 删除刚创建的Deployment和hpa
kubectl delete deploy webapp
kubectl delete hpa webapp
- 创建一个带有node镜像的Job,并打印节点版本
kubectl create job nodeversion --image=node -- node -v
job.batch/nodeversion created
kubectl get job -w
NAME COMPLETIONS DURATION AGE
nodeversion 0/1 50s 50s
kubectl get pod
NAME READY STATUS RESTARTS AGE
nodeversion-nlgww 0/1 ContainerCreating 0 89s
- 查看上面创建的Pod的日志
kubectl logs nodeversion-nlgww
v20.0.0
- 基于Job打印yaml文件
kubectl create job hello-job --image=busybox --dry-run=client -o yaml -- echo "Hello I am from job"
yaml文件
apiVersion: batch/v1
kind: Job
metadata:
creationTimestamp: null
name: hello-job
spec:
template:
metadata:
creationTimestamp: null
spec:
containers:
- command:
- echo
- Hello I am from job
image: busybox
name: hello-job
resources: {}
restartPolicy: Never
status: {}- 基于上面输出的信息创建Job
kubectl create -f hello-job.yaml
- 查看Job与Pod,打印其日志
kubectl get job
NAME COMPLETIONS DURATION AGE
hello-job 1/1 8s 66s
nodeversion 1/1 4m10s 11m
kubectl get po
NAME READY STATUS RESTARTS AGE
hello-job-p8zbg 0/1 Completed 0 2m14s
nodeversion-nlgww 0/1 Completed 0 12m
kubectl logs hello-job-p8zbg
Hello I am from job
- 删除刚创建的Job
kubectl delete job hello-job
job.batch "hello-job" deleted
- 再次创建Job,并将任务执行数设置为10
apiVersion: batch/v1
kind: Job
metadata:
creationTimestamp: null
name: hello-job
spec:
# 将执行数设置为10
completions: 10
template:
metadata:
creationTimestamp: null
spec:
containers:
- command:
- echo
- Hello I am from job
image: busybox
name: hello-job
resources: {}
restartPolicy: Never
status: {}kubectl apply -f hello-job.yaml
- 查看新创建的job
kubectl get job -w
NAME COMPLETIONS DURATION AGE
hello-job 7/10 54s 54s
nodeversion 1/1 4m10s 17m
hello-job 7/10 60s 60s
hello-job 8/10 60s 60s
...
kubectl get po
NAME READY STATUS RESTARTS AGE
hello-job-8mvmd 0/1 Completed 0 42s
hello-job-bgtvg 0/1 Completed 0 49s
hello-job-g26g8 0/1 Completed 0 71s
hello-job-l9566 0/1 Completed 0 94s
hello-job-pph4q 0/1 Completed 0 34s
hello-job-qcg8w 0/1 Completed 0 78s
hello-job-tlzz7 0/1 Completed 0 62s
hello-job-tqlhs 0/1 Completed 0 85s
hello-job-tqvgv 0/1 Completed 0 55s
hello-job-zkvv5 0/1 Completed 0 27s
nodeversion-nlgww 0/1 Completed 0 17m
kubectl delete job hello-job
- 再次创建Job并设置并行执行数为10
apiVersion: batch/v1
kind: Job
metadata:
creationTimestamp: null
name: hello-job
spec:
# 将执行数设置为10
parallelism: 10
template:
metadata:
creationTimestamp: null
spec:
containers:
- command:
- echo
- Hello I am from job
image: busybox
name: hello-job
resources: {}
restartPolicy: Never
status: {}
创建Job
kubectl create -f hello-job.yaml
job.batch/hello-job created
- 查看job的执行与pod情况,完成后删除job
kubectl get job -w
NAME COMPLETIONS DURATION AGE
hello-job 5/1 of 10 21s 21s
hello-job 5/1 of 10 21s 21s
hello-job 6/1 of 10 21s 21s
hello-job 6/1 of 10 22s 22s
hello-job 7/1 of 10 22s 22s
hello-job 7/1 of 10 25s 25s
hello-job 8/1 of 10 25s 25s
hello-job 8/1 of 10 25s 25s
hello-job 8/1 of 10 28s 28s
hello-job 9/1 of 10 28s 28s
hello-job 9/1 of 10 31s 31s
hello-job 10/1 of 10 31s 31s
kubectl get po
NAME READY STATUS RESTARTS AGE
hello-job-5rhz5 0/1 Completed 0 2m44s
hello-job-7hzdr 0/1 Completed 0 2m44s
hello-job-8hgzl 0/1 Completed 0 2m44s
hello-job-dlc59 0/1 Completed 0 2m44s
hello-job-h7p5l 0/1 Completed 0 2m44s
hello-job-hr272 0/1 Completed 0 2m44s
hello-job-ltnbl 0/1 Completed 0 2m44s
hello-job-r4rbs 0/1 Completed 0 2m44s
hello-job-vp5lb 0/1 Completed 0 2m44s
hello-job-wjghl 0/1 Completed 0 2m44s
kubectl delete job hello-job
- 创建一个CronJob,每分钟打印日期和Hello from kubernetes cluster
kubectl create cronjob date-job --image=busybox --schedule="*/1 * * * *" -- bin/sh -c "date; echo Hello from kubernetes cluster"
cronjob.batch/date-job created
- 获取CronJob 的yaml
kubectl get cj date-job -o yaml
- 查看CronJob组件信息和打印日志
kubectl get cj
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
date-job */1 * * * * False 0 27s 108s
kubectl get job
NAME COMPLETIONS DURATION AGE
date-job-28043482 1/1 7s 116s
date-job-28043483 1/1 6s 56s
kubectl get po
NAME READY STATUS RESTARTS AGE
date-job-28043483-q9kdm 0/1 Completed 0 2m16s
date-job-28043484-gqtlb 0/1 Completed 0 76s
date-job-28043485-fg6pd 0/1 Completed 0 16s
kubectl logs date-job-28043483-q9kdm
Thu Apr 27 15:23:03 UTC 2023
Hello from kubernetes cluster
- 删除CronJob,并确认与其关联的Job和Pod是否删除
kubectl delete cj date-job
cronjob.batch "date-job" deleted
kubectl get po
kubectl get job