-
[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'kubernetes > udemy' 카테고리의 다른 글
[udemy] Azure Files (0) 2025.02.18 [Udemy] Secrets (0) 2025.02.18 [Udemy] AKS Storage - Azure Disks (0) 2025.02.14 [Udemy] Services Demo with Cluster IP and Load Balancer Services (Declarative) (0) 2025.02.14 [Udemy] Services Demo with Cluster IP and Load Balancer Services (Imperative) (0) 2025.02.13