그렇다면 이제 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 에 해당하는 방법을 하고 있는 것이다 ...
쿠버네티스 안에서 사용자 계정을 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
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
이 구조를 생각하며 우선 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 가 깨지는 데 이는 나중에 살펴봐야할듯
https://aws.plainenglish.io/building-your-first-kubernetes-application-with-aws-eks-bc2f1e84118
인그레스 파드 서비스의 위치를 잘 표현한 그림 !
**11/3 수정