AWS App Mesh는 애플리케이션의 서비스 간 통신을 쉽게 모니터링하고 제어할 수 있는 서비스 메시입니다.
서비스 메시는 네트워크 프록시를 통해 서비스 간의 통신을 처리하는 인프라 계층입니다.
App Mesh는 서비스 간 통신을 표준화하여 애플리케이션의 가시성과 고가용성을 보장합니다.
주요 구성 요소
•
서비스 메시: 서비스 간의 네트워크 트래픽을 관리하는 논리적 경계입니다.
•
가상 서비스: 실제 서비스의 추상화로, 서비스 간 통신을 위한 이름을 제공합니다.
•
가상 노드: 검색 가능한 서비스에 대한 논리 포인터입니다.
•
가상 라우터 및 경로: 트래픽을 처리하고 특정 기준에 따라 트래픽을 라우팅합니다.
•
프록시: App Mesh 구성을 읽고 트래픽을 적절하게 전달합니다.
•
가상 서비스: Kubernetes의 서비스와 비슷한 역할을 합니다.
•
가상 노드: Kubernetes의 파드와 비슷한 역할을 합니다.
•
가상 라우터: Kubernetes의 인그레스와 비슷한 역할을 합니다.
•
프록시: Kubernetes의 사이드카 패턴과 비슷한 역할을 합니다.
예제
기존 애플리케이션에서 serviceA가 serviceB와 통신한다고 가정합니다. serviceB의 새 버전 serviceBv2를 배포하고, serviceA의 트래픽을 두 서비스로 나누어 보내고 싶다면, App Mesh를 사용하면 애플리케이션 코드를 변경하지 않고도 이를 쉽게 설정할 수 있습니다.
App Mesh를 사용하면 서비스 간 통신이 프록시를 통해 이루어지며, 프록시는 App Mesh 구성을 읽고 트래픽을 적절하게 라우팅합니다. 이를 통해 서비스 간 통신 방식을 유연하게 제어할 수 있습니다.
•
가상 서비스: 여러 가상 노드를 하나의 서비스로 묶는 추상화.
•
가상 노드: 실제 서비스 인스턴스를 나타내는 논리 포인터.
•
가상 라우터: 트래픽을 여러 가상 노드로 분배하는 역할.
ENV
CLUSTER_NAME=<CLUSTER_NAME>
AWS_REGION=<REGION_CODE>
Shell
복사
App Mesh 설치 가능 여부 검증
curl -o pre_upgrade_check.sh https://raw.githubusercontent.com/aws/eks-charts/master/stable/appmesh-controller/upgrade/pre_upgrade_check.sh
sh ./pre_upgrade_check.sh
Shell
복사
Helm Repo
helm repo add eks https://aws.github.io/eks-charts
Shell
복사
CRD (CustomerResourceDefinition)
kubectl apply -k "https://github.com/aws/eks-charts/stable/appmesh-controller/crds?ref=master"
Shell
복사
Namespace
kubectl create ns appmesh-system
Shell
복사
OIDC
eksctl utils associate-iam-oidc-provider \
--region=$AWS_REGION \
--cluster $CLUSTER_NAME \
--approve
Shell
복사
IRSA
eksctl create iamserviceaccount \
--cluster $CLUSTER_NAME \
--namespace appmesh-system \
--name appmesh-controller \
--attach-policy-arn arn:aws:iam::aws:policy/AWSCloudMapFullAccess,arn:aws:iam::aws:policy/AWSAppMeshFullAccess \
--override-existing-serviceaccounts \
--approve
Shell
복사
appmesh-controller install
helm upgrade -i appmesh-controller eks/appmesh-controller \
--namespace appmesh-system \
--set region=$AWS_REGION \
--set serviceAccount.create=false \
--set serviceAccount.name=appmesh-controller
Shell
복사
AWS App Mesh 리소스 Deploy
apiVersion: v1
kind: Namespace
metadata:
name: my-apps
labels:
mesh: my-mesh
appmesh.k8s.aws/sidecarInjectorWebhook: enabled
YAML
복사
apiVersion: appmesh.k8s.aws/v1beta2
kind: Mesh
metadata:
name: my-mesh
spec:
namespaceSelector:
matchLabels:
mesh: my-mesh
YAML
복사
kubectl apply -f namespace.yaml
kubectl apply -f mesh.yaml
Shell
복사
Kubernetes 메시 리소스의 세부 정보 확인
kubectl describe mesh my-mesh
Shell
복사
컨트롤러가 생성한 App Mesh 서비스 메시에 대한 세부 정보 확인
aws appmesh describe-mesh --mesh-name my-mesh
Shell
복사
Virtual Node
apiVersion: appmesh.k8s.aws/v1beta2
kind: VirtualNode
metadata:
name: my-service-a
namespace: my-apps
spec:
podSelector:
matchLabels:
app: my-app-1
listeners:
- portMapping:
port: 80
protocol: http
serviceDiscovery:
dns:
hostname: my-service-a.my-apps.svc.cluster.local
YAML
복사
kubectl apply -f virtual-node.yaml
kubectl describe virtualnode my-service-a -n my-apps
Shell
복사
Virtual Router
apiVersion: appmesh.k8s.aws/v1beta2
kind: VirtualRouter
metadata:
namespace: my-apps
name: my-service-a-virtual-router
spec:
listeners:
- portMapping:
port: 80
protocol: http
routes:
- name: my-service-a-route
httpRoute:
match:
prefix: /
action:
weightedTargets:
- virtualNodeRef:
name: my-service-a
weight: 1
YAML
복사
kubectl apply -f virtual-router.yaml
kubectl describe virtualrouter my-service-a-virtual-router -n my-apps
Shell
복사
Virtual Service
apiVersion: appmesh.k8s.aws/v1beta2
kind: VirtualService
metadata:
name: my-service-a
namespace: my-apps
spec:
awsName: my-service-a.my-apps.svc.cluster.local
provider:
virtualRouter:
virtualRouterRef:
name: my-service-a-virtual-router
YAML
복사
kubectl apply -f virtual-service.yaml
kubectl describe virtualservice my-service-a -n my-apps
Shell
복사
Proxy Auth Policy
cat << EOF > proxy-auth.json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "appmesh:StreamAggregatedResources",
"Resource": [
"arn:aws:appmesh:ap-northeast-2:362708816803:mesh/my-mesh/virtualNode/my-service-a_my-apps"
]
}
]
}
EOF
Shell
복사
Policy Create
aws iam create-policy --policy-name my-policy --policy-document file://proxy-auth.json
Shell
복사
Attach Policy
eksctl create iamserviceaccount \
--cluster $CLUSTER_NAME \
--namespace my-apps \
--name my-service-a \
--attach-policy-arn arn:aws:iam::362708816803:policy/my-policy \
--override-existing-serviceaccounts \
--approve
Shell
복사
Service
apiVersion: v1
kind: Service
metadata:
name: my-service-a
namespace: my-apps
labels:
app: my-app-1
spec:
selector:
app: my-app-1
ports:
- protocol: TCP
port: 80
targetPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-service-a
namespace: my-apps
labels:
app: my-app-1
spec:
replicas: 3
selector:
matchLabels:
app: my-app-1
template:
metadata:
labels:
app: my-app-1
spec:
serviceAccountName: my-service-a
containers:
- name: nginx
image: nginx:1.19.0
ports:
- containerPort: 80
YAML
복사
kubectl apply -f service.yaml
kubectl -n my-apps get pods
Shell
복사