Amazon EKS Cluster 내에서 컨테이너 이미지에 대해 승인된 내부 레지스트리를 사용하도록 사용자를 제한할 수 있다. 기본적으로 Cluster는 공개 이미지 리포지토리를 사용하도록 허용되어 있다.
먼저 Public Repository에서 nginx 이미지를 풀링하도록 허용하는 test Pod manifest를 생성한다.
cat > public-nginx.yaml <<EOF
kind: Pod
apiVersion: v1
metadata:
name: nginx
labels:
app: nginx
namespace: default
spec:
containers:
- image: nginx
name: nginx
EOF
nginx Pod를 생성한다.
kubectl apply -f public-nginx.yaml
정상적으로 생성된 것을 확인 한 이후 다시 지워본다.
kubectl delete -f public-nginx.yaml
ㅁ OPA Policy Solution
1. rego를 사용하여 OPA 정책을 만든다.
rego에 정리된 정책은 Pod 이미지
cat > image_source.rego <<EOF
package kubernetes.admission
deny[msg] {
input.request.kind.kind == "Pod"
image := input.request.object.spec.containers[_].image
not startswith(image, "${ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com")
msg := sprintf("image '%v' comes from untrusted registry", [image])
}
EOF
The policy written in rego denies all the authenticated and authorised requests from the Kubernetes API server if the Pod image source does not start with ${ACCOUNT_ID}.dkr.ecr.us-west-2.amazonaws.com and returns an error message image '%v' comes from untrusted registry.
2. OPA 정책을 ConfigMapp으로 배포
kubectl create configmap image-source --from-file=image_source.rego
OPA Validating Webhook Configuration에서 정책 구현을 확인
kubectl get configmap image-source -o jsonpath="{.metadata.annotations}"
3. Private ECR Repository 생성
nginx 이름의 ECR repository 생성
aws ecr create-repository --repository-name nginx
ECR API에서 저장소 이름을 가져와서 로컬 nginx 인스턴스에 Tag를 지정할 수 있다.
export REPOSITORY=$(aws ecr describe-repositories --repository-name nginx --query "repositories[0].repositoryUri" --output text)
Docker Hub Public nginx를 Local로 가져와서 Tag를 다시 지정한다.
docker pull nginx
latest repository 이름으로 Tag를 다시 지정하고 이미지를 자신의 Amazon ECR로 Push 한다. Amazon ECR에 Login 하여 구성한다.
aws ecr get-login-password \
--region <region> \
| docker login \
--username AWS \
--password-stdin <aws_account_id>.dkr.ecr.<region>.amazonaws.com
여기서 region은 실제 구성되는 region, aws_account_id 는 ECR Console에서 확인하여 적용한다.
로컬 Docker 이미지를 등록하여 이미지 ID 를 캡쳐한다.
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 6084105296a9 5 days ago 133MB
lambci/lambda python3.8 094248252696 6 weeks ago 524MB
lambci/lambda nodejs12.x 22a4ada8399c 6 weeks ago 390MB
lambci/lambda nodejs10.x db93be728e7b 6 weeks ago 385MB
lambci/lambda python3.7 22b4b6fd9260 6 weeks ago 946MB
lambci/lambda python3.6 177c85a10179 6 weeks ago 894MB
lambci/lambda python2.7 d96a01fe4c80 6 weeks ago 763MB
lambci/lambda nodejs8.10 5754fee26e6e 6 weeks ago 813MB
nginx의 Tag ID를 기록하여 ECR 저장소에 다시 Tag를 지정한다.
docker tag <IMAGE ID> $REPOSITORY
docker tag latest $REPOSITORY
Amazon ECR에 최신 태그 푸시
docker push ${REPOSITORY}:latest
4. Private ECR Repository를 사용하는 Pod Manifest를 만든다.
cat > private-nginx.yaml <<EOF
kind: Pod
apiVersion: v1
metadata:
name: nginx
labels:
app: nginx
namespace: default
spec:
containers:
- image: ${REPOSITORY}:latest
name: nginx
EOF
Test 수행
1. public repository를 사용하여 pod 사용 테스트 --> 실패해야 함
kubectl apply -f public-nginx.yaml
2. private repository를 사용하여 pod 사용 테스트 --> 성공해야 함
kubectl apply -f private-nginx.yaml
'AWS EKS 실습 > EKS Intermediate' 카테고리의 다른 글
Deploying Jenkins for Kubernetes (0) | 2021.03.19 |
---|---|
Advanced POD CPU and Memory management (0) | 2021.03.18 |
Pod Priority And Preemption (0) | 2021.03.18 |
Resource Quotas (0) | 2021.03.18 |
Resource management 기본 (0) | 2021.03.18 |