Skip to content

Latest commit

 

History

History
773 lines (656 loc) · 19.5 KB

2.md

File metadata and controls

773 lines (656 loc) · 19.5 KB

k8s 150练习(中)

Pod设计

主要关于Pod操作

  • 关于标签Label、选择器selector和注解Annotations的使用
  • 了解Deployment如何进行滚动升级和回滚
  • 理解Job和CronJobs
  1. 查看Pod,展示标签信息
kubectl get pods --show-labels
  1. 创建五个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
  1. 检查上面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
  1. 查看带有标签env=dev的pod
kubectl get pods -l env=dev
  1. 查看带有标签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

  1. 查看带有标签env=prod 的Pod
kubectl get pods -l env=prod
  1. 查看带有标签env=prod 的Pod并展示其标签
kubectl get pods -l env=prod --show-labels
  1. 查看Pod, 并显示其env标签
kubectl get pods -L env
  1. 查看标签为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
  1. 查看标签为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
  1. 修改某个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
  1. 删除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>
  1. 给多个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
  1. 获取所有node节点并展示其信息
kubectl get nodes --show-labels
  1. 为Node打 nodeName=nginxNode标签
kubectl label node kind-control-plane nodeName=nginxnode
  1. 创建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
  1. 查看Pod的Node-Selector
kubectl describe po nginx | grep Node-Selectors
Node-Selectors:  nodeName=nginxnode
  1. 查看刚创建的Nginx Pod的标签
kubectl describe po nginx | grep Labels
Labels:       run=nginx
  1. 为Pod添加注解name=webapp
kubectl annotate pod nginx-dev{1..3} name=webapp

kubectl annotate pod nginx-pord{1..3} name=webapp

  1. 查看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
  1. 移除Pod的注解,查看结果
kubectl annotate pod nginx-dev{1..3} name-
kubectl annotate pod nginx-prod{1..2} name-
  1. 删除所有pod
kubectl delete po --all

  1. 创建有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
  1. 查看上面创建的Deployment
kubectl get deploy webapp --show-labels
NAME     READY   UP-TO-DATE   AVAILABLE   AGE    LABELS
webapp   5/5     5            5           103s   app=webapp
  1. 获取刚创建的Deployment的yaml文件
kubectl get deploy webapp -o yaml
  1. 查看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
  1. 水平扩展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
  1. 查看Deployment的部署状态
kubectl rollout status deploy webapp
deployment "webapp" successfully rolled out
  1. 查看webapp Deployment的replicaset
kubectl get rs -l app=webapp

NAME                DESIRED   CURRENT   READY   AGE
webapp-754bcc647d   10        10        10      37m
  1. 获取webapp Deployment下Pod和ReplicaSet 的yaml
kubectl get rs -l app=webapp -o yaml
kubectl get po -l app=webapp -o yaml
  1. 删除webapp Deployment 并查看Pod的删除情况
kubectl delete deploy webapp
  1. 创建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
  1. 更新Deployment的镜像版本并查看
kubectl set image deploy/webapp nginx=nginx:1.17.4

kubectl describe deploy webapp | grep Image
  1. 检查更新历史并查看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
  1. 撤销对Deployment镜像版本的更改,检查回滚结果
kubectl rollout undo deploy webapp
deployment.apps/webapp rolled back

kubectl describe deploy webapp | grep Image

Image:        nginx:1.17.1
  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>
  1. 将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
  1. 将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
  1. 撤销之前的错误操作并确认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
  1. 查看指定版本的更新记录
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>
  1. 暂停Deployment的部署
kubectl rollout pause deploy webapp
deployment.apps/webapp paused
  1. 更新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>
  1. 恢复Deployment的部署
kubectl rollout resume deploy webapp
  1. 检查滚动历史并确认其新版本
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>

  1. 为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
  1. 删除刚创建的Deployment和hpa
kubectl delete deploy webapp

kubectl delete hpa webapp
  1. 创建一个带有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
  1. 查看上面创建的Pod的日志
kubectl logs nodeversion-nlgww
v20.0.0
  1. 基于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: {}
  1. 基于上面输出的信息创建Job
kubectl create -f hello-job.yaml
  1. 查看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
  1. 删除刚创建的Job
kubectl delete job hello-job
job.batch "hello-job" deleted
  1. 再次创建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
  1. 查看新创建的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
  1. 再次创建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
  1. 查看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
  1. 创建一个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
  1. 获取CronJob 的yaml
kubectl get cj date-job -o yaml
  1. 查看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
  1. 删除CronJob,并确认与其关联的Job和Pod是否删除
kubectl delete cj date-job
cronjob.batch "date-job" deleted

kubectl get po

kubectl get job