1. 개요
- AWS EC2에 docker swarm으로 여러 docker container가 구축되어있다.
- docker swarm으로 구축되어있는 EC2 환경을 Azure Kubernetes Service로 마이그레이션 해야한다.
2. 테스트 과정
테스트 참고는 여기 !!
- AWS EC2 배포 및 구성

- docker swarm 구축
manager node에서 docker swarm init 명령어로 초기화를 해준다음 join token을 얻는다
해당 join token을 worker node에 입력해서 manager node와 join 시킨다.
join이 정상적으로 되면 swarm이 구성된 것이다.

worker node에 정상적으로 조인이 되지 않는다면 EC2에 연결되어 있는 보안그룹을 볼 필요가 있다.
보안그룹에서 2377에 대한 인바운드 설정이 정상적으로 되어있는지 확인한다.

아래 이미지와 같이 토큰 기반 조인을 한다.
모든 worker node에 동일하게 진행하면 된다.
만약 swarm join이 벌써되어있다면 manager node에서 docker node ls로 확인해본다.
정상적으로 조인되어있는것이 아니라면, worker node에서 docker swarm leave --force를 통해 swarm 해제를 한다.
그 이후 토큰 조인을 진행하면 정상적으로 될 것이다.



정상적으로 토큰 기반 조인이 됐을 경우 manager node에서 docker node ls 명령어를 입력했을때 다음과 같이 출력 될 것이다.

- docker service create 명령어로 service 배포 (선택)
docker swarm으로 조인이 되어있는 상황에서 각 service를 배포해본다.
아래 명령어를 입력해서 각 서비스를 배포해보고 결과를 출력받아본다.
docker service create --name redis --replicas 4 redis:latest
docker service create --name apache --replicas 10 httpd
docker service create --name postgres --replicas 1 -e POSTGRES_PASSWORD=pa55w.rd1234 postgres
해당 명령어를 이용해서 service의 replicas 수 만큼 apache, redis, postres container를 배포하는 것이다.
정상적으로 배포되었을 때 다음과 같이 출력을 받아야한다.

각 서비스에 대해서 어떤 노드에 배포되었는지 확인하기 위해서 다음 명령어를 입력해봤다.

이런식으로 배포할 수도 있지만, 일반적으로 compose.yaml 파일을 이용해서 service를 배포한다고 한다.
그래서 다음은 docker-compse.yaml 파일 또는 docker-stack.yaml을 이용해서 docker stack으로 swarm을 구축해보겠다.
이름은 상관없다. 파일 소스가 중요할뿐 !
[내생각 정리내용]
결국 swarm 구성 후 docker service create 로 container를 클러스터에 배포하거나 아니면 docker-compose.yaml 이나 docker-stack.yaml을 이용해서 한번에 간단하게 관리하여 배포하는 거다.
docker compose는 개발 환경에 맞도록 설계된더라 swarm 구성하지 않고 단일 호스트에서 여러 컨테이너가 관리가 가능하다. 그러므로 개발 및 테스트 환경에서 유용하다.
하지만, docker stack은 swarm으로 구성된 클러스터 환경에서 여러 컨테이너 관리가 가능하다. 그러므로 운영 환경에 맞다.
docker-compose.yaml과 docker-stack.yaml은 여러 컨테이너를 한번에 간단히 배포 관리하기 위한 파일일 뿐이다.
- docker-compose.yaml 파일을 이용해서 배포
우선, docker-compose.yaml파일은 다음과 같다.
version: "3"
services:
web_app:
image: httpd:latest
deploy:
replicas: 10
placement:
constraints:
- node.role != manager
data_base:
image: redis:latest
deploy:
replicas: 4
placement:
constraints:
- node.role != manager
data_base2:
image: postgres:latest
environment:
POSTGRES_PASSWORD: mypasswd
deploy:
replicas: 1
placement:
constraints:
- node.role != manager
~
vi 에디터로 해당 yaml파일을 만들고 나서 docker stack deploy 명령어를 이용해서 stack을 배포한다.

stack 배포 후 yaml 파일에 해당하는 service가 생성된 것을 볼 수 있고 해당 service는 stack으로 묶여있다.
정상적으로 여러 worker node에 배포된 것인지 swarm으로 형성된 것인지 확인하기 위해 다음 명령어를 입력해 보았다.
docker stack ps mystack을 입력했을 경우, 해당 stack에 포함되는 service들의 container가 어느 node에 배포되어있는지 보여준다.

