본문 바로가기

DevOps/쿠버네티스(Kubernetes)

[CKA] Kubernetes Image Security

Kubernetes Image Security

이미지 이름의 기본부터 시작하여 보안 이미지 저장소와 안전한 저장소의 이미지를 사용하도록 포드를 구성하는 방법에 대해 알아보자. 
웹 애플리케이션 및 데이터베이스, Rediscache 등과 같은 다양한 종류의 pod를 생성해보았다.

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


간단한 pod 정의 파일로 시작하자. 예를 들어, 여기서는 Nginx 이미지를 사용하여 Nginx 컨테이너를 배포했다.
이 이미지 이름을 자세히 살펴보면 이름은 Nginx이지만 이 이미지는 무엇이고 이 이미지는 어디에서 가져온 것일까?

이 이름은 도커의 이미지 명명 규칙을 따른다. 여기서 Nginx는 이미지 또는 리포지토리 이름이다. 당신이 Nginx라고 말할 때, 그것은 사실 library/nginx이다. 첫 번째 부분은 사용자 또는 계정 이름을 나타낸다. 따라서 사용자 또는 계정 이름을 제공하지 않으면 라이브러리로 간주된다. 라이브러리는 도커의 공식 이미지가 저장되는 기본 계정의 이름이다.

 이 이미지들은 어디에 저장되고 어디서 가져올까? 이러한 이미지를 가져올 위치를 지정하지 않았기 때문에 도커의 기본 레지스트리인 도커 허브로 추정된다. DNS 이름은 docker.io이다. 레지스트리는 모든 이미지가 저장되는 곳이다. 새 이미지를 만들거나 이미지를 업데이트할 때마다 레지스트리에 push 한다. 응용프로그램을 배포할 때마다 레지스트리에서 가져온다.

다른 인기 있는 등록소들도 많이 있다. 구글의 레지스트리는 gcr.io에 있으며, 클러스터에서 엔드 투 엔드 테스트를 수행하는 데 사용되는 것과 같은 많은 쿠버네티스 관련 이미지가 저장되어 있다. 이것들은 모두 누구나 다운로드하고 접근할 수 있는 공개적으로 접근 가능한 이미지들이다.

공용으로 제공해서는 안 되는 애플리케이션이 사내에 구축되어 있는 경우 내부 개인 레지스트리를 호스팅하는 것이 좋은 해결책이 될 수 있다. AWS, Azure 또는 GCP와 같은 많은 클라우드 서비스 공급자는 기본적으로 개인 레지스트리를 제공한다. Dockerhud, Google의 레지스트리 또는 내부 개인 레지스트리에 있는 이러한 솔루션에서 자격 증명 집합을 사용하여 액세스할 수 있도록 리포지토리를 비공개로 설정할 수 있다.

도커의 관점에서, 개인 이미지를 사용하여 컨테이너를 실행하려면, 먼저 Docker login 명령을 사용하여 개인 레지스트리에 로그인하고 자격 증명을 입력한다. 성공하면 개인 레지스트리의 이미지를 사용하여 응용프로그램을 실행한다.


Pod 정의 파일로 돌아가 개인 레지스트리의 이미지를 사용하려면 이미지 이름을 개인 레지스트리의 전체 경로로 바꾼다. 하지만 로그인 부분 인증을 어떻게 구현할까? Kubernetes는 개인 레지스트리에 액세스하기 위한 자격 증명을 어떻게 얻을까?

Kubernetes 내에서, 우리는 이미지가 작업자 노드에서 도커 런타임에 의해 당겨지고 실행된다는 것을 알고 있다. 작업자 노드에서 도커 런타임에 자격 증명을 전달하는 방법은 무엇일까? 이를 위해 먼저 자격 증명이 포함된 secret object를 만든다. secret은 도커 등록부 유형이고 우리는 그것을 regred라고 명명한다.

 

$ kubectl create secret docker-registry regcred \
    --docker-server=private-registry.io \
    --docker-username=registry-user \
    --docker-password=registry-password \
    --docker-email=egistry-user@org.com


# nginx-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
spec:
  containers:
  - name: nginx
    image:
  imagePullSecrets:
  - name: regcred


Docker 레지스트리는 Docker 자격 증명을 저장하기 위해 만들어진 기본 제공 secret 유형이다. 그런 다음 레지스트리 서버 이름, 레지스트리에 액세스할 사용자 이름, 암호 및 사용자의 이메일 주소를 지정한다. 그런 다음 imagePullSecrets에서 포드 정의 파일 내부의 시크릿을 지정한다. Pod가 생성되면 작업자 노드의 Kubernetes 또는 Kubelet은 비밀의 자격 증명을 사용하여 이미지를 가져온다.



 

출처: https://www.udemy.com/course/certified-kubernetes-administrator-with-practice-tests/learn/lecture/14296114#announcements

'DevOps > 쿠버네티스(Kubernetes)' 카테고리의 다른 글

[CKA] Volume Driver Plugins in Docker  (0) 2023.01.27
[CKA] Network Policy  (0) 2023.01.14
[CKA] Kubernetes TLS  (0) 2022.12.11
[CKA] Kubernetes drain/cordon/uncordon  (0) 2022.11.24
[CKA] 쿠버네티스 ConfigMap 구성하기  (0) 2022.11.14