kubernetes/udemy

[udemy] Ingress - ExternalDNS (2)

bbiyak2da 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