🀷🏼‍♀️ Etc.../- linux, aws, docker, k8s

[μΏ λ²„λ„€ν‹°μŠ€] k8s의 κΈ°λ³Έ λ‹¨μœ„μΈ ν¬λ“œ (Pods)와 ν¬λ“œ μƒμ„±ν•˜κΈ°

Wonit 2021. 5. 13. 16:09

μΏ λ²„λ„€ν‹°μŠ€λŠ” μ»¨ν…Œμ΄λ„ˆλ“€μ˜ Life cycle μ—μ„œ λΆ€ν„° scheudling κΉŒμ§€ μ „λ°˜μ μΈ μ˜€μΌ€μŠ€νŠΈλ ˆμ΄μ…˜ 도ꡬ라고 ν•˜μ˜€λ‹€.

 

이런 μΏ λ²„λ„€ν‹°μŠ€λŠ” ν¬μ»€μŠ€κ°€ μ»¨ν…Œμ΄λ„ˆμ— 맞좰져 μžˆλ‹€.

 

λ„μ»€μ—μ„œλŠ” κΈ°λ³Έ λ‹¨μœ„κ°€ μ»¨ν…Œμ΄λ„ˆ μ˜€μ—ˆμ§€λ§Œ μΏ λ²„λ„€ν‹°μŠ€μ—μ„œλŠ” κΈ°λ³Έ λ‹¨μœ„λ₯Ό ν¬λ“œ, Pods 라고 λΆ€λ₯Έλ‹€.

 

μ˜€λŠ˜μ€ 이 ν¬λ“œμ— λŒ€ν•΄μ„œ μ•Œμ•„λ³΄λ„λ‘ ν•˜μž.

 

ν¬λ“œ, Pods

ν¬λ“œλŠ” μ•žμ„œ 이야기 ν•˜μ˜€λ“― μ»¨ν…Œμ΄λ„ˆ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ΅¬λ™ν•˜κΈ° μœ„ν•΄ κΌ­ ν•„μš”ν•œ 였브젝트(Object) 이닀.

 

즉, μΏ λ²„λ„€ν‹°μŠ€μ—μ„œ κ°€μž₯ κΈ°λ³Έ λ‹¨μœ„λ₯Ό 말 ν•˜λ©° μš°λ¦¬λŠ” ν¬λ“œλ₯Ό μ΄μš©ν•΄μ„œ μ»¨ν…Œμ΄λ„ˆλ₯Ό κ°€λ™μ‹œκ³  μΏ λ²„λ„€ν‹°μŠ€λŠ” μ»¨ν…Œμ΄λ„ˆλ₯Ό 직접 κ΄€λ¦¬ν•˜μ§€ μ•Šκ³  ν¬λ“œλ₯Ό μ΄μš©ν•΄ μ»¨ν…Œμ΄λ„ˆλ“€μ„ κ΄€λ¦¬ν•˜κ²Œ λœλ‹€.

 

ν¬λ“œ λ‚΄λΆ€μ˜ μ»¨ν…Œμ΄λ„ˆλ“€μ€ 기본적으둜 Shared Context μ—μ„œ μ‹€ν–‰λ˜μ–΄μ„œ λ¦¬λˆ…μŠ€μ˜ λ„€μž„ μŠ€νŽ˜μ΄μŠ€μ™€ 컨트둀 κ·Έλ£Ή (cgroup)을 ν•¨κ»˜ κ³΅μœ ν•œλ‹€.

 

 

이 κ°œλ…μ΄ ν¬λ“œμ™€ μ»¨ν…Œμ΄λ„ˆλ₯Ό ꡬ뢄 μ§“λŠ” μ•„μ£Ό μ€‘μš”ν•œ κ°œλ…μ΄ λ˜λŠ”λ° 잘 κΈ°μ–΅ 해두도둝 ν•˜μž

