EKS

EKS

์„ค์ •

aws ์„ค์ •

aws configure
aws cli๊ฐ€ ์—†๋‹ค๋ฉด ๋‹ค์šด๋กœ๋“œ
Access Key ID, Secret Access Key ์ž…๋ ฅ์—์„œ EKS ์„ค์ • KEY ๋„ฃ๊ธฐ
๋„ฃ๊ณ  ๋‚˜๋ฉด ~/.aws/credentials ํŒŒ์ผ์— ์œ„์˜ ๊ฐ’์ด ๋“ค์–ด๊ฐ„๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Œ.
ย 

EKS context ๋งŒ๋“ค๊ธฐ

aws eks --region ap-northeast-2 update-kubeconfig --name DATEPOP
๊ฒฐ๊ณผ โฌ‡
Added new context arn:aws:eks:ap-northeast-2:<APPID>:cluster/<CLUSTER_NAME> to /Users/<USERNAME>/.kube/config
ย 
service namespace ์กฐํšŒ
kubectl ๋ช…๋ น์–ด๊ฐ€ ์—†๋‹ค๋ฉด kubernetes ๋‹ค์šด๋กœ๋“œ
kubectl get services --all-namespaces
ย 
notion image
ย 

ย 

Kubernetes ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•๋“ค

ย 
/Users/<USERNAME>/.kube/config ์—ฌ๊ธฐ์— ํŒŒ์ผ์ด ์žˆ๋‹ค๋ฉด ์•„๋ž˜ ๋ฐฉ์‹์œผ๋กœ ํ•  ๋•Œ ์ž๋™์œผ๋กœ ์„ค์ • ํŒŒ์ผ ์ฝ์–ด์„œ ํด๋Ÿฌ์Šคํ„ฐ ์—ด๋ฆผ.
  • Kubernetes Dashboard
ย 
ย 
ย 

ย 

์ƒˆ๋กœ์šด ์ปจํ…Œ์ด๋„ˆ ์„ค์ • ์ž‘์„ฑํ•˜๊ธฐ

Deployment

  • ํ•„์ˆ˜) ๋ฐฐํฌ๋ฅผ ์œ„ํ•ด ๊ฐ€์žฅ ํ•„์š”ํ•œ ํŒŒ์ผ
  • ์ฃผ์˜* Secret.yaml ํŒŒ์ผ์— ์žˆ๋Š” ์‹œํฌ๋ฆฟ๊ฐ’๊ณผ ์—ฌ๊ธฐ env์— ์žˆ๋Š” ๋ณ€์ˆ˜๋ช…๊ณผ 1๋Œ€1 ๋Œ€์‘๋˜๊ฒŒ ๋ชจ๋‘ ๋„ฃ์–ด์ค˜์•ผํ•œ๋‹ค.
ย 
์•„๋ž˜์—์„œ <DEPLOYMENT_NAME>๊ณผ <NAMESPACE>๋ฅผ ์•Œ๋งž๊ฒŒ ๋„ฃ๋Š”๋‹ค. (์•„๋ž˜ ์„ค์ • yaml์—์„œ ๊ณ„์† ๋™์ผ)
ํŒŒ์ผ์—์„œ ์‹œํฌ๋ฆฟํ‚ค๋ฅผ ๊ฐ€์ ธ์™€ ๋„ฃ๋Š” ๊ฒฝ์šฐ๋Š” Volume ๋งˆ์šดํŠธ๋ฅผ ํ•ด์•ผํ•˜๊ณ  ๊ทธ๊ฒŒ ์•„๋‹ˆ๋ฉด ํ•„์š”๋Š” ์—†๋‹ค.
ํ•ด๋‹น ๋ณผ๋ฅจ๊ด€๋ จ๋œ ํ•„์š” ์—†์„ ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์€ ํšŒ์ƒ‰์œผ๋กœ ํ‘œ์‹œ.
apiVersion: apps/v1 kind: Deployment metadata: name: <DEPLOYMENT_NAME> namespace: <NAMESPACE> labels: app: <DEPLOYMENT_NAME> spec: replicas: 3 revisionHistoryLimit: 2 selector: matchLabels: app: <DEPLOYMENT_NAME> template: metadata: labels: app: <DEPLOYMENT_NAME> spec: volumes: - name: <VOLUME_NAME> secret: secretName: gcp defaultMode: 420 containers: - name: <DEPLOYMENT_NAME> image: ports: - name: inbound containerPort: 8000 protocol: TCP env: - name: DEBUG valueFrom: secretKeyRef: name: <DEPLOYMENT_NAME> key: DEBUG - name: GOOGLE_APPLICATION_CREDENTIALS value: <VOLUME_FOLDER_PATH>/<FILE_NAME> volumeMounts: - name: <VOLUME_NAME> readOnly: true mountPath: <VOLUME_FOLDER_PATH>
ย 
Deployment์—์„œ์˜ ๊ถŒ๊ณ ์‚ฌํ•ญ
  • readiness ์„ค์ •ํ•˜๊ธฐ (/ping ์„ค์ •)

