미니 gRPC 프로젝트(2): k8s에 gRPC API 배포

이것은 2 부입니다

전제 조건


  • 맥OS 카탈리나
  • gopaths가 이미 구성됨
  • 자체 GCP 프로젝트 보유

  • 디렉토리 개요




    $ tree
    .
    ├── README.md
    ├── infrastructure
    │   ├── backend-deployment.yml
    │   ├── backend-service.yml
    │   ├── frontend-deployment.yml
    │   └── frontend-service.yml
    ├── proto
    │   ├── calc.proto
    │   └── gen
    │       └── calc.pb.go
    └── src
        ├── backend
        │   ├── Dockerfile
        │   └── main.go
        └── frontend
            ├── Dockerfile
            └── main.go
    
    6 directories, 11 files
    


    Dockerfile 만들기



    src/프론트엔드/Dockerfile



    프로토를 가져올 수 있도록 github 계정으로 푸시해야 합니다.

    FROM golang:1.15
    
    ENV HOME /root
    ENV PATH $PATH:/usr/local/go/bin
    ENV GOPATH /go 
    RUN echo $GOPATH
    RUN go get -u github.com/golang/protobuf/protoc-gen-go
    RUN go get -u github.com/grpc-ecosystem/go-grpc-middleware/logging/zap
    RUN go get -u go.uber.org/zap
    RUN go get -u github.com/YOURACCOUNT/micro-prac/proto/gen
    WORKDIR /go/src/micro-sample-frontend
    COPY . .
    
    RUN go build -o /usr/local/bin/micro-sample-frontend
    
    CMD ["micro-sample-frontend"]
    


    src/백엔드/Dockerfile




    FROM golang:1.15
    
    ENV HOME /root
    ENV PATH $PATH:/usr/local/go/bin
    ENV GOPATH /go 
    RUN echo $GOPATH
    RUN go get -u github.com/golang/protobuf/protoc-gen-go
    RUN go get -u github.com/grpc-ecosystem/go-grpc-middleware/logging/zap
    RUN go get -u go.uber.org/zap
    
    # Make sure to push your protos to your github account
    RUN go get -u github.com/YOURACCOUNT/micro-prac/proto/gen
    
    WORKDIR /go/src/micro-sample-backend
    COPY . .
    
    RUN go build -o /usr/local/bin/micro-sample-backend
    
    CMD ["micro-sample-backend"]
    


    도커 이미지 생성



    빌드하려면 다음 명령을 사용하십시오.

    docker build -t gcr.io/$PROJECT_ID/micro-sample-frontend:v0.1 .
    docker build -t gcr.io/$PROJECT_ID/micro-sample-backend:v0.1 .
    


    GCP 프로젝트 만들기



    프로젝트를 만들고 GKE에서 micro-sample 라는 클러스터를 만들었습니다.



    내 로컬 컴퓨터에서 다음을 실행합니다.

    $ gcloud init
    Welcome! This command will take you through the configuration of gcloud.
    
    // Choose the correct configurations for your project.
    .......
    
    $ gcloud container clusters get-credentials micro-sample --zone="asia-northeast1-a"
    Fetching cluster endpoint and auth data.
    kubeconfig entry generated for micro-sample.
    
    $ kubectl config current-context
    gke_$PROJECT_ID_asia-northeast1-a_micro-sample
    


    이미지를 GCR로 푸시



    빌드된 이미지를 GCR에 푸시하면 이제 GCP 프로젝트가 생성됩니다.

    docker push gcr.io/$PROJECT_ID/micro-sample-frontend:v0.1
    docker push gcr.io/$PROJECT_ID/micro-sample-backend:v0.1
    


    GCR에서 리포지토리를 볼 수 있어야 합니다.



    서비스 yaml 파일을 만듭니다.



    $PROJECT_ID를 자신의 GCP 프로젝트 ID로 바꿔야 합니다. infrastructure라는 새 폴더를 만들고 그 안에 모든 yaml 파일을 저장합니다.

    infrastructure$ tree
    .
    ├── backend-deployment.yml
    ├── backend-service.yml
    ├── frontend-deployment.yml
    └── frontend-service.yml
    
    0 directories, 4 files
    


    인프라스트럭처/backend-deployment.yml




    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: micro-sample-backend-deployment
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: micro-sample
      template:
        metadata:
          labels:
            app: micro-sample
            tier: backend
            track: stable
        spec:
          containers:
          - name: micro-sample
            image: gcr.io/$PROJECT_ID/micro-sample-backend:v0.1
            ports:
            - containerPort: 8000
    


    인프라/백엔드-service.yml




    kind: Service
    apiVersion: v1
    metadata:
      name: micro-sample-service-backend
    spec:
      selector:
        app: micro-sample
        tier: backend
      ports:
      - protocol: TCP
        port: 8000
        targetPort: 8000
    


    인프라스트럭처/frontend-deployment.yml




    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: micro-sample-frontend-deployment
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: micro-sample
      template:
        metadata:
          labels:
            app: micro-sample
            tier: frontend
            track: stable
        spec:
          containers:
          - name: micro-sample-frontend
            image: gcr.io/$PROJECT_ID/micro-sample-frontend:v0.1
            ports:
              - containerPort: 8080
                name: http
            env:
              - name: BACKEND_SERVICE_NAME
                value: micro-sample-service-backend.default
    


    인프라스트럭처/frontend-service.yml




    kind: Service
    apiVersion: v1
    metadata:
      name: micro-sample-service-frontend
    spec:
      type: LoadBalancer
      selector:
        app: micro-sample
        tier: frontend
      ports:
      - protocol: TCP
        port: 80
        targetPort: 8080
    


    GCP의 구성




    $ kubectl apply -f frontend-service.yml
    service/micro-sample-service-frontend created
    
    $ kubectl apply -f frontend-deployment.yml
    deployment.apps/micro-sample-frontend-deployment created
    
    $ kubectl apply -f backend-service.yml
    service/micro-sample-service-backend created
    
    $ kubectl apply -f backend-deployment.yml
    deployment.apps/micro-sample-backend-deployment created
    


    클러스터의 팟(Pod) 확인



    로컬 시스템에서 kubectl get pods를 실행할 때 모든 팟(Pod)이 실행 중임을 확인할 수 있어야 합니다.

    $ kubectl get pods
    NAME                                                READY   STATUS    RESTARTS   AGE
    micro-sample-backend-deployment-854c888c95-46dp5    1/1     Running   0          98s
    micro-sample-backend-deployment-854c888c95-l4g48    1/1     Running   0          98s
    micro-sample-frontend-deployment-5cf875f7c9-2htft   1/1     Running   0          3m33s
    micro-sample-frontend-deployment-5cf875f7c9-g4kpn   1/1     Running   0          3m33s
    


    클러스터의 외부 IP를 확인하고 curl를 실행합니다. API에서 결과를 얻을 수 있어야 합니다.

    $ kubectl get svc
    NAME                            TYPE           CLUSTER-IP   EXTERNAL-IP    PORT(S)        AGE
    kubernetes                      ClusterIP      10.4.0.1     <none>         443/TCP        15m
    micro-sample-service-backend    ClusterIP      10.4.8.222   <none>         8000/TCP       51s
    micro-sample-service-frontend   LoadBalancer   10.4.15.80   EXTERNAL_IP   80:31017/TCP   7m44s
    
    $ curl "http://EXTERNAL_IP/increment?val=1"
    {"val":2}
    


    청소



    프런트엔드 및 백엔드 서비스를 모두 삭제합니다.

    $ kubectl delete svc micro-sample-service-frontend
    service "micro-sample-service-frontend" deleted
    
    //check if they are deleted
    $ kubectl get services
    NAME                           TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)    AGE
    kubernetes                     ClusterIP   10.4.0.1     <none>        443/TCP    14h
    


    마지막으로 클러스터를 삭제합니다.

    $ gcloud container clusters delete micro-sample
    The following clusters will be deleted.
     - [micro-sample] in [asia-northeast1-a]
    
    Do you want to continue (Y/n)?  Y
    
    Deleting cluster micro-sample...done.
    


    GKE에서 클러스터가 삭제되었음을 확인할 수 있습니다.

    참조



    죄송합니다. 일본어만 가능합니다.

    雰囲気でgRPC,GKE+kubernetes使ってマイクロサービス作る

    좋은 웹페이지 즐겨찾기