그리고 ν•˜λ‚˜μ˜ 도컀 μ»¨ν…Œμ΄λ„ˆμ—μ„œ ν•˜λ‚˜μ˜ 도컀 이미지λ₯Ό μ΄μš©ν–ˆλ˜ κ²ƒκ³ΌλŠ” 달리 μΏ λ²„λ„€ν‹°μŠ€μ˜ ν¬λ“œλŠ” ν•˜λ‚˜μ˜ ν¬λ“œμ—μ„œ μ—¬λŸ¬ μ»¨ν…Œμ΄λ„ˆλ₯Ό κ΅¬λ™μ‹œν‚¬ 수 μžˆλ‹€.

 

이 κ°œλ…μ€ 후에 배울 Sidecar νŒ¨ν„΄μ΄λΌκ³ λ„ ν•˜λŠ”λ°, 보톡 μ‹€μ§ˆμ μΈ κΈ°λŠ₯ λ™μž‘μ„ ν•˜λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ»¨ν…Œμ΄λ„ˆ ν•˜λ‚˜μ™€ ν•΄λ‹Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‘°μž‘ν•˜λŠ” 창ꡬ와 λΉ„μŠ·ν•œ μ»¨ν…Œμ΄λ„ˆ ν•˜λ‚˜λ₯Ό μ‘°ν•©ν•˜μ—¬ κ΅¬μ„±ν•˜κΈ°λ„ ν•œλ‹€.

 

ν¬λ“œ 내에 κ³΅μœ λ˜λŠ” λ¦¬μ†ŒμŠ€

μ•„κΉŒ μ•žμ—μ„œ 이야기 ν–ˆλ˜ Shared Context에 λŒ€ν•΄μ„œ λ‹€μ‹œ 이야기 ν•΄λ³΄μž.

 

λ§Œμ•½ ν•˜λ‚˜μ˜ ν¬λ“œμ—μ„œ μ—¬λŸ¬ μ»¨ν…Œμ΄λ„ˆλ₯Ό ꡬ동 μ‹œμΌ°λ‹€κ³  ν•΄λ³΄μž.

 

그럼 ν¬λ“œλŠ” λ‚΄λΆ€μ μœΌλ‘œ 2개의 λ¦¬μ†ŒμŠ€λ₯Ό κ³΅μœ ν•  수 μžˆλ‹€.

  1. Pod Storage
  2. Pod Networking

λ§Œμ•½ μš°λ¦¬κ°€ 도컀λ₯Ό μ‚¬μš©ν–ˆλ‹€λ©΄ μ–΄λ• μ„κΉŒ? μš°μ„  ν•˜λ‚˜μ˜ μ»¨ν…Œμ΄λ„ˆλŠ” ν•˜λ‚˜μ˜ μ• ν”Œλ¦¬μΌ€μ΄μ…˜λ§Œ μ‹€ν–‰ν•˜λ„λ‘ ν•˜κ³  도컀 λΈŒλ¦Ώμ§€ λ„€νŠΈμ›Œν¬(Bridge Network)λ₯Ό κ΅¬μ„±ν–ˆμ–΄μ•Ό ν–ˆλ‹€. ν•˜μ§€λ§Œ μΏ λ²„λ„€ν‹°μŠ€μ—μ„œλŠ” 그럴 ν•„μš”κ°€ μ—†λ‹€.

 

이제 ν¬λ“œλ₯Ό μƒμ„±ν•˜λŠ” 방법에 λŒ€ν•΄μ„œ μ•Œμ•„λ³΄μž.

 

ν¬λ“œλ₯Ό μƒμ„±ν•˜λŠ” 2가지 방법

ν¬λ“œλ₯Ό μƒμ„±ν•˜κΈ° μœ„ν•œ 방법은 크게 2가지가 μ‘΄μž¬ν•œλ‹€.

  1. 직접 ν¬λ“œλ₯Ό μƒμ„±ν•˜λŠ” 경우
  2. ν¬λ“œλ₯Ό κ°μ‹ΈλŠ” μƒμœ„ λ¦¬μ†ŒμŠ€λ₯Ό μ‚¬μš©ν•˜λŠ” 경우

 

