Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Kubernetes

  • ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” docker-compose์™€ ๋น„์Šทํ•œ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค(์„œ๋ฒ„์˜ ์ž๋™์žฌ์‹คํ–‰, ์›๊ฒฉ ํ•ธ๋“ค๋ง, etc.). ์ฐจ์ด์ ์€ docker-compose๋Š” single host ํ™˜๊ฒฝ์—์„œ ์ˆ˜ํ–‰๋˜๋ฉฐ, ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” multi-host ํ™˜๊ฒฝ์—์„œ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.

a

1. Components

  • Cluster : Controll Plane๊ณผ 1๊ฐœ ์ด์ƒ์˜ Worker Node ์˜ ์ง‘ํ•ฉ์ž…๋‹ˆ๋‹ค.
    • Controll Plane : Master Node ๋กœ๋„ ๋ถˆ๋ฆฝ๋‹ˆ๋‹ค. ์ด ๋…ธ๋“œ๋Š” Worker Node ๋“ค๊ณผ Pod ๋“ค์„ ๊ด€๋ฆฌํ•˜๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
      • API server : ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋ฅผ RESTAPI๋ฅผ ํ†ตํ•ด ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ค์–ด์ฃผ๋Š” ์„œ๋ฒ„์ž…๋‹ˆ๋‹ค.
      • Scheduler : Worker Node ๋‚ด๋ถ€ Pod๋“ค์˜ ์Šค์ผ€์ฅด๋ง์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค.
      • Controll Manager : ์‹ค์งˆ์ ์œผ๋กœ Worker Node, Pod๋ฅผ ๊ด€๋ฆฌํ•˜๋ฉฐ ํ˜„์žฌ ์ƒํƒœ๋ฅผ ์ฒดํฌํ•ฉ๋‹ˆ๋‹ค.
      • etcd(key-value store) : ์—ฌ๋Ÿฌ๊ฐ€์ง€ configuration ํŒŒ์ผ๋“ค์ด ์ €์žฅ๋˜์–ด์žˆ๋Š” ๊ณณ์ž…๋‹ˆ๋‹ค.
    • Worker Node : ์„œ๋น„์Šค๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” Pod๊ฐ€ ์‹คํ–‰๋˜๋Š” ๋…ธ๋“œ์ž…๋‹ˆ๋‹ค.
      • kubelet : Master Node ์™€ Worker Node ์‚ฌ์ด ๋งค๊ฐœ์ฒด์ด๋ฉฐ, ํŒŒ๋“œ ๋ณ„ ํ—ฌ์Šค์ฒดํฌ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
      • kube-proxy : IP ๋ณ€ํ™˜๊ณผ ๋ผ์šฐํŒ…์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ load-balancing์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
      • Container runtime : Container Registry๋กœ๋ถ€ํ„ฐ ๋„์ปค ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ , ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹œ์ž‘/์ข…๋ฃŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

        Container Registry : Docker Hub, Amazon Elastic Container Registry(ECR), Google Container Registry(GCR)

2. Types of yaml used in Kubernetes

์‹ค์งˆ์ ์œผ๋กœ ์„œ๋ฒ„๋“ค์€ Pod๋ผ๋Š” ๋‹จ์œ„๋กœ ์„œ๋น„์Šค๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ Pod๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‹ค์–‘ํ•œ ํƒ€์ž…์˜ configuration ํŒŒ์ผ๋“ค์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํŒŒ์ผ ํ˜•์‹์€ ์ฃผ๋กœ yaml์ด๋ผ๋Š” ํ˜•์‹์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋Š”๋ฐ์š”. Deployment, Service, Ingress, ClusterIssuer, ๋“ฑ์˜ ํƒ€์ž…์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ๋ถ€ํ„ฐ ๊ฐ๊ฐ์˜ yamlํŒŒ์ผ๋“ค์„ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

2-1. Deployment