Service

  • ํ•„์ˆ˜
  • Web ๊ธฐ๋ฐ˜์˜ ๊ฒฝ์šฐ ๋Œ€๋ถ€๋ถ„ TCP์— port์™€ targetPort๋ฅผ ์„ค์ •ํ•˜๋ฉด ๋
  • ์›น์ด๋ฉด ๋Œ€๋ถ€๋ถ„ port 80์ด๋‹ˆ ๋„์ปค์—์„œ ์„ค์ •ํ•œ ๋‚ด๋ถ€ ํฌํŠธ๋ฒˆํ˜ธ๋งŒ targetPort์— ๋„ฃ์œผ๋ฉด ๋œ๋‹ค.
apiVersion: v1 kind: Service metadata: name: <DEPLOYMENT_NAME> namespace: <NAMESPACE> spec: ports: - protocol: TCP name: inbound port: 80 targetPort: 8000 selector: app: <DEPLOYMENT_NAME>
ย 

Secret

  • ํ•„์ˆ˜ ์•„๋‹˜. ํ™˜๊ฒฝ ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋งŒ ํ•„์š”ํ•จ.
  • Deployment.yaml env ์‹œํฌ๋ฆฟ๊ณผ ์—ฌ๊ธฐ data ์•„๋ž˜ ์‹œํฌ๋ฆฟ์„ ๋™์ผํ•˜๊ฒŒ
apiVersion: v1 kind: Secret type: Opaque metadata: name: <DEPLOYMENT_NAME> namespace: <NAMESPACE> data: DEBUG: SECRET_VALUE SECRET_KEY: SECRET_VALUE
ย 
ย 

์ƒˆ ์ปจํ…Œ์ด๋„ˆ ๋„์šฐ๊ธฐ

๊ธฐ๋ณธ ๋ช…๋ น์–ด

kubectl apply -f <YAML_FILE>
ย 

์ ์šฉ ์ˆœ์„œ

์ˆœ์„œ๋Š” ํฌ๊ฒŒ ์ƒ๊ด€์—†์ง€๋งŒ ๋ฐฐํฌํ•˜์ž๋งˆ์ž ๋ฐ”๋กœ ๋ณด๊ณ  ์‹ถ๋‹ค๋ฉด
Secret โ†’ Service โ†’ Deployment
or
Service โ†’ Secret โ†’ Deployment ๋กœ ํ•˜๋ฉด ๋œ๋‹ค.
ย 
๊ทธ๋Ÿผ Deployment๊ฐ€ ๋œจ๋Š” ์‹œ์ ์— ํ•„์š”ํ•œ Secret์ด ์ ์šฉ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ”๋กœ ๋œฌ๋‹ค.
ย 
Deployment๊นŒ์ง€ ์ ์šฉํ–ˆ๋‹ค๋ฉด Pod์— ๋“ค์–ด๊ฐ€์„œ ์ •์ƒ์ ์œผ๋กœ ์—ด๋ ธ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.
ย 
Deployment ์ ์šฉํ•  ๋•Œ image ๊ฐ’์— ์ด๋ฏธ์ง€ ์ฃผ์†Œ๋ฅผ ๊ผญ ๋„ฃ์–ด์ค˜์•ผํ•œ๋‹ค!
ย 
+) Lens์—์„œ ํŽธ์ง‘ํ•˜๊ณ  ์ €์žฅํ•˜๋ฉด ๊ทธ ์ˆœ๊ฐ„๋„ kubectl apply -f ๊ฐ€ ๋˜๋Š”๊ฒƒ์ด๋‹ค.
ย 

ย 

Ingress ์„ค์ •

