Image Security
민감한 인증 정보를 안전하게 관리하면서 필요한 이미지를 적절하게 가져올 수 있는 방법이 있다.
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 |