[SKT강화] AWS 에서 생각 해보기(2) - MSA

이동현·2022년 10월 28일
0

SKT 프로젝트

목록 보기
14/15

그렇다면 이제 MSA 구현을 위해서 , ingress 와 service 를 구현 해 보자.

먼저
https://github.com/kubernetes-sigs
라는 repo가 있는데,

SIG Docs는 쿠버네티스 프로젝트의 분과회(special interest group) 중 하나로, 
쿠버네티스 전반에 대한 문서를 작성하고, 
업데이트하며 유지보수하는 일을 주로 수행한다. 
분과회에 대한 보다 자세한 정보는 커뮤니티 GitHub 저장소 내 SIG Docs 를 참조한다.

라는 설명으로 보아 k8s 를 편하게 다루기 위한 좋은 것(?) 들이 많이 있는 repo 이다.

예 >
https://github.com/kubernetes-sigs/aws-load-balancer-controller/

이와 같이 load balancer 에 대한 다양한 yaml 파일들을 제공해준다.
그래서 매번 다 치는 게 아니라 ,
기본 틀을 받고 약간 변형한다는 느낌으로 쓰면 된다 !

(참고)
쿠버네티스의 Ingress -> Application Load Balancers으로 프로비저닝
쿠버네티스의 Service -> Network Load Balancers으로 프로비저닝

(참고)
https://docs.aws.amazon.com/eks/latest/userguide/alb-ingress.html
aws 의 documentation.
((Application load balancing on Amazon EKS))

(참고)
https://potato-yong.tistory.com/147
지금 하는 방법이 위 블로그에서
ingress 에 해당하는 방법을 하고 있는 것이다 ...

(6.9) iam oidc 만들기

쿠버네티스 안에서 사용자 계정을 service account라 한다.
service account 에서 pod과 같은 것에 적절한 iam role을 줄 수있다.
iam role을 주게 하기 위해서, IAM OIDC identity provider 를 생성해야 한다고 한다 (...)

document/ tutorial 왈

https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.4/deploy/installation/

eksctl utils associate-iam-oidc-provider \
--region ${AWS_REGION} \
--cluster eks-demo \
--approve

aws eks describe-cluster --name eks-demo --query "cluster.identity.oidc.issuer" --output text

aws iam list-open-id-connect-providers | grep 8A6E78112D7F1C4DC352B1B511DD13CF

(6.99) 권한 부여

AWSLoadBalancerControllerIAMPolicy라는 policy를 만듭니다.

aws iam create-policy \
--policy-name AWSLoadBalancerControllerIAMPolicy \
--policy-document https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.4.1/docs/install/iam_policy.json

aws-load-balancer-controller 라는 iamaccount를 만듭니다. (eks-demo 클러스터 안에 )

eksctl create iamserviceaccount \
--cluster eks-demo \
--namespace kube-system \
--name aws-load-balancer-controller \
--attach-policy-arn arn:aws:iam::$ACCOUNT_ID:policy/AWSLoadBalancerControllerIAMPolicy \
--override-existing-serviceaccounts \
--approve

(7) ingress controller 만들기


이 구조를 생각하며 우선 path 마다 다른 서비스를 제공하기 위해서 ingress controller 를 만들어 보자 !

cert 매니저 생성 ( 만들어야 한다는데 자세한 원리는 모르겠다 )
kubectl apply --validate=false -f https://github.com/jetstack/cert-manager/releases/download/v1.5.3/cert-manager.yaml

load balancer controller yaml 파일 다운로드
wget https://github.com/kubernetes-sigs/aws-load-balancer-controller/releases/download/v2.4.4/v2_4_4_full.yaml

yaml파일에서
이부분 eks-demo로(내 클러스터 이름) 으로 수정 .

이부분 삭제했음.

(오류 !! 해결)

다음과 같이 pod가 너무 많다는데 그 이유가
AWS의 인스턴스들은 각 타입별로 pod 생성 갯수를 제한하고 있다고 한다.
즉 귀여운 t3.micro로는 할 수가 없던 것 ... ㅠㅠ
*게다가 t2.micro는 ap-northeast-2b에 생성도 안된다 .
https://may9noy.tistory.com/539

Possible fix is just upgrade your instance to be a more capable type.

*cert-manager가 잘 동작하는지 ?
kubectl get po -n cert-manager
kubectl describe po cert-manager-84bc577876-mhzrb -n cert-manager

크기를 키워서 다시하니까 됐다... ㅠㅠ

그리고 나서
kubectl apply -f v2_4_4_full.yaml

잘됐는지 확인
kubectl get deployment -n kube-system aws-load-balancer-controller

kubectl get sa aws-load-balancer-controller -n kube-system -o yaml

(오류2 아이고 힘들다 ! ㅠㅠ) - 막상 배포하려니 auto - subnet이 없다는 오류 .
https://stackoverflow.com/questions/64822461/getting-error-while-deploying-ingress-controller-in-eks
이거랑 동등했다.

원인 -> 내가 default가 아닌 custom vpc subnet을 지정해서 그렇다 .
tag를 달아줘야 한다고 한다.
https://eksctl.io/usage/vpc-configuration/

deployment.yaml

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: demo-django-backend
  namespace: default
spec:
  replicas: 3
  selector:
    matchLabels:
      app: demo-django-backend
  template:
    metadata:
      labels:
        app: demo-django-backend
    spec:
      containers:
        - name: demo-django-backend
          image: 456188629746.dkr.ecr.ap-northeast-2.amazonaws.com/webserver:latest
          imagePullPolicy: Always
          ports:
            - containerPort: 8000

service.yaml

---
apiVersion: v1
kind: Service
metadata:
  name: demo-django-backend
  annotations:
    alb.ingress.kubernetes.io/healthcheck-path: "/location"
spec:
  selector:
    app: demo-django-backend
  type: NodePort
  ports:
    - port: 8000 # 서비스가 생성할 포트  
      targetPort: 8000 # 서비스가 접근할 pod의 포트
      protocol: TCP

ingress.yaml

---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
    name: "backend-ingress"
    namespace: default
    annotations:
      kubernetes.io/ingress.class: alb
      alb.ingress.kubernetes.io/scheme: internet-facing
      alb.ingress.kubernetes.io/target-type: ip
spec:
    rules:
    - http:
        paths:
          - path: /location
            pathType: Prefix
            backend:
              service:
                name: "demo-django-backend"
                port:
                  number: 8000
          - path: /location2
            pathType: Prefix
            backend:
              service:
                name: "demo-django-backend2"
                port:
                  number: 8000

결과 )

다음과 같이 msa 구조가 나오고

building A

building B

주소만 location2로 하면 두번째 건물들의 pod으로 접속된다 .

*css 가 깨지는 데 이는 나중에 살펴봐야할듯

  • 참고 자료


    즉 ingress는 내플젝기준 cloud9 instance
    service는 nodegroup(node 3개짜리) 중 하나에 있고
    그다음 service가 pod를 배포한다.
  • EKS의 "노드"는 Kubernetes 포드를 예약할 수 있는 Amazon EC2 인스턴스입니다.

https://aws.plainenglish.io/building-your-first-kubernetes-application-with-aws-eks-bc2f1e84118

인그레스 파드 서비스의 위치를 잘 표현한 그림 !

**11/3 수정

0개의 댓글