ย 
์œ„์™€ ๊ฐ™์ดํ•˜๋”๋ผ๋„ Pod๋งŒ ์ •์ƒ์ ์œผ๋กœ ๋œฌ๊ฑฐ๊ณ  ์‹ค์ œ๋กœ URL์„ ํ†ตํ•ด ์ ‘๊ทผ ํ•  ์ˆ˜๋Š” ์—†๋‹ค.
ย 
์ด ์„ค์ •์„ 3rd party traefik ingress๋ฅผ ํ†ตํ•ด ์ง„ํ–‰ํ–ˆ๋Š”๋ฐ ์•„๋ž˜์™€ ๊ฐ™์ด yaml ๋งŒ๋“ค๊ณ  ์ ์šฉํ•˜๋ฉด ๋œ๋‹ค.
ย 
apiVersion: traefik.containo.us/v1alpha1 kind: IngressRoute metadata: name: <TRAEFIK_NAME> namespace: <TRAEFIK_NAMESPACE> spec: entryPoints: - web routes: - match: Host(`api.datepop.co.kr`) && PathPrefix(`/api/v1/test`) kind: Rule services: - namespace: <NAMESPACE> name: <DEPLOYMENT_NAME> port: 80
์—ฌ๊ธฐ์„œ ์ฃผ์˜ํ• ์ ์€
  1. metadata์— ์žˆ๋Š” name๊ณผ namespace๋Š” traefik์ธ๊ฒƒ. ์ด๋ฏธ์ง€ ๋ฐฐํฌํ•œ ๊ทธ name๊ณผ namespace์™€๋Š” ๋‹ค๋ฅด๋‹ค! ๊ทธ๋ž˜์„œ ๋ณ€์ˆ˜๋ช…๋„ ํŒŒ์ผ๋‚ด์—์„œ ๋‹ค๋ฅด๊ฒŒ ํ‘œ์‹œ.
  1. ๊ฐ™์€ TRAEFIK_NAME์œผ๋กœ kubectl apply -f ๋ฅผ ํ•˜๋ฉด ๊ธฐ์กด routes ์ž‘์„ฑํ•œ๊ฑด ์ƒˆ๋กœ์šด routes๋กœ ๋ฎ์–ด์“ฐ๊ธฐ๊ฐ€ ๋œ๋‹ค.
    1. ์ด๋Ÿฐ ์‹ค์ˆ˜ํ•˜๋Š” ์ผ€์ด์Šค
      1. ๊ธฐ์กด ๋‚ด์šฉ์„ ๋ณต๋ถ™ํ•˜๊ณ  name์„ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ  ๋‹ค๋ฅธ routing rules ๋ฐฐํฌ (๋ณธ์ธ ๊ฒฝํ—˜)
ย 
traefik์—์„œ ์„ค์ •ํ•˜๋Š”๊ฒƒ์€ Host์™€ PathPrefix๋ฅผ ํ†ตํ•ด ์–ด๋–ค ๋„๋ฉ”์ธ์— ์–ด๋–ค path์ผ๋•Œ ์–ด๋–ค namespace์˜ name์œผ๋กœ ์ด๋™ํ•˜๋Š”์ง€๋ฅผ ์„ค์ • ํ•  ์ˆ˜ ์žˆ๋‹ค.
*.datepop.co.kr์œผ๋กœ ๋‹ค ๊ฐ€๋Šฅํ•œ ์ด์œ ๋Š” AWS Route53์—์„œ ์„ค์ •ํ–ˆ๊ธฐ ๋•Œ๋ฌธ
ย 

Ingress๋ฅผ ์„ค์ •ํ•˜๋Š” ์ผ€์ด์Šค

  1. ์ƒˆ๋กœ์šด ์„œ๋น„์Šค ์ถœ์‹œ
    1. ์˜ˆ๋ฅผ๋“ค์–ด ๋ธ”๋กœ๊ทธ ์‚ฌ์ดํŠธ๋ฅผ ๋ฐฐํฌํ•œ๋‹ค๋ฉด blog.datepop.co.kr์— ์˜ฌ๋ฆฌ๊ณ  ์‹ถ์„ ๊ฒƒ
    2. ๊ทธ๋Ÿผ ingress์— Host๋ฅผ blog.datepop.co.kr์„ ๋„ฃ๊ณ  namespace, name์„ ์ž˜ ๊ฐ€๋ฅดํ‚ค๊ฒŒ ์„ค์ •ํ•˜๋ฉด ๋
  1. ๊ธฐ์กด ์„œ๋น„์Šค ๋ฎ์–ด์“ฐ๊ธฐ
    1. A๋ผ๋Š” Deployment์™€ B๋ผ๋Š” Deployment๊ฐ€ ์žˆ๋Š”๋ฐ A๋Š” ๊ธฐ์กด ์„œ๋น„์Šค๊ณ  B๋Š” ์ƒˆ๋กœ์šด ๊ฒƒ
    2. ๋™์ผํ•œ API์ด์ง€๋งŒ ๋” ๊ฐœ์„ ํ•ด์„œ B๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค๋ฉด API spec์€ ๋™์ผํ•˜๋‹ˆ B๋กœ ๋ณ€๊ฒฝํ•ด๋„ ๋œ๋‹ค.
    3. ๊ทธ๋Ÿฐ ๊ฒฝ์šฐ ๋™์ผํ•œ route์— name, namespace๋งŒ A โ†’ B๋กœ ์ˆ˜์ •ํ•˜๋ฉด ๋œ๋‹ค.
    4. ย 
