Razee は、クラスター、環境、クラウド プロバイダーにわたる Kubernetes リソースのデプロイメントを自動化および管理し、ロールアウト プロセスを監視してデプロイメントの問題を発見できるようにリソースのデプロイメント情報を視覚化するために IBM によって開発されたオープンソース プロジェクトです。もっと早く。
Razee の使用を開始するには、次のリンクを参照してください。
Razee の主要な機能と、それらを活用してクラスターの Kubernetes リソースのデプロイメントを管理する方法を確認します。
Razee は、RazeeDash、RazeeDeployables、RazeeDeploy の 3 つのモジュールで構成されており、これらは疎結合であり、独立して使用できます。 RazeeDash を使用すると、Kubernetes リソースのライブ インベントリを動的に作成し、強力なフィルターとアラート機能を使用して構成情報を視覚化し、展開プロセスの問題をより迅速にトラブルシューティングできます。 RazeeDeploy コンポーネントは、Kubernetes リソースのテンプレート化、リソースとクラスターのグループ化、これらのグループ化のルールの定義によってマルチクラスターのデプロイメントを簡素化するように設計されており、クラスター、環境、クラウド全体に適用される柔軟な構成を作成できます。
成分 | 説明 |
---|---|
ウォッチキーパー | Watch Keeper は、Kubernetes リソースの構成情報を取得し、このデータを RazeeDash API に送信する責任があります。 Watch Keeper を使用するには、このコンポーネントをクラスターにインストールし、監視するすべてのリソースにrazee/watch-resource ラベルを追加するだけです。ラベルを追加すると、Watch Keeper は Kubernetes API サーバーから構成情報を取得し、このデータを直ちに RazeeDash API に送信します。このプロセスは 1 時間ごとに繰り返されます。さらに、Watch Keeper は Kubernetes イベント ウォッチャーをリソースに追加し、リソースの構成が変更されたときに Watch Keeper が Kubernetes によって通知されるようにします。 |
RazeeDash API | RazeeDash API は、Watch Keeper から Kubernetes リソース構成とリソース定義を受け取るサービスです。 RazeeDash API に送信されたデータは、自動的に MongoDB に保存されます。 |
ラジーダッシュ | RazeeDash は、Watch Keeper によって取得されたデータを視覚化し、クラスター内の Kubernetes リソースのインベントリを動的に作成します。インテリジェントなフィルターとアラート機能を使用してこのデータを分析し、展開プロセスの問題を迅速に特定して解決できます。 |
クラスターサブスクリプション | ClusterSubscription は、Razee のサブスクリプションを監視して、クラスターのアクティブなサブスクリプションが存在するかどうかを確認する Razee デプロイメントです。サブスクリプションが見つかると、関連するバージョンの Kubernetes リソースが Razee から取得され、クラスターに自動的に適用されます。 |
成分 | 説明 |
---|---|
RazeeDeploy コア | RazeeDeploy Core は、クラスター内で実行される継続的デリバリー ツールであり、 CustomResourceDefinitions (CRD)、Kubernetes コントローラー、および RazeeDeploy コンポーネントの依存関係のセットアップに使用できます。 |
Razeeデプロイ デルタ | RazeeDeploy Delta は、クラスター内で実行され、RazeeDeploy コンポーネントのカスタム リソース定義と Kubernetes コントローラーを最新の状態に保つ RazeeDeploy Core のコンポーネントです。 |
RemoteResource とリモート リソース S3 | RemoteResource と RemoteResourceS3 は、ソース リポジトリに保存されている Kubernetes リソースを自動的にデプロイするために使用できるカスタム リソース定義およびコントローラーです。更新が行われるたびにこれらの YAML ファイルを各クラスター、環境、またはクラウド全体に手動で適用するのではなく、リモート リソースでソース リポジトリを定義し、クラスター内にリモート リソースを作成するだけです。リモート リソース コントローラーは、ソース リポジトリに自動的に接続し、Kubernetes 構成ファイルをダウンロードして、そのファイルをクラスターに適用します。 |
口ひげテンプレート | MustacheTemplate は、他の Kubernetes YAML ファイル内の YAML ファイル部分を置き換えるために使用できる環境変数を定義するためのカスタム リソース定義およびコントローラーです。たとえば、mustache テンプレートの環境変数を使用してリモート リソースの URL を構築し、デプロイするアプリのバージョンを指すことができるようにします。 |
機能フラグセットLD | FeatureFlagSetLD は、Launch Darkly から機能フラグ値を自動的に取得するためのカスタム リソース定義およびコントローラーです。機能フラグを使用すると、クラスターにデプロイされるコードを制御し、クラスター、環境、またはクラウド全体で複数のバージョンの Kubernetes リソースを管理できます。 |
マネージドセット | ManagedSet は、作成して同時にクラスターに適用する Kubernetes リソースをグループ化するためのカスタム リソース定義およびコントローラーです。 |
Kubernetes ユーティリティ | Kubernetes ユーティリティは、Kubernetes との通信を簡素化するために使用できるnpm パッケージです。 |
Razee をクラスターにデプロイするには、クラスターが次の要件を満たしている必要があります。
まず、次のコマンドを実行して、クラスタに razeedeploy-delta をインストールします。
kubectl apply -f https://github.com/razee-io/Razee/releases/latest/download/razeedeploy.yaml
出力例:
namespace/razeedeploy created
serviceaccount/razeedeploy-sa created
clusterrole.rbac.authorization.k8s.io/razeedeploy-admin-cr configured
clusterrolebinding.rbac.authorization.k8s.io/razeedeploy-rb configured
job.batch/razeedeploy-job created
kubectl get deploy -n razeedeploy
NAME READY UP-TO-DATE AVAILABLE AGE
remoteresource-controller 1/1 1 1 56s
RazeeDash コンポーネントをクラスターにインストールします。 RazeeDash API に送信されるデータを保存するには、MongoDB インスタンスをセットアップする必要があります。提供されているrazeedash-all-in-one.yaml
ファイルを使用して RazeeDash と単一の MongoDB インスタンスをセットアップするか、クラスター内で実行される既存の MongoDB インスタンスを使用して RazeeDash をセットアップするかを選択できます。注: クラスタの 1 つに RazeeDash の実行中のインスタンスがすでにあり、代わりに別のクラスタをインベントリ リストに追加したい場合は、この手順をスキップして、クラスタへの Watchkeeper コンポーネントのインストールを続行できます。
RazeeDash と単一の MongoDB インスタンスをインストールするには:
kubectl apply -f https://github.com/razee-io/Razee/releases/latest/download/razeedash-all-in-one.yaml
出力例:
persistentvolume/mongo-pv-volume created
persistentvolumeclaim/mongo-pv-claim created
deployment.apps/mongo created
service/mongo created
secret/razeedash-secret created
remoteresource.deploy.razee.io/razeedash created
service/razeedash-lb created
service/razeedash-api-lb created
既存の MongoDB インスタンスを使用するには:
mongo_url の razeedash シークレットを作成します。以下のコマンドを実際のユーザー名とパスワード、mongo-0、mongo-1、mongo-3 の 3 つのホスト インスタンスと正しいポートに置き換えます。 mongo URL の末尾に/razeedash?ssl=true
あることを確認してください。
例 :
kubectl -n razee create secret generic razeedash-secret --from-literal " mongo_url=mongodb://username:password@mongo‑0:27017,mongo‑1:27017,mongo‑2:27017/razeedash?ssl=true "
kubectl apply -f https://github.com/razee-io/Razee/releases/latest/download/razeedash.yaml
razeedash-api
デプロイが完了するまで待ちます。前の手順で、提供されたrazeedash-all-in-one.yaml
ファイルを使用して RazeeDash を作成することを選択した場合、MongoDB のインスタンスがクラスター内に作成され、RazeeDash API インスタンスに接続されます。 MongoDB のセットアップが完了するまでに数分かかるため、RazeeDash API のデプロイメントで断続的なMongoNetworkError
エラーが発生する可能性があります。 MongoDB が完全にセットアップされると、Kubernetes は RazeeDash API インスタンスのセットアップを自動的に終了します。
kubectl logs deploy/razeedash-api -n razee
MongoDB がまだセットアップされていない場合の出力例:
> [email protected] start /usr/src
> node app/index.js
(node:16) UnhandledPromiseRejectionWarning: MongoNetworkError: getaddrinfo
ENOTFOUND mongo
at Socket. < anonymous > (/usr/src/node_modules/mongodb-core/lib/connection/connect.js:287:16)
at Object.onceWrapper (events.js:284:20)
at Socket.emit (events.js:196:13)
at emitErrorNT (internal/streams/destroy.js:91:8)
at emitErrorAndCloseNT (internal/streams/destroy.js:59:3)
at processTicksAndRejections (internal/process/task_queues.js:84:9)
(node:16) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch (). (rejection id: 1)
(node:16) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
RazeeDash API が完全に設定されている場合の出力例:
> [email protected] start /usr/src
> node app/index.js
{ " name " : " apollo/subscription " , " parseUA " :false, " excludes " :[ " referer " , " url " , " body " , " short-body " ], " hostname " : " razeedash-api-7bd66669b7-jj2vj " , " pid " :17, " level " :30, " msg " : " Apollo streaming servic e is configured on redisUrl: redis://redis-service:6379/0 " , " time " : " 2020-06-03T21:57:16.021Z " , " v " :0}
{ " name " : " apollo/subscription " , " parseUA " :false, " excludes " :[ " referer " , " url " , " body " , " short-body " ], " hostname " : " razeedash-api-7bd66669b7-jj2vj " , " pid " :17, " level " :30, " msg " : " Apollo streaming is ena bled on redis endpoint redis-service:6379 " , " time " : " 2020-06-03T21:57:17.062Z " , " v " :0}
{ " name " : " / " , " parseUA " :false, " excludes " :[ " referer " , " url " , " body " , " short-body " ], " hostname " : " razeedash-api-7bd66669b7-jj2vj " , " pid " :17, " level " :30, " msg " : " Created new collection users index users " , " time " : " 2020-06-03T21:57:17.222Z " , " v " :0}
{ " name " : " / " , " parseUA " :false, " excludes " :[ " referer " , " url " , " body " , " short-body " ], " hostname " : " razeedash-api-7bd66669b7-jj2vj " , " pid " :17, " level " :30, " msg " : " Created new View clusterStatsView " , " time " : " 2020-06-03T21:57:17.239Z " , " v " :0}
{ " name " : " / " , " parseUA " :false, " excludes " :[ " referer " , " url " , " body " , " short-body " ], " hostname " : " razeedash-api-7bd66669b7-jj2vj " , " pid " :17, " level " :30, " msg " : " Created new View resourceStatsView " , " time " : " 2020-06-03T21:57:17.241Z " , " v " :0}
{ " name " : " apollo/models " , " parseUA " :false, " excludes " :[ " referer " , " url " , " body " , " short-body " ], " hostname " : " razeedash-api-7bd66669b7-jj2vj " , " pid " :17, " level " :30, " msg " : " SetupDistributedCollections r eceived modelName=resources for DB mongodb://mongo:27017/razeedash " , " time " : " 2020-06-03T21:57:17.284Z " , " v " :0}
{ " name " : " apollo/models " , " parseUA " :false, " excludes " :[ " referer " , " url " , " body " , " short-body " ], " hostname " : " razeedash-api-7bd66669b7-jj2vj " , " pid " :17, " level " :30, " msg " : " SetupDistributedCollections r eceived modelName=orgs for DB mongodb://mongo:27017/razeedash " , " time " : " 2020-06-03T21:57:17.295Z " , " v " :0}
{ " name " : " apollo/models " , " parseUA " :false, " excludes " :[ " referer " , " url " , " body " , " short-body " ], " hostname " : " razeedash-api-7bd66669b7-jj2vj " , " pid " :17, " level " :30, " msg " : " SetupDistributedCollections:c lusters - received modelName=clusters for DB mongodb://mongo:27017/razeedash " , " time " : " 2020-06-03T21:57:17.297Z " , " v " :0}
{ " name " : " apollo " , " parseUA " :false, " excludes " :[ " referer " , " url " , " short-body " , " user-agent " , " req " , " res " ], " hostname " : " razeedash-api-7bd66669b7-jj2vj " , " pid " :17, " level " :30, " msg " : " Initialize apollo application for default auth " , " time " : " 2020-06-03T21:57:17.298Z " , " v " :0}
{ " name " : " apollo " , " parseUA " :false, " excludes " :[ " referer " , " url " , " short-body " , " user-agent " , " req " , " res " ], " hostname " : " razeedash-api-7bd66669b7-jj2vj " , " pid " :17, " level " :30, " msg " : " [] Apollo server c ustom plugin are loaded. " , " time " : " 2020-06-03T21:57:17.299Z " , " v " :0}
{ " name " : " razeedash-api " , " hostname " : " razeedash-api-7bd66669b7-jj2vj " , " pid " :17, " level " :30, " msg " : " ? razeedash-api listening on port 3333/api " , " time " : " 2020-06-03T21:57:17.723Z " , " v " :0}
{ " name " : " apollo " , " parseUA " :false, " excludes " :[ " referer " , " url " , " short-body " , " user-agent " , " req " , " res " ], " hostname " : " razeedash-api-7bd66669b7-jj2vj " , " pid " :17, " level " :30, " msg " : " ? Apollo server listening on http://[::]:3333/graphql " , " time " : " 2020-06-03T21:57:17.734Z " , " v " :0}
RazeeDash API セットアップ中に自動的に作成されるrazeedash-lb
およびrazeedash-api-lb
ロード バランサー サービスの外部 IP アドレスを取得します。 razeedash-lb
RazeeDash インスタンスのパブリック エンドポイントとして機能し、 razeedash-api-lb
RazeeDash API インスタンスのパブリック エンドポイントとして機能します。割り当てられたパブリック IP アドレスを使用すると、RazeeDash および RazeeDash API コンポーネントへのアクセスに使用するパブリック URL を構築できます。 RazeeDash のセットアップを完了するには、2 つの URL を RazeeDash 構成マップに保存する必要があります。次の Bash コマンドを使用して、パブリック IP アドレスを取得し、パブリック URL を構築し、URL を RazeeDash 構成マップに保存します。 Bash スクリプトbin/kc_create_razeedash_config.sh
を実行することもできます。 RazeeDash 構成マップのroot_url
とrazeedash_api_url
の末尾に/
含める必要があることに注意してください。
# Amazon EKS uses host names, IBM Cloud Kubernetes Service uses Ingress IP addresses. This handle both.
RAZEEDASH_LB_IP= $( kubectl get service razeedash-lb -n razee -o jsonpath= " {.status.loadBalancer.ingress[*].ip} " )
RAZEEDASH_API_LB_IP= $( kubectl get service razeedash-api-lb -n razee -o jsonpath= " {.status.loadBalancer.ingress[*].ip} " )
RAZEEDASH_LB_HOSTNAME= $( kubectl get service razeedash-lb -n razee -o jsonpath= " {.status.loadBalancer.ingress[*].hostname} " )
RAZEEDASH_API_LB_HOSTNAME= $( kubectl get service razeedash-api-lb -n razee -o jsonpath= " {.status.loadBalancer.ingress[*].hostname} " )
RAZEEDASH_LB= ${RAZEEDASH_LB_HOSTNAME} && [[ " ${RAZEEDASH_LB_IP} " != " " ]] && RAZEEDASH_LB= ${RAZEEDASH_LB_IP}
RAZEEDASH_API_LB= ${RAZEEDASH_API_LB_HOSTNAME} && [[ " ${RAZEEDASH_API_LB_IP} " != " " ]] && RAZEEDASH_API_LB= ${RAZEEDASH_API_LB_IP}
kubectl create configmap razeedash-config -n razee
--from-literal=root_url=http:// " ${RAZEEDASH_LB} " :8080/
--from-literal=razeedash_api_url=http:// " ${RAZEEDASH_API_LB} " :8081/
すべての Razee コンポーネントがデプロイされ、CLI 出力のREADY列に1/1
表示されていることを確認します。
kubectl get deployments -n razee
出力例:
NAME READY UP-TO-DATE AVAILABLE AGE
featureflagsetld-controller 1/1 1 1 53m
managedset-controller 1/1 1 1 53m
mongo 1/1 1 1 34m
mustachetemplate-controller 1/1 1 1 53m
razeedash 1/1 1 1 25m
razeedash-api 1/1 1 1 25m
razeedeploy-delta 1/1 1 1 53m
remoteresource-controller 1/1 1 1 53m
remoteresources3-controller 1/1 1 1 53m
RazeeDash のようこそ画面を開きます。
open http:// " ${RAZEEDASH_LB} " :8080
GitHub、GitHub Enterprise、または Bitbucket で RazeeDash 用のOAuth
アプリケーションを作成します。
RazeeDash のようこそ画面から、 OAuth
アプリケーションを作成するツールのタイルを選択します。
ポップアップ ウィンドウの指示に従って、 OAuth
アプリケーションを作成します。
「構成を保存」をクリックします。
RazeeDash のようこそ画面で、 [<integration_tool> でサインイン] をクリックします。
ポップアップ ウィンドウの指示に従って、選択した統合ツールへの RazeeDash アクセスを許可します。
OAuth
認証情報のいずれかをリセットする必要がある場合は、インスタンスに対して mongo シェルを開いて実行することで、最初からやり直すことができます。
> use razeedash
> db.meteor_accounts_loginServiceConfiguration.remove({})
監視するすべてのクラスターに Watch Keeper をインストールします。 Watch Keeper をインストールするクラスターは、RazeeDash をインストールしたクラスターとは異なるクラスターにすることができます。
RazeeDash コンソールで、 [登録] をクリックします。
「管理」をクリックします。
Razee Agent のインストールkubectl
コマンドをコピーします。
監視するクラスターでコマンドを実行して、Watch Keeper コンポーネントを作成します。 RazeeDash をインストールしたのと同じクラスターに Watch Keeper をインストールすると、Watch Keeper コンポーネントの一部がすでにクラスターに存在するというメッセージが表示されます。これらのメッセージは無視してかまいません。
kubectl create -f http:// < razeedash-api-lb_external_IP > :8081/api/install/cluster ? orgKey=orgApiKey- < org_api_key >
RazeeDash がインストールされているクラスターの出力例:
deployment.apps/remoteresource-controller created
configmap/watch-keeper-config created
secret/watch-keeper-secret created
remoteresource.deploy.razee.io/watch-keeper-rr created
Error from server (AlreadyExists): error when creating
" http://4e0ef59e-us-south.lb.appdomain.cloud:8081/api/install/cluster?
orgKey=orgApiKey-d52b52fc-38ae-4da0-b187-6e097e5bfe5c " : namespaces
" razee " already exists
Error from server (AlreadyExists): customresourcedefinitions.
apiextensions.k8s.io " remoteresources.deploy.razee.io " already exists
Error from server (AlreadyExists): error when creating
" http://4e0ef59e-us-south.lb.appdomain.cloud:8081/api/install/cluster?
orgKey=orgApiKey-d52b52fc-38ae-4da0-b187-6e097e5bfe5c " : namespaces
" razee " already exists
Error from server (AlreadyExists): error when creating
" http://4e0ef59e-us-south.lb.appdomain.cloud:8081/api/install/cluster?
orgKey=orgApiKey-d52b52fc-38ae-4da0-b187-6e097e5bfe5c " : serviceaccounts
" razeedeploy-sa " already exists
Error from server (AlreadyExists): error when creating
" http://4e0ef59e-us-south.lb.appdomain.cloud:8081/api/install/cluster?
orgKey=orgApiKey-d52b52fc-38ae-4da0-b187-6e097e5bfe5c " : clusterroles.
rbac.authorization.k8s.io " razeedeploy-admin-cr " already exists
Error from server (AlreadyExists): error when creating
" http://4e0ef59e-us-south.lb.appdomain.cloud:8081/api/install/cluster?
orgKey=orgApiKey-d52b52fc-38ae-4da0-b187-6e097e5bfe5c " :
clusterrolebindings.rbac.authorization.k8s.io " razeedeploy-rb " already exists
Error from server (AlreadyExists): error when creating
" http://4e0ef59e-us-south.lb.appdomain.cloud:8081/api/install/cluster?
orgKey=orgApiKey-d52b52fc-38ae-4da0-b187-6e097e5bfe5c " : configmaps
" razeedeploy-delta-resource-uris " already exists
Error from server (AlreadyExists): error when creating
" http://4e0ef59e-us-south.lb.appdomain.cloud:8081/api/install/cluster?
orgKey=orgApiKey-d52b52fc-38ae-4da0-b187-6e097e5bfe5c " : deployments.apps
" razeedeploy-delta " already exists
RazeeDash がインストールされていないクラスターの出力例:
configmap/watch-keeper-config created
secret/watch-keeper-secret created
clusterrole.rbac.authorization.k8s.io/cluster-reader created
serviceaccount/watch-keeper-sa created
clusterrolebinding.rbac.authorization.k8s.io/watch-keeper-rb created
networkpolicy.networking.k8s.io/watch-keeper-deny-ingress created
deployment.apps/watch-keeper created
Error from server (AlreadyExists): namespaces " razee " already exists
Watch Keeper の展開が完了するまで待ちます。
kubectl get deployment -n razee | grep watch-keeper
出力例:
watch-keeper 1/1 1 1 2m5s
RazeeDash コンソールから、 [RazeeDash]をクリックして RazeeDash の詳細ページを開き、Watch Keeper ポッドの展開情報が表示されることを確認します。
Watch Keeper をクラスター内にセットアップすると、監視する他の Kubernetes リソースのデプロイメント情報を取得できます。データは自動的に RazeeDash API に送信され、RazeeDash を使用してこのデータにアクセス、監視、分析できます。
次の情報の詳細レベルから選択して、Watch Keeper にどの情報を取得させるかを決定します。
lite
: Kubernetes リソース構成のmetadata
とstatus
セクションを取得します。detail
: Kubernetes リソースのすべての構成データを取得しますが、環境変数と構成マップとシークレットのdata
セクションは除外されます。debug
: 環境変数やdata
を含む、Kubernetes リソースのすべての構成データを取得します。構成マップとシークレットのセクション。この情報には機密情報が含まれる可能性があるため、このオプションは注意して使用してください。監視するすべての Kubernetes リソースのラベルセクションにrazee/watch-resource
ラベルを追加し、情報の詳細レベルを指定します。たとえば、Kubernetes デプロイメントを監視する場合は、次のコマンドを使用します。ラベルをリソースに追加すると、Watch Keeper はリソースを自動的にスキャンし、データを RazeeDash API に送信します。その後、リソースは 1 時間ごとにスキャンされます。さらに、Watch Keeper は Kubernetes イベント ウォッチャーをリソースに追加し、リソースの構成が変更されたときに Watch Keeper が Kubernetes によって通知されるようにします。
kubectl edit deployment < deployment_name >
YAML ファイルの例:
apiVersion : extensions/v1beta1
kind : Deployment
metadata :
annotations :
deployment.kubernetes.io/revision : " 1 "
kubectl.kubernetes.io/last-applied-configuration : |
{"apiVersion":"apps/v1","kind":"Deployment","metadata":{"annotations":{},"labels":{"app":"myapp"},"name":"expandpvc","namespace":"default"},"spec":{"selector":{"matchLabels":{"app":"myapp"}},"template":{"metadata":{"labels":{"app":"myapp"}},"spec":{"con