μš°λ¦¬λŠ” λŒ€λΆ€λΆ„ ν¬λ“œλ₯Ό κ°μ‹ΈλŠ” μƒμœ„ λ¦¬μ†ŒμŠ€λ₯Ό μ‚¬μš©ν•˜λŠ” 경우λ₯Ό 많이 λ³Ό 것이닀.


κ·Έλž˜λ„ κ°„λ‹¨ν•˜λ‹ˆ 두 방법 λͺ¨λ‘λ₯Ό μ•Œμ•„λ³΄μž.

 

직접 ν¬λ“œλ₯Ό μƒμ„±ν•˜λŠ” 경우

직접 ν¬λ“œλ₯Ό μƒμ„±ν•˜κΈ° μœ„ν•΄μ„œλŠ” yml νŒŒμΌμ— kindλ₯Ό Pod 둜 μ§€μ •ν•˜κ³  spec에 ν¬λ“œκ°€ μ‹€ν–‰μ‹œν‚¬ μ»¨ν…Œμ΄λ„ˆ 섀정을 μΆ”κ°€ν•˜κΈ°λ§Œ ν•˜λ©΄ λœλ‹€.

 

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
    - name: service-container-name
      images: my-service:v1.0
      ports:
        - containerPort: 80
          protocol: TCP
  • apiVersion
    • yml νŒŒμΌμ—μ„œ μ •μ˜ν•œ 였브젝트의 API 버전을 λ‚˜νƒ€λ‚Έλ‹€.
  • kind
    • ν•΄λ‹Ή yml νŒŒμΌμ— μ‘΄μž¬ν•˜λŠ” λ¦¬μ†ŒμŠ€μ˜ μ’…λ₯˜λ₯Ό λ‚˜νƒ€λ‚Έλ‹€
  • metadata
    • 주석, 이름, 라벨과 같은 메타데이터λ₯Ό 지정할 수 μžˆλ‹€
  • spec
    • λ¦¬μ†ŒμŠ€λ₯Ό μƒμ„±ν•˜κΈ° μœ„ν•œ μžμ„Έν•œ 정보λ₯Ό μž…λ ₯ν•œλ‹€.

ν¬λ“œλ₯Ό κ°μ‹ΈλŠ” μƒμœ„ λ¦¬μ†ŒμŠ€λ₯Ό μ‚¬μš©ν•˜λŠ” 경우

λŒ€λΆ€λΆ„μ˜ κ²½μš°μ—μ„œ μš°λ¦¬λŠ” 이 방법을 μ‚¬μš©ν•  것이닀.

 

ν¬λ“œμ˜ μƒμœ„ λ¦¬μ†ŒμŠ€λŠ” λŒ€ν‘œμ μœΌλ‘œ λ‹€μŒ 3가지가 μžˆλ‹€.

  • ReplicaSet
  • StatefulSet
  • Deployment

이듀은 ν¬λ“œλ₯Ό μ‘°μž‘ν•˜κ³  κ΄€λ¦¬ν•˜λŠ” μƒμœ„ λ¦¬μ†ŒμŠ€λ“€μΈλ°, μƒμœ„ λ¦¬μ†ŒμŠ€μ—μ„œ ν¬λ“œλ₯Ό μ •μ˜ν•˜κΈ° μœ„ν•΄μ„œλŠ” PodTemplate 에 ν¬λ“œμ˜ spec, 속성을 지정해주면 λœλ‹€.

 

아직 λ°°μš°μ§€ μ•Šμ•˜μ§€λ§Œ ReplicaSet 의 경우λ₯Ό κ°„λ‹¨νžˆ 봐보자.

 

