본문 바로가기

Computer Science/Kubernetes(CKA) 자격증 준비

Kubernetes 정리 167: Image Security

1. 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 계정의 이름입니다. 이러한 이미지는 공식 이미지의 검토 및 게시를 담당하는 전담 팀에서 유지 관리합니다.

자신의 계정을 만들고 그 아래에 자신의 리포지토리 또는 이미지를 만들려면 비슷한 패턴을 사용합니다. 따라서 라이브러리 대신 귀하의 이름 또는 귀하의 회사 이름이 될 것입니다.

 이러한 이미지는 어디에 저장되고 어디에서 가져올까요?

대중에게 공개해서는 안 되는 사내 구축 애플리케이션이 있는 경우 내부 private 레지스트리를 호스팅하는 것이 좋은 해결책이 될 수 있습니다.

 

2. Private Registry

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

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

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

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

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