Deployment๋Š” Pod์— ์‚ฌ์šฉ๋˜๋Š” ๋„์ปค ์ด๋ฏธ์ง€๋ฅผ ๋ถˆ๋Ÿฌ์™€์„œ, ๋ช‡๊ฐœ์˜ ๋™์ผํ•œ Pod๋ฅผ ์ƒ์„ฑํ•  ๊ฒƒ์ธ์ง€ ์„ค์ •ํ•˜๋Š” ํŒŒ์ผ์ž…๋‹ˆ๋‹ค. ์•„๋ž˜๋Š” ๋ฑ…ํ‚น ์„œ๋ฒ„์— ์‚ฌ์šฉํ•œ deployment.yaml ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: golang-backend-api-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: golang-backend-api
  template:
    metadata:
      labels:
        app: golang-backend-api
    spec:
      containers:
      - name: golang-backend-api
        image: ghkdqhrbals/simplebank:latest
        imagePullPolicy: Always
        ports:
          - containerPort: 8080
        env:
          - name: DB_SOURCE
            value: postgresql://root:secret@postgres:5432/simple_bank?sslmode=disable
  • apiVersion : ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ๋“ค์˜ ๋ฒ„์ „์ž…๋‹ˆ๋‹ค. ์ •๋ง ๋‹ค์–‘ํ•œ ๋ฒ„์ „์ด ์กด์žฌํ•˜๊ณ  ๊ฐ๊ฐ์˜ ๋ฒ„์ „์€ ์ง€์›ํ•˜๋Š” ๋ฐ”๊ฐ€ ์ „๋ถ€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ ๋ฒ„์ „๋“ค๊ณผ ๊ฐ๊ฐ์˜ ๋‚ด์šฉ์€ https://matthewpalmer.net/kubernetes-app-developer/articles/kubernetes-apiversion-definition-guide.html์—์„œ ํ™•์ธ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • kind : ํƒ€์ž…์ž…๋‹ˆ๋‹ค. ์ฃผ๋กœ ์šฐ๋ฆฌ๋Š” Service, PersistanceVolume, PersistanceVolumeClaim, Deployment, Ingress ๋“ฑ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • metadata : ์—ฌ๋Ÿฌ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋“ค์„ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ผ๋ฒจ์„ ๋ถ™์ด๊ณ  ์ €์žฅํ•˜๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
