[![logo](https://www.hongsnet.net/images/logo.gif)](https://www.hongsnet.net)

# Cluster 운용상 비교 및 검토

> Docker Swarm -> `K8s`로의 **클러스터 환경**에 대해 검토하고 검증한다.

## Docker Swarm

- Node 당 하나의 컨테이너만을 운용되고 있다.
- Manager를 제외한 Node에만 컨테이너가 배포되어야 한다.
  - Global Mode는 **Node 당** 하나의 컨테이너만을 실행
  - Swarm 도입 시 여전비 VM 환경이 대부분이므로 Replica 보단, 하나의 컨테이너만을 실행하여 도입하는 것을 목적
- Front-end LB(HA-PROXY)와의 통신을 원활히 하도록 구성해야 한다.
  - **Global Mode** 적용 시 Host Network을 사용하도록 구성되기 때문에 문제가 없다.


## K8s

- ReplicaSet을 통한 Pod의 `확장`/`축소`를 수행한다.
- Master를 제외한 Node에만 컨테이너가 배포되어야 한다.
- Front-end LB(HA-PROXY)와의 통신을 원활히 하도록 `NodePort` Service 외부노출방식을 사용한다.
- CPU/Memory Resource 사용상태에 따라 Pod의 `Scale-Out`을 수행하며, 정상이면, `Scale-Down`을 수행(Auto Scaling)한다.


# Conclusion k8s

> Swarm -> `K8s`로의 Migration은 검토결과 문제가 없다.


# Docker Swarm

- **Node 당 하나의 컨테이너만을 운용해야 한다.**

```python
...중략
  deploy:
     mode: global
```

> 이는 Swarm Cluster 외 단독 컨테이너 및 VM 환경에서 대한 리소스사용을 고려한 측면이다. 기본 값은 **Replica** 다.


- **Manager 제외한 Node에 컨테이너를 배포해야 한다.**

```python
  deploy:
    placement:
     onstraints: [node.hostname != TB2-DOCKER]
```

> 이는 Manager Node에 Storage 운용 및 관리/제어를 위한 목적으로만 사용하기위한 측면이다.


- **Front-end LB와의 통신을 원활히 하도록 구성해야 한다.**

> N/A, 기본 **Overlay** 네트워크로 사용되어도 Front-end의 LB(HA-Proxy) 서비스운영에 문제가 없다.


# K8s

- ReplicaSet을 통한 Pod의 `확장`/`축소`를 수행한다.

> Deployment Object의 **replicas**를 사용한다.

```python
apiVersion: apps/v1
kind: Deployment
...
spec:
  replicas: 5

...중략
```

> 세부적인 내역은 아래의 Link를 확인한다.

[www.hongsnet.net k8s 구성내역](https://gitlab.hongsnet.net/joohan.hong/joohanhong/tree/master/DOCKER/K8S/HONGSNET)


- **Manager 제외한 Node에 컨테이너를 배포해야 한다.**

> k8s의 경우 Label을 통해 구분하면 된다.

```python
apiVersion: apps/v1
kind: DaemonSet
metadata:
 ...
spec:
  ....
  template:
    ...
    spec:
      ...
      nodeSelector:
        key: worker
```

등록은 다음과 같이 수행하며, 참고적으로 key는 임의의 변수 값이다.

```bash
# kubectl label nodes cube02 key=worker
```

- Front-end LB(HA-PROXY)와의 통신을 원활히 하도록 `NodePort` Service 외부노출방식을 사용한다.

> Front-end LB(HA-PROXY)와의 구성(`NodePort`)으로 구성하면 문제 없다.


```python
apiVersion: v1
kind: Service
metadata:
  name: hongsnet-web
spec:
  type: NodePort
  selector:
    app: hongsnet
  ports:
    - port: 80
      targetPort: 80
      nodePort: 30000
```

- CPU/Memory Resource 사용상태에 따라 Pod의 `Scale-Out`을 수행하며, 정상이면, `Scale-Down`을 수행(Auto Scaling)한다.

> Auto Scaling을 적용하여, Pod의 가용성을 높인다. 자세한 내역은 아래의 Link를 참조한다.

[AutoScaling 구성내역](https://gitlab.hongsnet.net/joohan.hong/joohanhong/tree/master/DOCKER/K8S/MIGRATION/SERVICE/SCALE)


