• kubernetes(2)


    目录

    pod管理

    应用部署

    ​编辑

    ​编辑

    ​编辑

    编写yaml文件

    init容器

    ​编辑

    探针

    存活探针

    ​编辑

    就绪探针

    控制器

    replicaset

    deployment

    版本迭代

    回滚

    滚动更新策略

    暂停与恢复

    statefulset

    ​编辑

    ​编辑daemonset

    job

    cronjob


    pod管理

    应用部署

    上传测试镜像

    1. [root@k8s1 docker]# docker push reg.westos.org/library/myapp:v1
    2. [root@k8s1 docker]# docker push reg.westos.org/library/myapp:v2

    创建自助式pod(生产不推荐)

    1. [root@k8s2 ~]# kubectl run demo --image=myapp:v1
    2. [root@k8s2 ~]# kubectl get pod -o wide //使用 wide 输出格式,可以展示更多的列,包括 Node(Pod 所在的节点)、IP、状态、重启次数、版本等信息

    查看pod详情

    [root@k8s2 ~]# kubectl describe  pod demo        //获取指定 Pod 的各项详细信息,包括容器的状态、日志、事件等
    

     删除pod

    [root@k8s2 ~]# kubectl delete  pod demo
    

     创建控制器(推荐)

    1. [root@k8s2 ~]# kubectl create deployment myapp --image=myapp:v1 --replicas=3
    2. //创建一个 Deployment 对象的命令,用于管理 Pod,管理的pod副本数为3

    控制器自动维护pod副本数

    1. [root@k8s2 ~]# kubectl get pod
    2. [root@k8s2 ~]# kubectl get deployments.apps //返回所有 Deployments 的名称、可用副本数、所需副本数、更新策略等详细信息

    1. [root@k8s2 ~]# kubectl delete pod myapp-67984c8646-4j6fs
    2. [root@k8s2 ~]# kubectl get deployments.apps
    3. [root@k8s2 ~]# kubectl get pod

     在远程pod中执行命令

    1. [root@k8s2 ~]# kubectl exec myapp-67984c8646-nwtl9 -- ls /usr/share/nginx/html
    2. //在 Pod myapp-678fcbc488-gqdgk 中执行命令 ls /usr/share/nginx/html

    扩容pod数量

    1. [root@k8s2 ~]# kubectl scale deployment myapp --replicas=6
    2. [root@k8s2 ~]# kubectl get pod

     缩容pod数量

    1. [root@k8s2 ~]# kubectl scale deployment myapp --replicas=3
    2. [root@k8s2 ~]# kubectl get pod

    通过service暴露pod

    1. [root@k8s2 ~]# kubectl expose deployment myapp --port=80 --target-port=80
    2. //kubectl expose deployment myapp 命令创建了一个 Service,并将 Deployment myapp 暴露在集群内部的网络中。
    3. --port 参数指定了 Service 监听的端口号,这里为 80
    4. --target-port 参数指定了 Service 转发流量到 Deployment 中的 Pod 时所使用的端口号,这里同样为 80

     查看svc详情

    1. [root@k8s2 ~]# kubectl describe svc myapp
    2. //获取了名为 myapp 的 Service 的详细信息。该命令输出的信息包括:
    3. Service 的名称、命名空间、标签等基本信息;
    4. Service 的类型(ClusterIP、NodePort、LoadBalancer 等);
    5. Service 的端口信息,包括监听的端口号、协议(TCP/UDP)等;
    6. Service 关联的 Pod 信息,包括选择器、关联的 Pod 的 IP 地址、副本数等;
    7. Service 的 Endpoints 信息,包括关联的 Pod 的 IP 地址和端口号。
    8. [root@k8s2 ~]# curl 10.96.20.8
    9. [root@k8s2 ~]# curl 10.96.20.8/hostname.html

    service自动发现pod扩容与缩容,自动更新endpoints,实现对应用的负载均衡

    service默认使用clusterip类型,只能在集群中访问

    nodeport类型,可以在集群外部访问

    [root@k8s2 ~]# kubectl edit svc myapp
    

    [root@k8s2 ~]# kubectl get svc
    

    访问集群任意节点+端口

    更新应用版本

    1. [root@k8s2 ~]# kubectl set image deployment/myapp myapp=myapp:v2 //将 myapp 容器的镜像更新为 myapp:v2
    2. [root@k8s1 docker]# curl 192.168.81.11:31902

    查看应用历史版本

    [root@k8s2 ~]# kubectl rollout history deployment myapp    //用于查看 Deployment myapp中所有副本集的升级历史记录
    

    回滚

    [root@k8s2 ~]# kubectl rollout undo deployment myapp --to-revision=1
    

    删除应用

    1. [root@k8s2 ~]# kubectl delete deployments.apps myapp
    2. [root@k8s2 ~]# kubectl delete svc myapp
    3. [root@k8s2 ~]# kubectl get ns

    集群通过namespace来做资源隔离,默认操作的资源都指向default

    编写yaml文件

    获取帮助

    [root@k8s2 pod]# kubectl explain pod.spec.containers
    

    获取yaml模版

    1. [root@k8s2 pod]# kubectl run demo --image nginx --dry-run=client -o yaml > pod.yaml
    2. //--dry-run=client:使用客户端模式,即不会真正创建 Pod,仅会返回 YAML 格式的定义文件
    3. -o yaml:以 YAML 格式输出定义文件
    4. > pod.yaml:将输出的 YAML 定义文件保存到当前目录下的 pod.yaml 文件中
    5. 执行该命令会生成一个名为 pod.yaml 的文件,其中包含了一个定义 nginx 镜像 Pod 的 YAML 文件
    6. [root@k8s2 pod]# vim pod.yaml
    7. apiVersion: v1 //Kubernetes API的版本
    8. kind: Pod //资源类型,这里是pod
    9. metadata: //元数据对象,用于述 Pod 的基本信息,例如标签,名称等。
    10. labels:
    11. run: demo
    12. name: demo
    13. spec: //制定了pod的具体配置
    14. containers: //定义了 Pod 中的容器
    15. - image: nginx // 指定容器使用的镜像,这里使用的是nginx。
    16. name: demo
    17. imagePullPolicy: IfNotPresent //指定镜像拉取策略为IfNotPresent,表示如果本地已经存在相同版本的镜像,则不会从镜像仓库中拉取

     

    创建pod

    [root@k8s2 pod]# kubectl create -f pod.yaml    //根据pod.yaml文件中的定义来创建一个新的 Kubernetes Pod对象
    

     查看详情

    1. [root@k8s2 pod]# kubectl get pod -o wide
    2. [root@k8s2 pod]# kubectl describe pod demo
    3. [root@k8s2 pod]# kubectl get pod demo -o yaml
    4. //kubectl get pod -o wide命令会以表格形式显示所有的 Pod 对象,其中包括名称、状态、所在节点、IP地址、版本等信息。-o wide选项可以扩展输出内容,显示更多信息。
    5. kubectl describe pod demo命令会以文本形式展示指定名称为 demo 的 Pod 对象的详细信息,包括 Pod 的元数据、各容器的信息、生命周期事件、存储和网络配置等。
    6. kubectl get pod demo -o yaml命令会以 YAML 格式展示指定名称为 demo 的 Pod 对象的详细信息,包括 Pod 的元数据、各容器的信息、存储和网络配置等。这种格式的输出可以用于创建或修复 Pod 对象。

     示例

    1、

    2、

    3、

    • Guaranteed,保证级别:Pod 中的容器都设置了 CPU 和 Memory 的 requests 和 limits,并且这些值相等。此时,如果资源满足所有 Guaranteed 类别的 Pod 的需求,则这些 Pod 会被同时调度在集群中,保证它们的运行。
    • Burstable,突发级别:Pod 中至少有一个容器设置了 CPU 和 Memory 的 requests 和 limits,但是这些值不相等。此时,如果资源足够,那么这些 Pod 会被相应地调度,但是它们的性能可能会受到限制,因为它们能够使用的资源是有上限的。
    • BestEffort,尽力级别:Pod 中的容器没有设置 CPU 和 Memory 的 requests 和 limits。此时,这些容器会尽力地获取集群中未被占用的资源,但是它们的资源使用是无法保证的,因为它们需要等待集群中已分配的所有资源使用完毕才能够获得更多的资源。

     4、

    5、

    1. [root@k8s2 pod]# kubectl apply -f pod.yml //更新该 Pod 的配置
    2. [root@k8s2 pod]# kubectl delete -f pod.yml //删除pod

    init容器

    1. [root@k8s2 pod]# vim init-pod.yaml
    2. apiVersion: v1
    3. kind: Pod
    4. metadata:
    5. name: myapp-pod
    6. labels:
    7. app.kubernetes.io/name: MyApp
    8. spec:
    9. containers:
    10. - name: myapp-container
    11. image: busybox
    12. command: ['sh', '-c', 'echo The app is running! && sleep 3600']
    13. initContainers:
    14. - name: init-myservice
    15. image: busybox
    16. command: ['sh', '-c', "until nslookup myservice.default.svc.cluster.local; do echo waiting for myservice; sleep 2; done"]

    1. [root@k8s2 pod]# kubectl apply -f init-pod.yaml
    2. [root@k8s2 pod]# kubectl get pod

    在init容器没有成功运行之前,主容器不会被运行

    添加svc定义

    1. [root@k8s2 pod]# vim myservice.yaml
    2. ---
    3. apiVersion: v1
    4. kind: Service
    5. metadata:
    6. name: myservice
    7. spec:
    8. ports:
    9. - protocol: TCP
    10. port: 80
    11. targetPort: 9376

    svc解析成功后,init容器退出,主容器运行

    1. [root@k8s2 pod]# yum install -y bind-utils
    2. [root@k8s2 pod]# dig -t A myservice.default.svc.cluster.local. @10.96.0.10

    [root@k8s2 pod]# kubectl get pod
    

    探针

    存活探针

    1. [root@k8s2 pod]# vim liveness-pod.yaml
    2. apiVersion: v1
    3. kind: Pod
    4. metadata:
    5. labels:
    6. test: liveness
    7. name: liveness-http
    8. spec:
    9. containers:
    10. - name: liveness
    11. image: nginx
    12. livenessProbe:
    13. tcpSocket:
    14. port: 8080
    15. initialDelaySeconds: 3
    16. periodSeconds: 3
    17. [root@k8s2 pod]# kubectl apply -f liveness-pod.yaml

    [root@k8s2 pod]# kubectl apply -f liveness-pod.yaml
    

    在存活探针检测失败导致容器不断被重启 

    就绪探针

    1. [root@k8s2 pod]# vim liveness-pod.yaml
    2. apiVersion: v1
    3. kind: Pod
    4. metadata:
    5. labels:
    6. test: liveness
    7. name: liveness-http
    8. spec:
    9. containers:
    10. - name: liveness
    11. image: nginx
    12. livenessProbe:
    13. tcpSocket:
    14. port: 80
    15. initialDelaySeconds: 3
    16. periodSeconds: 3
    17. readinessProbe:
    18. httpGet:
    19. path: /test.html
    20. port: 80
    21. initialDelaySeconds: 5
    22. periodSeconds: 5

    就绪探针失败导致容器一直未就绪

    创建测试页面

    [root@k8s2 pod]# kubectl exec  liveness-http -- touch /usr/share/nginx/html/test.html
    

    就绪探针成功

    创建svc

    [root@k8s2 pod]# kubectl expose pod liveness-http --port 80 --target-port 80
    

    就绪容器自动上线

    删除测试页面

    [root@k8s2 pod]# kubectl exec  liveness-http -- rm /usr/share/nginx/html/test.html
    

    就绪探针失败,容器未就绪

    在svc中容器自动下线

    控制器

    文档:

    replicaset

    ReplicaSet用于保证指定数量的 Pod 副本一直运行

    1. [root@k8s2 pod]# vim rs-example.yml
    2. apiVersion: apps/v1
    3. kind: ReplicaSet
    4. metadata:
    5. name: replicaset-example
    6. spec:
    7. replicas: 1
    8. selector:
    9. matchLabels:
    10. app: nginx
    11. template:
    12. metadata:
    13. labels:
    14. app: nginx
    15. spec:
    16. containers:
    17. - name: nginx
    18. image: nginx

    replicaset是通过标签匹配pod

    [root@k8s2 pod]# kubectl label pod replicaset-example-n2kf2 app=myapp --overwrite    //n2kf2 myapp标签
    

    [root@k8s2 pod]# kubectl label pod replicaset-example-n2kf2 app=nginx --overwrite
    

    replicaset自动控制副本数量,pod可以自愈

    [root@k8s2 pod]# kubectl delete pod replicaset-example-n2kfs
    

    deployment

    Deployment 的主要作用是实现应用程序的无缝升级和回滚

    1. [root@k8s2 pod]# vim deployment-example.yaml
    2. apiVersion: apps/v1
    3. kind: Deployment
    4. metadata:
    5. name: deployment-example
    6. spec:
    7. replicas: 3
    8. selector:
    9. matchLabels:
    10. app: myapp
    11. template:
    12. metadata:
    13. labels:
    14. app: myapp
    15. spec:
    16. containers:
    17. - name: myapp
    18. image: myapp:v1

    版本迭代

    1. [root@k8s2 pod]# vim deployment-example.yaml
    2. apiVersion: apps/v1
    3. kind: Deployment
    4. metadata:
    5. name: deployment-example
    6. spec:
    7. replicas: 3
    8. selector:
    9. matchLabels:
    10. app: myapp
    11. template:
    12. metadata:
    13. labels:
    14. app: myapp
    15. spec:
    16. containers:
    17. - name: myapp
    18. image: myapp:v2

    replicaset就是deployment的一个版本

    回滚

    1. [root@k8s2 pod]# vim deployment-example.yaml
    2. apiVersion: apps/v1
    3. kind: Deployment
    4. metadata:
    5. name: deployment-example
    6. spec:
    7. replicas: 3
    8. selector:
    9. matchLabels:
    10. app: myapp
    11. template:
    12. metadata:
    13. labels:
    14. app: myapp
    15. spec:
    16. containers:
    17. - name: myapp
    18. image: myapp:v1

    滚动更新策略

    1. [root@k8s2 pod]# vim deployment-example.yaml
    2. apiVersion: apps/v1
    3. kind: Deployment
    4. metadata:
    5. name: deployment-example
    6. spec:
    7. minReadySeconds: 5
    8. strategy:
    9. rollingUpdate:
    10. maxSurge: 1
    11. maxUnavailable: 0
    12. replicas: 3
    13. selector:
    14. matchLabels:
    15. app: myapp
    16. template:
    17. metadata:
    18. labels:
    19. app: myapp
    20. spec:
    21. containers:
    22. - name: myapp
    23. image: myapp:v1
    24. //minReadySeconds 的值为 5 秒,表示在新版本的 Pod 启动后,需要等待至少 5 秒才会继续滚动升级。maxSurge 的值为 1,表示在滚动升级的过程中,除了当前的 Pod 数量之外,最多会创建一个新的 Pod。maxUnavailable 的值为 0,表示在滚动升级的过程中,不允许任何 Pod 不可用

    暂停与恢复

    暂停,避免触发不必要的线上更新

    1. [root@k8s2 pod]# kubectl rollout pause deployment deployment-example
    2. [root@k8s2 pod]# vim deployment-example.yaml
    3. apiVersion: apps/v1
    4. kind: Deployment
    5. metadata:
    6. name: deployment-example
    7. spec:
    8. minReadySeconds: 5
    9. strategy:
    10. rollingUpdate:
    11. maxSurge: 1
    12. maxUnavailable: 0
    13. replicas: 6
    14. selector:
    15. matchLabels:
    16. app: myapp
    17. template:
    18. metadata:
    19. labels:
    20. app: myapp
    21. spec:
    22. containers:
    23. - name: myapp
    24. image: nginx
    25. resources:
    26. limits:
    27. cpu: 0.5
    28. memory: 200Mi
    29. requests:
    30. cpu: 0.5
    31. memory: 200Mi

    调整副本数,不受影响

    但是更新镜像和修改资源并没有触发更新

    恢复后开始触发更新

    [root@k8s2 pod]# kubectl rollout resume deployment deployment-example
    

    statefulset

    当使用StatefulSet时,Pod的名称会包括一个索引,例如web-0web-1web-2等,这些索引是按顺序递增的,并且在Pod的生命周期中保持不变

    StatefulSet保证每个Pod的名称在整个集群中是唯一的,例如,如果您有一个名为web-0的Pod,任何时候都不能重新创建一个叫做web-0的Pod。

    1. [root@k8s2 pod]# vim statefulset.yaml
    2. apiVersion: apps/v1
    3. kind: StatefulSet
    4. metadata:
    5. name: web
    6. spec:
    7. selector:
    8. matchLabels:
    9. app: nginx
    10. serviceName: "nginx"
    11. replicas: 3
    12. minReadySeconds: 3
    13. template:
    14. metadata:
    15. labels:
    16. app: nginx
    17. spec:
    18. terminationGracePeriodSeconds: 10
    19. containers:
    20. - name: nginx
    21. image: nginx
    22. ports:
    23. - containerPort: 80
    24. name: web

    daemonset

    Taints(污点)是一种标记,可以应用于节点,用于表示这个节点上的某些条件不适合运行某些 Pod。

    添加回来

    1. [root@k8s2 pod]# vim daemonset-example.yml
    2. apiVersion: apps/v1
    3. kind: DaemonSet
    4. metadata:
    5. name: daemonset-example
    6. spec:
    7. selector:
    8. matchLabels:
    9. app: nginx
    10. template:
    11. metadata:
    12. labels:
    13. app: nginx
    14. spec:
    15. tolerations:
    16. - effect: NoSchedule //表示不允许调度新的 Pod 到该节点上
    17. operator: Exists //表示只要这个污点存在,就能容忍。
    18. containers:
    19. - name: nginx
    20. image: nginx

    job

    Job是用于处理一次性任务的控制器,它可以保证任务成功完成后自动停止。Job中包含一个或多个Pods,在Pods成功完成后便完成任务。如果Pods失败,则Job会重启Pods,直到任务完成。

    1. [root@k8s2 pod]# vim job.yml
    2. apiVersion: batch/v1
    3. kind: Job
    4. metadata:
    5. name: pi
    6. spec:
    7. completions: 6 //完成任务的Pod数量
    8. parallelism: 2 //并行执行的Pod数量
    9. template:
    10. spec:
    11. containers:
    12. - name: pi
    13. image: perl:5.34.0
    14. command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
    15. restartPolicy: Never //完成后不会重启
    16. backoffLimit: 4 //当任务执行失败时,最多重试的次数

    cronjob

    CronJob是用于处理周期性任务的控制器,它类似于传统的Cron定时任务,可以基于指定的时间或时间间隔来执行任务。CronJob会创建一个Job对象来运行任务,Job对象运行完成后自动被删除。如果Job对象出现错误,CronJob将会自动重启Job对象,直到任务成功完成。

    1. [root@k8s2 pod]# vim cronjob.yml
    2. apiVersion: batch/v1
    3. kind: CronJob
    4. metadata:
    5. name: hello
    6. spec:
    7. schedule: "* * * * *"
    8. jobTemplate:
    9. spec:
    10. template:
    11. spec:
    12. containers:
    13. - name: hello
    14. image: busybox
    15. imagePullPolicy: IfNotPresent
    16. command:
    17. - /bin/sh
    18. - -c
    19. - date; echo Hello from the Kubernetes cluster
    20. restartPolicy: OnFailure
    21. //每分钟的每一秒都会执行一次,使用busybox镜像来打印当前时间并输出"Hello from the Kubernetes cluster"

  • 相关阅读:
    python 语音识别(百度api)
    MySQL性能分析:性能模式和慢查询日志的使用
    java基于Springboot+vue的健身房课程预约平台 element
    学习Java这么久了,还没了解过Java虚拟机?这有点说不过去了啊,阿里P8总结最新Java虚拟机学习指南赶紧学起来!
    上岸美团这份《Java岗面试指南》被772人催更,我连夜肝了出来
    多测师肖sir_高级金牌讲师__接口测试之练习题(6.1)
    各种NoSQL数据库
    Linux 之nmcli网络配置命令
    PHP:类的自动加载
    day36 XSS跨站&MXSS&UXSS&FlashXSS&PDFXSS
  • 原文地址:https://blog.csdn.net/m0_64028800/article/details/133935924