• 『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 이미지 빌드, 푸쉬하는 과정을 설명하라
      1. 작성한 dockerfile의 문법을 검사한다.
      2. 내용의 줄이 마지막 명령어인지 검사한다.
      3. 마지막 명령어가 아니라면 docker 컨테이너를 실행한다.
      4. 컨테이너가 실행되면 Docker file에 명시된 명령어를 실행한다.
      5. 명령어 실행 뒤 docker commit으로 이미지를 생성한다.
      6. 컨테이너를 종료한다.
      7. 마지막 명령어를 수행할 때까지 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)을 가하여 시스템의 취약한 부분을 찾고 보강하는 방식의 엔지니어링 기법이다.
      • 대표적으로 넷플릭스가 카오스 엔지니어링 기법을 사용하는 것으로 유명하다.
      • 간단히 고의적으로 장애를 발생시켜 문제를 해결하는 방법이다.

     

    • 애자일 방법론이란 무엇인가?
      • 계획표 처럼 큰 계획을 만들지 않고 주어진 요구사항을 상황에 맞춰 작은 단위로 유연하게 개발하는 방식이다.

     

    • 매니페스트파일을 사용하는 이유는 무엇인가?
      • 매니페스트파일을 사용하면 인프라를 코드로 쉽게 관리 및 보관이 가능하다.
      • 이로 인해 인프라나 오브젝트를 수정해야하는 일이 생기면 코드를 수정하고 업로드 함으로써 다운타임을 최소화 시킬 수 있다.

     

     

     

     

    댓글