본문 바로가기

AWS EKS 실습

11. (보안) EKSCTL을 사용한 eks 구성 (기존 VPC)

기존에 구성한 VPC에 EKS를 구성하기 위해서는 다음과 같은 스크립트가 필요하다.

cat << EOF > eksnewelite.yaml
---
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig

metadata:
  name: newelite-eks-cluster
  region: ${AWS_REGION}
  version: "1.19"

vpc:
  subnets:
    private:
      ap-northeast-2a: { id: subnet-0624cd75bfb9cc184 }
      ap-northeast-2b: { id: subnet-01f02fbb82988f048 }
      ap-northeast-2c: { id: subnet-0cd8b79944171649a }
      
managedNodeGroups:
- name: newelite-nodegroup
  desiredCapacity: 3
  privateNetworking: true
  instanceType: t3.small
  ssh:
    enableSsm: true

# To enable all of the control plane logs, uncomment below:
# cloudWatch:
#  clusterLogging:
#    enableTypes: ["*"]

secretsEncryption:
  keyARN: ${MASTER_ARN}
EOF

metadata.name과 managedNodeGroups[*].name 부분만 원하는 이름으로 고친다.

subnet 영역은 생성되어 있는 subnet의 ID를 찾아서 설정해준다.

 

기존 Subnet에 생성하기 위해서는 Subnet의 auto-assign IP setting 이 되어 있어야 한다.

Subnet 선택 > Action > Modify auto-assing IP settings에서 설정한다.

설정이 되었으면 eksctl로 새로운 cluster를 구성한다.

eksctl create cluster -f newelite-eks.yaml

설치 완료 메시지에 kubeconfig 파일은 다음과 같이 보여진다.

 saved kubeconfig as "/home/ec2-user/.kube/config"

 

정상적으로 설치가 완료되면 다음과 같이 확인한다.

$ kubectl get nodes
NAME                                             STATUS   ROLES    AGE   VERSION
ip-10-0-11-156.ap-northeast-2.compute.internal   Ready    <none>   97s   v1.19.6-eks-49a6c0
ip-10-0-12-176.ap-northeast-2.compute.internal   Ready    <none>   99s   v1.19.6-eks-49a6c0
ip-10-0-13-121.ap-northeast-2.compute.internal   Ready    <none>   99s   v1.19.6-eks-49a6c0

$ kubectl get all -A
NAMESPACE     NAME                           READY   STATUS    RESTARTS   AGE
kube-system   pod/aws-node-9wndk             1/1     Running   0          104s
kube-system   pod/aws-node-gk9h5             1/1     Running   0          105s
kube-system   pod/aws-node-pv2l5             1/1     Running   0          105s
kube-system   pod/coredns-78fb67b999-fv74d   1/1     Running   0          8m5s
kube-system   pod/coredns-78fb67b999-tjqc5   1/1     Running   0          8m5s
kube-system   pod/kube-proxy-5p2w2           1/1     Running   0          105s
kube-system   pod/kube-proxy-7cp7j           1/1     Running   0          105s
kube-system   pod/kube-proxy-bc4b9           1/1     Running   0          104s

NAMESPACE     NAME                 TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)         AGE
default       service/kubernetes   ClusterIP   172.20.0.1    <none>        443/TCP         8m18s
kube-system   service/kube-dns     ClusterIP   172.20.0.10   <none>        53/UDP,53/TCP   8m12s

NAMESPACE     NAME                        DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
kube-system   daemonset.apps/aws-node     3         3         3       3            3           <none>          8m12s
kube-system   daemonset.apps/kube-proxy   3         3         3       3            3           <none>          8m11s

NAMESPACE     NAME                      READY   UP-TO-DATE   AVAILABLE   AGE
kube-system   deployment.apps/coredns   2/2     2            2           8m12s

NAMESPACE     NAME                                 DESIRED   CURRENT   READY   AGE
kube-system   replicaset.apps/coredns-78fb67b999   2         2         2       8m5s

