Azure

[Azure] AKS (Azure Kubernetes Service) 사용해보기 -1

seolbinzz 2023. 11. 29. 11:19

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편에서 계속