ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Udemy] AKS Storage - Azure Disks (2)
    kubernetes/udemy 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
Designed by Tistory.