ENV
export SERVICE=apigatewayv2
export ACK_SYSTEM_NAMESPACE=ack-system
export AWS_REGION=ap-northeast-2
export EKS_CLUSTER_NAME=<CLUSTER_NAME>
export EKS_NODE_GROUP_NAME=<NODE_GROUP_NAME>
export AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query "Account" --output text)
Shell
복사
HELM 차트 Install
export RELEASE_VERSION=$(curl -sL https://api.github.com/repos/aws-controllers-k8s/$SERVICE-controller/releases/latest | grep '"tag_name":' | cut -d'"' -f4 | cut -c 2-)
helm pull oci://public.ecr.aws/aws-controllers-k8s/$SERVICE-chart --version=$RELEASE_VERSION
tar xzvf $SERVICE-chart-$RELEASE_VERSION.tgz
Shell
복사
ACK APIGateway2 Controller 설치
helm install --create-namespace --namespace $ACK_SYSTEM_NAMESPACE ack-$SERVICE-controller --set aws.region="$AWS_REGION" ~/$SERVICE-chart
Shell
복사
설치 확인
helm list --namespace $ACK_SYSTEM_NAMESPACE
kubectl -n ack-system get pods -l "app.kubernetes.io/instance=ack-apigatewayv2-controller"
kubectl get crd | grep apigatewayv2
Shell
복사
AWS Load Balancer Controller 설치
curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.7.2/docs/install/iam_policy.json
aws iam create-policy \
--policy-name AWSLoadBalancerControllerIAMPolicy \
--policy-document file://iam_policy.json
eksctl create iamserviceaccount \
--cluster=$EKS_CLUSTER_NAME \
--namespace=kube-system \
--name=aws-load-balancer-controller \
--role-name AmazonEKSLoadBalancerControllerRole \
--attach-policy-arn=arn:aws:iam::$AWS_ACCOUNT_ID:policy/AWSLoadBalancerControllerIAMPolicy \
--override-existing-serviceaccounts \
--approve
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
복사
노드 그룹에 권한 부여
NODEGROUP_ROLE_NAME=$(aws eks describe-nodegroup --cluster-name $EKS_CLUSTER_NAME --nodegroup-name $EKS_NODE_GROUP_NAME --query "nodegroup.nodeRole" --output text | cut -d'/' -f2-)
aws iam attach-role-policy --role-name $NODEGROUP_ROLE_NAME --policy-arn arn:aws:iam::aws:policy/AmazonAPIGatewayAdministrator
Shell
복사
애플리케이션 배포
•
author-deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: author-deployment
spec:
replicas: 1
selector:
matchLabels:
app: author
template:
metadata:
labels:
app: author
spec:
containers:
- name: nginx
image: nginx:1.17.3
ports:
- containerPort: 80
volumeMounts:
- name: workdir
mountPath: /usr/share/nginx/html
# These containers are run during pod initialization
initContainers:
- name: install
image: bitnami/git
command: ["git"]
args:
[
"clone",
"https://github.com/aws-samples/amazon-apigateway-ingress-controller-blog.git",
"/var/lib/data/",
]
volumeMounts:
- name: workdir
mountPath: "/var/lib/data"
dnsPolicy: Default
volumes:
- name: workdir
emptyDir: {}
---
apiVersion: v1
kind: Service
metadata:
name: authorservice
annotations:
service.beta.kubernetes.io/aws-load-balancer-type: "nlb-ip"
service.beta.kubernetes.io/aws-load-balancer-internal: "true"
spec:
type: LoadBalancer
selector:
app: author
ports:
- protocol: TCP
port: 80
targetPort: 80
YAML
복사
•
echoserver.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: echoserver
spec:
selector:
matchLabels:
app: echoserver
replicas: 1
template:
metadata:
labels:
app: echoserver
spec:
containers:
- image: gcr.io/google_containers/echoserver:1.4
imagePullPolicy: Always
name: echoserver
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: echoserver
annotations:
service.beta.kubernetes.io/aws-load-balancer-type: "nlb-ip"
service.beta.kubernetes.io/aws-load-balancer-internal: "true"
spec:
ports:
- port: 80
targetPort: 8080
protocol: TCP
type: LoadBalancer
selector:
app: echoserver
YAML
복사
kubectl apply -f echoserver.yml
kubectl apply -f author-deployment.yml
Shell
복사
배포 확인
kubectl get deploy,svc
YAML
복사
NLB DNS 확인
NLB1DNS=$(kubectl get svc authorservice -o jsonpath={.status.loadBalancer.ingress[0].hostname})
dig +short $NLB1DNS
NLB2DNS=$(kubectl get svc echoserver -o jsonpath={.status.loadBalancer.ingress[0].hostname})
dig +short $NLB2DNS
Shell
복사
VPC Link 가 사용할 보안그룹 생성
VPC_ID=$(aws ec2 describe-vpcs --query 'Vpcs[0].VpcId' --output text)
VPCLINK_SG=$(aws ec2 create-security-group \
--description "SG for VPC Link" \
--group-name SG_VPC_LINK \
--vpc-id $VPC_ID \
--region $AWS_REGION \
--output text \
--query 'GroupId')
Shell
복사
VPC Link 생성
cat << EOF > vpclink.yaml
apiVersion: apigatewayv2.services.k8s.aws/v1alpha1
kind: VPCLink
metadata:
name: nlb-internal
spec:
name: nlb-internal
securityGroupIDs:
- $VPCLINK_SG
subnetIDs:
- $(aws ec2 describe-subnets \
--filter Name=tag:kubernetes.io/role/internal-elb,Values=1 \
--query 'Subnets[0].SubnetId' \
--region $AWS_REGION --output text)
- $(aws ec2 describe-subnets \
--filter Name=tag:kubernetes.io/role/internal-elb,Values=1 \
--query 'Subnets[1].SubnetId' \
--region $AWS_REGION --output text)
EOF
kubectl apply -f vpclink.yaml
Shell
복사
VPC Link 생성 확인
kubectl describe vpclink nlb-internal | grep 'Vpc Link'
aws apigatewayv2 get-vpc-links | jq
Shell
복사
API GW 생성 (VPC Link 연동)
cat << EOF > apigw-api.yaml
apiVersion: apigatewayv2.services.k8s.aws/v1alpha1
kind: API
metadata:
name: apitest-private-nlb
spec:
body: '{
"openapi": "3.0.1",
"info": {
"title": "ack-apigwv2-import-test-private-nlb",
"version": "v1"
},
"paths": {
"/\$default": {
"x-amazon-apigateway-any-method" : {
"isDefaultRoute" : true,
"x-amazon-apigateway-integration" : {
"payloadFormatVersion" : "1.0",
"connectionId" : "$(kubectl get vpclinks.apigatewayv2.services.k8s.aws \
nlb-internal \
-o jsonpath="{.status.vpcLinkID}")",
"type" : "http_proxy",
"httpMethod" : "GET",
"uri" : "$(aws elbv2 describe-listeners \
--load-balancer-arn $(aws elbv2 describe-load-balancers \
--region $AWS_REGION \
--query "LoadBalancers[?contains(DNSName, '$(kubectl get service authorservice \
-o jsonpath="{.status.loadBalancer.ingress[].hostname}")')].LoadBalancerArn" \
--output text) \
--region $AWS_REGION \
--query "Listeners[0].ListenerArn" \
--output text)",
"connectionType" : "VPC_LINK"
}
}
},
"/meta": {
"get": {
"x-amazon-apigateway-integration": {
"uri" : "$(aws elbv2 describe-listeners \
--load-balancer-arn $(aws elbv2 describe-load-balancers \
--region $AWS_REGION \
--query "LoadBalancers[?contains(DNSName, '$(kubectl get service echoserver \
-o jsonpath="{.status.loadBalancer.ingress[].hostname}")')].LoadBalancerArn" \
--output text) \
--region $AWS_REGION \
--query "Listeners[0].ListenerArn" \
--output text)",
"httpMethod": "GET",
"connectionId": "$(kubectl get vpclinks.apigatewayv2.services.k8s.aws \
nlb-internal \
-o jsonpath="{.status.vpcLinkID}")",
"type": "HTTP_PROXY",
"connectionType": "VPC_LINK",
"payloadFormatVersion": "1.0"
}
}
}
},
"components": {}
}'
EOF
kubectl apply -f apigw-api.yaml
Shell
복사
stage 생성
cat << EOF | kubectl apply -f -
apiVersion: apigatewayv2.services.k8s.aws/v1alpha1
kind: Stage
metadata:
name: "apiv1"
spec:
apiID: $(kubectl get apis.apigatewayv2.services.k8s.aws apitest-private-nlb -o=jsonpath='{.status.apiID}')
stageName: api
autoDeploy: true
EOF
Shell
복사
stage URL 호출 정보 확인
curl -s $(kubectl get api apitest-private-nlb -o jsonpath="{.status.apiEndpoint}")/api/author/ | head
curl -s $(kubectl get api apitest-private-nlb -o jsonpath="{.status.apiEndpoint}")/api/meta | head
Shell
복사
파드에서 접속 로그 확인
kubectl logs -l app=author --since=1h
kubectl logs -l app=echoserver --since=1h
Shell
복사
API GW 와 NLB 관련 리소스 삭제
kubectl delete stages.apigatewayv2.services.k8s.aws apiv1
kubectl delete apis.apigatewayv2.services.k8s.aws apitest-private-nlb
kubectl delete vpclinks.apigatewayv2.services.k8s.aws nlb-internal
kubectl delete service echoserver # NLB 삭제
kubectl delete services authorservice # NLB 삭제
sleep 10 # 10초 정도 후 아래 VPC Link 삭제 진행
Shell
복사
VPC Link 가 사용했던 보안그룹 삭제
aws ec2 delete-security-group --group-id $VPCLINK_SG --region $AWS_REGION
Shell
복사
ACK APIGateway2 Controller 삭제
helm uninstall -n $ACK_SYSTEM_NAMESPACE ack-$SERVICE-controller
Shell
복사
ACK APIGateway2 Controller 관련 crd 삭제
kubectl delete -f ~/$SERVICE-chart/crds/
Shell
복사
ACK APIGateway2 Controller 관련 namespace 삭제
kubectl delete namespace $ACK_SYSTEM_NAMESPACE
Shell
복사
AWS Load Balancer controller 삭제
helm uninstall -n kube-system aws-load-balancer-controller
Shell
복사
AWS IAM Role 삭제
eksctl delete iamserviceaccount --cluster=$EKS_CLUSTER_NAME --namespace=kube-system --name=aws-load-balancer-controller
Shell
복사