33일차 - 쿠버네틱스 개념

은채의 성장통·2025년 7월 14일

KCC정보통신

목록 보기
29/30
post-thumbnail

노션정리

1. 도커 네트워크 개요

  • 컨테이너 간 통신
  • 컨테이너와 호스트 간 통신
  • 컨테이너와 외부 간 통신

2. 도커 네트워크 드라이버 종류

드라이버설명
bridge도커 기본 네트워크 드라이버로, 동일 호스트 내에서 격리된 네트워크 환경을 제공
host컨테이너가 호스트의 네트워크 스택을 직접 사용
overlay여러 도커 호스트에 걸쳐 있는 컨테이너 간 통신을 지원
macvlanMAC 주소 기반 가상 네트워크 인터페이스를 생성해 컨테이너에 할당

3. 도커 네트워크 명령어

명령어설명
docker network ls네트워크 목록 표시
docker network inspect my_network특정 네트워크의 세부 정보 확인
docker network create my_network새로운 네트워크 생성
docker network connect my_network my_container컨테이너를 네트워크에 연결
docker network disconnect my_network my_container컨테이너를 네트워크에서 분리
docker network rm my_network네트워크 삭제
docker network prune사용하지 않는 네트워크 모두 삭제

4. 특정 드라이버 기반 네트워크 생성

docker network create --driver bridge my_bridge_network
docker network create --driver overlay my_overlay_network

5. 도커 컨테이너 생성 및 네트워크 연결

컨테이너 실행 시 네트워크 설정 포함

docker run -d -it --name oracle11g -p 1521:1521 --network mynetwork jinkyoungheo/oracle11g
docker run -d -it --name tomcat10 -p 8888:8080 --network mynetwork tomcat:10

실행 후 컨테이너에 네트워크 연결

docker network connect mynetwork oracle11g
docker network connect mynetwork tomcat10

6. 컨테이너 상태 확인

docker container inspect oracle11g
docker container inspect tomcat10

  • 실행과정

    1. Docker 네트워크 생성

    두 컨테이너가 서로 통신할 수 있도록 가상 네트워크를 만들었습니다.
    docker network create mynetwork
    
    🔎 역할: mynetwork은 Tomcat과 Oracle 컨테이너가 서로 IP로 접근할 수 있게 해주는 가상 연결망입니다.

    2. Oracle 컨테이너 생성 및 실행

    Oracle DB를 제공하는 컨테이너를 실행했어요.
    docker run -d -it --name oracle11g -p 1521:1521 --network mynetwork jinkyoungheo/oracle11g
    
    🔎 역할: 내부적으로 SID=xe, 포트 1521으로 Oracle DB가 열리고, Tomcat에서 JDBC로 접근 가능해집니다.

    3. Tomcat 컨테이너 생성 및 실행

    JSP를 실행할 Tomcat 컨테이너를 띄웠습니다.
    docker run -d -it --name tomcat10 -p 8888:8080 --network mynetwork tomcat:10
    
    🔎 역할: index.jsp 파일을 웹으로 서비스하는 역할. JSP 실행 시 Oracle JDBC를 통해 DB에 접속합니다.

    4. 컨테이너 네트워크 연결 (옵션)

    컨테이너 생성 후 수동으로 네트워크 연결도 수행 가능:
    docker network connect mynetwork oracle11g
    docker network connect mynetwork tomcat10
    

    5. JSP 코드 작성 (index.jsp)

    Tomcat의 webapps/ROOT/ 또는 webapps/myapp/ 디렉토리에 JSP 파일을 배치했습니다.
    <%@ page contentType="text/html;charset=utf-8" %>
    <%@ page import="java.sql.*" %>
    <!DOCTYPE html>
    <html>
    <head>
        <title>Index</title>
    </head>
    <body>
        <h1>Welcome...</h1>
        <%
            Connection con = null;
            try {
                out.println("1");
                Class.forName("oracle.jdbc.OracleDriver");
                out.println("2");
                con = DriverManager.getConnection(
                    "jdbc:oracle:thin:@192.168.0.32:1521:xe",  // Oracle 컨테이너 IP 또는 호스트명
                    "hr",                                      // 아이디
                    "hr"                                       // 비밀번호
                );
                out.println("OK");
            } catch (Exception e) {
                out.println(e.getMessage());
            } finally {
                if (con != null) {
                    try { con.close(); } catch (Exception e) { }
                }
            }
        %>
    </body>
    </html>
    
    🔎 역할:
    • 클라이언트가 Tomcat에 접속하면 JSP 실행

    • 내부적으로 Oracle DB에 연결 시도 → 결과 반환

    • 오류 시 ORA-01882 등 출력


      6. 환경 변수 설정 (setenv.sh)

      타임존 관련 오류를 해결하기 위해 Tomcat에 환경 변수를 추가했습니다.

      # setenv.sh (경로: /usr/local/tomcat/bin/setenv.sh)
      #!/bin/bash
      export CATALINA_OPTS="$CATALINA_OPTS -Dfile.encoding=UTF8 -Duser.timezone=Asia/Seoul"
      

      복사 명령어:

      docker cp ./setenv.sh tomcat10:/usr/local/tomcat/bin/setenv.sh
      docker restart tomcat10
      

      🔎 역할:

    • JVM 타임존 설정 변경 → Oracle이 인식 가능한 Asia/Seoul 사용

    • ORA-01882 오류 방지


      최종 연결 흐름

    1. 브라우저에서 http://localhost:8888/index.jsp 요청

    2. Tomcat 컨테이너 → JSP 실행

    3. JSP 내부에서 Oracle DB 컨테이너로 JDBC 접속 시도

    4. Oracle 응답 → JSP에서 결과 출력