apiVersion: v1
kind: ReplicaSet # ν¬λ“œμ˜ μƒμœ„ λ¦¬μ†ŒμŠ€μΈ λ ˆν”Œλ¦¬μΉ΄ μ…‹
metadata:
  name: my-replicaset
spec:
  replicas: 4
  selector:
    matchLabels:
      app: my-pod-label
  template: # Pod Template (포트 속성 μ •μ˜)
    metadata:
      name: my-pod
      labels:
        app: my-pod-label
    spec:
      containers:
        - name: nginx-pod
          image: nginx
          ports:
            - containerPort: 80

kubectl둜 yml 에 ν•΄λ‹Ή ν•˜λŠ” ν¬λ“œ 였브젝트 μ‹€ν–‰ν•˜κΈ°

이제 kubectl 을 μ΄μš©ν•΄μ„œ μš°λ¦¬κ°€ λ§Œλ“  2가지 yml νŒŒμΌμ„ μ΄μš©ν•΄ ν¬λ“œλ“€μ„ κ΅¬λ™μ‹œμΌœλ³΄μž.

  1. apply λͺ…λ Ήμ–΄λ₯Ό μ΄μš©ν•˜μ—¬ yml 파일 μ‹€ν–‰ν•˜κΈ°
  2. pods μƒνƒœ ν™•μΈν•˜κΈ°
  3. replica set μƒνƒœν™•μΈν•˜κΈ°

apply λͺ…λ Ήμ–΄λ₯Ό μ΄μš©ν•˜μ—¬ yml 파일 μ‹€ν–‰ν•˜κΈ°

yml νŒŒμΌμ„ μ‹€ν–‰ν•˜λŠ” λ°©λ²•μ—λŠ” λ‹€μ–‘ν•œ 방법듀이 μ‘΄μž¬ν•˜κ² μ§€λ§Œ λŒ€ν‘œμ μœΌλ‘œ kubectl apply λ₯Ό μ‚¬μš©ν•œλ‹€.

 

apply λͺ…λ Ήμ–΄μ—λŠ” μ˜΅μ…˜μ„ 쀄 수 μžˆλŠ”λ° -f μ˜΅μ…˜μ„ μ€˜μ„œ yml νŒŒμΌμ„ μ‹€ν–‰μ‹œν‚€λ„λ‘ ν•΄λ³΄μž.

 

$ kubectl apply -f my-pod.yml
pod/my-pod created

$ kubectl apply -f my-replicaset.yml
replicaset.apps/my-replicaset created

 

그럼 μœ„μ™€ 같이 created μƒνƒœλ‘œ ν¬λ“œμ™€ replicaset이 λͺ¨λ‘ 잘 μƒμ„±λ˜μ—ˆλ‹€.

 

pods μƒνƒœ ν™•μΈν•˜κΈ°

pod μƒνƒœλ₯Ό ν™•μΈν•˜κΈ° μœ„ν•΄μ„œλŠ” kubectl get pods λͺ…λ Ήμ–΄λ₯Ό μ‚¬μš©ν•œλ‹€.

 

pod만 μƒμ„±ν•œ ymlκ³Ό replicset 으둜 μƒμ„±ν•œ ν¬λ“œκ°€ μ •μƒμ μœΌλ‘œ 잘 λ„μ›Œμ‘ŒλŠ”μ§€ ν™•μΈν•΄λ³΄μž.

 

$ kubectl get pods

NAME            READY   STATUS    RESTARTS   AGE
my-pod          1/1     Running   0          3m55s
my-replicaset   1/1     Running   0          2m51s
my-replicaset   1/1     Running   0          2m51s
my-replicaset   1/1     Running   0          2m51s
my-replicaset   1/1     Running   0          2m51s

 

그럼 μœ„μ™€ 같이 ν¬λ“œκ°€ 잘 λ™μž‘ν•˜λŠ” 것을 λ³Ό 수 μžˆλ‹€.