Kubernetes 탐지기, Kotlin, Helm을 통해 고가용성 서비스를 쉽게 얻을 수 있습니다.

간단한 설명과 Kubernetes 탐지기가 어떻게 작동하는지 예를 들어 설명하면 서비스가 시종일관 정상적으로 유지되는 데 도움이 됩니다.
에 자리잡다,...
표지 사진Github 저자unsplash

브라덴 콜럼 전제 조건(이 자습서에 사용된 버전 사용):


  • Docker(엔진 19.03.13)

  • Minikube(1.15.1)

  • 키잡이(3.4.0)

  • Kubernetes 버전 일치
  • 탐지기 정보


    탐침(때로는 심장 박동 또는 은 마이크로 서비스의 기본 기능이다.서비스 상태를 파악하고 문제가 발생할 때 복구하기 위해 끊임없이 검사를 한다.
    탐색을 아주 간단한 단점으로 설정하면 서비스가 실행될 때 유효한 HTTP 상태 코드를 되돌려주거나, 더 복잡하게 데이터베이스 연결 상태를 찾거나, 서비스가 외부 의존항과 통신할 수 있는지, 대기열에 메시지를 보낼 수 있는지 등을 찾을 수 있습니다.
    Kubernetes에서 이 검사를 설정할 수 있는 옵션을 제공합니다.다중 복사본, 다중 노드 환경과 함께 설정하면 탐지기는 주동적인 오류 처리를 허용하고 고장에서 복구하는 중요한 기능을 가진다.
    다음과 같은 세 가지 유형으로 분류됩니다.

    건강 검진 활성 프로브


    Liveness Probe는pod/컨테이너가 실행 중이지만 작동하지 않기 때문에pod/컨테이너가 언제 재부팅되어야 하는지 알 수 있습니다.그것은 서비스를 원시 상태로 복원함으로써 가용성을 높이는 데 도움을 준다.
    initialDelaySeconds 을 전달할 때마다 Kubernetes는 지정한 명령을 실행하기 시작하며, 응답이 200-399가 아니면 실패합니다.failureThreshold값을 변경하지 않으면pod는 3차례의 고장 후에 다시 시작됩니다.

    준비된 탐지기


    Readiness Probe는 옵션과 실현에 있어서liveness Probe와 유사하지만pod에서 데이터를 받을 준비가 되었을 때 Kubernetes에 알리는 기능을 가지고 있습니다.때때로 프로그램은 시작할 때 작업을 실행해야 한다.메모리에 데이터를 불러올 수도 있고, 캐시를 예열할 수도 있으며, 새로운 요청을 받기 전에 정보를 처리할 수도 있다.이 장면에서 서비스가 실제로 실행되고 있어도 요청을 처리할 준비가 되어 있지 않다.
    준비 단점이 200-399 사이의 HTTP 코드를 되돌려주면pod 조건을pod 준비로 변경합니다.successThreshold값은pod가 데이터를 수신하기 전에 반드시 유효해야 하는 횟수를 확정하는 데 사용할 수 있다.

    시동 탐지기


    Startup Probe는 다른 두 탐지기의 부팅에 지연을 제공합니다.시동이 느린 용기가 있을 때, 그것은 특히 유용하다. 왜냐하면, 그것은 더욱 긴 시간이 필요하고, 활동성과 준비성 탐지기의 단점을 사용할 수 있도록 보장하기 때문이다.이 강좌에서 우리는 그것을 뛰어넘을 것이다.

    구현 시작


    이 시리즈의 마지막 부분에서 Spring Boot이 있는 Kotlin 프로그램을 만들고 Helm을 사용하여 Kubernetes에 배치합니다.이제 우리는 활동성과 준비성 탐측을 포함하여 그것을 확장할 것이다.

    탐지 끝점에 쓰기

    Application.kt 파일에서 두 개의 새 끝점을 생성합니다.
        @GetMapping("/health")
        @ResponseStatus(HttpStatus.OK)
        fun health(): String {
            println("Liveness Probe");
            return "Healthy";
        }
    
        @GetMapping("/ready")
        @ResponseStatus(HttpStatus.OK)
        fun ready(): String {
            println("Readiness Probe");
            return "Ready";
        }
    
    서비스가 실행 중이면 항상 성공으로 돌아갑니다.잠시 후 우리는 시뮬레이션에 실패할 것이다.

    확장 투구 배치 템플릿


    Kubernetes 탐지기는 배치 규범의 일부분입니다.따라서 당신의 투구deployment.yaml 템플릿에 containers규범에 다음과 같은 내용을 추가합니다.
        livenessProbe:
            httpGet:
                path: /health
                port: 8080
            initialDelaySeconds: 10
            periodSeconds: 3
        readinessProbe:
            httpGet:
                path: /ready
                port: 8080
            initialDelaySeconds: 15
            periodSeconds: 5
    
    이 예에서 Kubernetes는 10초 후에 활동성 검사를 시작하고 3초마다 서비스 포트/health 포트에서 한 번, 15초 후에 5초마다 포트/ready에서 한 번 반복한다고 알려드립니다.

    어플리케이션 구축 및 실행


    설정을 테스트하려면 Kubernetes에서 프로그램을 구축하고 실행하십시오. (Minikube를 사용하여 이 동작을 수행하는 방법에 대한 설명은 사용할 수 있거나 저장소 루트 디렉터리의run.sh 스크립트를 사용할 수 있습니다.)
    실행 후kubectl get podspod가 실행 중이고 로그가 메시지를 인쇄하고 있음을 나타냅니다.
    ~/code/demos/demo-spring-boot master >2 > kubectl get pods
    NAME                                READY   STATUS    RESTARTS   AGE
    demo-spring-boot-7f7769cfbd-k747j   1/1     Running   0          19s
    ~/code/demos/demo-spring-boot master >2 > kubectl logs -f demo-spring-boot-7f7769cfbd-k747j
    
      .   ____          _            __ _ _
     /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
    ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
     \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
      '  |____| .__|_| |_|_| |_\__, | / / / /
     =========|_|==============|___/=/_/_/_/
     :: Spring Boot ::                (v2.4.0)
    
    2020-12-06 20:26:05.812  INFO 1 --- [           main] c.g.d.DemoSpringBootApplicationKt        : Starting DemoSpringBootApplicationKt using Java 15-ea on demo-spring-boot-7f7769cfbd-k747j with PID 1 (/app.jar started by root in /)
    2020-12-06 20:26:05.816  INFO 1 --- [           main] c.g.d.DemoSpringBootApplicationKt        : No active profile set, falling back to default profiles: default
    2020-12-06 20:26:09.290  INFO 1 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
    2020-12-06 20:26:09.372  INFO 1 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
    2020-12-06 20:26:09.372  INFO 1 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.39]
    2020-12-06 20:26:09.510  INFO 1 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
    2020-12-06 20:26:09.510  INFO 1 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 3524 ms
    2020-12-06 20:26:10.276  INFO 1 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
    2020-12-06 20:26:10.705  INFO 1 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
    2020-12-06 20:26:10.775  INFO 1 --- [           main] c.g.d.DemoSpringBootApplicationKt        : Started DemoSpringBootApplicationKt in 6.565 seconds (JVM running for 7.716)
    2020-12-06 20:26:12.900  INFO 1 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
    2020-12-06 20:26:12.900  INFO 1 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
    2020-12-06 20:26:12.901  INFO 1 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 1 ms
    Liveness Probe
    Liveness Probe
    Readiness Probe
    Liveness Probe
    Readiness Probe
    Liveness Probe
    Liveness Probe
    Readiness Probe
    

    탐지 실패


    현재 Kubernetes 탐지기가 고장났을 때의 반응을 보여주기 위해 단점의 고장을 시뮬레이션합니다.나는 Kotlin 코드를 확장해서 카운터 대상을 가지게 했는데, 건강 검사가 발생할 때마다 그 대상은 값을 1씩 증가시켰다.값이 10이 되면 Google 서비스는 503 서비스를 사용할 수 없기 때문에 더 이상 준비된 것으로 간주되지 않습니다.15 시 상태 점검이 실패하고pod가 다시 시작됩니다.
    package com.gateixeira.demospringboot.controller
    
    import org.springframework.http.HttpStatus
    import org.springframework.web.bind.annotation.GetMapping
    import org.springframework.web.bind.annotation.RestController
    import org.springframework.http.ResponseEntity
    
    @RestController
    class Application {
        object Counter {
            public var value = 0
            fun count(): Int = value++
        }
    
        @GetMapping("/")
        fun home(): String {
            return "Hello World";
        }
    
        @GetMapping("/health")
        fun health(): ResponseEntity<String> {
            Counter.count();
    
            if (Counter.value > 15) {
                println("Service not healthy. Count: " + Counter.value);
                return ResponseEntity.status(HttpStatus.SERVICE_UNAVAILABLE).body("Not healthy");
            } else {
                println("Service is healthy. Count: " + Counter.value);
                return ResponseEntity.status(HttpStatus.OK).body("Healthy");
            }
        }
    
        @GetMapping("/ready")
        fun ready(): ResponseEntity<String> {
    
            if (Counter.value > 10) {
                println("Service not ready. Count: " + Counter.value);
                return ResponseEntity.status(HttpStatus.SERVICE_UNAVAILABLE).body("Not ready");
            } else {
                println("Service is ready. Count: " + Counter.value);
                return ResponseEntity.status(HttpStatus.OK).body("Ready");
            }
        }
    }
    
    임계값이 1로 설정되었는지 확인하기 위해 deployment.yaml 템플릿에 새 속성을 추가했는데 결과는 다음과 같습니다.
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      namespace: {{ .Values.namespace }}
      name: {{ .Values.appName }}
      labels:
        app: {{ .Values.appName }}
    spec:
      replicas: {{ .Values.replicaCount }}
      selector:
        matchLabels:
          app: {{ .Values.appName }}
      template:
        metadata:
          labels:
            app: {{ .Values.appName }}
        spec:
          containers:
            - name: "{{ .Values.appName }}"
              image: "{{ .Values.image.registry }}/{{ .Values.appName }}:{{ .Values.appVersion }}"
              imagePullPolicy: "{{ .Values.image.pullPolicy }}"
              livenessProbe:
                httpGet:
                  path: /health
                  port: 8080
                initialDelaySeconds: 10
                periodSeconds: 3
                successThreshold: 1
                failureThreshold: 1
              readinessProbe:
                httpGet:
                  path: /ready
                  port: 8080
                initialDelaySeconds: 15
                periodSeconds: 5
                successThreshold: 1
                failureThreshold: 1
          restartPolicy: Always
    
    이제 우리 서비스를 다시 구축하고 시작하며 탐측의 발생을 관찰합시다.맨 위에 있는 터미널 창에는 탐색 준비가 완료된 후pod가 READY 0/1에서 READY 1/1로 이동한 것으로 표시됩니다.

    몇 초 후podREADY 0/1가 되돌아왔습니다. 계수기가 10을 넘었기 때문에 데이터가 더 이상 수신되지 않습니다.

    마지막으로pod는 활성 탐지기에 장애가 발생하면 재부팅됩니다.

    이 모든 검사는 우리의pod 생명주기가 아직 준비되지 않았을 때부터 실행되고 데이터를 받을 준비를 하게 합니다.그리고 완전히 실패할 때까지 준비를 하지 않아서 다시 시작할 수 있도록 했다.1분 간격 내:
    
    ~/code/demos/demo-spring-boot master > kubectl get pods
    NAME                               READY   STATUS    RESTARTS   AGE
    demo-spring-boot-f8bd8cdff-k8csl   0/1     Running   0          9s
    ~/code/demos/demo-spring-boot master > kubectl get pods
    NAME                               READY   STATUS    RESTARTS   AGE
    demo-spring-boot-f8bd8cdff-k8csl   1/1     Running   0          19s
    ~/code/demos/demo-spring-boot master > kubectl get pods
    NAME                               READY   STATUS    RESTARTS   AGE
    demo-spring-boot-f8bd8cdff-k8csl   0/1     Running   0          48s
    ~/code/demos/demo-spring-boot master > kubectl get pods
    NAME                               READY   STATUS    RESTARTS   AGE
    demo-spring-boot-f8bd8cdff-k8csl   0/1     Running   1          60s
    ~/code/demos/demo-spring-boot master > kubectl get pods
    NAME                               READY   STATUS    RESTARTS   AGE
    demo-spring-boot-f8bd8cdff-k8csl   1/1     Running   1          79s
    
    축하합니다!Kubernetes 탐지기가 실행 중인 작업 원리를 알고 있습니다. 아마도 프로그램이 시작될 때 '9' 를 얻었을 것입니다.

    좋은 웹페이지 즐겨찾기