AKS? 컨테이너 기반 애플리케이션 배포 및 관리를 효율적으로 진행할 수 있도록 도와주는 서비스
[ AKS를 이용한 3-Tier 구성 ]
이 그림을 토대로 구성해보도록 하겠습니다 ~
1. VM 설치 및 설정
- 리소스 그룹 : seolbin
- VM 이름 : seolbin-vm
- 이미지 : centos8
- 인바운드 포트 : 80, 22
2. Mysql 설치
- 리소스 그룹 : seolbin
- DB 이름 : seolbin-db
3. Azure CLI 설치
Azure CLI란? Azure 클라우드 플랫폼과 상호 작용하기 위한 명령줄 도구입니다.
OS 버전 별 리포지토리 키 추가 URL : https://learn.microsoft.com/ko-kr/cli/azure/install-azure-cli-linux?pivots=dnf
위에 URL에서 centos8.x에 맞는 리포지토리 키를 가져옵니다.
dnf install -y https://packages.microsoft.com/config/rhel/8/packages-microsoft-prod.rpm
yum install azure-cli -y
Azure CLI 설치를 하면 az login 명령어를 통해 Azure에 로그인할 수 있습니다.
4. docker 설치
yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
# docker version 확인
docker version
# doker start
service docker start
5. Mysql 설치 / Kuberctl 설치
우선 VM에 mysql에 설치합니다.
그리고 Azure 포탈에서 만든DB서버 -> 연결 -> 브라우저에서 또는 로컬에서 연결 에서 확인 가능
mysql -h seolbin-db.mysql.database.azure.com -u hosting -p
mysql 접속되면 완료!
6. Kubectl 설치
Kubectl란? 쿠버네티스 클러스터를 제어하기 위한 명령줄 도구입니다.
# 변수 생성
export RESOURCE_GROUP=btc-rg
export CLUSTER_NAME=btcaks
export LOCATION=koreacentral
#aks 생성
az aks create --resource-group seolbin --name seolbin-aks --generate-ssh-keys --node-vm-size Standard_B2s
- 리소스 : seolbin
- aks 이름 : seolbin-aks
- aks 노드 종류 : Standard_B2s
쿠버네티스의 Yum 리포지토리를 추가합니다.
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-\$basearch
enabled=1
gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF
Yum을 통해 Kubectl 패키지 설치를 합니다.
yum install -y kubectl
source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc
그 다음 AKS 클러스터 자격 증명을 가져와서 kubectl이 클러스터에 연결할 수 있도록 설정합니다.
az aks get-credentials --name seolbin-aks --resource-group seolbin
명령어를 이용하여 정상 연결 확인해봅시다
7. WAS Container 구성
" 펫 클리닉 " 이라는 공식 스프링을 사용할겁니다.
# java 폴더 생성
mkdir /usr/bin/java
# java 폴더 이동
cd /usr/bin/java
# OpenJDK 다운로드 (petclinic 쓰려면 11버전 이상이어야 함)
wget https://download.java.net/java/GA/jdk18.0.2.1/db379da656dc47308e138f21b33976fa/1/GPL/openjdk-18.0.2.1_linux-x64_bin.tar.gz
tar xvzf openjdk-18.0.2.1_linux-x64_bin.tar.gz
자바를 설치하면 환경변수 설정을 해주어야 합니다.
# 환경변수 설정 추가
vim /etc/profile
# 맨 밑에 해당 부분 넣어주면 됩니다
export JAVA_HOME=/usr/bin/java/jdk-18.0.2.1
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/tools.jar
# 변경사항 적용
source /etc/profile
# 변경사항 확인
echo $JAVA_HOME
#DB 접속 및 petclinic 데이터베이스 생성
# DB 접속
mysql -h btc-db.mysql.database.azure.com -u btcuser -p
# 데이터베이스 생성
create database petclinic;
# 확인
show databases;
#펫클리닉 설치 및 DB 연동
# petclinic 설치
git clone https://github.com/spring-projects/spring-petclinic.git
cd spring-petclinic
# petclinic 속성 변경
vim src/main/resources/application-mysql.properties
## 내용 수정
# database init, supports mysql too
database=mysql
spring.datasource.url=${MYSQL_URL:jdbc:mysql://seolbin-db.mysql.database.azure.com:3306/petclinic}
spring.datasource.username=${MYSQL_USER:<seolbin>}
spring.datasource.password=${MYSQL_PASS:<패스워드>}
# SQL is written to be idempotent so this is safe
spring.sql.init.mode=always
# petclinic 빌드
./mvnw package
#Was Dockerfile 생성
#앞에서 빌드한 petclinic의 jar파일을 DockerFile이 있는 디렉토리로 이동
cd spring-petclinic/target/
cp spring-petclinic-2.7.3.jar /home/hosting/was
# Dockerfile 생성
cd was
vim Dockerfile
# jar 파일의 이름을 확인 후 알맞게 넣어주어야합니다.
...
FROM openjdk:18
ADD spring-petclinic-2.7.3.jar /spring-petclinic-2.7.3.jar
ENTRYPOINT ["java","-jar","-Dspring.profiles.active=mysql","/spring-petclinic-2.7.3.jar"]
#WAS Container 빌드
# Dockerfile 빌드해서 이미지 생성
cd was
docker build -t was:1 .
# 실행
docker run --name was -d -p 8080:8080 was:1
# 확인
docker ps
8. WEB Container 구성
#WEB Dockerfile 생성
mkdir web
# Dockerfile 생성
cd web
vim Dockerfile
...
FROM centos:7
RUN yum install -y httpd && yum clean all
RUN echo "Hello Docker" > /var/www/html/index.html
CMD ["/usr/sbin/httpd", "-DFOREGROUND"]
# WEB Dockerfile 빌드
cd web
docker build -t web:1 .
# 실행
docker run --name web -d -p 80:80 web:1
# 확인
docker ps
docker ps 로 확인하면 web, was 두 개의 컨테이너가 올라가 있습니다
9. WEB - WAS 연동 ( Reverse Proxy 사용)
docker inspect was
위의 해당 명령어로 was IP를 확인합니다. -> 172.17.0.2
#vm에서 web 으로 들어가는 명령어
docker exec -it web /bin/bash
#web conf 파일 수정
-> 수정 후 docker restart web 필수
vi /etc/httpd/conf/httpd.conf
## 맨 밑에 추가
<VirtualHost *:80>
ServerName localhost
ProxyRequests Off
ProxyPreserveHost On
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyPass / http://172.17.0.2:8080/ disablereuse=on
ProxyPassReverse / http://172.17.0.2:8080/
</VirtualHost>
VM의 공인 IP로 접속했을 때 해당 페이지가 뜹니다
10. ACR 생성
ACR? Docker 및 OCI 이미지의 레지스트리이며, 컨테이너 이미지와 아티팩트를 빌드, 저장, 보안, 스캔, 복제 및 관리하는 데 사용하는 OCI 배포 인스턴스입니다.
[ ACR 생성 ]
- 리소스 그룹 : seolbin
- 레지스트리 이름 : seolbinregi
[ az login 및 az acr 연결 ]
az login
az acr login --name seolbinregi.azurecr.io
11. 도커 이미지를 ACR에 올리기
우선 컨테이너를 stop 합니다
docker stop web
docker stop was
#컨테이너 프로세스 확인
[ docker commit 하기 ]
그 다음 컨테이너를 commit 합니다
docker commit? Docker 컨테이너의 현재 상태를 새로운 이미지로 저장하는 명령어
docker commit [컨테이너명] [원하는이미지명:태그]
docker commit was was:v1
docker commit web web:v1
그 다음 아래 명령어를 통해 tag가 v1인 이미지가 web , was 두 개 생성됩니다
[ docker tag 하기 ]
Docker 이미지를 ACR 또는 레지스트리에 푸시하려면 docker tag를 사용하여 이미지에 새로운 태그를 추가해야합니다.
docker tag was:v1 seolbinregi.azurecr.io/was:v1
docker tag web:v1 seolbinregi.azurecr.io/web:v1
[ docker push 하기 ]
docker push 를 사용하여 로컬에서 빌드한 이미지를 Azure 컨테이너 레지스트리로 푸시합니다.
docker push seolbinregi.azurecr.io/was:v1
docker push seolbinregi.azurecr.io/web:v1
Azure 포탈 내 seolbinregi 리포지토리에 푸시된 모습
[ docker pull 하기 ]
기존 존재하던 도커 이미지를 지우고 ACR에서 이미지를 받아와서 해당 이미지로 컨테이너를 빌드해봅시다
# 기존 이미지 삭제
docker rmi seolbinregi.azurecr.io/was:v1
docker rmi seolbinregi.azurecr.io/web:v1
# ARC에 등록된 이미지 다운로드
docker pull seolbinregi.azurecr.io/was:v1
docker pull seolbinregi.azurecr.io/web:v1
[ docker run 하기 ]
docker run -d --name was01 -p 8080:8080 seolbinregi.azurecr.io/was:v1
docker run -d --name web01 -p 80:80 seolbinregi.azurecr.io/web:v1
12. AKS 클러스터에 대한 ACR 통합 & 익명 풀 액세스 활성화
이 작업들은 AKS 클러스터에서 ACR의 이미지를 사용하려는 경우 필요합니다.
AKS 클러스터에 대한 ACR 통합은 AKS 클러스터가 ACR에서 이미지를 다운로드 할 수 있도록 필요한 권한을 부여하는 작업입니다.
익명 풀 액세스 활성화는 익명 사용자가 ACR에서 이미지를 다운로드 할 수 있도록 허용하는 기능입니다.
az aks update -n seolbin-aks -g seolbin --attach-acr seolbinregi
az acr update --name seolbinregi --anonymous-pull-enabled
[ 익명 풀 액세스 활성화하기 ]
# 익명 풀 액세스 활성화
az acr update --name seolbinregi --anonymous-pull-enabled
#익명 풀 액세스 비활성화 참고
# 비활성화
$ az acr update --name seolbinregi --anonymous-pull-enabled false
13. was.yaml 파일 생성 및 배포
web과 was를 연동하기 위해 was 파드의 ClusterIP를 web의 설정값에 적용시켜 다시 이미지를 따서 받아와야하기 때문에 was의 yaml 파일 먼저 생성하겠습니다.
ClusterIP란? 내부 클러스터 네트워크에서 서비스에 접근하기 위한 가상 IP 주소
왜 사용할까? ClusterIP 주소를 사용하여 내부의 다른 파드에 접근하기 위해서
[ was.yaml 생성 ]
mkdir yaml
cd yaml
vim was.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: was-server
spec:
replicas: 2
selector:
matchLabels:
app: was
template:
metadata:
labels:
app: was
spec:
containers:
- image: seolbinregi.azurecr.io/was:v1
name: was-server
ports:
- containerPort: 8080
resources:
requests:
cpu: 200m
readinessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 5
periodSeconds: 10
---
apiVersion: v1
kind: Service
metadata:
name: was-server-svc
spec:
type: ClusterIP
selector:
app: was
ports:
- port: 8080
targetPort: 8080
[ WAS 배포 ]
# WAS 배포
kubectl apply -f was.yaml
# POD 모니터링
kubectl get pods
# SVC 모니터링
kubectl get svc
이렇게하면 2개의 파드와 하나의 ClusterIP가 생성됩니다.
13. WEB-WAS 연동
웹 서버 설정 파일을 수정하여 WAS의 Cluster IP 와의 연동을 설정하고 웹서버를 재시작합니다.
#web 서버 접속
docker exec -it web bash
vi /etc/httpd/conf/httpd.conf
<VirtualHost *:80>
ServerName localhost
ProxyRequests Off
ProxyPreserveHost On
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyPass / http://10.0.85.56:8080/ disablereuse=on
ProxyPassReverse / http://10.0.85.56:8080/
</VirtualHost>
[ WEB 이미지 ACR에 올리기 ]
이제 실행중인 컨테이너를 stop하고 다시 이미지를 commit 후 push합니다.
# 실행 중인 컨테이너 stop
docker stop web
# commit
docker commit web seolbinregi.azurecr.io/web:v2
# push
docker push seolbinregi.azurecr.io/web:v2
Azure 포탈 seobinregi 리포지토리 web에 v1, v2가 등록된 것을 확인할 수 있습니다.
14. web.yaml 파일 생성 및 배포
ACR에 업로드된 이미지를 사용하여 2개의 파드 복제본을 생성하고, LoadBalancer 가 생성한 External IP를 통해 외부로 접근합니다.
was.yaml 파일에서는 ClusterIP로 지정해주었지만, 여기서는 LoadBalancer로 지정해줍니다.
vi web.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-server
spec:
replicas: 2
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- image: seolbinregi.azurecr.io/web:v2
name: btc-web
ports:
- containerPort: 80
resources:
requests:
cpu: 200m
readinessProbe:
tcpSocket:
port: 80
initialDelaySeconds: 5
periodSeconds: 10
---
apiVersion: v1
kind: Service
metadata:
name: web-server-svc
spec:
type: LoadBalancer
selector:
app: web
ports:
- port: 80
name: http # SERVICE port name
protocol: TCP # The protocol the SERVICE will listen to
targetPort: 80
[ WAS 배포 ]
# WEB 배포
kubectl apply -f web.yaml
# POD 모니터링
kubectl get pods
# SVC 모니터링
kubectl get svc
이렇게하면 2개의 파드와 하나의 LoadBalancer가 생성된 것을 확인할 수 있습니다.
15. WEB 접속 및 연동 확인
이제 web의 External IP로 접속하면 web이 뜨게됩니다.
[ 사용자 및 펫 추가 ]
Add Owner 클릭
Add New Pet 클릭
Add Pet 클릭
이렇게 하면 사용자와 Pet이 추가됩니다.
이제 DB를 들어가서 사용자 및 Pet이 추가되었는지 확인해봅시다.
[ 사용자 확인 ]
[ Pet 확인 ]
--> 다음 2편에서 계속
'Azure' 카테고리의 다른 글
[Azure] 스케일링 종류 (1) | 2024.01.10 |
---|---|
[Azure] AKS (Azure Kubernetes Service) 사용해보기 -2 (0) | 2023.12.01 |
[Azure] 서비스 앤드포인트? (0) | 2023.11.16 |
[Azure] TerraForm에 대한 이해 -2 (0) | 2023.11.15 |
[Azure] TerraForm에 대한 이해 -1 (0) | 2023.11.14 |