1. Docker Swarm에서, Swarm Cluster를 구축하는 과정을, Docker Swarm의 주요 명령어를 사용하여 설명합니다. 이 경우, manager node와 worker node들로 나누어서 설명합니다. docker-machine ssh manager로 매니저 노드에 ssh접근하고 docker swarm init —advertise-addr <manager-ip>을 실행해서 docker swarm을 초기화하고 매니저 노드로 삼는다. 그럼 토큰이 나오는데 이것을 복사하고 매니저에서 exit한다음 ssh로 workernode에 들어가고 docker swarm join —token <token> <manager ip>:2377으로 worker node를 swarm에 join한다. 다른 worker node에도 ssh로 접근해서 동일한 작업을 수행하면 swarm cluster를 구축할 수 있다.
  2. Docker Swarm에서, Container(들)를 실행하는 과정을, Docker Swarm의 주요 명령어를 사용하여 설명합니다. 이 경우, manager node와 worker node들로 나누어서 설명합니다. 도커스웜은 개별 컨테이너를 생성하는게 아니라 서비스라는 단위로 매니저가 관리한다. 서비스는 여러개의 컨테이너로 구성된 scalable group으로 자동으로 swarm에 의해 네트워크 기능이 추가된다. swarm cluster를 만든 이후에 service의 yml파일을 준비하고 yml파일을 매니저에게 주고(docker-machine scp docker-compose.yml manager:~) 매니저에 ssh로 접근해서 docker stack deploy -c docker-compose.yml helloswarm으로 실행시키면 알아서 replicas에 명시된 개수대로 worker node에서 컨테이너가 실행된다.
  3. Docker Machine은 어떤 기능을 수행하는지 설명합니다. 이 기능이 개발자 입장에서 어떤 장점(혹은 편리한 점)을 제공하는지 설명합니다. 도커머신은 도커 엔진을 virtual host에 설치하고 관리한다. 내 컴퓨터에서 hypervisor를 이용해서 VM들을 필요한 만큼 만들고 운영체제 설치하고 도커까지 깔아놓는 작업을 자동으로 하도록 프로그램으로 구현된 것이다. 사용자가 직접 vm에 리눅스 및 도커 등을 다운로드 하지 않아도 되므로 편리하다. 새로운 머신들 위에 운영체제 깔고 도커설치하는것을 자동화한게 docker machine이다.
  4. Docker Swarm으로 Container들을 수행하고자 하는 경우, 지리적으로 특정 국가(혹은 지역)에 해당하는 Node들에서만 Container를 구동하고자 한다면, 어떻게 해야하는지 수업에서 배운 내용으로 설명합니다 docker label을 통해서 노드에 메타데이터를 추가할 수 있다. 라벨 기반으로 constraints를 설정할 수 있다. 특정 지역이름을 라벨로 가진 노드만 실행하면 된다. docker-compose에서 label기반으로 constraints를 설정한 후에 docker stack deploy를 수행한다.
  5. Kubernetes in 5mis 영상 기준으로, Docker Swarm과 Kubernetes의 유사점 및 차이점을 각각 2가지 씩 설명합니다. 동일한 점은 둘 다 로드밸런싱 기능을 제공하고 yaml파일을 사용해서 서비스를 정의하고 배포한다. docker swarm은 노드가 죽으면 서비스가 중단되며 직접 복구작업을 수행해야하지만 쿠버네티스는 desired state를 기반으로 자동으로 조정해서 서비스가 중단되면 다른 worker로 서비스를 옮긴다. docker swarm은 도커에게 개발자가 cli로 명령을 내리지만 쿠버네티스는 운영자가 쿠버네티스에게 desired state를 전달하면 희망한 상태를 맞추기 위해서 쿠버네티스가 개입한다.
  6. CNCF의 Landscape를 방문하여, 수업에서 다룬 Docker/Kubernetes/Jenkins 외에 본인이 관심 있는 분야의 프로그램을 선택한 후, “프로그램의 이름, CNCF 내에서의 분류를 적고, 기능과 활용 예시“를 간단히 설명합니다. gRPC, Remote Procedure Call, grpc는 http/2를 기반으로 원격 프로시저 호출을 수행하는 프레임워크로 마이크로서비스 아키텍쳐에서 서비스 간의 통신을 위해 사용할 수 있다. api나 채팅 어플리케이션 등의 클라이언트-서버 실시간 통신을 구현할 수 있음
  7. Monolithic Architecture 대비 Microservice Architecture의 장점을 비교하여 설명합니다. 설명시, 좋아지는 사항을 단어로만 나열하지 않고, 좋아지는 부분에 대한 이유를 설명합니다. monolithic architecture의 경우 프로그램 하나에 너무 많은 기능이 들어있으니 장애가 발생했을때 모든 서비스가 다 죽고, 새로운 기능을 개발할때 테스트 컴파일 빌드 등의 과정이 오래걸린다. 마이크로서비스는 기능수정 및 업데이트를 빠르게 수행할 수있다. 트래픽이 몰리는 곳에만 scaling을 통해서 클라우드 자원을 효율적으로 쓸 수 있다. polyglot으로 최적의 언어 개발환경 방법론을 쓸 수 있다.
  8. K8s의 Pod이 Docker의 Container와 다른 부분이 무엇인지 설명합니다. pod은 복수개의 컨테이너가 들어있고 하나의 네트워크 단위로 묶어셔 pod내의 컨테이너들은 하나의 ip주소를 공유한다. pod은 storage resource, network ip, 여러개의 컨테이너들을 encapsulation한 개념으로 쿠버네티스의 기본 단위이다.
  9. K8s의 Ingress가 제공하는 기능을 나열하고 간단하게 설명합니다. ingress는 클러스터 외부에서 들어오는 요청을 여러 pod들로 분산해주는 load balancing기능 및 해당 요청을 적절한 서비스로 전달하는 reverse proxy기능, 을 하고 도메인 이름에 따라서 트래픽 라우팅하는 기능과 클러스터 내부에서는 암호화가 이루어지지 않고 외부에서만 암호화하니까 ssl termination기능을 하고 외부에서 들어오는트래픽을 제어하는 방화벽 기능도 한다.
  10. Replica Controller의 주요 역할 두가지를 설명합니다. desired state에 의해 요청된 pod의 replica개수를 유지한다. 장애가 발생했을때 자동으로 pod을 재생성해서 장애를 복구해서 서비스가 중단없이 운영될 수 있도록 한다
  11. Yaml 파일의 주요 필드인 apiVersion, kind, metadata, selector, template, replicas의 의미를 kind가 Deployment인 기준으로 설명합니다. apiVersion은 kubernetes api의 버전을 명시한다. kind는 리소스의 종류로 클래스와 비슷한 개념이며 kind에 deployment라고 하면 deployment 인스턴스를 생성하는것고 같다. 메타데이터는 deployment 자신에 대한 데이터로 이름, 라벨, namespace등이 들어간다. selector는 deployment가 관리할 pod을 선택하는 label을 기반으로 특정 label을 가진 pod만 선택할 수 있도록 한다. template은 deployment가 생성할 pod의 메타데이터와 스펙, 환경변수 등을 포함하au 템플릿으로 템플릿을 바탕으로 pod을 생성한다. replicas는 deployment가 유지할 pod의 복사본 수를 정의한다.
  12. NodePort의 물리적인 정체는 무엇이며, 어떤 경우에 활용하는지 설명합니다. 클러스터를 구성하는 노드(vm)들에 구멍(port)을 하나씩 뚫은것. = 즉 각 노드에 port를 열어놓은것. 이 포트에 들어온 트래픽은 service로 포워딩된다. nodeport는 고객을 받기 위한 용도가 아니다, 신뢰할 수 있는 traffic만 유입되어야 한다. 따라서 개발 및 테스트, 모니터링에서 사용한다.
  13. LoadBalancer와 Ingress의 유사점과 차이점을 설명합니다. 로드밸런서와 ingress모두 클러스터 외부에서 내부 서비스로의 접근을 가능하게 하고 트래픽을 여러 pod으로 분산시키는 로드밸런싱 기능을 제공한다. 하지만 Ingress는 사실 서비스가 아니다. 서비스들의 앞단에서 클러스터로 들어가는 트래픽에 대한 smart router역할을 한다. load balancer는 고정된 ip주소를 제공하지만 ingress는 요청을 받으면 도메인에 따라 해당 서버 트래픽을 라우팅해주는 역할을 한다 LoadBalancer는 내부의 프라이빗 IP 주소를 외부의 퍼블릭 IP 주소로 변환(NAT/PAT)합니다. 이는 IP 주소 공간이 제한적이기 때문에 필요합니다. LoadBalancer는 외부에 고정된 IP 주소를 제공하므로, 이 IP 주소가 외부에 노출됩니다인그레스는 서비스들을 묵고
  14. K8s의 Rolling-update와 Rolling-back은 어떤 기능이며, 서비스를 운영하는 입장에서 어떤 경우에 사용하는지 설명합니다. 살아있는 pod의 개수를 유지하면서 pod들을 하나씩 새로 띄우고 하나를 죽이면서 교체한다. 새로운 버전의 어플리케이션을 배포할때 점진적으로 업데이트할 수 있다. 하지만 pod안에있는 어플리케이션을 염두에 두지는 않는다. rolling back은 옛날 버전으로 돌아가는 것으로 새로운 버전에서 에러가 발생하는 경우 이전 버전으로 돌아간다. 보통 모든 버전을 다 repository에 가지고 있고 어떤 시기에 출시했던 버전으로 돌아가고 싶다면 해당 버전으로 rollback을 수행한다.
  15. K8s의 emptyDir, hostPath, PVC의 물리적인 위치를 설명합니다. 그리고 어떤 용도로 사용하는지 설명합니다. emptydir은 pod안에 존재하는 스토리지 영역으로 pod이 죽으면 사라진다 pod내에서 임시데이터 저장할때 사용된다 hostpath는 cache라고도 하며 pod이 실행되고 있는 host의 filesystem path이다. hostpath도 상시적인 저장은 안되고 임시적인 것이다. 노드의 특정 파일이나 디렉토리에 접근한다. persistent volume claim은 항구적으로 존재하는 volume이다. persistentvolume은 쿠버네티스 클러스터에 존재하는 스토리지로 persistentvolumclaim은 이 공간을 claim해서 pod이 사용한다. pod이 항구적인 스토리지가 필요하다고 주장하면 쿠버네티스가 매칭해준다. persistentvolume은 physical storage이든 원격접속하는 NFS든 쿠버네티스가 인식할수 있도록 부착된 것이다.