Search

App Mesh

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
복사