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
반응형

메인 컴포넌트

#nodes #pods #노드 #파드 #쿠버네티스 #kubernetes #k8ss

노드와 파드

  • 노드
    • 노드는 컨테이너가 배포되고 구동되는 Worker Machine이다.
    • 각 노드는 클러스터 내에서 개별 노드를 의미하고, 물리/가상 머신이다.
    • 노드는 실제 workload를 구동시키고 필요 자원을 제공하는 역할이다.
  • 파드
    • 최소 배포 가능한 단위
    • 하나 혹은 강하게 결합된 컨테이너를 의미함
    • 파드 내의 컨테이너들은 같은 네트워크 네임스페이스를 공유한다
      • 이는 localhost 상에서 서로 소통할 수 있게 함
    • 파드는 클러스터에서 하나의 프로세스 인스턴스를 의미함
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
  • 왜 컨테이너가 아니라 파드를 사용하는가
    • Grouping Containers
      • 컨테이너들을 논리적으로 그룹화 한다.
      • 스케줄링, 스케일링, 관리를 간단화시킨다.
    • Shared Resources
      • 파드 내의 컨테이너들은 동일한 네트워크 네임스페이스를 공유함
      • 파드 내의 컨테이너들은 동일한 볼륨을 공유할 수 있다.
      • 따라서 서로 소통하기 더욱 쉬워진다
    • Amotic Unit
      • 파드는 배포의 원자 단위이다.
      • 어플리케이션 관리 혹은 스케일링 시, 파드 레벨로 수행한다 (컨테이너 개별 적용말고)
    • Scheduling and Affinity
      • 쿠버네티스는 파드를 노드에 스케줄하지, 각각 컨테이너를 스케줄하지 않는다.
      • 따라서 서로 연간되어있는 파드 내의 컨테이너들은 동일한 노드에 위치하게 된다
728x90
반응형
728x90
반응형

레디스 개요 복습

  • REDIS Remote Dictionary Server
    • 디스크가 아닌 주 메모리(RAM)에 데이터를 저장하는 데이터베이스
      • 따라서 데이터가 주메모리보다 크면 안됨
    • 단일 스레드로 설계됨
    • 디스크 검색이 필요한 다른 DBMS보다 자료 접근이 훨신 빠름
    • 때문에 성능 향을 위한 캐시 서버로 자주 사용됨
      • 자주 접근하는 데이터 및 계산에 많은 시간이 소요되는 데이터를 캐싱해 빠른 접근 제공
  • 키 - 값 쌍을 가진 JSON 객체를 저장하는, 스키마 없는 데이터 베이스(NoSQL)

Redis Command

KEY 관련 명령어

  • SET (key, value): 키 - 값 쌍을 설정
  • GET (key): 주어진 키에 대한 값 조회
  • DEL (key): 주어진 키 삭제
  • EXISTS (key): 키 존재 여부 확인
  • FLUSHALL: 모든 데이터 삭제
  • KEYS (pattern): 특정 패턴을 가진 키 전체 조회
  • SETEX (key, seconds, value): 특정 시간 후에 만료되는 키 - 값 쌍 설정
  • TTL (key): 키의 만료까지 남은 시간 리턴

LIST 관련 명령어

  • LPUSH (key, value): 배열 가장 첫번째에 요소(value) 추가
  • RPUSH (key, value): 배열 가장 마지막에 요소(value) 추가
  • LRANGE (key, startIndex, stopIndex): 시작 인덱스(startIndex)와 종료 인덱스(stopIndex) 사이의 요소 목록 리턴
  • LPOP (key): 배열의 가장 첫번째 요소 제거
  • RPOP (key): 배열의 가장 마지막 요소 제거

HASH 관련 명령어

  • 단일 키 내에 {키 - 값} 쌍 저장이 가능
    • HSET (key, field, value): 키(field) - 값(value) 쌍을 해시 안에 세팅
    • HGET (key, field): 해시 안의 키(field)의 값을 가져옴
    • HGETALL (key): 해시의 모든 키-값 쌍 조회
    • HDEL (key, field): 해시에서 주어진 키(field) 삭제
    • HEXISTS (key, field): 해시 내의 키(field) 존재 여부 확인
728x90
반응형

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

[REDIS] Redis 란?  (0) 2024.10.25
728x90
반응형

