728x90
반응형

Deployment

  • 파드들을 관리함을 의미
  • rolling update, rollback, scaling 과 같은 기능을 제공
  • web server, APIs, microservices에 적합하게 만듬
apiVersion: apps/v1  
kind: Deployment                        // Deployment 정의 
metadata:  
    name: webapp-deployment  
spec:  
    replicas: 3                         // 3개의 레플리카(인스턴스) - 아래 파드들
    selector:  
        matchLabels:  
            app: my-webapp  
    template:  
        metadata:  
            labels:  
                app: my-webapp  
        spec:  
            containers:  
            - name: webapp  
              image: nginx:latest  
              ports:  
                - containerPort: 80  
              envFrom:  
                - configMapRef:  
                    name: webapp-config  
            - name: database  
              image: mongo:latest  
              env:  
                - name: MONGO_INITDB_ROOT_USERNAME  
                  valueFrom:   
                    secretKeyRef:  
                        name: db-credentials  
                        key: username  
                - name: MONGO_INITDB_ROOT_PASSWORD  
                  valueFrom:  
                    secretKeyRef:  
                        name: db-credentials  
                        key: password  
              volumeMounts:  
                - name: db-data  
                  mountPath: /data/db  
    volumes:  
        - name: db-data  
          persistentVolumeClaim:  
          claimName: database-pvc  

---  

apiVersion: v1  
kind: Service  
metadata:  
    name: webapp-service  
spec:  
    selector:  
        app: my-webapp  
    ports:  
        - protocol: TCP  
          port: 80  
          targetPort: 80  

---  

apiVersion: v1  
kind: ConfigMap  
metadata:  
    name: webapp-config  
data:  
    WEBAPP_ENV: "production"  
    DATABASE_URL: "mongodb://database-service:27017/mydb"  

---  

apiVersion: v1  
kind: Secret  
metadata:  
    name: db-credentials  
type: Opaque  
data:  
    username: <base64-encoded-username>  
    password: <base64-encoded-password>  

---  

apiVersion: v1  
kind: PersistentVolumeClaim  
metadata:  
    name: database-pvc  
spec:  
    accessModes:  
        - ReadWriteOnce  
    resources:  
        requests:  
            storage: 1Gi
728x90
반응형
728x90
반응형

VOLUME

  • 파드 내의 모든 컨테이너가 접근 가능한 디렉토리
  • 컨테이너에서 스토리지(storage)를 분리시켜 컨테이너 재시작/재스케쥴과 별개로 데이터를 영속 관리 가능하게 함
apiVersion: v1  
kind: Pod  
metadata:  
    name: webapp-with-db  
    labels:  
    app: my-webapp  
spec:  
    containers:  
    - name: webapp  
      image: nginx:latest 
      ports:  
        - containerPort: 80  
      envFrom:  
        - configMapRef:  
            name: webapp-config  
    - name: database  
      image: mongo:latest  
      env:  
        - name: MONGO_INITDB_ROOT_USERNAME  
          valueFrom:  
            secretKeyRef:  
                name: db-credentials  
                key: username  
        - name: MONGO_INITDB_ROOT_PASSWORD  
          valueFrom:  
            secretKeyRef:  
                name: db-credentials  
                key: password  
          volumeMounts:  
            - name: db-data                  
              mountPath: /data/db              // 데이터 볼륨을 /data/db 마운트한다
    volumes:  
    - name: db-data                            // db-data 볼륨에 영구히 저장된다
      persistentVolumeClaim:  
      claimName: database-pvc                 

---  

apiVersion: v1  
kind: Service  
metadata:  
    name: webapp-service  
spec:  
    selector:  
        app: my-webapp  
    ports:  
      - protocol: TCP  
        port: 80  
        targetPort: 80  

---  

apiVersion: v1  
kind: ConfigMap  
metadata:  
    name: webapp-config  
data:  
    WEBAPP_ENV: "production"  
    DATABASE_URL: "mongodb://database-service:27017/mydb"  

---  

apiVersion: v1  
kind: Secret  
metadata:  
    name: db-credentials                   
type: Opaque  
data:  
    username: <base64-encoded-username>    
    password: <base64-encoded-password>

---

apiVersion: v1  
kind: PersistentVolumeClaim                // PVC - 스토리지 요구사항 정의
metadata:  
    name: database-pvc  
