Kubernetes 탐지기, Kotlin, Helm을 통해 고가용성 서비스를 쉽게 얻을 수 있습니다.
21244 단어 microserviceskubernetesdockerkotlin
에 자리잡다,...
표지 사진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 pods
pod가 실행 중이고 로그가 메시지를 인쇄하고 있음을 나타냅니다.~/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
로 이동한 것으로 표시됩니다.몇 초 후pod
READY 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' 를 얻었을 것입니다.
Reference
이 문제에 관하여(Kubernetes 탐지기, Kotlin, Helm을 통해 고가용성 서비스를 쉽게 얻을 수 있습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/gateixeira/an-easy-way-to-a-highly-available-service-with-kubernetes-probes-kotlin-and-helm-3o0j텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)