📌 개발이 완료되기 전까지 인프라 구축을 완료할 것이다.
📒 Frontend - Backend - DB : 3-tier (3계층) 구조
📒 Backend - Spring Boot, Frontend - html, css, js
# eksproject.yaml파일
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
metadata:
name: eksproject
region: ap-northeast-2
version: "1.24"
# AZ
availabilityZones: ["ap-northeast-2a", "ap-northeast-2b", "ap-northeast-2c"]
# IAM OIDC & Service Account
iam:
withOIDC: true
serviceAccounts:
- metadata: # ingress,LB를 위한 loadbalancer controller 애드온 추가
name: aws-load-balancer-controller
namespace: kube-system
wellKnownPolicies:
awsLoadBalancerController: true
- metadata: # 스토리지 클래스를 위한 애드온 추가
name: ebs-csi-controller-sa
namespace: kube-system
wellKnownPolicies:
ebsCSIController: true
- metadata: # HPA를 위한 Metrics-server 애드온 추가
name: cluster-autoscaler
namespace: kube-system
wellKnownPolicies:
autoScaler: true
# Managed Node Groups
managedNodeGroups:
# On-Demand Instance
- name: mynodes-t3
instanceType: t3.medium
minSize: 1
desiredCapacity: 2
maxSize: 3
privateNetworking: true # 워커노드를 프라이빗 네트워크에 감춘다.
#ssh:
#allow: true
#publicKeyPath: ./keypair/myeks.pub
availabilityZones: ["ap-northeast-2a", "ap-northeast-2b", "ap-northeast-2c"]
iam:
withAddonPolicies:
autoScaler: true
albIngress: true
cloudWatch: true
ebs: true
# Fargate Profiles
fargateProfiles:
- name: myfg
selectors:
- namespace: dev
labels:
env: dev
# CloudWatch Logging
cloudWatch:
clusterLogging:
enableTypes: ["*"] # 모든 로그를 클라우드워치에 남긴다
금일 인프라 구축 작업에서는 Frontend에는 nginx이미지를, Backend에는 이전 파이프라인 실습에서 빌드하였던 이미지를 임시적으로 사용해서 디플로이먼트를 생성하고, 서비스와 ingress를 생성하는 것을 목표로 한다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: front-deploy
spec:
replicas: 2
selector:
matchLabels:
tier: frontend
template:
metadata:
name: front-deploy
labels:
tier: frontend
spec:
containers:
- name: front-app
image: nginx:alpine # nginx 이미지
ports:
- containerPort: 80
protocol: TCP
apiVersion: v1
kind: Service
metadata:
name: front-svc
spec:
type: NodePort
ports:
- port: 80
targetPort: 80
nodePort: 31112
selector:
tier: frontend
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: front-ing
annotations: # AWS에서 ALB로 사용할수 있게 만든다
kubernetes.io/ingress.class: alb
alb.ingress.kubernetes.io/scheme: internet-facing
alb.ingress.kubernetes.io/target-type: instance
spec:
rules:
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: front-svc
port:
number: 80
apiVersion: apps/v1
kind: Deployment
metadata:
name: back-deploy
spec:
selector:
matchLabels:
tier: backend
replicas: 2
template:
metadata:
labels:
tier: backend
spec:
containers:
- name: back-app
image: suhwan11/hello-world:49 # 이전에 생성했던 이미지
ports:
- containerPort: 8080
protocol: TCP
apiVersion: v1
kind: Service
metadata:
name: back-svc
spec:
selector:
tier: backend
ports:
- port: 80
targetPort: 8080
nodePort: 31111
type: NodePort
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: back-ing
annotations: # AWS에서 ALB로 사용하기 위해 설정
kubernetes.io/ingress.class: alb
alb.ingress.kubernetes.io/scheme: internet-facing
alb.ingress.kubernetes.io/target-type: instance
spec:
rules:
- http:
paths:
- pathType: Prefix
path: /
backend:
service:
name: back-svc
port:
number: 80
EFS스토리지를 사용하기 위해서 EFS CSI 드라이버를 설치해야 한다.
kubectl apply -k "github.com/kubernetes-sigs/aws-efs-csi-driver/deploy/kubernetes/overlays/stable/?ref=release-2.4.0"
# EFS CSI 드라이버 설치
kubectl get pod -n kube-system -l "app.kubernetes.io/name=aws-efs-csi-driver,app.kubernetes.io/instance=aws-efs-csi-driver"
# 설치 확인
# 스토리지 클래스 생성
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: efs-sc
provisioner: efs.csi.aws.com
명일에는 스토리지 구축, HPA, Auto scailing Group, RDS연동 구축을 목표로 하고 있다.