728x90

Backend/Docker, Kubernetes 10

StatefulSet

상태를 유지하는 데이타베이스와 같은 애플리케이션을 관리하기 위한 컨트롤러가 StatefulSet 컨트롤러이다. (StatefulSet은 쿠버네티스 1.9 버전 부터 정식 적용 되었다. ) Pod 이름에 대한 규칙성 부여 StatefulSet에 의해서 생성되는 Pod들의 이름은 규칙성을 띈다. 생성된 Pod들은 {Pod 이름}-{순번} 식으로 이름이 정해진다. 예를 들어 Pod 이름을 mysql 이라고 정의했으면, 이 StatefulSet에 의해 생성되는 Pod 명들은 mysql-0, mysql-1,mysql-2 … 가 된다. ​ 배포시 순차적인 기동과 업데이트 또한 StatefulSet에 의해서 Pod가 생성될때, 동시에 모든 Pod를 생성하지 않고, 0,1,2,.. 순서대로 하나씩 Pod를 생성한다. ..

[Kubernetes] Graceful Shutdown

쿠너네티스 환경에서는 Scale in/out 이 빈번하게 발생하기 때문에 Scale in 과정에서 종료되는 pod 들에 대한 관리가 필요하다. 예를 들어 pod에서 어떠한 로직을 처리중에 있는데 강제로 종료를 해버리면 당연히 문제가 될 것이고 종료되고 있는 과정에 트래픽이 인입되면 해당 요청을 정상처리할 수 없어 에러를 리턴할 수 밖에 없을 것이다. 이에 pod 이 정상적으로 종료될 수 있도록 대기시간을 주고 그 시간동안 트래픽은 막는 방안이 필요하다. 쿠버네티스에서는 pod 을 종료할 때 SIGTERM 시그널을 우선 보내고 terminationGracePeriodSeconds에 설정된 시간 이후에는 SIGKILL 시그널을 보내서 프로세스를 강제종료한다. terminationGracePeriodSecon..

ingress apiVersion networking.k8s.io/v1

kubectl get ing 로 ingress 자원을 확인하면 아래와 같은 경고메시지가 뜨는 경우가 있다. Warning: extensions/v1beta1 Ingress is deprecated in v1.14+, unavailable in v1.22+; use networking.k8s.io/v1 Ingress 대충 해석해보며 ingress 에 apiVersion 중 extensions/v1beta1 는 1.14 버전에 deprecated 되었고 1.22 버전부터는 사용할 수 없으니 networking.k8s.io/v1 로 변경하라는 것 같다. 수정하는 것은 어렵지 않으니 수정하고 적용을 했는데 아래와 같은 오류가 났다. error validating data: [ValidationError(Ingr..

kubectl panic: runtime error: index out of range .. with length .. [recovered]

Jenkins Job 에서 kubectl 을 사용하는데 위와 같은 에러가 났다. 신기한 것은 동일한 명령을 로컬에서 하면 잘 된다. 거의 반나절 삽질하다 찾은 원인을 공유한다. 결국 yaml 파일에 문제가 있었던 것인데 나는 ingress 부분이었다. ingress 정의시 spec.rules.host 항목 마지막에 공백이 포함되었던 게 문제였다. 예를 들어 에러가 났던 ingress yaml 파일은 아래와 같다. 그런데 로컬에서는 왜 잘 됐나? kubectl 버전에 따라 이를 trim 처리해서 잘 처리하는 버전이 있고 에러를 리턴하는 버전이 있는 것 같다. 문제 없이 처리되었던 로컬환경의 kubectl 버전을 보니 1.20.4 였고 Jenkins에서 사용하던 kubectl 버전은 1.21.1 이었다. 상..

docker-compose 로 로컬 카프카 띄우기

검색하면 예제가 많지만 난 안되서 한참을 헤맸다. 최종적으로 성공한 docker-compose.yaml 은 아래와 같다. version: '2' services: zookeeper: image: wurstmeister/zookeeper:3.4.6 container_name: local-zookeeper ports: - "2181:2181" kafka: image: wurstmeister/kafka:2.13-2.8.1 container_name: local-kafka ports: - "9092:9092" depends_on: - zookeeper environment: KAFKA_ZOOKEEPER_CONNECT: local-zookeeper:2181 KAFKA_ADVERTISED_HOST_NAME: loc..

Deployment 적용시 ORA-01882: timezone region not found

그동안 잘 적용되던 kubectl apply -f ... 로 잘 적용되던 Deployment 가 갑자기 아래 오류를 내뿜으로 커넥션을 생성하지 못했다. ORA-01882: timezone region not found 타임존 오류인거 같아 Deployment 에서 참조하는 ConfigMap 에 아래와 같이 타임존을 추가하니 문제가 해결되었다. apiVersion: v1 kind: ConfigMap metadata: name: ... data: SPRING_PROFILES_ACTIVE: "sandbox" SYS_LOG_MIN_LEVEL: "info" TZ: Asia/Seoul

ingress https 설정

일단 클러스터가 연결되어 kubectl 로 조작이 가능한 상황이어야 한다. 다운로드 받은 인증서로 secret 생성 일반적으로 tls 인증서 관련 압축파일을 다운로드 받아서 압축을 풀면 key 파일과 cert 파일이 있을 것이다. 그 경로로 이동해서 아래와 같은 명령어로 secret 을 생성한다. kubectl create secret tls ${secret_name} --key={tls_key_file_name} --cert=${tls_cert_file_name} -n ${namespace} Ingress 에 https 적용 metadata: annotations: nginx.ingress.kubernetes.io/force-ssl-redirect: "true" #http 로 접근하더라도 자동으로 ht..

728x90