본문 바로가기
MLOps/Doker & Kubernetes

Udemy CKA 강의 정리 167: Image Security

by 공부하는 무니 2023. 1. 19.
반응형

해당 내용은 Udemy의 Certified Kubernetes Administrator (CKA) with Practice Tests 강의를 공부한 내용입니다. 내용을 그대로 번역하기보다는, 제가 이해하기 쉬운 대로 수정한 부분들이 있습니다.

⚠️ 영어 독해가 많이 부족합니다. 틀린 내용이 있으면 알려주시면 감사하겠습니다.


이번 강의에서는 Image Security에 대해 이야기 하겠습니다. 

Image

이미지 이름의 기본사항부터 시작한 다음 secure 이미지 리포지토리 및 secure 리포지토리의 이미지를 사용하도록 파드를 구성하는 방법에 대해 알아봅니다. 해당 코스 과정 전반에 걸쳐 web apps, databases, Redis cache 등과 같은 다양한 종류의 애플리케이션을 호스팅하는 파드를 배포했습니다. 간단한 파드 definition 파일을 봅시다.

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
spec:
  containers:
  - name: nginx
    image: nginx

여기에서는 nginx 이미지를 사용하여 nginx 컨테이너를 배포했습니다. 이 이미지 이름을 자세히 살펴보겠습니다. 이름은 nginx이지만 이 이미지는 실제로 무엇이며, 어디에서 가져오는 걸까요?

이 이름은 Docker의 이미지 명명 규칙을 따릅니다. 여기서 nginx는 이미지 또는 레포지토리 이름입니다. nginx라고 하면 실제로 library/nginx입니다. 첫 번째 부분은 사용자 또는 계정 이름을 나타냅니다. 따라서 사용자 또는 계정 이름을 제공하지 않으면 라이브러리로 간주됩니다. Library는 Docker의 공식 이미지가 저장되는 default 계정의 이름입니다. 이러한 이미지는 공식 이미지의 검토 및 게시를 담당하는 전담 팀에서 유지 관리합니다.

자신의 계정을 만들고 그 아래에 자신의 리포지토리 또는 이미지를 만들려면 비슷한 패턴을 사용합니다. 따라서 라이브러리 대신 귀하의 이름 또는 귀하의 회사 이름이 될 것입니다.  이러한 이미지는 어디에 저장되고 어디에서 가져올까요? 이미지를 가져올 위치를 지정하지 않았으므로 Docker의 default 레지스트리인 Docker 허브로 가정합니다. DNS name은 docker.io입니다. 레지스트리는 모든 이미지가 저장되는 곳입니다. 새 이미지를 만들거나 이미지를 업데이트할 때마다 이미지를 레지스트리에 푸시하고 누군가 이 애플리케이션을 배포할 때마다 레지스트리에서 가져옵니다. 다른 인기있는 레지스트리도 많이 있습니다. Google 레지스트리는 gcr.io 입니다. 여기에 클러스터에서 end-to-end 테스트를 수행하는 데 사용되는 이미지 등 많은 Kubernetes 관련 이미지가 저장도됩니다. 누구나 다운로드하고 액세스할 수 있는 공개적으로 액세스 가능한 이미지입니다.

대중에게 공개해서는 안 되는 사내 구축 애플리케이션이 있는 경우 내부 private 레지스트리를 호스팅하는 것이 좋은 해결책이 될 수 있습니다.  AWS, Azure 또는 GCP와 같은 많은 클라우드 서비스가 private 레지스트리를 제공합니다. 

Private Registry

Docker 허브, Google 레지스트리 또는 내부 개인 레지스트리에 있는 이러한 솔루션에서 자격 증명 세트를 사용하여 액세스할 수 있도록 리포지토리를 비공개로 만들도록 선택할 수 있습니다. Docker의 관점에서 프라이빗 이미지를 사용하여 컨테이너를 실행하려면 먼저 Docker 로그인 커맨드를 사용하여 프라이빗 레지스트리에 로그인합니다.

$ docker login private-registry.io

자격 증명(credential)을 입력합니다. 성공하면 프라이빗 레지스트리의 이미지를 사용하여 애플리케이션을 실행합니다. 파드 definition 파일로 돌아가 개인 레지스트리의 이미지를 사용하기 위해 이미지 이름을 개인 레지스트리의 전체 경로로 바꿉니다. 그러나 로그인 부분인 인증을 어떻게 구현합니까? Kubernetes는 개인 레지스트리에 액세스하기 위한 자격 증명을 어떻게 얻습니까?

$ docker run private-registry.io/apps/internal-app

Kubernetes 내에서 워커 노드의 Docker 런타임에 의해 이미지가 pull되고 실행된다는 것을 알고 있습니다. 워커 노드의 도커 실행 시간에 credential을 어떻게 전달합니까? 이를 위해 먼저 자격 증명이 있는 secret 오브젝트를 만듭니다. secret은 도커 레지스트리 유형이며 이름을 regcred로 지정합니다.

Docker 레지스트리는 Docker 자격 증명을 저장하기 위해 구축된 default 제공 secret 유형입니다. 그런 다음 레지스트리 서버 이름, 레지스트리에 액세스하기 위한 username, 암호 및 사용자의 이메일 주소를 지정합니다. 그런 다음 이미지 풀 시크릿 섹션 아래의 파드 definition 파일 내에 시크릿을 지정합니다. 파드이 생성되면 Kubernetes 또는 워커 노드의 kubelet은 시크릿의 자격 증명을 사용하여 이미지를 가져옵니다. 

반응형

댓글