쿠버네티스(Kubernetes) 개요

  • 컨테이너 오케스트레이션 플랫폼으로, 여러 애플리케이션을 자동으로 배포, 스케일링, 관리하는 기능을 제공
  • Google의 Borg 시스템에서 파생되었으며, 2014년 오픈소스로 공개
  • 현재 대규모 커뮤니티에 의해 지속적으로 개발 및 유지 관리

주요 기능 및 특징

1. 컨테이너 오케스트레이션

  • 여러 컨테이너를 클러스터 단위로 효율적으로 관리
  • 애플리케이션을 독립적인 컨테이너로 분할하여 배포 및 운영 가능

2. 자동 스케일링

  • 리소스 사용량이나 트래픽 변화에 따라 자동으로 컨테이너 수를 조절

3. 서비스 디스커버리 및 로드 밸런싱

  • 컨테이너 간 통신을 지원하며 내부적으로 로드 밸런싱 처리

4. 롤링 업데이트 및 롤백

  • 서비스를 중단하지 않고 새로운 버전으로 배포 가능
  • 오류 발생 시 이전 상태로 빠르게 롤백 가능

5. 선언적 구성 및 상태 관리

  • YAML 또는 JSON 파일을 사용해 원하는 상태를 선언
  • 클러스터는 지정된 상태를 지속적으로 유지하고 자동 조정

6. 다양한 배포 전략

  • 롤링 업데이트, 블루-그린 배포, 카나리아 배포 등 다양한 전략 지원

쿠버네티스 아키텍처

1. 클러스터 구조

마스터 노드

  • 클러스터 관리와 제어 담당
  • 주요 컴포넌트:
    • API 서버: 클러스터 상태 관리 및 외부 요청 처리
    • 스케줄러: 파드 할당 결정
    • 컨트롤 매니저: 클러스터 상태 모니터링 및 조정

워커 노드

  • 실제 애플리케이션 실행
  • 주요 컴포넌트:
    • kubelet: 파드 실행 및 상태 보고
    • 컨테이너 런타임: 컨테이너 운영
    • kube-proxy: 네트워크 트래픽 중계 및 로드 밸런싱

저장소 구성

etcd

  • Key-Value 형태의 데이터 저장소
  • Kubernetes 클러스터의 상태와 설정 정보 저장
  • 고가용성을 위한 Replicated State Machine(RSM) 구조 채택
  • 클러스터가 정상적으로 동작하기 위해 매우 중요한 컴포넌트

쿠버네티스 리소스 개념

1. 파드(Pod)

  • 가장 작은 배포 단위, 하나 이상의 컨테이너 그룹 포함
  • 컨테이너 간 네트워크, IPC, UTS 네임스페이스 공유
  • 파드마다 고유한 IP를 가짐
  • 데이터 공유를 위한 볼륨 공유 가능
  • 스케일링의 기본 단위, 여러 개로 복제 가능

2. 서비스(Service)

  • 여러 파드를 하나의 엔드포인트로 묶어 노출시키는 리소스
  • IP나 상태 변경에도 안정적인 접근을 제공

서비스 유형

