본문 바로가기
CSP (Cloud Service Provider)/Azure

[Azure] AKS (Azure Kubernetes Service) - (4) WEB, WAS YAML파일 생성 및 연동

by BTC_SUU 2023. 8. 30.

베하! 안녕하세요~
BTC_수신자표시제한 입니다 😊

지난번에 컨테이너 이미지를 ACR에 올리고 그 이미지를 가지고 컨테이너를 빌드 후 연동까지 진행해보았습니다!

2023.08.16 - [CSP (Cloud Service Provider)/Azure] - [Azure] AKS (Azure Kubernetes Service) - (3) ACR

 

[Azure] AKS (Azure Kubernetes Service) - (3) ACR

베하! 안녕하세요~ BTC_수신자표시제한 입니다 😊 지난번에 Docker 컨테이너로 올린 web과 was를 연동해서 펫클리닉 사이트에 접속하는거까지 진행해보았습니다! 2023.07.28 - [CSP (Cloud Service Provider)/Azu

btcd.tistory.com

오늘은 지난번에 이어 ACR에 올린 이미지를 사용해 WEB과 WAS의 YAML파일 생성하고 연동해보겠습니다~!


1. was.yaml 파일 생성 및 배포

web과 was를 연동하기 위해 was 파드의 ClusterIP를 web의 설정값에 적용시켜 다시 이미지를 따서 받아와야하기 때문에 was의 yaml 파일 먼저 생성하겠습니다.

 

ClusterIP는 서비스 유형 중 하나로, 내부 클러스터 네트워크에서 서비스에 접근하기 위한 가상 IP 주소입니다. 클러스터 내에서 서비스의 일부로서, 해당 서비스의 파드들을 내부 네트워크에 노출시키고, 클러스터 내부에서만 접근 가능하도록 설정하는 데 사용됩니다..

 

ClusterIP를 사용하는 경우, 웹 서버나 애플리케이션 클라이언트는 해당 서비스의 ClusterIP 주소를 사용하여 내부의 다른 파드에 접근할 수 있습니다. 이렇게 하면 서비스의 백엔드 파드들을 추가하거나 제거할 때도 서비스의 ClusterIP 주소가 변경되지 않아서 클라이언트 설정을 변경할 필요가 없습니다. 클라이언트는 항상 ClusterIP 주소를 통해 접근하면 됩니다.

 

[was.yaml 생성]

저는 yaml 폴더를 생성하고 그 폴더에서 yaml 파일을 관리하겠습니다.

mkdir yaml

cd yaml

vim was.yaml

 

해당 yaml 파일에 Deployment와 Service를 정의해주겠습니다.

 

Deployment는 Kubernetes에서 애플리케이션을 관리하고 배포하기 위한 리소스 유형 중 하나입니다. 주로 컨테이너화된 애플리케이션을 실행하는 파드를 생성하고 관리하는 역할을 합니다.

Service는 애플리케이션의 네트워크 접근성을 관리하는 추상화된 리소스입니다. Service는 일련의 파드에 대한 단일 진입점을 제공하고, 클라이언트나 다른 서비스가 해당 파드들과 통신할 수 있도록 도와줍니다.

 

해당 컨테이너는 ACR에 업로드한 이미지를 사용하여 2개의 파드 복제본을 생성하고, ClusterIP를 통해 클러스터 내부에서만 접근 가능한 IP 주소를 제공합니다. 외부에서는 이 서비스에 직접 접근할 수 없으며, 내부 컴포넌트 간의 통신을 위한 용도로 사용됩니다. 또한 서비스는 내부의 파드의 8080 포트와 연결되며, 클러스터 내의 WAS 애플리케이션에 대한 내부 통신을 담당합니다.

 

apiVersion: apps/v1
kind: Deployment
metadata:
  name: was-server
spec:
  replicas: 2
  selector:
    matchLabels:
      app: was
  template:
    metadata:
      labels:
        app: was
    spec:
      containers:
      - image: btcacr.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

 

각 설정값들에 대한 설명은 아래의 코드를 참고해주세요!

 

apiVersion: 사용할 Kubernetes API 버전을 지정합니다.
kind: 리소스 유형을 나타냅니다. 이 경우, 애플리케이션을 배포하기 위해 Deployment를 사용합니다.
metadata: 리소스에 대한 메타데이터를 지정합니다.
  name: 리소스의 이름을 지정합니다.
spec: Deployment의 세부 사항을 정의합니다.
  replicas: 파드의 복제본 수를 지정합니다. 이 경우, 2개의 복제본이 생성됩니다.
  selector: 어떤 파드를 선택할지에 대한 레이블 선택기를 지정합니다.
    matchLabels: 레이블을 기반으로 파드를 선택합니다.
      app: 
  template: 생성되는 파드 템플릿을 정의합니다.
    metadata: 파드 템플릿의 메타데이터를 지정합니다.
      labels: 파드에 적용되는 레이블을 정의합니다.
        app: 
    spec: 파드 스펙을 설정합니다.
      containers: 파드 내에 포함될 컨테이너를 정의합니다.
      - image: 컨테이너에 사용될 이미지를 지정합니다.
        name: 컨테이너의 이름을 지정합니다.
        ports: 컨테이너가 열 포트를 설정합니다.
        - containerPort: 컨테이너가 듣는 포트 번호를 지정합니다.
        resources: 컨테이너의 리소스 요청을 정의합니다.
          requests: CPU 리소스 요청을 지정합니다.
            cpu: 
        readinessProbe: 파드의 상태를 확인하기 위한 프로브를 설정합니다.
          tcpSocket: TCP 소켓 연결을 통한 상태 확인을 설정합니다.
            port: 
          initialDelaySeconds: 파드 시작 후 첫 번째 상태 확인까지의 대기 시간을 지정합니다.
          periodSeconds: 상태 확인 주기를 지정합니다.
---
apiVersion: 사용할 Kubernetes API 버전을 지정합니다.
kind: 리소스 유형을 나타냅니다. 이 경우, 서비스를 정의하기 위해 Service를 사용합니다.
metadata:
  name: web-svc
spec:
  type: 서비스 유형을 지정합니다. LoadBalancer는 외부 트래픽에 대한 로드 밸런싱을 제공합니다.
  selector: 이 서비스가 연결할 파드를 선택하기 위한 레이블 선택기를 지정합니다.
    app: web
  ports: 서비스가 열 포트를 설정합니다.
  - port:서비스의 포트 번호를 지정합니다.
    name: 서비스 포트의 이름을 지정합니다.
    protocol: 서비스가 사용할 프로토콜을 지정합니다.
    targetPort: 서비스가 요청을 전달할 파드의 포트 번호를 지정합니다.

 

[WAS 배포 및 모니터링]

# WAS 배포
kubectl apply -f was.yaml

# POD 모니터링
kubectl get pods

# SVC 모니터링
kubectl get svc

 

이렇게하면 2개의 파드와 하나의 ClusterIP가 생성된 것을 확인할 수 있습니다.

 

2. WEB-WAS 연동

Docker 컨테이너 내에서 웹 서버 설정 파일을 수정하여 WAS(ClusterIP: 10.0.199.254)와의 연동을 설정하고, 그 후에 웹 서버 컨테이너를 다시 시작해야합니다.

 

[WEB docker 수정]

앞에서 생성한 was의 ClusterIP를 http.conf 파일에 적용시켜줍니다.

# Docker 컨테이너에 대해 bash 셸을 실행합니다. 이 명령을 통해 컨테이너 내부로 들어가서 명령을 실행할 수 있습니다.
docker exec -it web01 bash

vi /etc/httpd/conf/httpd.conf

#  WAS의 ClusterIP(10.0.199.254)를 가리키도록 아파치 설정을 수정합니다.
...
<VirtualHost *:80>
        ServerName localhost
        ProxyRequests Off
        ProxyPreserveHost On
        <Proxy *>
                Order deny,allow
                Allow from all
        </Proxy>
        ProxyPass / http://10.0.199.254:8080/ disablereuse=on
        ProxyPassReverse / http://10.0.199.254:8080/
</VirtualHost>
...

# 편집을 마친 뒤에는 vi 에디터를 종료하고 컨테이너의 셸을 빠져나옵니다.
exit

# 웹 서버 컨테이너를 재시작하여 변경된 설정을 적용합니다. 
docker restart web01

 

[WEB 이미지 ACR에 올리기]

이제 실행중인 컨테이너를 stop하고 다시 이미지를 commit -> push합니다.

# 실행 중인 컨테이너 stop
docker stop web

# commit
docker commit web01 btcacr.azurecr.io/web:v2

# push
docker push btcacr.azurecr.io/web:v2

 

이렇게 하면 기존에 있던 web:v1과 새로 생성된 v2가 ACR에 등록된 것을 확인할 수 있습니다.

 

[web:v2 이미지 실행]

이제 기존에 있던 이미지(web:v2)를 삭제하고 ACR에 등록한 이미지를 받아와 해당 이미지가 잘 동작하는지 확인해보겠습니다.

# 기존의 이미지 삭제
docker rmi btcacr.azurecr.io/web:v2

# ARC에 등록된 이미지 다운로드
docker pull btcarc.azurecr.io/web:v2

# 다운한 이미지 작동하는지 확인
docker run -d --name web02 -p 80:80 btcacr.azurecr.io/web:v2

# 멈추기
docker stop web02

 

3.  web.yaml 파일 생성 및 배포

[was.yaml 생성]

해당 컨테이너는 ACR에 업로드된 이미지를 사용하여 2개의 파드 복제본을 생성하고, LoadBalancer 서비스가 생성한 External IP를 통해 외부에서 접근 가능한 IP 주소를 제공합니다. 또한 서비스는 내부 파드의 80 포트와 연결되며, 클러스터 내의 웹 애플리케이션에 대한 내부 통신을 관리합니다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-server
spec:
  replicas: 2
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
      - image: btcacr.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.yaml 파일에서는 service를 ClusterIP로 지정해주었지만, 여기서는 LoadBalancer로 지정해줍니다.

 

Kubernetes의 Service 중 하나인LoadBalancer는 외부 트래픽을 내부 클러스터의 서비스로 라우팅하기 위한 기능을 제공하는 리소스 유형입니다. 일반적으로 LoadBalancer 서비스를 사용할 때, Kubernetes 클러스터 외부에 있는 로드 밸런서 서비스가 자동으로 생성되며, 해당 로드 밸런서는 지정된 포트를 듣고 들어오는 트래픽을 내부 클러스터의 해당 서비스로 라우팅합니다. 이를 통해 외부에서 내부 서비스로의 접근을 용이하게 하며, 클러스터의 서비스를 외부로 노출시키는 것이 가능해집니다. 

 

즉, was 서버는 내부 통신만 가능하면 되기 때문에 ClusterIP를 사용하면 되지만, web은 외부에서 접속할 수 있어야 하기 때문에 LoadBalancer로 지정해 주는 것입니다.

 

[WAS 배포 및 모니터링]

# WEB 배포
kubectl apply -f web.yaml

# POD 모니터링
kubectl get pods

# SVC 모니터링
kubectl get svc

이렇게하면 2개의 파드와 하나의 LoadBalancer가 생성된 것을 확인할 수 있습니다.

 

4. WEB 접속 및 연동 확인

이제 web의 External IP로 접속하면 web이 뜨게됩니다.

저는 다른날 테스트를 진행했기떄문에 사진에 보이는 IP가 다릅니다,,! 

WEB의 External IP로 접속하면 귀여운 강아지와 고양이 사진을 볼 수 있습니다~!

이제 사용자를 추가해서 Database에 정보가 잘 저장되는지 확인해보겠습니다.

 

[사용자 추가]

FIND OWNER에 들어가 사용자 정보를 입력하고 Add Owner를 누릅니다.

그러면 아래의 사진과 같이 확인창을 볼 수 있습니다.

그리고 Add New Pet을 눌러 Pet도 추가해줍니다.

그러면 아래와 같이 추가된 것을 볼 수 있습니다!

이제 DB에 접속해 해당 사용자와 반려동물이 제대로 저장이 되었는지 확인해 보겠습니다.

 

[DB 접속 및 확인]

# DB 접속
mysql -h btc-db.mysql.database.azure.com -u btcuser -p

# petclinic 데이터베이스 사용
use petclinic;

 

owner와 pet의 정보를 출력해보겠습니다.

따란~

제가 등록한 정보가 잘 나오는 것을 확인했습니다!


여기까지 ACR에 올린 이미지를 사용해 WEB과 WAS의 YAML파일 생성하고 연동까지 진행해보았습니다~!

도움이 되셨으면 좋겠습니다.😊

 

다음번엔 Ingress와 HPA를 구성해보겠습니다.
다음에 또 만나요 👋

'CSP (Cloud Service Provider) > Azure' 카테고리의 다른 글

Azure Monitor & Azure Firewall  (0) 2023.09.01
[Azure] Azure Devops  (0) 2023.09.01
Azure Storage  (0) 2023.08.18
[Azure] Azure Artifacts  (0) 2023.08.18
[Azure] AKS (Azure Kubernetes Service) - (3) ACR  (0) 2023.08.16

댓글