ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [udemy] Ingress - ExternalDNS (2)
    kubernetes/udemy 2025. 2. 22. 18:50

    ExternalDNS (2)

     

    하기 링크를 참고하여 관리 ID 생성, Secret 생성, ExternalDNS까지 생성하고 진행

    이번 게시글에서는 다중 경로 배포 후, DNS 영역 확인

    https://bbiyak-cloud.tistory.com/145

     

    [udemy] ExternalDNS

    ExternalDNS Kubernetes 클러스터에 ExternalDNS를 배포하면, Azure DNS와 통합하여 DNS 레코드를 자동으로 관리할 수 있습니다. 주요 기능자동 DNS 레코드 관리: Kubernetes 리소스(예: 서비스, 인

    bbiyak-cloud.tistory.com

     

    애플리케이션 생성 (Nginx-app1)

     

    # nginxApp1-Deployment.yaml 파일 작성

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: app1-nginx-deployment
      labels:
        app: app1-nginx
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: app1-nginx
      template:
        metadata:
          labels:
            app: app1-nginx
        spec:
          containers:
            - name: app1-nginx
              image: stacksimplify/kube-nginxapp1:1.0.0
              ports:
                - containerPort: 80

     

    # 생성

    kubectl apply -f nginxApp1-Deployment.yaml

     

    # nginxApp1-ClusterIP-Service.yaml 파일 작성

    apiVersion: v1
    kind: Service
    metadata:
      name: app1-nginx-clusterip-service
      labels:
        app: app1-nginx
    spec:
      type: ClusterIP
      selector:
        app: app1-nginx
      ports:
        - port: 80
          targetPort: 80

     

    # 생성

    kubectl apply -f nginxApp1-ClusterIP-Service.yaml

     

    app1-nginx에 대한 Deployment, Service를 생성하였다.

     

    애플리케이션 생성 (Nginx-app2)

     

    # nginxApp2-Deployment.yaml 파일 작성

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: app2-nginx-deployment
      labels:
        app: app2-nginx 
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: app2-nginx
      template:
        metadata:
          labels:
            app: app2-nginx
        spec:
          containers:
            - name: app2-nginx
              image: stacksimplify/kube-nginxapp2:1.0.0
              ports:
                - containerPort: 80

     

    # 생성

    kubectl apply -f nginxApp2-Deployment.yaml

     

    # nginxApp2-ClusterIP-Service.yaml 파일 작성

    apiVersion: v1
    kind: Service
    metadata:
      name: app2-nginx-clusterip-service
      labels:
        app: app2-nginx
      annotations:
    spec:
      type: ClusterIP
      selector:
        app: app2-nginx
      ports:
        - port: 80
          targetPort: 80

     

    # 생성

    kubectl apply -f nginxApp2-ClusterIP-Service.yaml

     

    app2-nginx에 대한 Deployment, Service를 생성하였다.

     

    애플리케이션 생성 (Nginx-app2)

     

    어휴 귀찮아,,

    그냥 kube-manifests/ 폴더 안에 다 생성해두고 한꺼번에 배포합시다..

     

    # 01-persistent-volume-claim.yaml 파일 작성

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: azure-managed-disk-pvc
    spec:
      accessModes:
      - ReadWriteOnce
      storageClassName: managed-premium 
      resources:
        requests:
          storage: 5Gi      
    
    # AKS already provisioned Storage classes managed-premium and default as part of 
    # default cluster setup

     

    # 02-UserManagement-ConfigMap.yaml 파일 작성

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

     

    # 03-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

     

    # 04-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

     

    # 05-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

     

    # 06-UserMgmtWebApp-Service.yaml 파일 작성

    apiVersion: v1
    kind: Service
    metadata:
      name: usermgmt-webapp-clusterip-service
      labels: 
        app: usermgmt-webapp
    spec:
      type: ClusterIP
      selector:
        app: usermgmt-webapp
      ports: 
        - port: 80
          targetPort: 8080

     

    # 07-Kubernetes-Secrets.yaml 파일 작성

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

     

    # 생성

    kubectl apply -f kube-manifests/

    Ingress 생성

     

    이것도 Ingress Controller가 이미 생성되어 있어야겠죠 ?

     

    # 01-Ingress-DomainName-Based-Routing-app1-2-3.yaml 파일 작성

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: ingress-app1-app2-app3
      #annotations:
        #kubernetes.io/ingress.class: "nginx"
    spec:
      ingressClassName: nginx
      rules:
        - host: eapp1.bbiyak.shop
          http:
            paths:
              - path: /
                pathType: Prefix
                backend:
                  service:
                    name: app1-nginx-clusterip-service
                    port: 
                      number: 80
        - host: eapp2.bbiyak.shop
          http:
            paths:
              - path: /
                pathType: Prefix
                backend:
                  service:
                    name: app2-nginx-clusterip-service
                    port: 
                      number: 80
        - host: eapp3.bbiyak.shop
          http:
            paths:
              - path: /
                pathType: Prefix
                backend:
                  service:
                    name: usermgmt-webapp-clusterip-service
                    port: 
                      number: 80

     

    # 생성

    kubectl apply -f 01-Ingress-DomainName-Based-Routing-app1-2-3.yaml

     

    확인

     

    # 웹 사이트 접근

    eapp1.bbiyak.shop

    eapp2.bbiyak.shop

    eapp3.bbiyak.shop

     

    잘 접근 되는 것을 확인

     

    # Azure DNS Zone 조회

    ExternalDNS에 의해, 리소스 배포 시 자동으로 레코드 집합이 반영되는 것을 확인

     


    [참고 영상]

    Udemy - Azure Kubernetes Service with Azure DevOps and Terraform

    섹션 14 : Domain Name based Routing

     

    [참고 문서]

    https://github.com/stacksimplify/azure-aks-kubernetes-masterclass/tree/master/13-Ingress-ExternalDNS-Domain-Name-Based-Routing

    'kubernetes > udemy' 카테고리의 다른 글

    [udemy] Namespace  (0) 2025.02.23
    [udemy] Ingress - SSL with Let's Encrypt  (0) 2025.02.23
    [udemy] Ingress - ExternalDNS  (0) 2025.02.22
    [udemy] Ingress  (0) 2025.02.18
    [udemy] Azure Files  (0) 2025.02.18
Designed by Tistory.