색션 12. 실전 Kubernetes - 핵심 개념 자세히 알아보기

198. Pod와 컨테이너 사양(Spec) 추가

Spec 추가

apiVersion: apps/v1
kind: Deployment
metadata:
name: second-app-deployment 
spec: 
replicas: 1 # 최초 Pod 의 숫자
 ```
- 초기 트래픽의 수준을 알아서 최초 Pod의 생성량을 안다면 이를 지정해주는 것도 유용하다. 

### Pod 설정하기 - 전체
```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: second-app-deployment 
spec: 
replicas: 1 
template: # deployment 생성을 위해 이미지를 설정하는 것과 같은 역할을 한다. 
 metadata: 
   lables: 
     app: second-app
  • template는 항상 Pod 를 대변하는 객체이다.
  • 따라서 최초에 kind를 통해 deployment 를 설정한 것과는 다르게 설정되는 것이다.
  • 더불어 이렇게 설정하는 것은 전체 Pod에 대한 설정이라고 생각하면 된다.

Pod 설정하기 - 개체

apiVersion: apps/v1
kind: Deployment
metadata:
  name: second-app-deployment 
spec: 
  replicas: 1 
  template: 
    metadata: 
      lables: 
        app: second-app
    spec: #메타데이터와 동일한 수준에서 시작한다. 
      containers: 
        - name: second-node
          image: axel9309/kub-first-app:4
000```
- 참고로 여기서 사용되는 spec 은 저 deployment의 Pod를 의미하는 것이고, 그 말은 다른 Pod가 필요하다면 다른 Deployment 가 필요하다. 
- `container` 라는 항목은 Pod 안에 한개가 아닐 수 있고, 한개라면 기존 방식처럼 map 형태로 하면 되며, 여러개의 container를 구동할 때는 YAML에서 배열 문법을 활용하면 된다. 
	- 이때 주의 사항이 각 컨테이너마다 이미지나, 이름이 다를 수 있기에, 그런 경우 상위처럼 하이픈(-) 없이 적어주면 앞전에 언더바를 쓴 대상의 속성으로 인식 된다. 

### 최소한의 deployment 를 활용해 적용시키는 방법
```shell
> kubectl apply -f="deploymentMine.yaml"
The Deployment "second-app-deployment" is invalid: 
* spec.selector: Required value
* spec.template.metadata.labels: Invalid value: map[string]string{"app":"second-app"}: `selector` does not match template `labels`
  • -f 는 파일을 인식시키기 위한 옵션 값, 여러 개를 인식 시킬 때는 -f 이 옵션을 여러번 사용하면 된다.
  • 우선 이렇게 해보면 에러메시지로 selector 가 필요하다고 이야기 한다.

selector란 어떻게 하는 것인가.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: second-app-deployment 
spec: 
  replicas: 1 
  selector: # 전체 Pod를 위하여 설정해줘야 한다. 
    matchLabels: 
      app: second-app # 해당 앱
      tier: backend # tier라는 라벨에 backend라는 값이 있을 때 deployment 의 모니터링이 들어가게 됨
  template: 
    metadata: 
      labels: 
        app: second-app
        tier: backend
    spec: #메타데이터와 동일한 수준에서 시작한다. 
      containers: 
        - name: second-node
          image: axel9309/kub-first-app:4
  • deployment 는 쿠버네티스 속에서 동적인 객체다.
    • Pod의 확장 명령이 떨어지면 deployment 가 지속적으로 감시하며 살핀다.
  • 이때 제어야 할 필요가 있을 때 selector 가 필요해진다. Pod에 대한 라벨링, 티어 설정 등은 자유롭게 할 수 있고, 그걸 지정한 뒤 selector가 이걸 가리킴으로써 deployment 는 자신에게 어떤 Pod가 연결되고, 감시할 것인지를 알게 되는 것이다.

get deployments

  • 이제 모든 기초 준비는 끝났기에 파일을 적용시키면 된다.
> kubectl apply -f="deploymentMine.yaml"
deployment.apps/second-app-deployment created
  • 성공적인 문구가 나옴과 동시에, deployment를 확인해보면 성공적으로 앱이 배포된 것이 보일 것이다.
> kubectl get deployments
NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
first-app               1/1     1            1           7d13h
second-app-deployment   0/1     1            0           6s
> kubectl get pods       
NAME                                     READY   STATUS    RESTARTS      AGE
first-app-5bd8cf76f4-pnxr4               1/1     Running   1 (51m ago)   3d10h
second-app-deployment-5f47fd4c87-s842j   1/1     Running   0             108s