Search

Kafka with EKS

위 Docs대로 진행해서 문제 없이 되었지만 직접 이미지를 만들어서 나중에 Message주고 받도록 하기
export EKS_CLUSTER_NAME=skills-eks-cluster export EKS_SERVICE_ACCOUNT=skills-msk-sa export EKS_NAMESPACE=skills export EKS_ROLE_NAME=skills-msk-role export EKS_SECURITY_GROUP=skills-msk-sg export KAFKA_TOPIC=server export IAM_POLICY_NAME=msk-cluster-access-policy export MSK_CLUSTER_NAME=skills-msk-cluster export MSK_CONFIGURATION_NAME=skills-msk-config export VPC_NAME=skills-vpc export AWS_REGION=ap-northeast-2
Shell
복사
cat << EOF > msk-policy.json { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "kafka-cluster:*", "Resource": "*" } ] } EOF
Shell
복사
aws iam create-policy --policy-name $IAM_POLICY_NAME --policy-document file://msk-policy.json
Shell
복사
POLICY_ARN=$(aws iam list-policies --query "Policies[?PolicyName=='$IAM_POLICY_NAME'].{ARN:Arn}" --output text)
Shell
복사
eksctl create iamserviceaccount \ --name $EKS_SERVICE_ACCOUNT \ --namespace $EKS_NAMESPACE \ --cluster $EKS_CLUSTER_NAME \ --role-name $EKS_ROLE_NAME \ --attach-policy-arn $POLICY_ARN \ --approve
Shell
복사
VPC_ID=$(aws ec2 describe-vpcs --filters Name=tag:Name,Values="$VPC_NAME" --query "Vpcs[].VpcId" --output text) SUBNET_ID_1=$(aws ec2 describe-subnets --filter Name=vpc-id,Values=$VPC_ID --query 'Subnets[?AvailabilityZone==`ap-northeast-2a`&&MapPublicIpOnLaunch==`true`].SubnetId' --output text) SUBNET_ID_2=$(aws ec2 describe-subnets --filter Name=vpc-id,Values=$VPC_ID --query 'Subnets[?AvailabilityZone==`ap-northeast-2b`&&MapPublicIpOnLaunch==`true`].SubnetId' --output text)
Shell
복사
aws ec2 create-security-group --group-name $EKS_SECURITY_GROUP --description "msk security group" --vpc-id $VPC_ID
Shell
복사
SECURITY_GROUP_ID=$(aws ec2 describe-security-groups --filter Name=vpc-id,Values=$VPC_ID Name=group-name,Values=$EKS_SECURITY_GROUP --query 'SecurityGroups[*].[GroupId]' --output text)
Shell
복사
aws ec2 authorize-security-group-ingress --group-id $SECURITY_GROUP_ID --protocol tcp --port 9098 --cidr 0.0.0.0/0
Shell
복사
cat << EOF > configuration.txt auto.create.topics.enable=true EOF
Shell
복사
MSK_CONFIGURATION_ARN=$(aws kafka create-configuration --name "${MSK_CONFIGURATION_NAME}" --description "Auto create topics enabled" --kafka-versions "3.8.x" --server-properties fileb://configuration.txt --query "Arn" --output text)
Shell
복사
cat << EOF > brokernodegroupinfo.json { "InstanceType": "kafka.t3.small", "ClientSubnets": [ "${SUBNET_ID_1}", "${SUBNET_ID_2}" ], "SecurityGroups": [ "${SECURITY_GROUP_ID}" ] } EOF
Shell
복사
cat << EOF > client-authentication.json { "Sasl": { "Iam": { "Enabled": true } } } EOF
Shell
복사
cat << EOF > configuration.json { "Revision": 1, "Arn": "${MSK_CONFIGURATION_ARN}" } EOF
Shell
복사
생성하는데 15 ~ 30분정도 소요됨
aws kafka create-cluster --cluster-name $MSK_CLUSTER_NAME \ --broker-node-group-info file://brokernodegroupinfo.json \ --kafka-version "3.8.x" \ --client-authentication file://client-authentication.json \ --configuration-info file://configuration.json \ --number-of-broker-nodes 2
Shell
복사
MSK_ARN=$(aws kafka list-clusters --query 'ClusterInfoList[*].ClusterArn' --output text) KAFKA_BOOTSTRAP_SERVER=$(aws kafka get-bootstrap-brokers --cluster-arn $MSK_ARN --output text)
Shell
복사
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 \ -n kube-system \ --set clusterName=$EKS_CLUSTER_NAME \ --set serviceAccount.create=false \ --set serviceAccount.name=aws-load-balancer-controller
Shell
복사
kubectl create namespace $EKS_NAMESPACE
Shell
복사
cat << EOF > deploy.yaml apiVersion: v1 kind: ConfigMap metadata: name: client-properties labels: name: client-properties namespace: skills data: client.properties: |- security.protocol=SASL_SSL sasl.mechanism=AWS_MSK_IAM sasl.jaas.config=software.amazon.msk.auth.iam.IAMLoginModule required; sasl.client.callback.handler.class=software.amazon.msk.auth.iam.IAMClientCallbackHandler --- apiVersion: v1 kind: Service metadata: namespace: skills name: skills-cs labels: app: skills annotations: service.beta.kubernetes.io/aws-load-balancer-type: external service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: ip service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing spec: type: LoadBalancer ports: - name: client-port port: 80 protocol: TCP targetPort: 8800 selector: app: skills --- apiVersion: apps/v1 kind: Deployment metadata: name: skills namespace: skills labels: app: skills spec: selector: matchLabels: app: skills replicas: 3 template: metadata: labels: app: skills spec: serviceAccountName: skills-msk-sa containers: - name: skills imagePullPolicy: Always image: migratorydata/server:latest volumeMounts: - name: client-properties mountPath: "/skills/addons/kafka/consumer.properties" subPath: client.properties readOnly: true - name: client-properties mountPath: "/skills/addons/kafka/producer.properties" subPath: client.properties readOnly: true env: - name: MIGRATORYDATA_EXTRA_OPTS value: "-DMemory=512MB -DX.ConnectionOffload=true -DClusterEngine=kafka" - name: MIGRATORYDATA_KAFKA_EXTRA_OPTS value: "-Dbootstrap.servers=$KAFKA_BOOTSTRAP_SERVER -Dtopics=$KAFKA_TOPIC" - name: MIGRATORYDATA_JAVA_GC_LOG_OPTS value: "-XX:+PrintCommandLineFlags -XX:+PrintGC -XX:+PrintGCDetails -XX:+DisableExplicitGC -Dsun.rmi.dgc.client.gcInterval=0x7ffffffffffffff0 -Dsun.rmi.dgc.server.gcInterval=0x7ffffffffffffff0 -verbose:gc" resources: requests: memory: "512Mi" ports: - name: client-port containerPort: 8800 readinessProbe: tcpSocket: port: 8800 initialDelaySeconds: 20 failureThreshold: 5 periodSeconds: 5 livenessProbe: tcpSocket: port: 8800 initialDelaySeconds: 10 failureThreshold: 5 periodSeconds: 5 volumes: - name: client-properties configMap: name: client-properties EOF
Shell
복사
kubectl apply -f deploy.yaml
Shell
복사
kubectl get pods -n skills
Shell
복사