유형설명
ClusterIP클러스터 내부 접근 전용
NodePort노드의 지정 포트를 통해 외부 접근 가능
LoadBalancer클라우드 기반 외부 로드 밸런서 사용
ExternalName외부 CNAME을 통해 외부 서비스 접근 지원

주요 특징

  • DNS 이름 제공: {서비스명}.{네임스페이스}.svc.cluster.local 형식
  • 클러스터 내부 로드 밸런싱
  • 서비스 디스커버리 지원

디플로이먼트(Deployment)와 레플리카셋(ReplicaSet) 개요

쿠버네티스(Kubernetes)에서 애플리케이션을 배포, 업데이트, 유지하는 데 사용되는 리소스입니다.

  • 디플로이먼트: 원하는 상태를 선언하고 이를 유지하도록 쿠버네티스에 지시
  • 레플리카셋: 지정된 수의 파드(Pod)를 유지하여 고가용성을 보장

디플로이먼트(Deployment)

디플로이먼트는 쿠버네티스의 상위 리소스로서, 애플리케이션을 효율적이고 안정적으로 배포하기 위한 기능을 제공합니다.

주요 특징

  • 선언적 배포
    • YAML 또는 JSON 형식의 구성 파일을 통해 원하는 상태를 선언
    • 쿠버네티스는 실제 상태를 이 선언된 상태에 맞게 유지하려고 동작
  • 자동 롤링 업데이트
    • 새로운 버전의 파드를 순차적으로 배포
    • 이전 버전 파드는 점진적으로 종료되어 서비스 중단 없이 업데이트 가능
  • 자동 스케일링
    • 리소스 사용량이나 사용자 정의 메트릭에 따라 파드 수 자동 조정
    • 트래픽 변화에 탄력적으로 대응
  • 롤백 지원
    • 업데이트 도중 문제가 발생하면 쉽게 이전 버전으로 복구 가능

레플리카셋(ReplicaSet)

레플리카셋은 디플로이먼트의 하위 구성 요소로서, 애플리케이션이 항상 지정된 수의 파드를 유지하도록 하는 역할을 합니다.

주요 기능

  • 파드 복제
    • 설정된 파드 수를 유지
    • 파드 중 일부가 죽거나 종료되면 자동으로 새로운 파드를 생성
  • 디플로이먼트에 의해 관리됨
    • 디플로이먼트가 자동으로 레플리카셋을 생성, 업데이트, 삭제하며 상태를 유지
  • 셀렉터 기반 매칭
    • 레이블 셀렉터를 사용하여 일치하는 파드 그룹을 선택하고 관리
    • 예: "app: myapp"이라는 레이블을 가진 파드들만 제어

관계 및 구조 요약

구성 요소역할
디플로이먼트전체 애플리케이션의 배포 및 업데이트 제어
레플리카셋원하는 수의 파드를 유지하는 컨트롤러
파드실제로 컨테이너를 실행하는 최소 단위


image.png


파드 (Pod)

  • Kubernetes에서 가장 작은 배포 단위입니다.
  • 하나 이상의 컨테이너를 포함할 수 있으며, 공통 네트워크와 스토리지를 공유합니다.
  • 일반적으로 하나의 파드는 하나의 애플리케이션 인스턴스를 실행합니다.
  • 파드는 일시적인 존재로, 장애가 발생하면 자동으로 복구되지 않습니다.

레플리카셋 (ReplicaSet)

  • 특정 수의 파드가 항상 실행되도록 복제와 유지 관리하는 역할을 합니다.
  • 예를 들어, 3개의 파드를 유지하도록 설정하면 하나가 죽었을 때 자동으로 새 파드를 생성합니다.
  • 직접 사용하는 경우는 드물고, 보통 디플로이먼트가 내부적으로 레플리카셋을 생성하고 관리합니다.

디플로이먼트 (Deployment)

  • 파드와 레플리카셋을 선언적으로 관리하는 상위 리소스입니다.
  • 애플리케이션의 업데이트, 롤백, 확장 등을 자동으로 처리합니다.
  • 새로운 버전의 이미지를 배포하면, 기존 파드를 점진적으로 교체하는 롤링 업데이트를 수행합니다.

서비스 (Service)

  • 파드의 고정된 접근 지점을 제공하는 리소스입니다.
  • 파드는 IP가 바뀔 수 있기 때문에, 서비스는 안정적인 네트워크 주소를 제공합니다.
  • 클러스터 내부 또는 외부에서 접근할 수 있도록 설정할 수 있으며, 로드밸런싱 기능도 포함됩니다.