EKS로 구성되어 있기 때문에 실제 kube-system namespace에서 보여야 하는 etcd, apiserver, controllermanager 등이 보이지 않는다.

 

앞으로 사용할 작업자 Role 이름을 Export 하여 bash_profile에 적용한다.

STACK_NAME=$(eksctl get nodegroup --cluster tango-bmt-eks -o json | jq -r '.[].StackName')
ROLE_NAME=$(aws cloudformation describe-stack-resources --stack-name $STACK_NAME | jq -r '.StackResources[] | select(.ResourceType=="AWS::IAM::Role") | .PhysicalResourceId')
echo "export ROLE_NAME=${ROLE_NAME}" | tee -a ~/.bash_profile

EKS Console에서 Kubernetes Cluster 객체도 볼수 있으며 이를 위해서는 추가적인 자격 증명이 필요하다.

 

IAM 사용자 역할을 아래 처럼 구성하여 EKS CONSOLE Credential을 구성한다.

c9builder=$(aws cloud9 describe-environment-memberships --environment-id=$C9_PID | jq -r '.memberships[].userArn')
if echo ${c9builder} | grep -q user; then
	rolearn=${c9builder}
        echo Role ARN: ${rolearn}
elif echo ${c9builder} | grep -q assumed-role; then
        assumedrolename=$(echo ${c9builder} | awk -F/ '{print $(NF-1)}')
        rolearn=$(aws iam get-role --role-name ${assumedrolename} --query Role.Arn --output text) 
        echo Role ARN: ${rolearn}
fi

아래와 같은 Role ARN을 확인할 수 있다. 

$ if echo ${c9builder} | grep -q user; then
> rolearn=${c9builder}
>         echo Role ARN: ${rolearn}
> elif echo ${c9builder} | grep -q assumed-role; then
>         assumedrolename=$(echo ${c9builder} | awk -F/ '{print $(NF-1)}')
>         rolearn=$(aws iam get-role --role-name ${assumedrolename} --query Role.Arn --output text) 
>         echo Role ARN: ${rolearn}
> fi

Role ARN: arn:aws:iam::369647062832:role/aws-reserved/sso.amazonaws.com/ap-northeast-2/AWSReservedSSO_SandboxAdminAccess_9bb4aaf21b4a335b

이 ARN을 사용하여  Cluster Credential Mapping을 생성한다.

eksctl create iamidentitymapping --cluster tango-bmt-eks --arn ${rolearn} --group system:masters --username admin

 

2021-05-08 12:29:03 [ℹ]  eksctl version 0.44.0
2021-05-08 12:29:03 [ℹ]  using region ap-northeast-2
2021-05-08 12:29:03 [ℹ]  adding identity "arn:aws:iam::369647062832:role/aws-reserved/sso.amazonaws.com/ap-northeast-2/AWSReservedSSO_SandboxAdminAccess_9bb4aaf21b4a335b" to auth ConfigMap

EKS 환경의 aws-auth configmap에 정상적으로 저장되었는지 확인한다. 

$ kubectl describe configmap -n kube-system aws-auth
Name:         aws-auth
Namespace:    kube-system
Labels:       <none>
Annotations:  <none>

Data
====
mapRoles:
----
- groups:
  - system:bootstrappers
  - system:nodes
  rolearn: arn:aws:iam::369647062832:role/eksctl-tango-bmt-eks-nodegroup-ta-NodeInstanceRole-WC6BPL6I9XOT
  username: system:node:{{EC2PrivateDNSName}}
- groups:
  - system:masters
  rolearn: arn:aws:iam::369647062832:role/aws-reserved/sso.amazonaws.com/ap-northeast-2/AWSReservedSSO_SandboxAdminAccess_9bb4aaf21b4a335b
  username: admin

mapUsers:
----
[]

Events:  <none>

 

'AWS EKS 실습' 카테고리의 다른 글

EKS를 위한 EFS 생성  (0) 2021.05.08