kubernetes/udemy

[Udemy] AKS Storage - Azure Disks (2)

bbiyak2da 2025. 2. 14. 16:07

AKS Storage (2)

 

이전 글과 이어집니다.

https://bbiyak-cloud.tistory.com/140

 

[Udemy] AKS Storage - Azure Disks

AKS Storage  Persistent Volume (PV)클러스터 내에서 사용할 수 있는 스토리지Persistent Volume Claim (PVC)정의: PVC는 사용자가 필요한 스토리지의 요구 사항을 정의하는 객체입니다. 사용자는 PVC를 

bbiyak-cloud.tistory.com

 

[목표 아키텍처]

Storage Class 생성

 

# storage-class.yml 파일 작성

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: managed-premium-retain-sc
provisioner: kubernetes.io/azure-disk
reclaimPolicy: Retain  # Default is Delete, recommended is retain
volumeBindingMode: WaitForFirstConsumer # Default is Immediate, recommended is WaitForFirstConsumer
allowVolumeExpansion: true  
parameters:
  storageaccounttype: Premium_LRS # or we can use Standard_LRS
  kind: Managed # Default is shared, recommended is Managed


# 생성

kubectl apply -f 01-storage-class.yml

 

 

PVC 생성

 

# persistent-volume-claim.yml 파일 작성

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: azure-managed-disk-pvc
spec:
  accessModes:
  - ReadWriteOnce
  storageClassName: managed-premium-retain-sc 
  resources:
    requests:
      storage: 5Gi      

# AKS already provisioned Storage classes managed-premium and default as part of 
# default cluster setup

 

# 생성

kubectl apply -f 02-persistent-volume-claim.yml

 

ConfigMap 생성

 

# UserManagement-Configmap.yml 파일 작성

apiVersion: v1
kind: ConfigMap
metadata:
  name: usermanagement-dbcreation-script
data: 
  mysql_usermgmt.sql: |-
    DROP DATABASE IF EXISTS webappdb;
    CREATE DATABASE webappdb;

 

# 생성

kubectl apply -f 03-UserManagement-ConfigMap.yml

 

Mysql Deployment 생성

 

# mysql-Deployment.yml 파일 작성

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
spec: 
  replicas: 1
  selector:
    matchLabels:
      app: mysql
  strategy:
    type: Recreate 
  template: 
    metadata: 
      labels: 
        app: mysql
    spec: 
      containers:
        - name: mysql
          image: mysql:5.6
          env:
            - name: MYSQL_ROOT_PASSWORD
              value: dbpassword11
          ports:
            - containerPort: 3306
              name: mysql    
          volumeMounts:
            - name: mysql-persistent-storage
              mountPath: /var/lib/mysql    
            - name: usermanagement-dbcreation-script
              mountPath: /docker-entrypoint-initdb.d #https://hub.docker.com/_/mysql Refer Initializing a fresh instance                                            
      volumes: 
        - name: mysql-persistent-storage
          persistentVolumeClaim:
            claimName: azure-managed-disk-pvc
        - name: usermanagement-dbcreation-script
          configMap:
            name: usermanagement-dbcreation-script

 

# 생성

kubectl apply -f 04-mysql-deployment.yml

 

Mysql ClusterIP 생성

 

# mysql-clusterip-service.yml 파일 작성

apiVersion: v1
kind: Service
metadata: 
  name: mysql
spec:
  selector:
    app: mysql 
  ports: 
    - port: 3306  
  clusterIP: None # This means we are going to use Pod IP

 

# 생성

kubectl apply -f 05-mysql-clusterip-service.yml

 

UserMgmtWebApp Deployment 생성

 

# UserMgmtWebApp-Deployment.yml 파일 작성

apiVersion: apps/v1
kind: Deployment 
metadata:
  name: usermgmt-webapp
  labels:
    app: usermgmt-webapp
spec:
  replicas: 1
  selector:
    matchLabels:
      app: usermgmt-webapp
  template:  
    metadata:
      labels: 
        app: usermgmt-webapp
    spec:
      initContainers:
        - name: init-db
          image: busybox:1.31
          command: ['sh', '-c', 'echo -e "Checking for the availability of MySQL Server deployment"; while ! nc -z mysql 3306; do sleep 1; printf "-"; done; echo -e "  >> MySQL DB Server has started";']      
      containers:
        - name: usermgmt-webapp
          image: stacksimplify/kube-usermgmt-webapp:1.0.0-MySQLDB
          imagePullPolicy: Always
          ports: 
            - containerPort: 8080           
          env:
            - name: DB_HOSTNAME
              value: "mysql"            
            - name: DB_PORT
              value: "3306"            
            - name: DB_NAME
              value: "webappdb"            
            - name: DB_USERNAME
              value: "root"            
            - name: DB_PASSWORD
              value: "dbpassword11"

 