metadata ํ•„๋“œ์— ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ๋Š” ์ฃผ์š” ์†์„ฑ๋“ค
  1. name (ํ•„์ˆ˜):
  • ๋ฆฌ์†Œ์Šค์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฆ„์€ ๋ฆฌ์†Œ์Šค์˜ ๊ณ ์œ  ์‹๋ณ„์ž์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์˜ˆ: name: my-pod
  1. namespace:
  • ๋ฆฌ์†Œ์Šค๊ฐ€ ์†ํ•˜๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค(namespace)๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ๊ธฐ๋ณธ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์ธ โ€œdefaultโ€๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ์˜ˆ: namespace: my-namespace
  1. labels:
  • ๋ฆฌ์†Œ์Šค์— ๋ถ€์—ฌํ•  ๋ผ๋ฒจ(Label)์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๋ผ๋ฒจ์€ ๋ฆฌ์†Œ์Šค๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ์˜ˆ:
    labels:
      app: my-app
      environment: production
    
  1. annotations:
  • ๋ฆฌ์†Œ์Šค์— ์ถ”๊ฐ€ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜(Annotation)์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์–ด๋…ธํ…Œ์ด์…˜์€ ๋ผ๋ฒจ๊ณผ ์œ ์‚ฌํ•˜์ง€๋งŒ ๋” ์ž์„ธํ•œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ์˜ˆ:
    annotations:
      description: This is my application.
      owner: John Doe
    
  1. resourceVersion:
  • ๋ฆฌ์†Œ์Šค์˜ ๋ฒ„์ „ ์ •๋ณด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ’์ž…๋‹ˆ๋‹ค. ์ฃผ๋กœ ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด์—์„œ ๋ฆฌ์†Œ์Šค์˜ ๋ณ€๊ฒฝ์„ ์ถ”์ ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  1. generateName:
  • ์ด๋ฆ„์„ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์ ‘๋‘์‚ฌ(prefix)์ž…๋‹ˆ๋‹ค. ์ฃผ๋กœ ๋ฆฌ์†Œ์Šค๋ฅผ ๋™์ ์œผ๋กœ ์ƒ์„ฑํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  1. finalizers:
  • ๋ฆฌ์†Œ์Šค๊ฐ€ ์‚ญ์ œ๋  ๋•Œ ์‹คํ–‰๋˜์–ด์•ผ ํ•˜๋Š” ์ข…๋ฃŒ ์ฒ˜๋ฆฌ(finalization) ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  1. clusterName:
  • ๋ฆฌ์†Œ์Šค๊ฐ€ ์†ํ•œ ํด๋Ÿฌ์Šคํ„ฐ์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  1. selfLink:
  • ๋ฆฌ์†Œ์Šค์˜ ์ž์ฒด ๋งํฌ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  1. uid:
  • ๋ฆฌ์†Œ์Šค์˜ ๊ณ ์œ  ์‹๋ณ„์ž์ธ UID๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  1. ownerReferences:
  • ๋‹ค๋ฅธ ๋ฆฌ์†Œ์Šค๊ฐ€ ํ•ด๋‹น ๋ฆฌ์†Œ์Šค๋ฅผ ์†Œ์œ ํ•˜๋Š” ๊ฒฝ์šฐ ์—ฐ๊ด€๋œ ๋ฆฌ์†Œ์Šค ์ •๋ณด๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  1. creationTimestamp:
  • ๋ฆฌ์†Œ์Šค๊ฐ€ ์ƒ์„ฑ๋œ ์‹œ๊ฐ„์„ ๋‚˜ํƒ€๋‚ด๋Š” ํƒ€์ž„์Šคํƒฌํ”„๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
  1. deletionTimestamp:
  • ๋ฆฌ์†Œ์Šค๊ฐ€ ์‚ญ์ œ๋  ์˜ˆ์ •์ธ ๊ฒฝ์šฐ, ์‚ญ์ œ ์˜ˆ์ •์ธ ์‹œ๊ฐ„์„ ๋‚˜ํƒ€๋‚ด๋Š” ํƒ€์ž„์Šคํƒฌํ”„๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
  1. deletionGracePeriodSeconds:
  • ๋ฆฌ์†Œ์Šค๊ฐ€ ์‚ญ์ œ๋  ๋•Œ Graceful Delete๋ฅผ ์œ„ํ•œ ๋Œ€๊ธฐ ์‹œ๊ฐ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  1. initializers:
  • ์ดˆ๊ธฐํ™”๋ฅผ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•œ ์„ค์ • ์ •๋ณด๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
  1. managedFields:
  • ๋ฆฌ์†Œ์Šค์˜ ๊ด€๋ฆฌ ํ•„๋“œ ์ •๋ณด๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
  1. ownerReference:
  • ๋‹ค๋ฅธ ๋ฆฌ์†Œ์Šค๊ฐ€ ํ•ด๋‹น ๋ฆฌ์†Œ์Šค๋ฅผ ์†Œ์œ ํ•˜๋Š” ๊ฒฝ์šฐ์— ๋Œ€ํ•œ ์—ฐ๊ฒฐ ์ •๋ณด๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

์œ„์—์„œ ์„ค๋ช…ํ•œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์†์„ฑ ์ค‘ ์ผ๋ถ€๋Š” ํ•„์ˆ˜์ด๋ฉฐ, ๋‹ค๋ฅธ ์ผ๋ถ€๋Š” ์„ ํƒ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. ๋ฆฌ์†Œ์Šค์˜ ์œ ํ˜• ๋ฐ ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋”ฐ๋ผ ์–ด๋–ค ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์„ค์ •ํ• ์ง€๋ฅผ ๊ฒฐ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • spec : ์‹ค์ œ๋กœ ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ํ•„์š”ํ•œ ์ •๋ณด๋“ค์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.
    • replicas : pod์˜ ๊ฐœ์ˆ˜๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    • selector : ๋ณต์ œ๋ณธ์„ ์ƒ์„ฑํ•  ํ…œํ”Œ๋ฆฟ ์ด๋ฆ„์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. Service์˜ metadata.label ๊ณผ ๋™์ผํ•œ ๊ฐ’์„ ๊ฐ€์ ธ์•ผํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์ผ Service ์˜ metadata.label.{key:value} ๊ฐ€ app: golang-backend-api ๋ผ๋ฉด, ์—ฌ๊ธฐ์„œ๋„ app: golang-backend-api ๋ฅผ ๊ฐ€์ ธ์•ผํ•ฉ๋‹ˆ๋‹ค.
    • template.metadata : ์ด deployment ๋กœ ์ธํ•ด ๋ณต์ œ๋˜๋Š” ์—ฌ๋Ÿฌ ํŒŒ๋“œ๋“ค์—๊ฒŒ ๊ณตํ†ต์œผ๋กœ ์ ์šฉํ•  ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • template.spec : ๊ฐ ํ…œํ”Œ๋ฆฟ์— ์–ด๋–ค ๋„์ปค ์ด๋ฏธ์ง€๊ฐ€ ์‚ฌ์šฉ๋  ๊ฒƒ์ธ์ง€, ํฌํŠธ ๋ฐ ๊ธฐํƒ€ ์„ค์ •์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค(Docker์„ค์ •๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค).
      1. Docker Hub ์—์„œ ghkdqhrbals/simplebank:latest ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
      2. golang-backend-api๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
      3. 8080 ํฌํŠธ๋ฅผ ๋„คํŠธ์›Œํฌ ๋‚ด๋ถ€์— ๋…ธ์ถœ์‹œํ‚ต๋‹ˆ๋‹ค.

