ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Udemy] Secrets
    kubernetes/udemy 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

     

Designed by Tistory.