* 부연 설명 (init container의 command)

MySQL 서버의 가용성을 확인하는 루프를 실행합니다.
MySQL 서버가 포트 3306에서 사용 가능한지 확인하고, 사용 가능하지 않으면 1초 동안 대기하며 하이픈(-)을 출력합니다. 사용 가능해지면 "MySQL DB Server has started"라는 메시지를 출력합니다.

 

 

# 생성

kubectl apply -f 06-UserMgmtWebApp-Deployment.yml

 

# 확인

kubectl get pods
---
NAME                               READY   STATUS    RESTARTS   AGE
mysql-6868c58fbd-4tm9t             1/1     Running   0          8m51s
usermgmt-webapp-76f6bfd6c5-qs95w   1/1     Running   0          8m51s
kubectl describe pod usermgmt-webapp-76f6bfd6c5-qs95w
---
...
Events:
  Type    Reason     Age    From               Message
  ----    ------     ----   ----               -------
  Normal  Scheduled  9m17s  default-scheduler  Successfully assigned default/usermgmt-webapp-76f6bfd6c5-qs95w to aks-agentpool-29221675-vmss000004
  Normal  Pulling    9m16s  kubelet            Pulling image "busybox:1.31"
  Normal  Pulled     9m11s  kubelet            Successfully pulled image "busybox:1.31" in 4.95s (4.95s including waiting). Image size: 764556 bytes.
  Normal  Created    9m11s  kubelet            Created container init-db
  Normal  Started    9m11s  kubelet            Started container init-db
  Normal  Pulling    8m39s  kubelet            Pulling image "stacksimplify/kube-usermgmt-webapp:1.0.0-MySQLDB"
  Normal  Pulled     8m29s  kubelet            Successfully pulled image "stacksimplify/kube-usermgmt-webapp:1.0.0-MySQLDB" in 10.015s (10.015s including waiting). Image size: 108318456 bytes.
  Normal  Created    8m29s  kubelet            Created container usermgmt-webapp
  Normal  Started    8m29s  kubelet            Started container usermgmt-webapp

 

init container(init-db)가 실행되어 command를 정상적으로 수행하면, 해당 init container는 자동으로 종료되고

진짜 컨테이너(usermgmt-webapp)이 실행된다. 

 

UserMgmtWebApp LoadBalancer 생성


# UserMgmtWebApp-Service.yml 파일 작성

apiVersion: v1
kind: Service
metadata:
  name: usermgmt-webapp-service
  labels: 
    app: usermgmt-webapp
spec: 
  type: LoadBalancer
  selector: 
    app: usermgmt-webapp
  ports: 
    - port: 80
      targetPort: 8080

 

# 생성

kubectl apply -f 07-UserMgmtWebApp-Service.yml

 

확인

 

# pv, pvc, sc 확인

kubectl get sc,pvc,pv
---
NAME                                                    PROVISIONER                RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
storageclass.storage.k8s.io/azurefile                   file.csi.azure.com         Delete          Immediate              true                   2d2h
storageclass.storage.k8s.io/azurefile-csi               file.csi.azure.com         Delete          Immediate              true                   2d2h
storageclass.storage.k8s.io/azurefile-csi-premium       file.csi.azure.com         Delete          Immediate              true                   2d2h
storageclass.storage.k8s.io/azurefile-premium           file.csi.azure.com         Delete          Immediate              true                   2d2h
storageclass.storage.k8s.io/default (default)           disk.csi.azure.com         Delete          WaitForFirstConsumer   true                   2d2h
storageclass.storage.k8s.io/managed                     disk.csi.azure.com         Delete          WaitForFirstConsumer   true                   2d2h
storageclass.storage.k8s.io/managed-csi                 disk.csi.azure.com         Delete          WaitForFirstConsumer   true                   2d2h
storageclass.storage.k8s.io/managed-csi-premium         disk.csi.azure.com         Delete          WaitForFirstConsumer   true                   2d2h
storageclass.storage.k8s.io/managed-premium             disk.csi.azure.com         Delete          WaitForFirstConsumer   true                   2d2h
storageclass.storage.k8s.io/managed-premium-retain-sc   kubernetes.io/azure-disk   Retain          WaitForFirstConsumer   true                   16m

