AWS EKS

Elastic Kubernetes Service(EKS)

쿠버네티스 클러스터 배포

클러스터(Cluster)

쿠버네티스 기본 단위
여러 개의 노드(서버) → 하나의 관리 가능한 그룹으로 묶은 것

구성

Control Plane: 클러스터 관리 영역
API 서버, 스케줄러, 컨트롤러 실행
Node(노드): 애플리케이션 워크로드(컨테이너)를 실제로 실행하는 워커 서버
클러스터 내에서 실제 애플리케이션이 실행되는 물리적/가상 서버
Kubelet: 노드에서 실행되는 쿠버네티스 에이전트, API 서버와 통신하며 컨테이너 관리
Contianer Runtime: 컨테이너 실행하는 도구, ex. Docker, containered
Kube-proxy: 네트워크 라우팅 처리
⇒ 노드) 실제 애플리케이션 실행/ 클러스터 내에서 애플리케이션의 컨테이너(Pod)를 실제로 실행
⇒ 클러스터) 배포된 애플리케이션 관리/ 워크로드 실행, 배포 관리, 리소스 할당, 스케일링 등 담당

Helm

쿠버네티스의 패키지 매니저
쿠버네티스 애플리케이션(Deployment, Service, ConfigMap 등) 정의 → Chart라는 구조화된 형식으로 관리

구성

Chart: 쿠버네티스 애플리케이션의 설정 파일 모음
values.yaml, templates/ 등
Release: Helm ~> 클러스터에 배포된 특정 Chart의 실행 인스턴스
⇒ 헬름) 클러스터에 배포 도구/ 복잡한 쿠버네티스 애플리케이션을 배포, 업그레이드, 롤백할 수 있도록 도움

흐름

1.
클러스터 생성: EKS에서 클러스터, Control Plane이 만들어짐
2.
노드 그룹 추가: 워크로드 실행할 워커 노드 구성
3.
Helm으로 애플리케이션 배포
4.
실행
a.
클러스터: Helm으로 배포된 애플리케이션 관리
b.
노드: 클러스터의 명령 받아 Pod 실행

순서

터미널

eksctl 설치

AWS 설치

aws configure

AWS 콘솔

1. VPC 생성

2. 클러스터 생성

IAM 생성

클러스터 구성 및 생성

vi cluster-config.yaml
apiVersion: eksctl.io/v1alpha5 kind: ClusterConfig metadata: name: web-quickstart region: ap-northeast-1 managedNodeGroups: - name: eks-mng instanceType: t3.large desiredCapacity: 3 iam: withOIDC: true serviceAccounts: - metadata: name: aws-load-balancer-controller namespace: kube-system wellKnownPolicies: awsLoadBalancerController: true addons: - name: aws-ebs-csi-driver wellKnownPolicies: # Adds an IAM service account ebsCSIController: true
Bash
복사
eksctl create cluster -f cluster-config.yaml
export CLUSTER_REGION=ap-northeast-1
export CLUSTER_VPC=$(aws eks describe-cluster --name plantify --region $CLUSTER_REGION --query "cluster.resourcesVpcConfig.vpcId" --output text)

AWS Load Balancer Controller(LBC) → 외부 액세스 설정

helm repo update eks
helm install aws-load-balancer-controller eks/aws-load-balancer-controller \ --namespace kube-system \ --set clusterName=plantify \ --set serviceAccount.create=false \ --set region=${CLUSTER_REGION} \ --set vpcId=${CLUSTER_VPC} \ --set serviceAccount.name=aws-load-balancer-controller
Bash
복사
kubectl get nodes
helm repo update

Redis

kubectl create namespace kafka --save-config
helm upgrade --install redis bitnami/redis -n kafka \ --set global.storageClass=gp2
kubectl get pod -n kafka
kubectl get pvc -n kafka
kubectl run --namespace kafka redis-client --restart='Never' \\ --env REDIS_PASSWORD=$REDIS_PASSWORD \ --image docker.io/bitnami/redis:7.4.1-debian-12-r2 --command -- sleep infinity
Bash
복사
비밀번호 확인
kubectl get secret redis -n kafka -o yaml

Kafka

# kafka helm upgrade --install kafka bitnami/kafka -n kafka \ --set persistence.storageClass=gp2 \ --set broker.persistence.storageClass=gp2 \ --set zookeeper.persistence.storageClass=gp2 \ --set zookeeper.enabled=true \ --set controller.replicaCount=0 \ --set broker.replicaCount=3 \ --set kraft.enabled=false \ --set auth.enabled=false \ --set auth.clientProtocol=plaintext \ --set auth.interBrokerProtocol=plaintext \ --set auth.sasl.enabled=false \ --set listeners.client.protocol=PLAINTEXT # 설정하면 client.properties X
Bash
복사
client.properties 생성 → 클라이언트 비밀번호 확인 후 password 수정
security.protocol=SASL_PLAINTEXT sasl.mechanism=SCRAM-SHA-256 sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required \ username="user1" \ password="$(kubectl get secret kafka-user-passwords --namespace kafka -o jsonpath='{.data.client-passwords}' | base64 -d | cut -d , -f 1)";
Bash
복사
클라이언트 비밀번호 확인
kubectl get secret kafka-user-passwords --namespace kafka -o jsonpath='{.data.client-passwords}' | base64 -d
pod 생성 후 Kafka client run
kubectl run kafka-client --restart='Never' --image docker.io/bitnami/kafka:3.9.0-debian-12-r1 --namespace kafka --command -- sleep infinity
토픽생성
kubectl exec -it kafka-broker-0 -n kafka -- kafka-topics.sh \ --create \ --topic transaction-status \ --bootstrap-server localhost:9092 \ --partitions 3 \ --replication-factor 3
Bash
복사
프로듀서 실행
kubectl exec --tty -i kafka-client --namespace kafka -- kafka-console-producer.sh \ --producer.config /tmp/client.properties \ --bootstrap-server kafka.kafka.svc.cluster.local:9092 \ --topic transaction-status
Bash
복사

내부 mysql 접속해서 직접 데이터 넣기

kubectl exec -it auth-mysql-6959988479-zpmsj -n auth -- /bin/bash
mysql -h auth-mysql -P 3306 -u root -p

서비스 간 호출

http://auth-service.auth.svc.cluster.local:8080
kafka 설정 파일 경로: /opt/bitnami/kafka/config/server.properties
server.properties 파일 있는지 확인
kubectl exec -it kafka-broker-0 -n kafka -- ls /opt/bitnami/kafka/config
설정 파일 확인
kubectl exec -it kafka-broker-0 -n kafka -- cat /opt/bitnami/kafka/config/server.properties
kubectlcp client.properties kafka-client:/tmp/client.properties -n kafka