본문 바로가기

Container/Kubernetes

[K8S] Image Security

Image Security

민감한 인증 정보를 안전하게 관리하면서 필요한 이미지를 적절하게 가져올 수 있는 방법이 있다.

출처 : certified-kubernetes-administrator-with-practice-tests

Google의 Registry : gcr.io/

 

만약 내부에서만 사용되어야 하는 image라면 Internal Registry를 만들어서 사용하면 되며, GCP, AWS 등의 CSP들은 기본적으로 private registry를 제공한다. 이러한 Private Registry에서 이미지를 가져오려면 인증 정보가 필요한데, 인증 정보는 Secret을 통해 관리할 수 있다. ( Secret은  docker-registry 타입을 사용하여 생성된다.)

 

Secret은 프라이빗 컨테이너 이미지 레지스트리에 접근하기 위한 인증 정보를 안전하게 저장하고 사용할 수 있게 해준다.

 

Secret을 사용한 프라이빗 레지스트리 인증

 

1. docker-registry 타입의 Secret 생성:

  • 프라이빗 레지스트리의 로그인 정보를 포함하는 Secret을 생성할 수 있다.
    • kubectl create secret docker-registry 명령을 사용
root@controlplane ~ ➜  kubectl create secret 
Create a secret with specified type.

 A docker-registry type secret is for accessing a container registry.

 A generic type secret indicate an Opaque secret type.

 A tls type secret holds TLS certificate and its associated key.

Available Commands:
  docker-registry   Create a secret for use with a Docker registry
  generic           Create a secret from a local file, directory, or literal
value
  tls               Create a TLS secret
# Create a new secret for use with Docker registries.
$ kubectl create secret docker-registry my-registry-secret \
  --docker-server=<your-registry-server> \
  --docker-username=<your-username> \
  --docker-password=<your-password> \
  --docker-email=<your-email>
  
  # <your-registry-server>: 프라이빗 레지스트리의 URL.
  # <your-username>: 레지스트리에 사용할 사용자 이름.
  # <your-password>: 사용자 비밀번호.
  # <your-email>: 사용자 이메일 (일부 레지스트리는 이메일을 필요로 할 수 있음).

 

2. Secret을 사용한 이미지 풀링:

  • 생성한 Secret을 사용하여 파드가 이미지를 풀링할 수 있도록 설정한다. 👉 imagePullSecrets 필드에 Secret의 이름을 지정
apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-container
    image: <your-image> # 프라이빗 레지스트리에서 가져올 이미지의 경로
  imagePullSecrets:
  - name: my-registry-secret

 

 

참고: https://kubernetes.io/docs/concepts/containers/images/#specifying-imagepullsecrets-on-a-pod

https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/

 

실습]

 

root@controlplane ~ ➜ kubectl get deploy
NAME   READY   UP-TO-DATE   AVAILABLE   AGE
web    2/2     2            2           2m12s

root@controlplane ~ ➜  kubectl describe deploy web
Name:                   web
Namespace:              default
CreationTimestamp:      Mon, 03 Feb 2025 10:46:42 +0000
Labels:                 app=web
Annotations:            deployment.kubernetes.io/revision: 1
Selector:               app=web
Replicas:               2 desired | 2 updated | 2 total | 2 available | 0 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
Pod Template:
  Labels:  app=web
  Containers:
   nginx:
    Image:         nginx:alpine  # 이거를 Private Registry로 수정하려 한다.
    
root@controlplane ~ ➜  kubectl edit deploy web
...
    spec:
      containers:
      - image: myprivateregistry.com:5000/nginx:alpine

 

root@controlplane ~ ➜  kubectl get pods
NAME                  READY   STATUS         RESTARTS   AGE
web-749fcb599-2t67x   0/1     ErrImagePull   0          58s # 새로 생긴 Pod에 ErrImagePull 발생
web-cbfbbd684-bjkns   1/1     Running        0          6m44s
web-cbfbbd684-cq56k   1/1     Running        0          6m44s

root@controlplane ~ ➜  kubectl describe pod web-749fcb599-2t67x
Name:             web-749fcb599-2t67x
...
Events:
  Type     Reason     Age                From               Message
  ----     ------     ----               ----               -------
  Normal   Scheduled  92s                default-scheduler  Successfully assigned default/web-749fcb599-2t67x to controlplane
  Normal   Pulling    52s (x3 over 92s)  kubelet            Pulling image "myprivateregistry.com:5000/nginx:alpine"
  Warning  Failed     52s (x3 over 92s)  kubelet            Failed to pull image "myprivateregistry.com:5000/nginx:alpine": failed to pull and unpack image "myprivateregistry.com:5000/nginx:alpine": failed to resolve reference "myprivateregistry.com:5000/nginx:alpine": pull access denied, repository does not exist or may require authorization: authorization failed: no basic auth credentials
  Warning  Failed     52s (x3 over 92s)  kubelet            Error: ErrImagePull
  Normal   BackOff    15s (x5 over 91s)  kubelet            Back-off pulling image "myprivateregistry.com:5000/nginx:alpine"
  Warning  Failed     15s (x5 over 91s)  kubelet            Error: ImagePullBackOff
  # 권한이 없어서 이미지를 가져오지 못하고 있다.

 

  • Registry에 접속하기 위해 필요한 Credential인 Secret object 생성
root@controlplane ~ ➜ kubectl create secret docker-registry private-reg-cred --docker-server=myprivateregistry.com:5000 --docker-username=dock_user --docker-password=dock
_password --docker-email=dock_user@myprivateregistry.com
secret/private-reg-cred created

root@controlplane ~ ➜  kubectl get secrets 
NAME               TYPE                             DATA   AGE
private-reg-cred   kubernetes.io/dockerconfigjson   1      60s



root@controlplane ~ ➜  kubectl edit deploy web
deployment.apps/web edited

    spec: 
      imagePullSecrets:
        name: private-reg-cred
반응형

'Container > Kubernetes' 카테고리의 다른 글

[K8S] Security Context  (0) 2025.02.03
[K8S] Service Account(SA)  (0) 2025.02.03
[K8S] ClusterRole/ClusterRoleBinding  (0) 2025.02.03
[K8S] api-resources  (0) 2025.01.23
[K8S] Authorization  (1) 2025.01.20