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 add eks https://aws.github.io/eks-charts
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 add bitnami https://charts.bitnami.com/bitnami
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