Deployment構成起動プローブjavaスクロール配置を実現


生存、準備、起動プローブの構成
私达はふだんk 8 sを使う时バージョンのアップグレードの问题に直面することができて、私の个人の开発の使用する基本はjava言语で、だからきっと1つの问题のコードの起动が遅いことにも出会うことができます.
Deploymentのバージョンを更新するときにjavaの起動が遅れるとリクエストが失敗し、それを解決するためにカナリアを使用してリリースすることができます.
2つのバージョンを表すには、2つのDeploymentを使用します.2つのDeploymentには同じLabelがあります.新しいバージョンのDeploymentが完全に起動した後、削除するにはDeploymentが必要です.
しかし,この方法は操作が比較的複雑であり,k 8 sの更新規則に反している.
プローブを使用してpodがready状態であることを確認
このような状況を解決するためにDeploymentは準備検出器を提供し、容器がいつ準備され、要求流量を受け入れることができるかを知ることができ、1つのPodの中のすべての容器が準備されている場合、このPodを準備と見なすことができる.
プローブの内容についてはここではあまり説明しませんが、文末のジャンプで公式サイトに接続できるチュートリアルです.
テスト
ここで私は自分でテストする流れを示して、みんなが理解するのに便利です.
準備されたサービス:
  • cliden-demo(20秒遅れて起動):健康なインタフェースを提供してhelloに戻ります!!
  • 対応ingress、service、deployment
  • Javaコード
    論理はとても簡単なGET要求で、/helloはパラメータがなくて、要求した後にHelloに帰って、Spring!ログを印刷
    再起動時
    
      public static void main(String[] args) throws InterruptedException {
        for (int i = 0; i < 20; i++) {
          System.out.println(i + " seconds late run");
          Thread.sleep(1000);
        }
        SpringApplication.run(DemoApplication.class, args);
      }
    
      public Mono<ServerResponse> hello(ServerRequest request) {
        log.info("hello!!!");
        return ServerResponse.ok()
            .contentType(MediaType.TEXT_PLAIN)
            .body(BodyInserters.fromObject("Hello, Spring!"));
      }
    
      @Bean
      public RouterFunction<ServerResponse> route(GreetingHandler greetingHandler) {
    
        return RouterFunctions.route(
            RequestPredicates.GET("/hello").and(RequestPredicates.accept(MediaType.TEXT_PLAIN)),
            greetingHandler::hello);
      }
    

    k 8 s関連yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: client-demo-server
      namespace: paas
    spec:
      replicas: 3
      selector:
        matchLabels:
          run: client-demo-server
      template:
        metadata:
          labels:
            run: client-demo-server
        spec:
          containers:
            - name: client-demo-server-containers
              image: registry.cn-beijing.aliyuncs.com/spring-cloud-client-demo-image:0.0.2
              #          ,            ,         
              readinessProbe:
                httpGet:
                  port: 8083
                  path: /hello
                  scheme: HTTP
                initialDelaySeconds: 5
                periodSeconds: 5
                successThreshold: 1
                timeoutSeconds: 100
              #               pod
              livenessProbe:
                httpGet:
                  port: 8083
                  path: /hello
                  scheme: HTTP
                initialDelaySeconds: 5
                periodSeconds: 5
                failureThreshold: 20
              volumeMounts:
                - name: host-time
                  mountPath: /etc/localtime
              ports:
                - containerPort: 8083
              resources:
                requests:
                  cpu:  1
                  memory: 1024Mi
                limits:
                  cpu:  1
                  memory: 1024Mi
    
          imagePullSecrets:
            - name: paas
          volumes:
            - name: host-time
              hostPath:
                path: /etc/localtime
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: client-demo-server
      namespace: paas
      labels:
        run: client-demo-server
    spec:
      type: NodePort
      ports:
        - port: 8083
      selector:
        run: client-demo-server
    ---
    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: client-demo-server
      namespace: paas
    spec:
      rules:
        - host: client-demo-server.jbzm.internal.com
          http:
            paths:
              - backend:
                  serviceName: client-demo-server
                  servicePort: 8083
    

    テスト結果
    サービス開始時間を増大させるために起動前に20 s待ったと再宣言
    kubectl get pod -n paas                                                                                    
    NAME                                  READY   STATUS    RESTARTS   AGE
    client-demo-server-57c468986d-2r9lh   1/1     Running   0          14m
    client-demo-server-57c468986d-k8xxw   1/1     Running   0          14m
    client-demo-server-57c468986d-wmcxf   1/1     Running   0          14m
    client-demo-server-767868f74c-gx6df   0/1     Running   0          49s
    

    ここでreplicasを3に設定し、deploymentバージョンを更新します.
    サービスが削除されていないことがわかりますが、新しいclient-demo-server-76788 f 74 c-gx 6 dfpodが現れ、Running状態にありますが、readyはありません.
    ここでdeploymentスクロール更新とスケジューリングの原理は公式ドキュメントで詳しく紹介されています
    新しく拡張されたpodのログを表示
    kubectl logs -f --tail=100 -n paas client-demo-server-767868f74c-gx6df                                                                       
    0 seconds late run
    1 seconds late run
    2 seconds late run
    3 seconds late run
    4 seconds late run
    5 seconds late run
    6 seconds late run
    7 seconds late run
    

    サービスが起動中であり、カウントダウンが終了して起動が完了するとpodはサービスの/helloインタフェースを呼び出し、ステータスコードが200に戻ったときにサービスが正常に起動したと考えられることがわかる.
    kubectl get pod -n paas                                                                                   
    NAME                                  READY   STATUS              RESTARTS   AGE
    client-demo-server-57c468986d-2r9lh   1/1     Running             0          15m
    client-demo-server-57c468986d-k8xxw   0/1     Terminating         0          15m
    client-demo-server-57c468986d-wmcxf   1/1     Running             0          15m
    client-demo-server-767868f74c-gx6df   1/1     Running             0          74s
    client-demo-server-767868f74c-lzwxw   0/1     ContainerCreating   0          17s
    

    すでに老けているpodが見えてきました
    の最後の部分
    ここまでは基本的にプレゼンテーションが終わりました
    参考記事
  • k 8 s公式サイト