2-2. Service

์•ž์„œ ์šฐ๋ฆฌ๋Š” deployment.yaml๋ฅผ ํ†ตํ•ด Pod๋ฅผ 2๊ฐœ ์ƒ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. Service ํƒ€์ž…์€ ์ด Pod๋“ค์— ํ†ตํ•ฉ entryํฌ์ธํŠธ๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ, ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์™ธ๋ถ€์—์„œ ์ ‘์†ํ•  ์ง€ ๋„คํŠธ์›Œํฌ๋ฅผ ์„ค์ •ํ•˜๋Š” ํƒ€์ž…์ž…๋‹ˆ๋‹ค. ์•„๋ž˜๋Š” service.yaml ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.

apiVersion: v1
kind: Service
metadata:
  name: golang-backend-api-service
spec:
  type: ClusterIP #diff. LoadBalancer, etc.
  selector:
    app: golang-backend-api
  ports:
    - protocol: TCP
      # nodePort is external access port outside the cluster. But, as we set type as clusterIP, this setting isn't needed
      # nodePort: 30131
      port: 80 # internal port
      targetPort: 8080 # forward port

reference from https://matthewpalmer.net/kubernetes-app-developer/articles/service-kubernetes-example-tutorial.html

  • spec.type : ClusterIP, LoadBalancer, NodePort ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ClusterIP : ์ด ์„ค์ •์€ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด๋ถ€์—์„œ๋งŒ Pod์— ์ ‘์†ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •ํ•ด์ค๋‹ˆ๋‹ค.
    • NodePort : ํด๋Ÿฌ์Šคํ„ฐ ์™ธ๋ถ€์—์„œ๋„ Pod์— ์ ‘์† ๊ฐ€๋Šฅํ•˜๋„๋ก ์„ค์ •ํ•ด์ค๋‹ˆ๋‹ค. ๋งŒ์•ฝ 2๊ฐœ์˜ ํŒŒ๋“œ์™€ ์—ฐ๊ฒฐ๋œ ์„œ๋น„์Šค๊ฐ€ NodePort ๋กœ ๋˜์–ด์žˆ๋‹ค๋ฉด, ๋ผ์šด๋“œ๋กœ๋นˆ ๋ฐฉ์‹์œผ๋กœ ์ˆœ์„œ๋Œ€๋กœ ์š”์ฒญ์ด ๊ฐ ํŒŒ๋“œ์— ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.
    • LoadBalancer : ํด๋ผ์šฐ๋“œ์—์„œ ์ œ๊ณตํ•˜๋Š” ๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ํƒ€์ž…์ž…๋‹ˆ๋‹ค.

์ž, ์ง€๊ธˆ๊นŒ์ง€ deployment์™€ service๋ฅผ ์ •์˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ•œ๋ฒˆ ์ •๋ฆฌํ•ด๋ณผ๊นŒ์š”?

