본문 바로가기
Cloud Side/Container > Kubernetes

[k8s] 초기화 컨테이너 적용시키기 - initContainers

by developerBeluga 2023. 4. 21.
728x90
반응형

 

 

 

MongoDB 연결이 안되었다는데요?

위에는 AKS에 생성된 workloads이다.

총 9개로 아직 Ready 상태가 주황빛이지만 n초만 지나도 오른쪽처럼 초록빛들이 들어온다.

 

여기에서 중요한 점이 있다.

초록빛이 즉, 정상적으로 Ready 상태가 되는 순서가 뒤죽박죽이다.

 

A라는 서비스가 먼저 Ready가 되었는데 아직 MongoDB가 Not Ready일 때 문제가 생겼다.

A 서비스는 시작되면서 바로 MongoDB에 연결을 시도했다.

하지만 MongoDB가 아직 Ready가 되지 못해 통신이 되지 않으니 A 서비스는 연결 오류를 뱉어난다.

나중에 MongoDB가 Ready가 되었다고 하더라도 A 서비스는 이미 연결 오류로 끝났다.

 

 

 

그럼 MongoDB 연결에 timeout을 걸어

위와 같은 상황에 내가 먼저 생각한 방법은 mongoDB 연결에 timeout을 걸어서 5분 뒤에 연결을 시도하는 것이다.

하지만 이럴 경우 무.조.건 5분은 낭비해야한다는 전제가 깔린다.

 

그리고 어떠한 이유로 mongoDB가 5분은 넘어서 Ready가 될 수 있다.

이럴 경우 timeout을 걸어준 이유가 없어진다.

 

 

 

그래서 찾은 방법은 kubernetes의 초기화 컨테이너

출처: https://kubernetes.io/ko/docs/concepts/workloads/pods/init-containers/#%EB%8B%A4%EC%9D%8C-%EB%82%B4%EC%9A%A9

kubernetes 공식문서에 나와있는 초기화 컨테이너 설명이다.

초기화 컨테이너는 본 컨테이너가 돌아가기 전에 먼저 시작해서 설정한 command가 잘 수행하면 그때서야 본 컨테이너를 돌린다.

 

위 예시로 설명하자면 command에 mongoDB를 체크해서 Ready라면 A의 본 컨테이너를 시작하라고 해주면 된다.

그러면 mongoDB가 Ready라는 걸 확인하고 나서야 A 서비스의 컨테이너가 만들어지면서 곧 Ready가 되고 mongoDB 연결도 순조롭게 된다.

반대로 mongoDB가 Not Ready라면 A 서비스는 컨테이너도 만들지 않고 계속해서 기다린다.

 

 

 

초기화 컨테이너 사용하기

apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
  labels:
    app.kubernetes.io/name: MyApp
spec:
  containers: // 본 컨테이너
  - name: myapp-container
    image: busybox:1.28
    command: ['sh', '-c', 'echo The app is running! && sleep 3600']
  initContainers: // 초기화 컨테이너
  - name: init-myservice
    image: busybox:1.28
    command: ['sh', '-c', "until nslookup myservice.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for myservice; sleep 2; done"]
  - name: init-mydb
    image: busybox:1.28
    command: ['sh', '-c', "until nslookup mydb.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for mydb; sleep 2; done"]

위 코드는 kubernetes 공식문서에서 제공한 초기화 컨테이너를 매니페스트 yaml 파일이다.

myapp-container라는 본 컨테이너가 생성되기 위해서는 initContainers에 정의한 init-myservice와 init-mydb의 command가 실행된다.

 

command를 보면 각 컨테이너의 IP가 있다면 넘어가고 아니라면 계속 물어보라는 명령어다.

하지만 나의 경우 mongoDB 컨테이너의 IP는 빨리 나왔지만 실제로 연결할 정도로 Ready가 안 되었기 때문에 위 command는 필요가 없었다. 

 

 

          initContainers:
            - name: check-mongodb
              image: busybox:1.28
              command:
                [
                  'sh',
                  '-c',
                  'until nc -z $(MONGODB_SERVICE_HOST) 27017; do echo waiting for mongodb; sleep 2; done',
                ]

위와 같이 해주니 mongoDB가 만들어질 때까지 잘 기다리고 나중에 A 서비스가 동작하면서 mongoDB와 잘 연결되었다.

$(MONGODB_SERVICE_HOST)는 매니페스트 yaml 파일에서 env를 사용할 때 쓰는 문법이다.

monogDB 컨테이너가 잘 생성되었다면 env에 mongoDB host가 잘 저장되었을 것이다.

 

초기화 컨테이너를 걸어준 서비스들을 보면 Init:0/2 혹은 Init:0/1로 표시되어져 있다.

mongoDB가 생성될 때까지 기다린다는 표시다.

 

 

 

 

참고

https://kubernetes.io/ko/docs/concepts/workloads/pods/init-containers/#%EB%8B%A4%EC%9D%8C-%EB%82%B4%EC%9A%A9

 

초기화 컨테이너

이 페이지는 초기화 컨테이너에 대한 개요를 제공한다. 초기화 컨테이너는 파드의 앱 컨테이너들이 실행되기 전에 실행되는 특수한 컨테이너이다. 초기화 컨테이너는 앱 이미지에는 없는 유틸

kubernetes.io

 

https://stackoverflow.com/questions/15443106/how-to-check-if-mongodb-is-up-and-ready-to-accept-connections-from-bash-script

 

how to check if mongodb is up and ready to accept connections from bash script?

I have a bash shell script which does a bunch of stuff before trying to mongorestore. I want to make sure that not only MongoDB is up, but it is also ready to accept connections before i try resto...

stackoverflow.com

 

 

 

 

 

 

728x90
반응형

댓글