NAME                                           STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS                VOLUMEATTRIBUTESCLASS   AGE
persistentvolumeclaim/azure-managed-disk-pvc   Bound    pvc-2507db73-be0a-414d-9dbc-59989d61b021   5Gi        RWO            managed-premium-retain-sc   <unset>                 16m

NAME                                                        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM           
                 STORAGECLASS                VOLUMEATTRIBUTESCLASS   REASON   AGE
persistentvolume/pvc-2507db73-be0a-414d-9dbc-59989d61b021   5Gi        RWO            Retain           Bound    default/azure-managed-disk-pvc   managed-premium-retain-sc   <unset>                          16m

 

# Service 확인

kubectl get svc      
---
NAME                      TYPE           CLUSTER-IP     EXTERNAL-IP      PORT(S)        AGE
kubernetes                ClusterIP      10.0.0.1       <none>           443/TCP        2d2h
mysql                     ClusterIP      None           <none>           3306/TCP       17m
usermgmt-webapp-service   LoadBalancer   10.0.128.135   20.249.172.156   80:32089/TCP   17m

 

usermgmt-webapp-service의 External IP로 접속해보자.

 

# 어플리케이션 접속

 

Username : admin101

Password : password101로 로그인하자

 

List Users를 클릭해보자

 

유저 목록이 잘 보인다.

새로운 사용자를 생성해보자

'Create User' 클릭

 

 

User 정보 입력하고 Add 후 Logout

 

admin102의 정보로 로그인해보자

 

 

User 목록에 잘 보이는 것을 확인 가능하다.

 

DB에서도 해당 User들이 잘 보이는지 확인해보자

 

# MySQL DB에서 확인

# Connect to MYSQL Database
kubectl run -it --rm --image=mysql:5.6 --restart=Never mysql-client -- mysql -h mysql -pdbpassword11
# Verify webappdb schema got created which we provided in ConfigMap
mysql> show schemas;
mysql> use webappdb;
mysql> show tables;
mysql> select * from user;
+--------+----------------------------+------------+-----------+--------------------------------------------------------------+--------+-----------+
| userid | email_address              | first_name | last_name | password                                                     | ssn    | user_name |
+--------+----------------------------+------------+-----------+--------------------------------------------------------------+--------+-----------+
|    101 | admin101@stacksimplify.com | Kalyan     | Reddy     | $2a$10$w.2Z0pQl9K5GOMVT.y2Jz.UW4Au7819nbzNh8nZIYhbnjCi6MG8Qu | ssn101 | admin101  |
|    102 | admin102@gmail.com         | fname102   | lname102  | $2a$10$fQ17Rz9bYuIKUuKS.kOVReahwXKuprkYOT9Ue0E9i2WIvtITuYO.e | ssn102 | admin102  |
+--------+----------------------------+------------+-----------+--------------------------------------------------------------+--------+-----------+
2 rows in set (0.00 sec)

 

DB에도 User들이 잘 보인다.

 

삭제

 

# 삭제

# Delete All
kubectl delete -f kube-manifests/
kubectl get pv
---
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS     CLAIM                            STORAGECLASS                VOLUMEATTRIBUTESCLASS   REASON   AGE
pvc-2507db73-be0a-414d-9dbc-59989d61b021   5Gi        RWO            Retain           Released   default/azure-managed-disk-pvc   managed-premium-retain-sc   <unset>
kubectl delete pv pvc-2507db73-be0a-414d-9dbc-59989d61b021
---
persistentvolume "pvc-2507db73-be0a-414d-9dbc-59989d61b021" deleted

 

pv는 별도로 삭제해준다.

 

 

Portal에 디스크도 남아있으니, 필요 없을 경우 정리해준다.

 


[참고 영상]

Udemy - Azure Kubernetes Service with Azure DevOps and Terraform

섹션 6 : AKS Storage - Azure Disks

50. Step-07: Use AKS provisioned Storage Class instead of Custom Storage Class

51. Step-08: Create User Management Web Application (UWB) k8s Deployment Manifest

52. Step-09: Create UWB k8s Service, Deploy, Test and CleanUp

 

 

[참고 문서]

https://github.com/stacksimplify/azure-aks-kubernetes-masterclass/tree/master/05-Azure-Disks-for-AKS-Storage/05-03-UserMgmt-WebApp-with-MySQLDB