-
『DevOps』질문 리스트DevOps 2022. 7. 11. 20:28
개요
DevOps 면접을 준비하며 작성하였던 내용이다.
이 내용은 추후 계속 추가될 수 있고, 삭제 될 수 있다.
누군가가 이 내용을 보고서 도움이 되었다면 정말 좋겠으나, 우선은 혼자 보려고 만들어 본다.
내용
DevOps는 기본적으로 문화이다.
개발의 Development와 운영의 Operation의 앞글자를 따서 Dev + Ops 인 DevOps이다.
즉 개발과 운영이 조화롭고 자연스럽게 돌아갈 수 있게 해주는 하나의 문화이다.
DevOps 엔지니어, DevOps 개발자의 경우는 이 문화를 직접적으로 체험하지는 못한다.
이유는 다음과 같다.
- 실제로 DevOps 엔지니어는 개발자, 운영자가 아니다.
- 개발의 영역에 손을 대기엔 업무 범위를 침범하는 행위이다.
- 운영의 영역에 손을 대기엔 업무 범위를 침범하는 행위이다.
그럼 DevOps 엔지니어는 무엇인가?
개발의 영역에 있는 개발자들이 운영까지 배포하는데 있어서 문제없이 그리고 아주 수월하게 배포할 수 있는 환경을 구축을 하는 역할이다.
반대로 보아도 동일하다.
운영 측인 서버엔지니어, 시스템 담당자가 개발자가 만든 코드를 운영 환경까지 서로의 의견 마찰없이 수월하게 배포해줄 수 있는 환경을 구축해주는 역할이다.
어느 한쪽 팀으로 치우치지 않고 운영팀과 개발팀 사이에 조화를 이룰 수 있는 환경을 만들어주고
DevOps문화를 선두하는 것이 바로 DevOps 엔지니어 / DevOps 개발자 이다.
그럼 이 DevOps 엔지니어 / DevOps 개발자 ( 이하 DevOps )는 무엇을 다루어야 하고 어느 부분까지 알아야 하는가?
아래의 역량을 갖추고 있어야한다.
해당 글에선 컨테이너, CI/CD, DevOps 문화 위주로 설명
- 컨테이너(K8S, Docker....)
- CI/CD(Git, Code Build와 같은 Build단계 툴, Code Deploy와 같은 Deploy단계 툴, 파이프라인 구축)
- Script 작성 능력(Python, Shell Script, GO, JS등과 같은 서버 레벨에서 사용이 가능한 언어)
- Network에 대한 이해
- Public, Private Cloud에 대한 이해도
- Server, Database에 대한 기초이상의 이해도
그러면 아래 질문에 대한 답을 이어가는 형식으로 한번 작성해보도록 하겠다.
컨테이너
- 쿠버네티스(K8S)가 무엇인가?
- 쿠버네티스는 컨테이너 오케스트레이션 도구로서 생성할 혹은 생성이 된 여러 컨테이너들을 관리할 수 있게 도와주는 도구이다.
- 쿠버네티스(K8S)의 구조에 대하여 설명하라.
- 쿠버네티스는 가장 큰 단위인 클러스터가 있고 그 안에 노드라는 각각의 서버들이 존재하는 구조이다.
- 역할에 따라 마스터 노드와 워커노드로 분류되며 마스터 노드는 클러스터를 관리하는 컨트롤러 역할을 한다.
- 마스터 노드에서는 컨트롤을 위한 etcd, api server, scheduler 등과 같은 컴포넌트가 있다.
- 워커 노드에는 kubelet과 porxy, CRI와 같은 컴포넌트들이 있다.
- 이보다 작은 단위인 오브젝트가 있다.
- 오브젝트는 기본 오브젝트와 컨트롤러로 분류가 된다.
- 기본 오브젝트에는 크게 4가지가 존재하며, 각각 Pods, Service, Volume, NameSpace가 있다.
- 컨트롤러에는 Replicaset과 Deployment, Job, CronJobs등이 있다.
- 컨테이너 오케스트레이션의 종류 2가지 이상을 설명하라.
- 대표적으로 구글에서 만든 쿠버네티스가 있으며 다음으로는 도커에서 사용되는 도커스웜이 있다.
- CRI란 무엇인가?
- CRI는 컨테이너 런타임 인터페이스의 약자로 kubelet과 컨테이너 런타임과의 표준이다.
- CRI는 라이프사이클을 관리하는 스펙으로 gRPC기반의 API로 동작하며 플러그인 구조로 추가할 수 있다.
- CRI-O와 Docker의 차이점을 설명하라.
- CRI-O는 컨테이너 실행을 목적으로 경량화 하여 컨테이너 생성, 이미지 빌드 등의 기능을 제공하지 않는다.
- Docker는 컨테이너 생성, 이미지 빌드, 컨테이너 실행 등의 모든 기능을 제공한다.
- K8S에서 제공하는 오브젝트 중 시크릿이 있다. 시크릿을 매니페스트파일로 작성시 해당 파일에 작성된 기밀 값은 어떻게 보관할 것인가?
- K8S 1.3이상 부터는 시크릿 암호화를 지원한다. 이를 사용하여 ETCD에 Secret값을 암호화시켜 저장한다.
- NodePort와 ClusterIP의 차이점은 무엇인가?
- ClusterIP는 서비스를 클러스터 IP로 할당하여 내부에서만 접근이 가능한 반면, NodePort는 모든 노드의 특정 포트를 이용해 외부에서도 접근할 수 있도록 하는 형태이다.
- K8S가 Docker 지원을 중단한 이유가 무엇인가?
- 정확히는 Docker runtime을 중단하였다.
- Docker는 애초부터 K8S를 위해 만들어 진 것이 아니기 때문에 호환성이 없는 상황에 더해 Docker는 CRI표준을 지키지 않기 때문에 중단한 것으로 알고 있다.
- K8S 클러스터를 직접 구축하면되는데 굳이 EKS, GKE등을 사용하여 K8S를 운영하는 이유는 무엇인가?
- 가장 큰 이유로는 클라우드 서비스 제공자 측에서 마스터 노드를 관리해준다.
- 직접 마스터 노드를 EC2로 띄울 필요없이 관리가 가능하다.
- Kubelet이란 무엇인가?
- Kubelet은 클러스터의 각 노드에서 실행되는 파드 관리를 위한 에이전트이다.
- 파드에서 컨테이너가 잘 동작하는 관리를 하며 파드 스펙을 받아 헬스체크를 진행하는 구조로 구성되어 있다.
- kubeadm이란 무엇인가?
- kubeadm은 쿠버네티스에서 제공하는 클러스터 빌드를 위한 전용 커맨드라인 인터페이스이다.
- K8S에서 기본적으로 제공하는 NI가 있다. 왜 Calico, Canal과 같은 NI를 사용하는 것인가?
- 기본적으로 제공되는 kubenet이라는 CNI는 제공되는 환경이 제한적이다.
- 대표적인 Calico, Canal과 같은 플러그인을 사용하여 여러 환경에서도 사용 할 수 있도록 사용한다.
- Helm이란 무엇인가? 그리고 왜 사용하는가?
- 쿠버네티스용 오픈소스 패키지 매니저이다. Python의 pip 역할을 하는 포지션이다.
- AWS기준 ALB Controller 등을 설치하여 Ingress와 같은 역할을 하도록 사용할 수 있다.
- ETCD가 무엇인가?
- 클러스터의 정보를 담아둔 DataBase이다.
- 시스템 정보에 대한 내용을 모아두었기에 가장 민감하게 구성하여야 한다.
- 여러 워커노드를 역할 별로 노드 단위로 분리할 수 있는가? 가능하다면 어떤 방식이 사용되는가?
- 분리가 가능하다.
- Taints(테인트)를 통해서 노드가 주체가 되어 파드를 생성하지 않도록 제외 시킬 수 있다.
- nodeSelector(노드셀렉터)를 통해 사용자가 명시한 레이블을 갖고 있는 노드에만 파드를 스케줄링한다.
- affinity(어피니티)를 통해 파드를 특정 레이블이 있는 노드로 제한하는 방법도 존재한다.
- Tolerations(톨러테이션)를 파드에 적용하여 일치하는 Taints(테인트)가 존재하는 노드로 귀속시킬 수도 있다.
- Docker 이미지 빌드, 푸쉬하는 과정을 설명하라
- 작성한 dockerfile의 문법을 검사한다.
- 내용의 줄이 마지막 명령어인지 검사한다.
- 마지막 명령어가 아니라면 docker 컨테이너를 실행한다.
- 컨테이너가 실행되면 Docker file에 명시된 명령어를 실행한다.
- 명령어 실행 뒤 docker commit으로 이미지를 생성한다.
- 컨테이너를 종료한다.
- 마지막 명령어를 수행할 때까지 2번~6번 과정을 반복한다.
- kubeadm와 kubespray 두개의 k8s 배포 도구의 차이점이 무엇인가.
- kubeadm은 k8s 클러스터 자체를 배포하는데 중점을 둔 도구이다.
- kubespray는 ansible을 기반으로 하는 k8s 클러스터 인프라 배포에 중점을 둔 도구이다.
- 둘다 k8s 클러스터 환경을 구축하는데 있어서 큰 도움이 되는 오픈소스임에는 변함이 없다.
CI/CD
- 사용해본 CI툴을 말하여라
- 버전 관리 도구로 Github, CodeCommit이 있다.
- CI도구로는 Jenkins와 CodeBuild가 있다.
- 사용해본 CD툴을 말하여라
- CD툴은 CodeDeploy와 ArgoCD를 사용해보았다.
- 하버와 넥서스 중 어떤걸 사용해보았는가
- 둘다 사용해보진 않았다. 그러나, 둘중에 사용해야 한다면 하버를 사용해 DockerImage 취약점까지도 관리하고 싶다.
- 배포전략에는 여러가지가 있다. 그 중 롤링(Rolling)방식에 대한 장/단점은 무엇이 있는가?
- 장점
- Blue/Green에 비해 저렴한(리소스 사용이 적음) 배포 방식이다.
- 일부 코드가 노출 될 수는 있으나, 장애를 최소화 시킬 수 있는 배포 방식이다.
- 컨테이너 혹은 서버 별로 배포되기에 진행 단계가 길어지지 않았을 경우 롤백이 쉽다.
- 단점
- 사용자가 많은 곳이라면 오류가 있는 코드가 다수의 사용자들에게 일부 노출될 수 있다.
- 배포하는 시간이 Blue/Green에 비해 오래걸린다.
- 특정 컨테이너 혹은 서버에 트래픽이 몰려 장애가 발생할 수 있다.
- 장점
- 위에서 말한 Rolling을 포함해 가장 효과적인 배포 방법은 무엇인가?
- 하나에 문장만 가지고서 판단할 수 없다.
- 그러나 범용성있게 가장 효과적인 방식은 카나리 배포 방식이다.
- 일부 서버에게만 코드를 배포한 다음 문제가 없다면 점진적으로 배포해나가는 방식이다.
- 네트워크 흐름에 대한 컨트롤을 해야하는 문제가 있지만 감안하더라도 안정성 측면에서 가장 효율적이다.
DevOps 문화
- 카오스 엔지니어링이 무엇인지 설명하라
- 복잡한 분산 시스템 환경에서 시스템의 신뢰성을 확인하기 위해, 인위적인 혼돈(Chaos)을 가하여 시스템의 취약한 부분을 찾고 보강하는 방식의 엔지니어링 기법이다.
- 대표적으로 넷플릭스가 카오스 엔지니어링 기법을 사용하는 것으로 유명하다.
- 간단히 고의적으로 장애를 발생시켜 문제를 해결하는 방법이다.
- 애자일 방법론이란 무엇인가?
- 계획표 처럼 큰 계획을 만들지 않고 주어진 요구사항을 상황에 맞춰 작은 단위로 유연하게 개발하는 방식이다.
- 매니페스트파일을 사용하는 이유는 무엇인가?
- 매니페스트파일을 사용하면 인프라를 코드로 쉽게 관리 및 보관이 가능하다.
- 이로 인해 인프라나 오브젝트를 수정해야하는 일이 생기면 코드를 수정하고 업로드 함으로써 다운타임을 최소화 시킬 수 있다.