REDIS Remote Dictionary Server

  • 디스크가 아닌 주 메모리(RAM)에 데이터를 저장하는 데이터베이스
    • 따라서 데이터가 주메모리보다 크면 안됨
  • 단일 스레드로 설계됨
  • 디스크 검색이 필요한 다른 DBMS보다 자료 접근이 훨신 빠름
    • 때문에 성능 향을 위한 캐시 서버로 자주 사용됨
      • 자주 접근하는 데이터 및 계산에 많은 시간이 소요되는 데이터를 캐싱해 빠른 접근 제공
  • 키 - 값 쌍을 가진 JSON 객체를 저장하는, 스키마 없는 데이터 베이스(NoSQL)
  • 장점
    • 인메모리 키 - 값 저장소: 순수한 메모리 읽기는 빠른 읽기/쓰기 속도 및 빠른 응답 제공
    • IO 다중화(멀티플렉싱): 단일 스레드가 여러 개의 열린 소켓 연결에서 동시에 대기
    • 저수준 데이터 구조: 효율적인 저수준 데이터 구조 사용
  • 단점
    • 휘발성: 시스템이 갑자기 중단되면 Redis 내의 데이터 손실 가능

Redis Cache 동작 방식

  • 클라이언트의 데이터 요청
  • Redis Cache에서 해당 키 탐색
  • 키 발견 시 - Cache Hit
    • 캐시된 데이터 응답
  • 키 발견 실패 시 - Cache Miss

728x90
반응형

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

[REDIS] 레디스 명령어  (0) 2024.10.28
728x90
반응형

도커 EXPOSE

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

도커 PORT

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

도커 네트워크

  • 도커 네트워크는 일종의 내부망 이다.
    • 각 컨테이너들은 독립적인 네트워크 망을 가진다.
    • 정확히는 분리된 네트워크를 가진다 -> IP를 나눈다는 의미
    • 때문에 각 컨테이너별로 호스트와는 다른 가상의 IP 주소를 가진다.
  • 도커 네트워크는 컨테이너가 끼리의 통신을 할 수 있는 범위라 말할 수 있을 것 같다.
  • 기본적으로 컨테이너가 구동되게 되면 해당 컨테이너에 대한 default_network가 생성된다.
    • 이렇게 되면 다른 네트워크의 컨테이너와 소통할 수 없기 때문에 도커 외부로 우회하여 소통해야한다.
    • 컨테이너끼리 소통하기 위해 외부로 나갔다 들어와야 하기 때문에 성능적으로 저하가 발생하고, 보안적으로도 문제가 생길 수 있다.
  • 그러나 동일한 네트워크에 속한 컨테이너들 끼리는, 컨테이너의 이름과 포트만으로 서로 통신이 가능하다.

컨테이너 구동 시 도커 네트워크 구성에 대해

  • 컨테이너 구동 시, 순차적으로 도커 내부 IP 부여
    • 일반적으로 172.~~ 으로 시작하더라
    • 순차적으로 IP를 부여하기 때문에, 컨테이너를 내렸다 다시 올리면 컨테이너 IP가 변동 될 수 있음
  • 도커 네트워크는 내부망이기에, 외부와 연결시켜야 함
    • 컨테이너 구동 시, 자동적으로 컨테이너 마다 호스트에 veth(Virtual Ethernet)라는 가상 네트워크 인터페이스를 생성함
    • 네트워크 관련 설정을 하지 않는다면 default0 브릿지를 사용함

Docker Bridge

  • 도커 브릿지는 호스트와 컨테이너를 잇는 라우팅 경로
    • 즉 쉽게 말하면, 각 컨테이너에 가상의 IP를 부여하는 공유기 역할

도커 네트워크 전체 조회

  • 현재 사용중인 도커 네트워크 리스트 조회
docker network ls
  • 도커 네트워크 세부사항 조회
docker network inspect 

도커 네트워크 설정

  • 도커 네트워크 설정
  • docker network create <네트워크 이름>

컨테이너 네트워크 설정

  • 같은 도커 네트워크에 해당하는 모든 컨테이너들은 서로 내부 통신이 가능함
    • 이미 db_mariadb 라는 컨테이너가 proxy라는 도커 네트워크 안에 구동되어 있다면
    • 지금 올리는 어플리케이션 컨테이너를 proxy라는 네트워크에 포함시킴으로 인해서, db_mariadb:3306 을 url로 잡으면 통신이 가능해짐
    • 같은 네트워크가 아니라면, 'HostIP:컨테이너 포트' 를 통해 접근할 수 있음
      • 문제는 컨테이너가 호스트에 포트를 열어둔게 아닌, 컨테이너 포트만 노출 시킨 상태라면 접근할 수 있는 방법이 없어짐
  • 컨테이너 네트워크 설정 - docker compose
    • external: 컨테이너 구동 시 새로운 네트워크를 사용할지에 대한 여부를 설정하는 것
      • true: 기존 도커 네트워크를 할당함
      • false: 새로운 도커 네트워크를 생성함
    services:
        app:
            // 컨테이너 설정
            networks:
                - proxy
    
    networks:
        proxy:
          # proxy라는 새로운 네트워크를 생성하는게 아닌, 기존의 proxy라는 네트워크를 사용한다는 의미
            external: true
  • 컨테이너 네트워크 설정 - Dockerfile
    docker run app_name --net proxy
728x90
반응형

+ Recent posts