spec:  
    accessModes:  
        - ReadWriteOnce  
resources:  
    requests:  
        storage: 1Gi                       // 스토리지 요구사항 상세. 1Gi 짜리 스토리지
728x90
반응형
728x90
반응형

Secrets

  • 민감 정보 저장에 사용
  • 기본 base64 인코딩이 default
  • 파드에서 파일로 마운팅되거나 환경 변수로 사용할 수 있음
apiVersion: v1  
kind: Pod  
metadata:  
    name: webapp-with-db  
    labels:  
    app: my-webapp  
spec:  
    containers:  
    - name: webapp  
      image: nginx:latest 
      ports:  
        - containerPort: 80  
      envFrom:  
        - configMapRef:  
            name: webapp-config  
    - name: database  
      image: mongo:latest  
      env:  
        - name: MONGO_INITDB_ROOT_USERNAME  
          valueFrom:  
            secretKeyRef:  
                name: db-credentials  
                key: username  
        - name: MONGO_INITDB_ROOT_PASSWORD  
          valueFrom:  
            secretKeyRef:  
                name: db-credentials  
                key: password  

---  

apiVersion: v1  
kind: Service  
metadata:  
    name: webapp-service  
spec:  
    selector:  
        app: my-webapp  
    ports:  
      - protocol: TCP  
        port: 80  
        targetPort: 80  

---  

apiVersion: v1  
kind: ConfigMap  
metadata:  
    name: webapp-config  
data:  
    WEBAPP_ENV: "production"  
    DATABASE_URL: "mongodb://database-service:27017/mydb"  

---  

apiVersion: v1  
kind: Secret  
metadata:  
    name: db-credentials                   // Secret 명칭
type: Opaque  
data:  
    username: <base64-encoded-username>    // 실제 base64 로 인코딩 된 값
    password: <base64-encoded-password>
728x90
반응형
728x90
반응형

Config Map

  • 파드에 환경변수 / 설정 파일로 마운트 된 내용들을 저장하는 용도
  • 컨테이너 이미지로부터 설정을 분리할 수 있으며, 컨테이너를 재빌드 할 필요 없이 설정을 업데이트 하기 용이하다
apiVersion: v1  
kind: Pod  
metadata:  
    name: webapp-with-db  
    labels:  
        app: my-webapp  
spec:  
    containers:  
    - name: webapp  
      image: nginx:latest  
      ports:  
        - containerPort: 80  
      envFrom:    
        - configMapRef:            // ConfigMap 참조
              name: webapp-config  
    - name: database  
      image: mongo:latest  

---  

apiVersion: v1  
kind: Service  
metadata:  
    name: webapp-service  
spec:  
    selector:  
        app: my-webapp  
    ports:  
    - protocol: TCP  
      port: 80  
      targetPort: 80  

---  

apiVersion: v1  
kind: ConfigMap                  // ConfigMap 설정
metadata:  
    name: webapp-config  
data:  
    WEBAPP_ENV: "production"  
    DATABASE_URL: "mongodb://database-service:27017/mydb"
728x90
반응형
728x90
반응형

Service

  • Service는 파드들의 그룹에 접근하기 위한 안정적인 엔드포인트를 정의한 것
  • 어플리케이션을 클러스터 내의 다른 파드들에 노출시거나 외부 클라이언트에 노출시킬 수 있다.
  • Load Balancing과 자동 스케일링 기능을 제공하여, 어플리케이션이 매우 사용 가능한 상태로 남게 해 준다
apiVersion: v1  
kind: Pod  
metadata:  
    name: webapp-with-db  
    labels:  
        app: my-webapp  
spec:  
    containers:  
    - name: webapp  
      image: nginx:latest  
      ports:  
        - containerPort: 80  
    - name: database  
      image: mongo:latest  

---  

apiVersion: v1  
kind: Service  
metadata:  
    name: webapp-service  
spec:  
    selector:            // 서비스 내의 파드를 선택한다
        app: my-webapp  // 파드가 해당 label을 metadata로 가진 이상, service는 이 파드를 타겟한다.
    ports:  
    - protocol: TCP   
      port: 80  
      targetPort: 80.   // 파드의 포트. 

