마이크로 서비스 - (2) 쿠버네티스 오케스트레이션 적용

임쿠쿠·2022년 6월 1일
0

Microservice

목록 보기
2/3
post-thumbnail

참고) 쿠버네티스 기본 개념
https://velog.io/@kimkevin90/Kubernetes-3-kubectl-Practice

1. 서비스 POD 생성

1) 도커 이미지 생성

FROM node:alpine

WORKDIR /app
COPY package.json ./
RUN npm install
COPY ./ ./

CMD ["npm", "start"]
docker build -t lim/posts:0.0.1 .

2) POD 생성

apiVersion: v1
kind: Pod
metadata:
  name: posts
spec:
  containers:
    - name: posts
      image: lim/posts:0.0.1

2. 서비스 Deployment 생성

1) Deployment 생성

apiVersion: apps/v1
kind: Deployment
metadata:
  name: posts-depl
spec:
  replicas: 1
  selector:
    matchLabels:
      app: posts
  template:
    metadata:
      labels:
        app: posts
    spec:
      containers:
        - name: posts
          image: lim/posts:0.0.1

2) Deployment 업데이트

방법1)

  • 코드 변경, 이미지 재 빌드, deploy definition 파일 수정, deploy 생성의 절차 복잡

방법2)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: posts-depl
spec:
  replicas: 1
  selector:
    matchLabels:
      app: posts
  template:
    metadata:
      labels:
        app: posts
    spec:
      containers:
        - name: posts
          image: lim/posts:latest
  • POD definition file에 latest 태그 지정
  • 코드업데이트 및 이미지 빌드
  • 이미지 도커 허브 푸쉬
  • kubectl rollout restart deploy deploy명

3. 각 서비스 Service 생성

  • 클러스터 내 POD간의 커뮤니케이션은 Cluster IP로 가능
  • 외부와 POD 커뮤니케이션 시, NodePort & Load Balancer 필요

1) NodePort 생성 후 외부 접속

apiVersion: v1
kind: Service
metadata:
  name: posts-srv
spec:
  type: NodePort
  selector:
    app: posts
  ports:
    - name: posts
      protocol: TCP
      port: 4000
      targetPort: 4000
  • targetPort는 POD에 진입하는 PORT
  • port는 외부에서 NodePort로 접속 후, 서비스로 진입하는 PORT

2) ClusterIP 생성 후 POD간 연결

(1) Event-Bus Deployment 및 ClusterIP Service 생성

apiVersion: apps/v1
kind: Deployment
metadata:
  name: event-bus-depl
spec:
  replicas: 1
  selector:
    matchLabels:
      app: event-bus
  template:
    metadata:
      labels:
        app: event-bus
    spec:
      containers:
        - name: event-bus
          image: limkevin1313/event-bus
---
apiVersion: v1
kind: Service
metadata:
  name: event-bus-srv
spec:
  selector:
    app: event-bus
  ports:
    - name: event-bus
      protocol: TCP
      port: 4005
      targetPort: 4005

(2) Post 서비스 clusterIP Service 생성

apiVersion: v1
kind: Service
metadata:
  name: posts-clusterip-srv
spec:
  selector:
    app: posts
  ports:
    - name: posts
      protocol: TCP
      port: 4000
      targetPort: 4000

결과

  • Post NodePort / Event-Bust & Post ClusterIP 생성

(3) 각 서비스 URL 코드 수정

  • 기존 localhost:PORT => 서비스명:PORT로 수정

Post서비스

await axios.post('http://event-bus-srv:4005/events', {
    type: 'PostCreated',
    data: {
    id, title
    }
  });

Event-Bus

axios.post("http://posts-clusterip-srv:4000/events", event).catch((err) => {
    console.log(err.message);
  });
  • 이미지 빌드 후, 도커 푸시 및 deploy 재시작

3) LoadBalancer & Ingress Controller 생성

  • 외부에서 LoadBalancer로 요청을 보내고 IngressController로 해당 POD에 라우팅

(1) Ingress-nginx 설치

참고) https://kubernetes.github.io/ingress-nginx/deploy/

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.2.0/deploy/static/provider/cloud/deploy.yaml

(2) Ingress 생성

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-srv
  annotations:
    kubernetes.io/ingress.class: nginx
spec:
  rules:
    - host: posts.com
      http:
        paths:
          - path: /posts
            pathType: Prefix
            backend:
              service:
                name: posts-clusterip-srv
                port:
                  number: 4000
  • posts.com/posts 접속 시, posts-clusterip-srv로 라우팅
  • /etc/hosts 127.0.0.1 posts.com 추가하여 localhost에서 posts.com으로 라우팅

4) Client Ingress 적용

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-srv
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/use-regex: "true"
spec:
  rules:
    - host: posts.com
      http:
        paths:
          - path: /posts/create
            pathType: Prefix
            backend:
              service:
                name: posts-clusterip-srv
                port:
                  number: 4000
          - path: /posts
            pathType: Prefix
            backend:
              service:
                name: query-srv
                port:
                  number: 4002
          - path: /posts/?(.*)/comments
            pathType: Prefix
            backend:
              service:
                name: comments-srv
                port:
                  number: 4001
          - path: /?(.*)
            pathType: Prefix
            backend:
              service:
                name: client-srv
                port:
                  number: 3000
  • React client는 root path 라우팅
  • Client에서 각 요청에 대해 각 서비스 라우팅

4. Scaffold로 dev 환경 구성

apiVersion: skaffold/v2alpha3
kind: Config
deploy:
  kubectl:
    # yaml파일 path
    # 실행 : skaffold dev
    manifests:
      - ./infra/k8s/*
build:
  local:
    push: false
  artifacts:
    - image: limkevin1313/client
      context: client
      docker:
        dockerfile: Dockerfile
      sync:
        manual:
          - src: "src/**/*.js"
            dest: .
    - image: limkevin1313/comments
      context: comments
      docker:
        dockerfile: Dockerfile
      sync:
        manual:
          - src: "*.js"
            dest: .
    - image: limkevin1313/event-bus
      context: events-bus
      docker:
        dockerfile: Dockerfile
      sync:
        manual:
          - src: "*.js"
            dest: .
    - image: limkevin1313/moderation
      context: moderation
      docker:
        dockerfile: Dockerfile
      sync:
        manual:
          - src: "*.js"
            dest: .
    - image: limkevin1313/posts
      context: posts
      docker:
        dockerfile: Dockerfile
      sync:
        manual:
          - src: "*.js"
            dest: .
    - image: limkevin1313/query
      context: query
      docker:
        dockerfile: Dockerfile
      sync:
        manual:
          - src: "*.js"
            dest: .
skaffold dev

참고 : Microservices with Node JS(Stephen Grider)

profile
Pay it forward

0개의 댓글