[Udemy] AKS Storage - Azure Disks (2)
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