Ingress

  • 클러스터 내에서 파드끼리 내부 통신을 가능하게 함
  • 즉, 서비스를 클러스터 외부 클라이언트에 노출시킴
  • 어플리케이션의 외부 엔트리 포인로서 동작
  • 들어오는 트래픽에 대해 라우팅 규칙과 로드 밸런싱을 설정할 수 있게 함
  • Ingress 사용을 위해서는 클러스터 내에 Ingress Controller가 배포되어야 함
apiVersion: networking.k8s.io/v1  
kind: Ingress  
metadata:  
    name: webapp-ingress  
spec:  
    rules:  
    - host: mywebapp.example.com       // 클러스터 외부에서 접근할 수 있는 도메인
      http:                            
        paths:                         // 라우팅 규칙을 정의하는 부분
        - path: /  
          pathType: Prefix  
          backend:                     // 트래픽이 포워딩 되어야 하는 타겟 서비스 정의
            service:  
                name: webapp-service  
                port:  
                    number: 80
728x90
반응형
728x90
반응형

아키텍처

마스터 노드

  • 전체 클러스터를 컨트롤하고, 전체 클러스터 상태를 관리함
  • 새로운 파드들의 스케일링, 노드/파드들의 헬스 모니터링, 수요에 따른 어플리케이션 스케일링 등 전체 클러스터에 대한 결정권을 갖는다.
  • 주요 컴포넌트
    • API Server
      • 클러스터와ㅏ 유저/컴포넌트간의 소통을 가능하게 하는 API를 노출시켜준다.
    • etcd
      • 클러스터의 모든설정 데이터를 key-value 값들이 저장된다
      • 모든 클러스터 상태 정보가 여기 저장된다.
    • Controller Manager
      • API Server를 통해 클러스터 상태를 체크하고 원하는 상태가 유지하기 위한 행동을 취한다.
    • Scheduler
      • 새로운 파드들을 리소스 필요량과 가용성에 따라 노드들에 배정한다.
      • 이를 통해 worker 노드들에 workload들을 공평하게 분배한다.

워커 노드

  • 컨테이너(파드)가 스케쥴되고 구동되는 머신을 의미
  • 클러스터의 data plane을 형성하고, 실제 workload를 실행한다.
  • 워커 노드 주요 컴포넌트
    • kubelet
      • 각각의 워커 노드를 구동시키고 Master Node와 통신하는 역할
      • 파드 명세에 적혀있는 대로 컨테이너가 구동되고 그 상태가 건강하게 하는 역할
    • Container Runtime
      • Docker나 containerd와 같은 복수개의 container runtimes를 지원한다
      • 컨테이너 이미지를 가져오고, 컨테이너를 구동하는 역할
    • Kube Proxy
      • 클러스터 내에서 네트워크 소통을 하는 역할
      • 서비스 네트워크 라우팅을 관리하고 Load Balancing을 수행한다.

상호작용 방식

  • Master node와 Worker Node들은 API Server를 통해 서로 통신한다.
  • 유저와 다른 컴포넌트들 역시 API Server를 통해 서로 상호 작용함
  • 예시
    • 새로운 어플리케이션 배포 시, 설정 파일들이 API Server를 통해 전달됨
      • 그 설정들은 etcd에 저장됨
    • Controller Manager는 API Server를 통해 클러스터 상태를 모니터링함
    • 새로운 파드가 스케줄됐을 때, Scheduler가 적정한 Worker Node를 선정한다
      • 이 선정된 내용을 API Server가 선정된 노드에게 전달한다
      • 그리고 그 노드의 kubelet이 컨테이너를 실행시킨다

728x90
반응형
728x90
반응형
  • 대규모 클러스터 환경에서 컨테이너화된 어플리케이션을 자동으로 배포/확장/관리하는데 필요한 요소들을 자동화하는 플랫폼
    • 코드 기반 클러스터 운영
    • 의도한 상태를 유지하며 클러스터를 관리함
  • Kubernetes: 조타수라는 뜻
  • 컨테이너 오케스트레이션 표준이라 여겨짐
  • 구글에서 2014년 오픈 소스로 공개
  • 여러 대의 도커 호스트를 하나의 클러스터로 만들어 줌
  • 다른 오케스트레이션 툴보다 다양한 기능을 제공하기 때문에 더 어려움
  • 배포, 스케일링, 컨테이너 어플리케이션 관리 자동화하는 컨테이너 오케스트레이션 플랫폼
  • 최소 2기가 램 이상을 사용하고, 2CPU 이상을 사용
    • 아니면 kubernetes로 서버 리소스를 다 써버릴 수 있음

