[udemy] Ingress - ExternalDNS (2)
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
[참고 문서]