DX Data School

Deployment

Kim J 2024. 4. 9. 10:36

1. Deployment

  • Pod (Kubernetes의 배포 단위) 배포에 관한 객체
  • Pod를 배포하고 몇 개의 Pod를 실행할 지 결정할 수 있음

 
  • Docker-Compose : 여러 개의 컨테이너를 묶어서 실행
  • Pod : 여러 개의 컨테이너를 묶어서 쿠버네티스에서 배포하는 단위
    • Deployment 나 ReplicaSet 을 이용하면 여러 개의 Pod를 생성할 때 직접 명령어를 입력할 필요가 없음
    • Pod는 문제가 발생해서 종료될 경우 자동으로 다시 배포가 이루어짐 (바람직한 상태를 유지함)

1) nginx 배포

  • 배포를 위한 yaml 파일 작성
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deploy
  labels:
    app: nginx

spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80
 
  • 배포 명령
    • kubectl apply -f yaml파일경로
    • kubectl apply -f C:\DX_DATA\kubernetes\nginx-deploy.yml
  • 상태 확인
    • kubectl get deployments
    • kubectl get pods
  • Pod, Replicaset, Deployment
    • Deployment (배포) -> Replocaset (파드의 개수 설정 및 관리) -> Pod (컨테이너의 집합)
    • 하나의 MicroService 구현 시 Pod 단위로 배포

 

2) Service

  • Pod는 생성되더라도 외부에서 접속 할 수 없기 때문에 외부에서 접속 할 수 있도록 해주는 것이 Kubernetes의 Service
    • Service를 외부에 노출 하게되면 외부에서 Pod에 접속 할 수 있다.
    • Service는 일종의 Port Forwarding의 역할

 

3) 앞에서 배포한 Pod를 외부에서 사용할 수 있도록 Service로 생성

  • Service를 위한 yaml 파일 생성
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
  labels:
    app: nginx-service

# nginx라는 레이블이 달린 Pod의 80번 포트를 외부에서 31472번 포트로 접속 하도록 설정
spec:
  type: NodePort
  ports:
  - port: 8080
    NodePort: 31472
    targetPort: 80
  selector:
    app: nginx
 
  • 배포 명령
    • kubectl apply -f 파일경로
    • kubectl apply -f C:\DX_DATA\kubernetes\nginx-service.yml
  • 서비스 확인
    • kubectl get svc

 

4) Rollback

  • 쿠버네티스는 Rolling Update와 더불어 Rollback 기능을 제공
    • Rolling Update
      • 업데이트를 할 때 기존 버전을 유지하고 새로운 Pod를 추가한 뒤 새로운 Pod가 정상적으로 동작하면 기존의 Pod를 하나 제거 후 새로운 Pod를 추가하는 방식
      • 이 업데이트 방식은 Public Cloud에서는 직접 구현할 필요가 없으며 Kubernetes에서도 직접 구현할 필요 없이 Container Service 에서 선택만 해주면 됨

 

5) Rollback 기능 확인

  • 현재 배포된 파드의 이미지를 변경
    • kubectl set image deployment.v1.apps/nginx-deploy nginx=nginx:1.16.1

 

  • 배포된 내용을 확인
    • kubelctl describe deploy nginx-deploy
위에서 생성할 때 image: nginx:latest 로 생성 한 것이 1.16.1로 변경됨!!
이미지 변경을 할 때 없는 이미지로 변경하기
    • kubectl set image deployment.v1.apps/nginx-deploy nginx=nginx:1.200
변경은 되었다고 나오지만
  • 파드 확인
    • kubectl get pods
      • 기존 2파드 2개는 존재하고 새로운 파드 하나가 추가되어 업데이트를 시도 (무중단서비스)
에러 이미지로 업데이트를 시도중인것을 볼 수 있음
  • 상태 확인
    • kubectl rollout status deployment/nginx-deploy
    • kubectl get deployment nginx-deploy
  • 이전 상태로 롤 백
    • kubectl rollout undo deployment/nginx-deploy
  • 상태확인
    • kubectl get deployment nginx-deploy
.
  • 배포 버전 확인
    • kubectl rollout history deployment/nginx-deploy
  • 특정 버전으로 롤백
    • kubectl rollout history deployment/nginx-deploy --to-revision=버전번호
      • docker-compose와 달리 컨테이너를 배포한 내역을 저장하고 있기 때문에 필요한 버전으로의 롤백이 쉽고 업데이트 한 내역을 보유하고 있다.
      • 이렇게 변경 내역을 관리하는 것을 형상(Configuration) 관리라고 함
        • git을 사용하는 가장 큰 이유는 코드의 형상 관리가 가능하기 때문임 코드의 변경이나 운영 환경의 변경이 생길 때마다 문서화 작업을 했는데 문서화 때문에 오버헤드가 커짐

 

'DX Data School' 카테고리의 다른 글

쿠버네티스 (Kubernetes)  (0) 2024.04.08
Docker 2  (0) 2024.04.08
Docker  (0) 2024.04.05
Container 와 Virtualization  (0) 2024.04.05
CI/CD  (0) 2024.04.05