์šฐ๋ฆฌ๋Š” Deployment๋ฅผ ํ†ตํ•ด (1) ๋„์ปค์ด๋ฏธ์ง€๋ฅผ ๋ถˆ๋Ÿฌ์™€์„œ, (2) ๋‘ ๊ฐœ์˜ ์„œ๋น„์Šค(Pod)๋ฅผ ์ƒ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. (3) ๊ทธ๋ฆฌ๊ณ  ์ด ์„œ๋น„์Šค๋“ค์€ ๊ฐ๊ธฐ ๋‹ค๋ฅธ IP๋ฅผ ๊ฐ€์ง€๊ณ  ํฌํŠธ 8080๋ฅผ ๋‚ด๋ถ€๋…ธ์ถœ์‹œํ‚ต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  Service๋ฅผ ํ†ตํ•ด (1) ์—ฎ๊ธด Pod ์ง‘ํ•ฉ์„ ๋ถˆ๋Ÿฌ์˜ค๊ณ , (2) ํ†ตํ•ฉ ์—”ํŠธ๋ฆฌ ํฌ์ธํŠธ์ธ ํฌํŠธ 80๋ฅผ ์ œ๊ณตํ•˜๊ณ , (3) ๊ฐ๊ฐ์˜ Pod:8080์œผ๋กœ ๋ผ์šด๋“œ๋กœ๋นˆ ํฌํŠธํฌ์›Œ๋”ฉํ•˜์˜€์Šต๋‹ˆ๋‹ค(๊ธฐ๋ณธ์ ์œผ๋กœ ๋ผ์šด๋“œ๋กœ๋นˆ์œผ๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค).

ํ•˜์ง€๋งŒ ์•„์ง๊นŒ์ง€๋Š”, ์™ธ๋ถ€๋กœ ํฌํŠธ๊ฐ€ ๋…ธ์ถœ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์ด์ œ๋ถ€ํ„ฐ ์ด๊ฑธ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์šฐ๋ฆฌ๋Š” Ingress ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค!(๋ฌผ๋ก  NodePort ๋กœ ์ง์ ‘์™ธ๋ถ€๋…ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)

2-3. Ingress

a

Ingress๋Š” ์™ธ๋ถ€์— ํฌํŠธ๋ฅผ ๋…ธ์ถœ์‹œ์ผœ์คŒ๊ณผ ๋™์‹œ์— ๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ์„ ์„ค์ •ํ•ด์ฃผ๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜๋Š” ingress.yaml ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.

apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
  name: nginx
spec:
  controller: k8s.io/ingress-nginx
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: golang-backend-api-ingress
  annotations:
    cert-manager.io/cluster-issuer: letsencrypt
spec:
  ingressClassName: nginx
  rules:
  - host: "api.hwangbogyumin.com"
    http:
      paths:
      - pathType: Prefix # 443, 80 etc. -> 80 if "/" prefix
        path: "/"
        backend:
          service:
            name: golang-backend-api-service
            port:
              number: 80
  tls:
  - hosts:
    - api.hwangbogyumin.com
    secretName: hwangbogyumin-api.cert

์—ฌ๊ธฐ์„œ๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

  1. TLS ์ธ์ฆ์„œ ์ ์šฉ
    • TLS ์ธ์ฆ์„œ๋Š” ์ž์‹ ์ด ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋„๋ฉ”์ธ์„ letsencrypt ์™€ ์—ฐ๋™ํ•˜๋ฉฐ ๋ฌด๋ฃŒ๋กœ! ๋ฐœ๊ธ‰๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์ €๋Š” ๋„๋ฉ”์ธ์„ AWS-Route-53์„ ํ†ตํ•ด ์ƒ€์Šต๋‹ˆ๋‹ค.
  2. ๋„๋ฉ”์ธ ์—ฐ๊ฒฐ
    • spec.rules.host : ์—ฌ๊ธฐ์— ์ž์‹ ์ด ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋„๋ฉ”์ธ์„ ์ ๊ณ , http.path ์— ์ถ”๊ฐ€์ ์ธ ๋ผ์šฐํŒ…์„ ์ ์œผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
  3. ์™ธ๋ถ€ ํฌํŠธ ๋…ธ์ถœ
    • backend.service.name : ์•ž์„œ ์šฐ๋ฆฌ๊ฐ€ ์„ค์ •ํ–ˆ๋˜ service๋Š” ๋ฌถ๊ธด Pod๋“ค์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ์™ธ๋ถ€ ํฌํŠธ๋ฅผ ๋งคํ•‘์‹œ์ผœ์ฃผ๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค(์ด ๋ถ€๋ถ„์€ nginx์˜ location์„ ์ •์˜ํ•˜๋Š” ๋ถ€๋ถ„๊ณผ ๊ฐ™์ฃ ).

์ด ์™€ ๊ฐ™์ด ์šฐ๋ฆฌ๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค!

References