Kotlin , Kubernetes , Linkerdによるマイクロサービス


KHipster is a development platform to generate, develop and deploy Spring Boot + Angular/React/Vue Fullstack Web applications and Spring microservices. KHipster is built on top of JHipster.


この投稿では次のように行います.
  • Jhipster記述言語を用いたKipipsterによるマイクロサービスの生成
  • JDLを使用したKubernetes設定の生成
  • Kipsterを使用してコードを生成する
  • でクラスタを作成する
  • Linkerd CLIをインストールし、KubernetesクラスタでLinkerdを展開します
  • KubernetesでのIngressコントローラの配備
  • Kubernetesクラスタにおけるアプリケーションの配備
  • アプリケーションへの設定トラフィック
  • 始めましょう.

    Kipsterでマイクロサービスを生成する

    ステップ1:インストール
    KipsterはNPMパッケージとして利用可能です.インストールするには
    λ npm i -g generator-jhipster-kotlin
    

    Do not have Node installed? Check out nvm (Node Version Manager) that makes it easy to setup Node - here.


    次に、実行してインストールを確認します.
    λ khipster 
    

    Step 2 : JDLファイルの作成

    The JDL is a JHipster-specific domain language.


    JDLはアプリケーション、展開、エンティティ、およびそれらの関係を記述するためにDSLを提供します.Applications サービス全体を参照してください、アプリケーションはモノリスやマイクロサービスすることができます.The deployments アプリケーションを展開する方法を参照してくださいkubernetes . The entities あなたのアプリケーションのデータベース表への直線マップ.The relationships エンティティの関係を参照しますone-to-one , one-to-many , など.JDLは、マイクロサービスアプリケーションとエンティティを作成するプロセスを簡素化します.
    // Gateway application
    application {
        config {
            applicationType         gateway
            authenticationType      jwt
            baseName                gateway
            buildTool               gradle
            clientFramework         react
            databaseType            sql
            devDatabaseType         h2Disk
            prodDatabaseType        mysql
            packageName             com.sendilkumarn
            serverPort              8080
            serviceDiscoveryType    no
        }
        entities *
    } 
    
    // Microservice application
    application {
        config {
            applicationType         microservice
            authenticationType      jwt
            baseName                service
            buildTool               gradle
            databaseType            sql
            devDatabaseType         h2Disk
            prodDatabaseType        mysql
            packageName             com.sendilkumarn
            serverPort              8081
            serviceDiscoveryType    no
        }
        entities product
    }
    
    // Product entity 
    entity product  {
        name    String  required
        price   Long    required
    }
    
    2つのアプリケーションを定義しました.gateway and service , エンティティとエンティティ:product . 間の大きな違いgateway and service :
  • gateway 用途clientFramework ASreact , applicationType ASgateway
  • service 用途applicationType ASmicroservice
  • Refer we have used serviceDiscoveryType no, this implies that we are not using serviceDiscovery in the microservices. We will use Linkerd for servicediscovery.

    Did you know? JHipster supports sql and noSql database and it has many configuration options for generating the applications. Check the entire list of application configuration options here.



    Kubernetesの設定を生成する
    Kipster提供kubernetes Kubernetes設定ファイルを生成するオプションJHipster 生成アプリケーション.Kubernetesチェックアウトについてより調査することに興味があるhere . The jdl 受け入れるdeployment Kubernetes展開を定義するブロック.
    deployment {
      deploymentType         kubernetes
      appsFolders            [gateway, service]
      dockerRepositoryName   "sendilkumarn"
      serviceDiscoveryType   no
      istio                  false
      kubernetesNamespace    khipster
      kubernetesServiceType  Ingress
    }
    

    Note: It checks whether you have installed Docker since we need Docker for creating and pushing the images and use them later.


    Kubernetesの定義はdeployment ブロック付きdeploymentType ASkubernetes . The appsFolders 生成されたアプリケーションのフォルダにポイントします.私たちはdockerRepositoryName , ここではDockerユーザ名を参照します.アプリケーションと同様に、serviceDiscoveryType ASno (私たちは使用するのでLinkerd サービスディスカバリ用).Kipster提供istio 私たちが利用するので、箱からLinkerd そのために.使用するKubernetes名前空間を定義しますkubernetesNamespace プロパティ.すべての展開とサービス使用khipster アプリケーションを配備する名前空間.
    最後に、私たちはIngress としてKubernetesServiceType 設定.Kubernetesの最小展開単位はpod . PODはDockerコンテナのグループです.詳細についてはpods . 各podはその作成中にIPアドレスを取得します.アプリケーションにアクセスしなければならないなら、PODのIPアドレスに接続しなければなりません.kubernetesクラスタでは,podsは様々な要因に基づいて自動的に生成され,破壊される.それで、ポッドが新しく発生するとき、それらを参照しているIPアドレスは変わるかもしれません.ポッドで実行中のアプリケーションに接続するには、サービスを使用します.サービスは、ポッドのセットとそれらにアクセスする方法を定義します.サービスは、それに名前でポッドを識別するのに役立つloadbalancerまたはサービス発見者のようです.
    Kubernetesは3種類のサービスタイプを提供します.
  • cluster ip -クラスタ内部IPにサービスを公開する
  • nodeport -ポートにサービスを公開する
  • ロードバランサ-これは外部IPにサービスを公開する
  • With Kube-DNS , Kubernetesも外部名にサービスをマップします.参照here より多くのインフォメーション.
    Ingressはサービスタイプではありませんが、Ingressでサービスを公開できます.侵入はクラスタのエントリポイントとして機能します.同じIPアドレスの下で複数のサービスを公開することは理想的です.

    We need ingress-controller to expose services via ingress IP, we will set up ingress-controller below.



    Kipsterを使用してコードを生成する
    The khipster import-jdl インポートJDL ファイルと配備構成ファイルを生成します.
    λ khipster import-jdl app.jdl
    
    Gateway application generated successfully.
    Service application generated successfully.
    Kubernetes configuration generated successfully.
    
    ログインしてくださいdocker login . それぞれのフォルダで各サービスを行ってビルドします.
    λ ./gradlew bootJar -Pprod jib -Djib.to.image=<docker-username>:<app-name>
    

    でクラスタを作成する

    Install gcloud here.


    λ gcloud beta container --project <project-name> clusters create "khipster-cluster" --machine-type "c2-standard-4" --num-nodes "2" --zone "us-central1-c"
    
    クラスタ名を作成しますkhipster-cluster 与えられたプロジェクトで.私たちはmachine-type with c2-standard-4 で2ノードus-central1-c ゾーン.ゼロからクラスタを作成しなければならないので、これは完了するのにしばらくかかります.

    Explore more about K8s installation in the GCP here.



    Linkerd CLIをインストールし、KubernetesクラスタでLinkerdを展開します

    Linkerd is a service mesh for Kubernetes. Linkerd makes running services easier and safer by giving you runtime debugging, observability, reliability, and security—all without requiring any changes to your code. - Linkerd website


    CLIをシステムに手動でインストールし、パスを設定します.
    λ curl -sL https://run.linkerd.io/install | sh
    Linkerd stable-2.9.0 was successfully installed 🎉
    
    λ export PATH=$PATH:$HOME/.linkerd2/bin
    
    次のように実行します.
    λ linkerd version
    Client version: stable-2.9.0
    Server version: unavailable
    
    インストールが完了したら.KubernetesクラスタにLinkerdをインストールする前に、Kubernetesクラスタが正しく設定されているかどうかを確認します.次のコマンドを実行します.
    λ linkerd check --pre
    ....
    Status check results are √
    

    The above command checks whether the kubernetes cluster is configured correctly and ready to install the Linkerd control plane.


    注意:裸のKubernetes設定では、必要なクラスタ管理機能がない場合があります.作成するclusterrolebinding with cluster-admin 選択したアカウントの役割.
    λ kubectl create clusterrolebinding cluster-admin-binding \
      --clusterrole=cluster-admin \
      --user="$(gcloud config get-value core/account)"
    
    clusterrolebinding.rbac.authorization.k8s.io/cluster-admin-binding created
    
    KubernetesクラスタにLinkerdをインストールするには、次の手順を実行します
    λ linkerd install | kubectl apply -f -
    
    The linkerd install コマンドはKubernetes設定ファイルを作成します.設定ファイルをパイプでパイプしますkubectl apply -f それらの生成されたファイルのコマンド.これは完全に作成されますlinkerd Kubernetesクラスタでインストールが完了したらインストールを完了します
    λ linkerd check
    

    KubernetesでのIngressコントローラの配備

    Ingress exposes HTTP and HTTPS routes from outside the cluster to services within the cluster. Traffic routing is controlled by rules defined on the Ingress resource.


    IngressはKubernetesクラスタ内で動作するサービスに接続する外部IPを提供します.イングルは、ロードバランシング、SSL/TLSなどを提供します.バニラバージョンのnginx ingressコントローラをインストールします.
    λ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.41.2/deploy/static/provider/cloud/deploy.yaml
    
    一度、インクルードコントローラがKubernetesクラスタにインストールされます.次のコマンドを実行してIPアドレスを取得します.
    λ kubectl get svc ingress-nginx-controller -n ingress-nginx -o jsonpath='{.status.loadBalancer.ingress[0].ip}'
    xxx.xxx.xxx.xxx
    
    我々のアプリケーションは、上記のIPアドレスを介してアクセスできます.

    Kubernetesクラスタにおけるアプリケーションの配備
    Kubernetesクラスタにアプリケーションを配備するには、Kubernetesフォルダに移動し、次のコマンドを実行します.
    λ ./kubectl-apply.sh apply -f
    
    すべての展開とサービスはK 8 Sクラスタにインストールされます.今、私たちは自動的にLinkerdを注入する必要がありますkhipster 特定の名前空間のすべてのサービスの名前空間.
    次に、Linkerdを追加しましょうkhipster 実行時の名前空間:
    λ kubectl get -n khipster deploy -o yaml \
      | linkerd inject - \
      | kubectl apply -f -
    

    You can also inject proxy automatically. Refer here for more information.


    現在、Kubernetesクラスタはすべての必要な構成で準備ができています.

    アプリケーションへの設定トラフィック
    ここで最後のステップはサービスへのサービスサービスをマップすることです.注意annotationmetadata セクションでは、NGNXプロキシプロキシヘッダーHTTPプロキシを使用します.参照here を参照してください.
    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: web-ingress
      namespace: khipster
      annotations:
        kubernetes.io/ingress.class: "nginx"
        nginx.ingress.kubernetes.io/configuration-snippet: |
          proxy_set_header l5d-dst-override $service_name.$namespace.svc.cluster.local:$service_port;
    
    spec:
      rules:
      - host: <ip-address>.nip.io
        http:
          paths:
          - path: /
            backend:
              serviceName: gateway
              servicePort: 80
          - path: /service
            backend:
              serviceName: service
              servicePort: 8081
    

    .nip.io refer the nip.io at the end. nip.io helps to redirect check here


    また、spec セクション.specセクションはリダイレクトのルールを提供します.ホストを提供し、名前を付けてサービスへのパスをマップします.ビオラ!今すぐアプリケーションが準備ができて!移動する<ip-address>.nip.io マイクロサービスの実行を確認する.
    リンカと一緒に来るdashboard & grafana サービス、トラフィック、およびすべてを監視する.あなたはそれらをチェックアウトすることができますlinkerd dashboard .
    //💻 GitHub // ✍️ Blog