publicclassEckDemoVpcextendsStack { public Vpc vpc;
publicEckDemoVpc(final Construct scope, final String id, final StackProps props) { super(scope, id, props); vpc = Vpc.Builder.create(this, "eks-work-VPC") .vpcName("eks-work-VPC") .maxAzs(3) // Default is all AZs in region .cidr("10.0.0.0/16") .enableDnsSupport(true) .enableDnsHostnames(true) .build(); } }
publicclassEckDemoClusterextendsStack {
publicEckDemoCluster(final Construct scope, final String id, final StackProps props, Vpc vpc) { super(scope, id, props); // controlplan 이 사용할 iam 지정 // https://docs.aws.amazon.com/eks/latest/userguide/service_IAM_role.html#create-service-role IManagedPolicypolicy= ManagedPolicy.fromAwsManagedPolicyName("AmazonEKSClusterPolicy"); RoleeksClusterRole= Role.Builder.create(this, "eks-work-control-plane-role") .roleName("eks-work-control-plane-role") .assumedBy(ServicePrincipal.Builder.create("eks.amazonaws.com").build()) .managedPolicies(Collections.singletonList(policy)) .build(); // 사용자가 cluster 에 접근하기 위한 role RoleclusterAdmin= Role.Builder.create(this, "eks-work-kubectl-role") .roleName("eks-work-kubectl-role") .assumedBy(newAccountRootPrincipal()) .build(); // eks cluster 생성 ClustereksCluster= Cluster.Builder.create(this, "eks-work-cluster") .vpc(vpc) .clusterName("eks-work-cluster") .version(KubernetesVersion.V1_26) .defaultCapacity(2) .defaultCapacityInstance(InstanceType.of(InstanceClass.T2, InstanceSize.SMALL)) .defaultCapacityType(DefaultCapacityType.NODEGROUP) .role(eksClusterRole) // control plane role .mastersRole(clusterAdmin) // kubectl access role .build(); // node 에 cloudwatch 권한 추가 eksCluster.getDefaultNodegroup().getRole() .addManagedPolicy(ManagedPolicy.fromAwsManagedPolicyName("CloudWatchAgentServerPolicy")); } }
# custer 이름 지정 export CLUSTER_NAME=eks-work-cluster export ACCOUNT_ID=$(aws sts get-caller-identity --query "Account" --output text) # Amazon EBS CSI 플러그인 위한 role 추가 eksctl create iamserviceaccount \ --name ebs-csi-controller-sa \ --namespace kube-system \ --cluster ${CLUSTER_NAME} \ --role-name AmazonEKS_EBS_CSI_DriverRole \ --role-only \ --attach-policy-arn arn:aws:iam::aws:policy/service-role/AmazonEBSCSIDriverPolicy \ --approve # Amazon EBS CSI 플러그 에드온 확인(버전) aws eks describe-addon-versions --addon-name aws-ebs-csi-driver # 드라이버 설치 eksctl create addon --name aws-ebs-csi-driver \ --cluster ${CLUSTER_NAME} \ --service-account-role-arn arn:aws:iam::${ACCOUNT_ID}:role/AmazonEKS_EBS_CSI_DriverRole --force # 설치된 드라이버 버전 확인 eksctl get addon --name aws-ebs-csi-driver --cluster ${CLUSTER_NAME} # 드라이버 업데이트 명령어 eksctl update addon --name aws-ebs-csi-driver \ --version ${EBS_DRIVER_UPDATE_VERSION} \ --cluster ${CLUSTER_NAME} --force # 드라이버 제거 eksctl delete addon --cluster ${CLUSTER_NAME} --name aws-ebs-csi-driver --preserve
GP3
gp3: General Purpose SSD 3rd generation, 범용 SSD 를 사용한 볼륨 타입
기존에 gp2 방식은 IOPS = 50 × 3 = 150, 50GP 만큼 IOPS 속도를 낼 수 있도록 구성되어 있었으나 AWS 인프라 규모가 거대해지면서 적은용량 스토리지 pool 용량에 상관없이 IOPS 3000, Throughput 125MiB/s 고정으로 제공한다.
수십만 볼륨을 풀링해서 관리가능해지면서 gp3 가 표준으로 자리 잡았다.
ESO + IRSA
External Secrets Operator(ESO) + IAM Roles for Service Accounts(IRSA)
위 두가지 조합을 사용하여 Aws Secret Manager 에 있는 값을 K8s Secret 에 동기화 하는 방법이다.
실행 후 아래 명령어로 LoadBalancer CLUSTER-IP 확인 AWS Console EC2-로드 밸런서 탭에서도 Classic Load Balancer 가 생성된 것 확인
1 2 3 4 5 6 7 8
kubectl get all NAME READY STATUS RESTARTS AGE pod/calc-deployment-5567f6f69f-6s4fp 1/1 Running 0 9h pod/greet-deployment-69b5fff8df-vt7mg 1/1 Running 1 (9h ago) 9h
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/calc-service LoadBalancer 172.20.223.154 ....ap-northeast-2.elb.amazonaws.com 8080:31922/TCP 9h service/greet-service LoadBalancer 172.20.227.106 ....ap-northeast-2.elb.amazonaws.com 8080:31787/TCP 9h
curl 명령어로 configmap 데이터와 service 간 통신이 정상적으로 이루어짐을 확인할 수 있다.
fluentd.yaml 파일에는 DaemonSet 설정 뿐 아니라 [ServiceAccount, ClusterRole, ConfigMap] 리소스가 설정된다. 특히 ConfigMap 안에 fluentd 사용을 위한 XML 형식의 conf 가 들어가 있다.
1 2 3 4 5 6
kubectl apply -f fluentd.yaml # serviceaccount/fluentd created # clusterrole.rbac.authorization.k8s.io/fluentd-role created # clusterrolebinding.rbac.authorization.k8s.io/fluentd-role-binding created # configmap/fluentd-config created # daemonset.apps/fluentd-cloudwatch created
AWS Console 에서 아래 경로를 따라 이동하면
1
CloudWatch > 로그 그룹 > /aws/containerinsights/eks-work-cluster/application
지금까지 만들었던 [greet, calc, region] 서비스에 대한 로그들이 생성되어 있다.