Tag: 컨테이너

  • 쿠버네티스 운영 입문: 클러스터를 안정적으로 굴리는 첫걸음

    쿠버네티스 운영 입문: 클러스터를 안정적으로 굴리는 첫걸음

    쿠버네티스를 도입하면 컨테이너 배포가 쉬워질 것이라 기대하지만, 실제 운영에서는 파드가 갑자기 재시작되거나 노드가 압박을 받아 워크로드가 쫓겨나는 일이 빈번하게 발생합니다. 운영의 본질은 ‘배포’가 아니라 ‘안정적으로 계속 굴리는 것’입니다. 이 글에서는 처음 클러스터를 책임지는 입장에서 반드시 이해해야 할 구조와 설정을 다룹니다.

    운영 문제: 왜 파드는 예고 없이 죽는가

    가장 흔한 장애는 리소스 미설정에서 비롯됩니다. requests와 limits를 지정하지 않으면 스케줄러는 노드 용량을 가늠하지 못하고, 한 파드가 메모리를 폭주시키면 OOMKilled가 연쇄적으로 발생합니다. 실제로 노드당 평균 메모리 사용률이 85%를 넘어가면 eviction 위험이 급격히 올라갑니다.

    아키텍처: 컨트롤 플레인과 워커의 역할

    컨트롤 플레인은 클러스터의 두뇌입니다. kube-apiserver가 모든 요청의 관문이 되고, etcd가 상태를 저장하며, scheduler와 controller-manager가 원하는 상태(desired state)와 실제 상태를 끊임없이 비교해 수렴시킵니다. 워커 노드의 kubelet은 이 명령을 받아 컨테이너를 실제로 띄웁니다. 운영자는 이 reconciliation loop를 이해해야 장애 원인을 추적할 수 있습니다.

    구성: 리소스와 헬스체크 기본 세팅

    최소한의 안정성을 확보하려면 모든 워크로드에 리소스 경계와 프로브를 설정해야 합니다. 아래는 권장 출발점입니다.

    resources:
      requests: { cpu: "250m", memory: "256Mi" }
      limits:   { cpu: "500m", memory: "512Mi" }
    livenessProbe:
      httpGet: { path: /healthz, port: 8080 }
      initialDelaySeconds: 15
    readinessProbe:
      httpGet: { path: /ready, port: 8080 }
      periodSeconds: 5

    livenessProbe는 ‘죽었으면 재시작’, readinessProbe는 ‘준비 안 됐으면 트래픽 차단’이라는 서로 다른 목적을 가집니다. 둘을 혼동해 livenessProbe를 너무 공격적으로 잡으면 부팅 중인 파드가 계속 재시작되는 죽음의 루프에 빠집니다.

    모니터링과 비용: 무엇을 봐야 하는가

    • 노드별 CPU/메모리 사용률과 allocatable 대비 점유율
    • 파드 재시작 횟수(restartCount)와 OOMKilled 빈도
    • 스케줄 실패(Pending) 파드 수와 그 원인 이벤트
    • PVC 스토리지 잔여 용량

    비용 관점에서는 노드 활용률이 핵심입니다. requests를 실제 사용량보다 과하게 잡으면 노드는 한가한데도 새 노드가 늘어 비용이 새어 나갑니다. 2주간 실측 데이터를 기준으로 requests를 재조정하면 흔히 20~30% 노드 비용을 절감할 수 있습니다.

    정리

    쿠버네티스 운영의 기본은 화려한 기능이 아니라 리소스 경계, 헬스체크, 관측 지표라는 세 가지 토대입니다. 이 토대를 먼저 다진 뒤에야 오토스케일링이나 멀티클러스터 같은 고급 주제로 나아갈 수 있습니다. 작게 시작하되, 측정 가능한 상태에서 시작하십시오.

  • CI/CD 파이프라인 구축: 커밋에서 배포까지 자동화하기

    CI/CD 파이프라인 구축: 커밋에서 배포까지 자동화하기

    배포가 두려운 팀은 배포를 미루고, 미룬 배포는 한 번에 거대한 변경을 몰아 더 위험해집니다. CI/CD의 진짜 가치는 속도가 아니라 ‘작은 변경을 자주, 안전하게’ 내보낼 수 있게 만드는 데 있습니다. 이 글은 빈 저장소에서 시작해 신뢰할 수 있는 파이프라인을 세우는 과정을 다룹니다.

    운영 문제: 수동 배포의 비용

    수동 배포는 단지 느린 게 아닙니다. 사람이 명령을 외워 치는 과정은 재현 불가능하고, 금요일 오후의 실수 한 번이 주말 장애로 번집니다. 자동화의 첫 목표는 ‘누가 눌러도 똑같은 결과’를 보장하는 것입니다.

    아키텍처: CI와 CD의 분리

    CI(지속적 통합)는 코드가 합쳐질 때마다 빌드와 테스트로 품질을 검증하는 단계이고, CD(지속적 배포)는 검증된 산출물을 환경에 안전하게 내보내는 단계입니다. 둘을 명확히 분리해야 ‘CI는 빠르게, CD는 신중하게’라는 서로 다른 리듬을 줄 수 있습니다.

    구현: 파이프라인 정의 예시

    stages:
      - lint-and-test      # 단위 테스트 + 정적 분석
      - build-image        # 컨테이너 이미지 빌드 + 취약점 스캔
      - deploy-staging     # 스테이징 자동 배포
      - smoke-test         # 핵심 경로 통합 검증
      - deploy-prod        # 카나리 10% -> 50% -> 100%

    핵심은 각 단계가 게이트 역할을 한다는 점입니다. 테스트가 깨지면 이미지는 빌드되지 않고, 스모크 테스트가 실패하면 운영 배포는 자동으로 중단됩니다. 사람의 판단이 아니라 파이프라인이 안전을 강제합니다.

    모니터링과 배포 안전장치

    • 배포 빈도와 변경 실패율(DORA 핵심 지표)
    • MTTR(평균 복구 시간)과 자동 롤백 발동 횟수
    • 카나리 단계별 에러율·지연 비교

    카나리 배포는 새 버전을 일부 트래픽에만 노출해 에러율이 기준치를 넘으면 즉시 롤백합니다. 이 한 가지 장치만으로도 잘못된 배포의 영향 범위를 전체 사용자에서 10% 이하로 가둘 수 있습니다.

    정리

    좋은 파이프라인은 배포를 ‘이벤트’에서 ‘일상’으로 바꿉니다. 테스트 게이트로 품질을, 카나리와 자동 롤백으로 안전을 확보하면, 팀은 두려움 없이 하루에도 여러 번 배포하며 빠르게 학습할 수 있습니다.

  • 컨테이너 보안: 이미지부터 런타임까지 막아야 할 빈틈

    컨테이너 보안: 이미지부터 런타임까지 막아야 할 빈틈

    컨테이너는 빠르고 가볍지만, 그 가벼움이 곧 보안 책임의 분산을 뜻합니다. 베이스 이미지의 오래된 라이브러리, 과도한 권한, 노출된 시크릿 등 빈틈은 여러 단계에 흩어져 있습니다. 보안은 한 곳을 막는 게 아니라 빌드부터 런타임까지 층층이 막는 다층 방어(defense in depth)여야 합니다.

    운영 문제: 공격면은 이미지에서 시작된다

    많은 사고가 이미지 단계에서 시작됩니다. 거대한 베이스 이미지에는 수백 개의 패키지가 들어 있고, 그중 하나의 알려진 취약점(CVE)이 침투 경로가 됩니다. 실측해 보면 풀 OS 기반 이미지는 distroless나 슬림 이미지 대비 알려진 취약점이 5배 이상 많은 경우가 흔합니다.

    단계별 방어

    • 빌드: 최소 베이스 이미지, 의존성 고정, 이미지 취약점 스캔
    • 배포: 신뢰된 레지스트리만 허용, 이미지 서명 검증
    • 런타임: 비루트 실행, 읽기 전용 파일시스템, 권한 최소화
    • 네트워크: NetworkPolicy로 파드 간 통신 화이트리스트화

    구현: 안전한 컨테이너의 기본기

    컨테이너가 루트로 실행되면 탈출 시 호스트 전체가 위험해집니다. 비루트 사용자와 권한 축소는 가장 비용 대비 효과가 큰 조치입니다.

    securityContext:
      runAsNonRoot: true
      runAsUser: 10001
      readOnlyRootFilesystem: true
      allowPrivilegeEscalation: false
      capabilities:
        drop: ["ALL"]

    시크릿은 절대 이미지나 환경 변수에 평문으로 넣지 말고, 시크릿 매니저에서 런타임에 주입해야 합니다. 한 번 이미지 레이어에 박힌 시크릿은 삭제해도 히스토리에 남아 유출됩니다.

    모니터링: 런타임 이상 탐지

    아무리 막아도 실행 중 비정상 행위는 발생할 수 있습니다. 컨테이너가 갑자기 셸을 띄우거나 예상치 못한 외부로 연결을 시도하면 런타임 보안 도구가 이를 탐지해 경보합니다. 빌드 시점 스캔과 런타임 탐지를 함께 두어야 알려진 위협과 알려지지 않은 위협 모두를 커버할 수 있습니다.

    정리

    컨테이너 보안에 은탄환은 없습니다. 최소 이미지, 비루트 실행, 시크릿 분리, 네트워크 격리, 런타임 탐지를 층층이 쌓아야 한 겹이 뚫려도 다음 겹이 막습니다. 보안을 배포 후의 점검이 아니라 파이프라인에 내장된 게이트로 만드는 것이 핵심입니다.