• 基于k8s实现动态弹性伸缩 动态的回滚和滚动更新


    K8S:

    K8S是一个使用 Docker 容器进行编排的系统,主要围绕 pods 进行工作。 Pods 是 k8s 生态中最小的调度单位,可以包含一个或多个容器。
    k8s是一个开源的容器集群管理系统,可以实现容器集群的自动化部署、自动扩缩容、维护等功能。

    pod生命周期:创建 —>> 发布 —>> 更新 —>> 回滚 —>> 删除

    今天用一个小例子实现一下k8s的动态弹性伸缩 动态的回滚和滚动更新,及负载均衡的功能。

    构建 namespace

    touch namespase.yaml
    
    • 1
    vim namespase.yaml
    
    • 1
    apiVersion: v1 #类型为Namespace
    kind: Namespace  #类型为Namespace
    metadata:
      name: ssx-nginx-ns  #命名空间名称
      labels:
        name: lb-ssx-nginx-ns  
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    k8s的创建命令:
    kubectl create
    如果不存在则创建,如果存在,则报错
    kubectl apply
    如果不存在则创建,如果存在,则更新

    kubectl create -f namespase.yaml
    
    • 1

    在这里插入图片描述
    查看空间:

    kubectl get ns
    
    • 1

    在这里插入图片描述
    前四个是系统默认的,最后是一个是我们新增的。

    创建pod控制器(deployment)yaml配置文件

    kubernetes通过Deployment和ReplicaSet(rs)管理多个Pod。

    touch deployment.yaml
    
    • 1
    vim deployment.yaml
    
    • 1
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: nginx #为该Deployment设置key为app,value为nginx的标签
      name: ssx-nginx-dm
      namespace: ssx-nginx-ns
    spec:
      replicas: 2 #副本数
      selector: #标签选择器,与上面的标签共同作用
        matchLabels: #选择包含标签app:nginx的资源
          app: nginx
      template: #这是选择或创建的Pod的模板
        metadata: #Pod的元数据
          labels: #Pod的标签,上面的selector即选择包含标签app:nginx的Pod
            app: nginx
        spec: #期望Pod实现的功能(即在pod中部署)
          containers: #生成container,与docker中的container是同一种
          - name: ssx-nginx-c
            image: nginx:latest #使用镜像nginx: 创建container,该container默认80端口可访问
            ports:
            - containerPort: 80  # 开启本容器的80端口可访问
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    kubectl create -f deployment.yaml
    
    • 1

    在这里插入图片描述
    如果不指定命名空间就会去查默认的命名空间,所以最好带上命名空间 -n 自己的空间。

    查看所有pod

    kubectl get pod -n ssx-nginx-ns
    
    • 1

    在这里插入图片描述
    根据配置文件中 replicas: 2 #副本数 参数这里看到我们启动了两个容器。

    kubectl describe:查看特定资源或资源组的详细信息

    kubectl describe pods ssx-nginx-dm-d9cd6595-6wnz2 -n ssx-nginx-ns
    
    • 1

    Pod启动成功以后 k8s内部会分配一个ip,只能内部访问,外部无法访问.
    在这里插入图片描述

    创建service(ymal方式创建)

    默认创建的pod是只能对内访问的,所以需要创建一个对外的访问端口,创建一个service其实就是暴露对外的访问端口

    touch service.yaml
    
    • 1
    vim service.yaml
    
    • 1
    apiVersion: v1
    kind: Service
    metadata:
      labels:
       app: nginx
      name: ssx-nginx-sv
      namespace: ssx-nginx-ns
    spec:
      ports:
      - port: 9000 #我暂时不理解,这个设置 明明没用到?
        name: ssx-nginx-last
        protocol: TCP
        targetPort: 80 # 容器nginx对外开放的端口 上面的dm已经指定了
        nodePort: 31090 #外网访问的端口
      selector:
        app: nginx
      type: NodePort
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    kubectl create -f service.yaml
    
    • 1

    在这里插入图片描述
    查看:
    kubectl get services、 kubectl get svc 都是一样的效果.

    kubectl get svc -n ssx-nginx-ns
    
    • 1

    在这里插入图片描述
    访问:

    curl  10.108.93.169:9000
    
    • 1

    在这里插入图片描述

    动态弹性伸缩 动态的回滚和滚动更新

    对于kubernetes来说Pod是资源调度最小单元,kubernetes主要的功能就是管理多个Pod,Pod中可以包含一个或多个容器,而kubernetes是如可管理多个Pod的呢?对,没错,就是通过控制器,比如Deployment和ReplicaSet(rs)。
    在这里插入图片描述

    弹性伸缩pod 自我修复和负载均衡

    查看副本数:

    kubectl get deployments -n ssx-nginx-ns
    
    • 1

    在这里插入图片描述
    增加副本:
    命令语法:
    scale [–resource-version=version] [–current-replicas=count] --replicas=COUNT (-f FILENAME | TYPE NAME)

    kubectl scale deployments/ssx-nginx-dm --replicas=3 -n ssx-nginx-ns
    
    • 1

    查看deployments 数:

    kubectl get deployments -n ssx-nginx-ns
    
    • 1

    在这里插入图片描述
    通过 kubectl get pods -n ssx-nginx-ns 可以看到当前的 Pod 也增加到了 3 个:每次请求发送到不同的 Pod,3 个副本轮训处理,这样就实现了负载均衡。
    在这里插入图片描述
    删除一个pod

    kubectl delete po ssx-nginx-dm-d9cd6595-s2pv4 -n  ssx-nginx-ns
    
    • 1

    在这里插入图片描述
    因为 Kubernetes 是声明式 API,所以删掉了之后,Pod API 对象就与预期的不一致了,所以会自动重新创建 Pod 保持与预期一致:
    在这里插入图片描述
    但是如果ReplicaSet 管理的 Pod 对象很多的话,那么要一个个手动删除,会很麻烦,所以可以使用:
    kubectl delete replicaset {rs_name} -n {namespace}

    要 scale down 也很方便,下面将删除一个副本(副本数变为 1)

    kubectl scale deployments/ssx-nginx-dm --replicas=1  -n ssx-nginx-ns
    
    • 1

    Rolling Update(灰度发布和回滚)

    Rolling Update 会边启动新的 Pod 边停止旧的 Pod,比如 replicas 是 3,然后有一个 Service 连着这三个 Pod,那么在做 Rolling Update 的时候,会先启动一个新版本的 Pod,并且这个 Pod 也会连上 Service,然后停掉其中一个旧的 Pod,再启动新版本的 Pod,再停止旧的 Pod,如此循环,直到 3 个 Pod 都是新版的为止。

    更新镜像的语法

    可以不用使用yml配置文件, 直接替换镜像版本:
    kubectl set image deployment =
    去搜一个nginx的版本,其他镜像也是同理,选择你需要的版本。

    kubectl set image deployment/ssx-nginx-dm ssx-nginx-c=nginx:1.14.0 -n ssx-nginx-ns
    
    • 1

    在这里插入图片描述
    通过 kubectl get pods 可以观察滚动更新的过程,可以看到 老版本nginx版本 的 Pod 被逐个删除,同时启动了新的 1.14.0版本的 Pod。

    在这里插入图片描述
    在这里插入图片描述
    回滚到上一个版本:

    kubectl rollout deployment/ssx-nginx-dm -n ssx-nginx-ns
    
    • 1

    也可以使用 --revision参数指定某个历史版本:

    kubectl rollout undo deployment/ssx-nginx-dm --to-revision=2 -n ssx-nginx-ns
    
    • 1

    如果想知道历史版本镜像,可以通过这个命令:

    kubectl rollout history deployment/ssx-nginx-dm -n ssx-nginx-ns
    
    • 1

    项目下线,即删除对应deployment与service资源:

    kubectl delete deployment nginx
    
    • 1
    kubectl delete svc nginx
    
    • 1
  • 相关阅读:
    【无标题】
    九耶丨阁瑞钛伦特-Vue(三)
    Nuscenes 数据集
    职场新手必备的5款办公软件,特别是第五个百试百用
    CleanMyMac X4.14.1最新版本下载
    论文阅读(13) 水母游泳过程中的神经机械波共振(2021)
    【24种设计模式】观察者模式(Observer Pattern)
    怎么把amr格式转换为mp3格式?
    day3:Node.js 基础知识
    python之requests的高级用法
  • 原文地址:https://blog.csdn.net/u010797364/article/details/125434295