특징

  • 코드 기반 클러스터 운영
    • 동일 코드 기반의 의사소통 -> 효율적
      • YAML 형식으로 파드들 및 기타 컴포넌트들을 정의함
      • 이전에는 다같이 검토 가능한 공통 도구가 없었음
  • 의도한 상태 기준 관리
    • 최초 의도한 상태와 현재 실행중인 상태를 쿠버네티스 컨트롤러가 자동으로 확인 (go 의 watch 모듈)
      • 차이점 발견 시, 현재 상태를 자동으로 처음 의도 상태로 변경
      • 즉, 실행중인 컨테이너가 예상치 않게 종료되면 자동으로 새로운 pod 생성

이후에 쿠버네티스 아키텍처와 쿠버네티스 옵션에 대한 글을 써 보고자 한다.

728x90
반응형
728x90
반응형

도커 EXPOSE

  • Expose는 컨테이너에 오픈할 포트를 의미한다.
  • 즉 컨테이너에서만 열려있는 포트로, 동일한 도커 네트워크에 속해있지 않은 호스트나 외부에서 접근할 수 없다.

도커 PORT

  • Port는 EXPOSE 된 컨테이너의 포트를 호스트에 열어주는 것을 의미한다.
  • 앞의 포트는 호스트의 포트, 뒤의 포트는 컨테이너의 노출된 포트를 의미한다.
  • 즉 동일한 도커 네트워크에 속해있지 않더라도, hostIP와 해당 포트를 알고 있다면 컨테이너에 접근이 가능해 진다.
  • 컨테이너의 포트를 호스트와 연결시켜주는 것이므로, 컨테이너 포트와 동일할 필요가 없다
    • 이 말은 다시 말하면, 특정 포트(3306 / 5504 / 6379등) 만을 사용해야하는 어플리케이션에 대해 다양한 포트 번호를 호스트가 사용할 수 있게 되는 것이다.
    • 왜냐하면 특정 포트를 반드시 사용해야 한다는 제약은 컨테이너의 포트에만 적용될 수 있기 때문이다.
      • 3306만을 사용해야하는 mysql을 구동할 때, PORTS를 5587:3306으로 설정한다면 외부에서는 5587로 접근하지만 어플리케이션은 3306 포트를 사용하는 효과를 거둘 수 있는 것이다.
728x90
반응형
728x90
반응형

 

본 과정은 Ubuntu 20.04 를 기준으로 작성되었습니다.

도커 설치

 

운영체제 패키지 업데이트

 

sudo apt-get update

 

 

필수 요소 설치

 

sudo apt-get install \
  apt-transport-https \
  ca-certificates \
  curl \
  gnupg \
  lsb-release -y

 

 

도커 GPG 키 설치

 

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

 

 

Stable 버전 도커 설치

 

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

 

 

도커 엔진 설치

 

sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io -y

 

 

버전 확인

 

docker version

 

 

도커 컴포즈는 뭔데?

 

도커 컴포즈는 컨테이너 이미지를 빌드하고, 컨테이너 설정을 미리 할 수 있는 설계도이다.

빌드할 도커 파일을 설정하고, 컨테이너 이름 및 공개할 포트 번호, 네트워크 등을 미리 설정할 수 있다.

 

도커 컴포즈 설치

 

sudo curl -L "https://github.com/docker/compose/releases/download/v2.9.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

 

 

실행 권한 부여

 

sudo chmod +x /usr/local/bin/docker-compose

 

 

버전 확인

 

docker-compose --version

 

728x90
반응형

'데브옵스 devOps > Docker' 카테고리의 다른 글

[DOCKER] 도커 port / expose 에 대해  (1) 2024.10.21
[DOCKER] 도커 네트워크에 관하여  (0) 2024.10.18
[DOCKER] 헬스체크  (2) 2024.10.03
[Docker] 도커란?  (1) 2024.09.25
[Docker] Private 도커 허브와 크레덴셜  (7) 2024.09.24

+ Recent posts