- docker-compose.yaml파일을 Kompose를 통해 쿠버네티스에서 사용 가능한 yaml 파일로 변경해보려고한다.
kubernetes 공식 참고 문서는 여기 !!
[주의사항!]
Kompose는 다음과 같은 리소스를 변환할 수 있다.
- Deployment
- Service
- Pod
- Ingress
- ConfigMap, Secret (제한적으로 가능하나, 그냥 수동으로하는게 좋음)
!! PV와 PVC와 같은 스토리지 리소스는 직접 변환하지 않는다. kubernetes 클러스터에 맞게 수동으로 정의하고 설정해야한다.
kompose 설치

kompose convert 명령어를 통해서 docker-compose.yaml파일을 k8s가 사용할 수있도록 yaml 파일 변환한다.

kubectl 설치가 되어있지 않아서 새로 설치 진행한다.

ACR과 AKS로 접근하기 위해서 Az CLI를 설치한다.


ACR에 접근하기 위해서 로그인 시도한다.

Kompose로 변환된 yaml파일의 이미지를 ACR 경로에 맞게 설정한다.
제대로 설정해야지 tag 달고 push 했을경우 정상적으로 ACR로 push가 된다.



docker 이미지를 pull 받아온다 .
그 이후 docker tag를 지정해주고 마지막으로 ACR로 push해준다. 순는 다음과 같다.
docker pull postgres:latest
docker pull redis:latest
docker pull httpd:latest
docker tag postgres:latest terzmyacr.azurecr.io/postgres:latest
docker tag redis:latest terzmyacr.azurecr.io/redis:latest
docker tag httpd:latest terzmyacr.azurecr.io/httpd:latest
docker push terzmyacr.azurecr.io/postgres:latest
docker push terzmyacr.azurecr.io/redis:latest
docker push terzmyacr.azurecr.io/httpd:latest


ACR에 Push된 이미지 확인하기

- AKS에 접속해서 ACR 이미지 배포
Az Cli 설치 , kubectl 설치 준비 되어야한다.
참고할 수 있는 자료는 여기 !!
ACR에 로그인이 되어있지 않다면 먼저 진행해야한다.

로그인 정보는 포탈 ACR 액세스키에서 참고하면 된다.

기존 AKS 클러스터에 ACR 연결
# Attach using acr-name
az aks update --name terzmy-aks --resource-group terzmy-RG --attach-acr terzmyacr
# Attach using acr-resource-id
az aks update --name myAKSCluster --resource-group myResourceGroup --attach-acr <acr-resource-id>
ACR에서 AKS로 이미지 배포
배포하기 전에 ACR에서 AKS에 대한 인증 권한 정보 등록해줘야한다.
az aks get-credentials --resource-group terzmy-RG --name terzmy-aks
deployment로 ACR 이미지 배포
yaml 파일 작성
apiVersion: apps/v1
kind: Deployment
metadata:
name: aks-helloworld-one
spec:
replicas: 1
selector:
matchLabels:
app: aks-helloworld-one
template:
metadata:
labels:
app: aks-helloworld-one
spec:
containers:
- name: aks-helloworld-one
image: terzmyacr.azurecr.io/httpd:latest
ports:
- containerPort: 80
env:
- name: TITLE
value: "Welcome to azure kubernetes service"
외부에서 접근하기 위해서 External LoadBalancer service 생성
apiVersion: v1
kind: Service
metadata:
name: aks-helloworld-one
spec:
type: LoadBalancer
ports:
- port: 80
selector:
app: aks-helloworld-one
deplyoment와 service 배포

External-IP:80 포트로 접근해서 httpd가 정상 작동하는지 확인

'Azure' 카테고리의 다른 글
| GitLab & Jenkins를 이용한 AKS CI/CD (0) | 2024.09.25 |
|---|---|
| Azure Kubernetes Service & Cert-Manager (0) | 2024.09.07 |
| Azure DataFactory를 통한 Azure Cosmos DB 데이터 적재 (0) | 2024.07.17 |
| Private Link를 통한 Azure PostgreSQL의 Private Networking (0) | 2024.07.03 |
| [Study] Azure PostgreSQL (0) | 2024.07.03 |