kubernetes/udemy

[Udemy] Secrets

bbiyak2da 2025. 2. 18. 10:46

Secrets

 

DB password를 Secret을 활용하여 사용해보자

 

모든 파일은 kube-manifests/ 폴더 안에 넣어두어, 일괄적으로 생성한다.

 

Storage class 생성

 

# Storage-class.yaml 파일 생성

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

 

Persistent Volume Claim 생성

 

# Persistent-Volume-Claim.yaml 파일 생성

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

 

ConfigMap 생성

 

# UserManagement-ConfigMap.yaml 파일 생성

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

 

mysql Deployment 생성

 

# mysql-deployment.yaml 파일 생성

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
              valueFrom: 
                secretKeyRef:
                  name: mysql-db-password
                  key: db-password
          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

DB의 password를 

Kubernetes-Secrets.yaml 파일의 mysql-db-password 키값을 가져올거다.

 

mysql cluster ip 생성

 

# mysql-clusterip-service.yaml 파일 생성

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

 

UserMgmtWebApp Deployment 생성

 

# UserMgmtWebApp-Deployment.yaml 파일 생성

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
              valueFrom: 
                secretKeyRef:
                  name: mysql-db-password
                  key: db-password

 

DB의 password를 

Kubernetes-Secrets.yaml 파일의 mysql-db-password 키값을 가져올거다.

 

UserMgmtWebApp Service 생성

 

# UserMgmtWebApp-Service.yaml 파일 생성

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

 

 

Secrets 생성

 

# Kubernetes-Secrets.yaml 파일 생성

apiVersion: v1
kind: Secret
metadata:
  name: mysql-db-password
type: Opaque
data:
  db-password: ZGJwYXNzd29yZDEx

 

해당 패스워드는 base64로 변환하여 적용한다.

dbpassword11 > ZGJwYXNzd29yZDEx

 

변환 사이트 : https://www.base64encode.org

 

Base64 Encode and Decode - Online

Encode to Base64 format or decode from it with various advanced options. Our site has an easy to use online tool to convert your data.

www.base64encode.org

 

생성 및 확인

 

# 생성

# Create All Objects
kubectl apply -f kube-manifests/

 

# 확인

kubectl get svc     
---
NAME                      TYPE           CLUSTER-IP     EXTERNAL-IP     PORT(S)        AGE
kubernetes                ClusterIP      10.0.0.1       <none>          443/TCP        17h
mysql                     ClusterIP      None           <none>          3306/TCP       13m
usermgmt-webapp-service   LoadBalancer   10.0.196.178   4.230.158.250   80:30630/TCP   13m
kubectl get pods
---
NAME                               READY   STATUS        RESTARTS   AGE
mysql-5dd79b6f45-jpfj8             1/1     Running       0          55s
usermgmt-webapp-5b77897684-kqvhz   1/1     Running       0          55s
usermgmt-webapp-f47699955-tqt45    1/1     Terminating   0          13m

 

# External IP로 접근

 


[참고 영상]

Udemy - Azure Kubernetes Service with Azure DevOps and Terraform

섹션 8 : Kubernetes Storage

 

[참고 문서]

https://github.com/stacksimplify/azure-aks-kubernetes-masterclass/tree/master/07-Kubernetes-Secrets