ย 

์ฝ”๋“œ์—์„œ Kubernetes๋กœ ๋ฐฐํฌ

1๋‹จ๊ณ„. ๋„์ปค ๋นŒ๋“œ

๋„์ปค ํŒŒ์ผ ๋งŒ๋“ค๊ณ  ๋นŒ๋“œํ•˜๋Š” ์ƒ์„ธํ•œ ๊ณผ์ •์€ ์—ฌ๊ธฐ์„œ ์ƒ๋žต.
docker build -t <name> .
ย 

2๋‹จ๊ณ„. ๋„์ปค ์—…๋กœ๋“œ

์œ„์— ๋นŒ๋“œํ•œ ์ด๋ฆ„์œผ๋กœ AWS ECR์— ์—…๋กœ๋“œ๋ฅผ ํ•ด์•ผํ•œ๋‹ค.
ย 
์—ฌ๊ธฐ์„œ ์ฃผ์˜ํ• ์ ์€ AWS ECR์— ๋“ค์–ด๊ฐ€์„œ ๋ฏธ๋ฆฌ private์œผ๋กœ ๋นŒ๋“œํ•œ ์ด๋ฆ„์— ๋Œ€ํ•œ ๋ ˆํฌ์ง€ํ† ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•ด์•ผํ•œ๋‹ค. (๊ทธ๋ƒฅ ์—…๋กœ๋“œ ์‹œ๋„ํ•˜๋ฉด ์ƒˆ๋กœ์šด๊ฒƒ์ด๋ฉด ์ž๋™์œผ๋กœ ์•Œ์•„์„œ ๋ฐ˜์˜๋ ์ง€ ์•Œ์•˜์œผ๋‚˜ ๋น„์–ด์žˆ๋Š” ๊ฒƒ์„ ๋ฏธ๋ฆฌ ์ƒ์„ฑํ•ด๋†”์•ผํ•œ๋‹ค)
ย 
์—…๋กœ๋“œํ•˜๊ธฐ์ „์— ECR์— ๋กœ๊ทธ์ธ์ด ๋˜์–ด ์žˆ์–ด์•ผํ•œ๋‹ค. ์•„๋ž˜์—์„œ AWS_DEFAULT_REGION ์ด๊ฒƒ๋งŒ ๋ฐ”๊ฟ”์ฃผ๋ฉด ๋œ๋‹ค.
aws ecr get-login-password | docker login --username AWS --password-stdin "$(aws sts get-caller-identity --query Account --output text).dkr.ecr.<AWS_DEFAULT_REGION>.amazonaws.com"
ย 
๋นŒ๋“œํ•œ ๋„์ปค์— ํƒœ๊ทธ ๋ถ™์ด๊ธฐ
docker tag <IMAGE_NAME>:<VERSION> <AWS_ACCOUNT_ID>.dkr.ecr.<AWS_DEFAULT_REGION>.amazonaws.com/<IMAGE_NAME>
ย 
๋งˆ์ง€๋ง‰์œผ๋กœ ์˜ฌ๋ฆฌ๊ธฐ
docker push <AWS_ACCOUNT_ID>.dkr.ecr.<AWS_DEFAULT_REGION>.amazonaws.com/<IMAGE_NAME>
ย 

3๋‹จ๊ณ„. ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์ ์šฉ

2๋‹จ๊ณ„์—์„œ ECR์— ์˜ฌ๋ฆฌ๋ฉด ECR์— ๊ทธ ์ด๋ฏธ์ง€์— ๋Œ€ํ•œ ์ฃผ์†Œ๊ฐ€ ์ƒ๊ธด๋‹ค.
ย 
๊ทธ ์ฃผ์†Œ๋ฅผ Deployment YAMLํŒŒ์ผ ๋‚ด image์— ๊ฐ’์œผ๋กœ ๋„ฃ๊ณ  ์ €์žฅํ•˜๋ฉด ๋œ๋‹ค.
ย 

ย 
์œ„ ๊ณผ์ •์˜ ์ž๋™ํ™”๋Š” 1, 2, 3๋‹จ๊ณ„๋ฅผ CI/CD ํˆด์„ ํ†ตํ•ด ๊ตฌํ˜„ํ•ด์„œ ์ง„ํ–‰ํ•˜๋ฉด ๋œ๋‹ค.
ย