728x90
Cloud 환경(여기서는 NHN)이 어느정도 구축되어 있다는 가정하에 간단하게 배포하는 과정을 알아보자
도커 이미지 생성 -> cloud image registry push -> k8s yaml 파일 작성 -> pod, service, ... 생성
1. Docker image
1. 이미지 생성
docker buildx build -t <repository>:<tag> .
- 이미지 삭제
docker rmi <image_name_or_id>
- 모든 이미지 삭제
docker rmi $(docker images -q)
2. 로컬 테스트
- 이미지 실행
docker run -p 8000:8000 <이미지 REPOSITORY>:<이미지 TAG>
- 이미지 목록 확인
docker images
- 사용하지 않는 컨테이너, 네트워크 삭제
docker system prune
- 컨테이너 상태 확인
- 실행중
docker ps
- 모든 컨테이너 (중지된 것 포함)
docker ps -a
- 실행중
- 컨테이너 중지
docker stop <컨테이너_ID 또는 컨테이너_이름>
- 모든 컨테이너 중지
docker stop $(docker ps -aq)
- 컨테이너 삭제
docker rm
- 모든 컨테이너 삭제
docker rm $(docker ps -aq)
- 도커 빌더 캐시 삭제
docker buildx prune -a
2. NHN Container Registry
https://docs.nhncloud.com/ko/Container/NCR/ko/user-guide/
1. NHN Cloud Container Registry 로그인
다음 명령어로 Docker 레지스트리에 로그인
docker login {NHN\_CLOUD\_REGISTRY\_URI}
docker login {URI} -u {User Access Key ID} -p {Secret Access Key}
2. 이미지 푸시/풀
로그인이 완료되면, Docker 이미지를 NHN Cloud Container Registry로 푸시하거나 풀 수 있습니다.
- 이미지 태깅
docker tag {LOCAL\_IMAGE\_NAME} {NHN\_CLOUD\_REGISTRY\_URI}/{PROJECT\_NAME}/{IMAGE\_NAME}:{TAG}
- 이미지 푸시
docker push {NHN\_CLOUD\_REGISTRY\_URI}/{PROJECT\_NAME}/{IMAGE\_NAME}:{TAG}
- 이미지 풀
docker pull {NHN\_CLOUD\_REGISTRY\_URI}/{PROJECT\_NAME}/{IMAGE\_NAME}:{TAG}
3. K8s 구성
yaml 파일 작성
예시
대괄호로 감싸져 있는 값은 상황에 맞게 입력
1. pod
apiVersion: apps/v1
kind: Deployment
metadata:
name: [name]
namespace: [namespace]
spec:
replicas: 1
selector:
matchLabels:
app: fastapi
template:
metadata:
labels:
app: fastapi
spec:
containers:
- name: [name]
image: [image path]
ports:
- containerPort: 8000
imagePullSecrets:
- name: [image를 받아오기 위한 secrets 키가 정의되어 있는 name]
- kind : Deployment -> pod 를 생성하는 deployment 정의
- spec-containers-ports -> 노출할 port 정의
2. service
apiVersion: v1
kind: Service
metadata:
name: [name]
namespace: [namespace]
spec:
type: NodePort
ports:
- port: 80
targetPort: 8000
selector:
app: fastapi
- kind : Service -> 클러스터 내에서 실행 중인 Pod들의 네트워킹을 관리하고, 안정적이고 일관된 네트워크 접근을 제공하는 Kubernetes 리소스
- spec.type : NodePort
- ClustIP (defalut) : 클러스터 내부에서만 접근 가능한 가상 IP를 생성. 클러스터 외부에서는 접근할 수 없음
- NodePort : 각 노드의 특정 포트를 열어 외부에서 접근 가능하게 함
- LoadBalancer : 클라우드 환경(AWS, GCP, Azure 등)에서 로드 밸런서를 생성하여 외부에서 직접 접근 가능한 방식
- ports
- port : 클라이언트가 service 에 접근하는 포트 (80번 포트는 보통 HTTP 통신에 많이 이용됨)
- targetPort : service 가 통신을 전달할 pod 의 port (컨테이너 내부의 애플리케이션(FastAPI)이 수신하는 포트)
3. Ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: []
namespace: []
spec:
ingressClassName: []
rules:
- host: []
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: []
port:
number: 80
tls:
- hosts:
- []
kind : Ingress -> HTTP/HTTPS 트래픽 라우팅, 로드밸런싱 하는 리소스, 어떤 url 로 hosting 할 것인지도 정할 수 있음
여기서 namespace는 3가지 리소스가 모두 동일해야 함
4. yaml 파일 변경 사항 적용
kubectl apply -f .yaml
5. deployment 로그 보기
kubectl describe deployment
6. pod 이벤트 확인하기
kubectl describe pod <pod-name> -n <namespace>
728x90