ConfigMap

  • 환경 변수나 설정 파일을 파드에 주입하기 위한 리소스입니다.
  • 파드와 애플리케이션의 설정을 분리하여, 유연한 구성 변경이 가능합니다.
  • 환경 변수, 커맨드라인 인자, 볼륨 마운트 등 다양한 방식으로 파드에 연결할 수 있습니다.
  • 보안이 필요한 정보는 ConfigMap이 아닌 Secret을 사용하는 것이 좋습니다.


✅ Pod 예시

apiVersion: v1                      # 사용할 API 버전 (Pod은 core API 그룹의 v1)
kind: Pod                           # 리소스의 종류 (Pod)
metadata:
  name: my-nginx-pod               # 파드의 이름
spec:
  containers:                      # 파드 안에 포함된 컨테이너 목록
    - name: nginx-container        # 컨테이너 이름
      image: nginx:latest          # 사용할 도커 이미지
      ports:
        - containerPort: 80        # 컨테이너가 사용하는 포트

✅ ReplicaSet 예시

apiVersion: apps/v1                # ReplicaSet은 apps API 그룹을 사용
kind: ReplicaSet                   # 리소스 종류 (ReplicaSet)
metadata:
  name: nginx-replicaset          # ReplicaSet 이름
spec:
  replicas: 3                     # 파드를 몇 개 유지할지 설정
  selector:                       # 파드를 선택하는 기준
    matchLabels:
      app: nginx                  # app=nginx 라벨을 가진 파드를 관리함
  template:                       # 생성할 파드의 템플릿
    metadata:
      labels:
        app: nginx                # 파드에 부여할 라벨 (selector와 일치해야 함)
    spec:
      containers:
        - name: nginx             # 컨테이너 이름
          image: nginx:latest     # 컨테이너에 사용할 이미지
          ports:
            - containerPort: 80   # 컨테이너가 사용할 포트

✅ Deployment 예시

apiVersion: apps/v1                # Deployment은 apps API 그룹 사용
kind: Deployment                   # 리소스 종류 (Deployment)
metadata:
  name: nginx-deployment          # Deployment 이름
spec:
  replicas: 2                     # 실행할 파드 개수
  selector:
    matchLabels:
      app: nginx                  # 관리할 파드의 라벨
  template:                       # 파드 정의 템플릿
    metadata:
      labels:
        app: nginx                # 파드 라벨 (selector와 매칭)
    spec:
      containers:
        - name: nginx             # 컨테이너 이름
          image: nginx:1.21       # 사용할 nginx 이미지
          ports:
            - containerPort: 80   # 컨테이너 포트

✅ Service 예시

apiVersion: v1                    # Service는 core API 그룹 사용
kind: Service                     # 리소스 종류 (Service)
metadata:
  name: nginx-service            # 서비스 이름
spec:
  selector:
    app: nginx                  # 연결할 파드의 라벨
  ports:
    - protocol: TCP             # 통신 프로토콜
      port: 80                  # 서비스가 노출하는 포트
      targetPort: 80            # 파드 내부 컨테이너가 사용하는 포트
  type: ClusterIP               # 클러스터 내부에서만 접근 가능한 기본 타입

✅ ConfigMap 예시

apiVersion: v1                      # ConfigMap도 core API 그룹 사용
kind: ConfigMap                     # 리소스 종류 (ConfigMap)
metadata:
  name: app-config                 # ConfigMap 이름
data:                               # key-value 형태의 설정 데이터
  DATABASE_URL: "mysql://..."      # 예시 데이터베이스 접속 주소
  API_KEY: "abc123xyz456"          # 예시 API 키

✅ ConfigMap을 사용하는 Pod 예시

apiVersion: v1                      # Pod 정의
kind: Pod
metadata:
  name: app-pod                    # 파드 이름
spec:
  containers:
    - name: app-container          # 컨테이너 이름
      image: my-app-image          # 사용자 앱 이미지
      env:                         # 환경변수를 정의하는 섹션
        - name: DATABASE_URL       # 환경변수 이름
          valueFrom:               # 외부 ConfigMap에서 값을 가져옴
            configMapKeyRef:
              name: app-config     # 사용할 ConfigMap 이름
              key: DATABASE_URL    # 가져올 key 값
        - name: API_KEY
          valueFrom:
            configMapKeyRef:
              name: app-config
              key: API_KEY

profile
인생 별거 없어

0개의 댓글