2.4. Kubernetes(Helm チャート)
2.4.1. 必須要件
動作に必要な環境
(ローカル環境に構築する場合のみ)kind v0.17.0
kubectl v1.26.x
Kubernetes v1.24.x 以上
動作に必要なミドルウェア
インストールの手順で使用するツール
用意しておくファイル
サーバー証明書
最小ハードウェア要件
20GB以上の空きディスク容量
Kubernetesクラスタのノード構成は次のいずれかを満たすこと
AWS m5.large相当(vCPU2、メモリ8GiB)のインスタンス3台以上
注釈
deployment.zip 内の k8s ディレクトリに本章を基準とした、構築のためのサンプルファイルがあります。 必要に応じて参照してください。
2.4.2. 外部ミドルウェアの設定
intdashが使用するミドルウェアについては、既にKubernetesクラスタから参照できるネットワークにインストールされている前提として進めます。 ミドルウェアのインストール方法は各種公式Webサイトを参照してください。
2.4.2.1. PostgreSQL
psql
コマンドで対話型シェルを起動します。
sudo -u postgres psql -d template1
データベースとユーザーを作成します。パスワードは同一ものを設定します。
CREATE ROLE "intdash-api-broker" WITH LOGIN; ALTER ROLE "intdash-api-broker" PASSWORD '<生成したパスワード>'; CREATE DATABASE "intdash-api-broker" OWNER intdash; CREATE ROLE "intdash-api-auth" WITH LOGIN; ALTER ROLE "intdash-api-auth" PASSWORD '<生成したパスワード>'; CREATE DATABASE "intdash-api-auth" OWNER intdash; CREATE ROLE "intdash-api-measurement" WITH LOGIN; ALTER ROLE "intdash-api-measurement" PASSWORD '<生成したパスワード>'; CREATE DATABASE "intdash-api-measurement" OWNER intdash; CREATE ROLE "intdash-api-tenant" WITH LOGIN; ALTER ROLE "intdash-api-tenant" PASSWORD '<生成したパスワード>'; CREATE DATABASE "intdash-api-tenant" OWNER intdash; CREATE ROLE "intdash-api-media" WITH LOGIN; ALTER ROLE "intdash-api-media" PASSWORD '<生成したパスワード>'; CREATE DATABASE "intdash-api-media" OWNER intdash; CREATE ROLE "intdash-api-webhook" WITH LOGIN; ALTER ROLE "intdash-api-webhook" PASSWORD '<生成したパスワード>'; CREATE DATABASE "intdash-api-webhook" OWNER intdash; CREATE ROLE "vm2m-data-viz-backend" WITH LOGIN; ALTER ROLE "vm2m-data-viz-backend" PASSWORD '<生成したパスワード>'; CREATE DATABASE "vm2m-data-viz-backend" OWNER intdash;注釈
セキュリティを向上させる場合はすべてのロールに対して別々のパスワードでも可能です。その場合は
values.yaml
を変更してください。 詳細については設定リファレンス Kubernetes(Helm チャート) を参照してください。
2.4.2.2. NATS
ユーザー情報を設定します。NATS の設定ファイルに
authorization
セクションを設定します。パスワードは、 natscli のnats server passwd
コマンドを使用して生成します。... authorization: { user: intdash, password: <nats server passwd で生成したBcrypt文字列> } ...
2.4.2.3. JetStream
ユーザー情報を設定します。NATS の設定ファイルに
authorization
セクションを設定します。パスワードは natscli のnats server passwd
コマンドを使用して生成します。... authorization: { user: intdash, password: <nats server passwd で生成したBcrypt文字列> } ...
2.4.2.4. S3(minio)
S3バケットを作成します。intdashはMeasurement ServiceとMedia Serviceで1つずつバケットを使用するため、それぞれ作成します。S3を使用できない場合は S3完全互換のOSSである minio を使用します。特別な理由がない限りはS3を推奨します。
次のコマンドでバケットを作成します。Media Service用のバケット intdash-media-service と Measurement Service用のバケット intdash-measurement-service を作成します。
export REGION=<リージョン名:例 ap-northeast-1やus-east-1など> aws s3api create-bucket \ --bucket intdash-media-service \ --create-bucket-configuration LocationConstraint=${REGION} aws s3api create-bucket \ --bucket intdash-measurement-service \ --create-bucket-configuration LocationConstraint=${REGION}
注釈
バケット作成時のオプションは適宜カスタマイズして作成してください。
minio-Download から、環境に応じたMINIO Clientをインストールします。
次のコマンドでバケットを作成します。
mc alias set minio <minioのURL:例 http://storage:9000> <minioのルートユーザー名> <minioのルートパスワード> mc mb --ignore-existing minio/intdash-media-service mc policy set download minio/intdash-media-service mc mb --ignore-existing minio/intdash-measurement-service mc policy set download minio/intdash-measurement-service
2.4.2.5. InfluxDB
influx
コマンドで対話型シェルを開きます。
influx
次のコマンドでユーザーを作成します。
> CREATE USER intdash WITH PASSWORD '<任意のパスワード>' WITH ALL PRIVILEGES; > auth username: intdash password: <パスワード入力> > CREATE DATABASE "intdash-measurement" WITH SHARD DURATION 1h;
2.4.3. 構築手順
コンテナイメージはAWS Marketplaceにて提供されます。最初にAWSアカウントからコンテナ製品をサブスクライブします
次のコマンド使用し、Docker Registry 及び Helm Registry へログインします。
export IMAGE_REPOSITORY_BASE=<Dockerレジストリ:例 <アカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com> export REGION=<リージョン名:例 ap-northeast-1やus-east-1など> aws ecr get-login-password \ --region ${REGION} | docker login --username AWS \ --password-stdin "${IMAGE_REPOSITORY_BASE}" aws ecr get-login-password \ --region ${REGION} | helm registry login \ --username AWS \ --password-stdin "${IMAGE_REPOSITORY_BASE}"
注釈
awsへ認証していない場合は、aws configure を実行し、認証情報を設定してください。
クラスタを構築します。
ローカル環境にKubernetesクラスタを構築します。 kind を使用するため、あらかじめインストールしてください。
クラスタを作成します。 kind-cluster.yaml という名前の次の内容のファイルを作成します。
kind: Cluster name: intdash apiVersion: kind.x-k8s.io/v1alpha4 nodes: - role: control-plane kubeadmConfigPatches: - | kind: InitConfiguration nodeRegistration: kubeletExtraArgs: node-labels: "ingress-ready=true" extraPortMappings: - containerPort: 80 hostPort: 80 protocol: TCP - containerPort: 443 hostPort: 443 protocol: TCP # QUIC用のポート - containerPort: 32443 hostPort: 11443 protocol: UDP注釈
Docker Rootless Modeを使用している場合、特権ポートの公開には設定が必要です。 Exposing privileged ports を参照してください。
作成したファイルを使用して、次のコマンドを実行します。
# クラスタの作成 kind create cluster --config=./kind-cluster.yaml # クラスタ情報の表示 kubectl cluster-info --context kind-intdash # クラスタのコンテキストを使用 kubectl config use-context kind-intdashIngress NGINX Controller を有効にします。Helmチャートを利用します。まず次の内容で nginx-values.yaml を作成します。これには kind 用のパッチも含まれています。
controller: updateStrategy: type: RollingUpdate rollingUpdate: maxUnavailable: 1 hostPort: enabled: true terminationGracePeriodSeconds: 0 service: type: NodePort watchIngressWithoutClass: true nodeSelector: ingress-ready: "true" tolerations: - key: "node-role.kubernetes.io/master" operator: "Equal" effect: "NoSchedule" - key: "node-role.kubernetes.io/control-plane" operator: "Equal" effect: "NoSchedule" publishService: enabled: false extraArgs: publish-status-address: localhost注釈
ChartのValuesについては、 Ingres NGINX ControlerのCharts を参照してください。設定のカスタマイズは可能ですが、intdashサーバーとしての動作に影響がないようにしてください。
クラスタにNGINX Ingress Controllerを適用します。
helm upgrade --install ingress-nginx ingress-nginx \ --repo https://kubernetes.github.io/ingress-nginx \ --namespace ingress-nginx --create-namespace -f ./nginx-values.yaml # 作成完了まで待機 kubectl wait --namespace ingress-nginx \ --for=condition=ready pod \ --selector=app.kubernetes.io/component=controller \ --timeout=90s
EKSクラスタを構築します。 eksctl を使用するのであらかじめインストールしておきます。
export REGION=<AWSリージョン:例 ap-northeast-1> eksctl create cluster -r ${REGION} --name intdash-cluster \ --nodes=3 \ --instance-types "m5.large" \ --node-volume-size 200注釈
クラスタ生成のオプションは必要に応じてカスタマイズしてください。
AWS Load Balancer Controller を AWS Load Balancer Controller - Installation Guide に従い インストールします。IAM OIDC プロバイダを作成します。
export REGION=<AWSリージョン:例 ap-northeast-1> eksctl utils associate-iam-oidc-provider \ --region ${REGION} \ --cluster intdash-cluster \ --approve
IAM ポリシーをダウンロードします。
curl \ -o iam-policy.json \ https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/main/docs/install/iam_policy.json
IAMポリシーを 「AWSLoadBalancerControllerIAMPolicy」という名前で作成します。
aws iam create-policy \ --policy-name AWSLoadBalancerControllerIAMPolicy \ --policy-document file://iam-policy.json
AWS Load Balancer Controllerが使用する IAM ロールとサービスアカウントを作成します。
export AWS_ACCOUNT_ID=<AWSアカウントID> eksctl create iamserviceaccount \ --cluster=intdash-cluster \ --namespace=kube-system \ --name=aws-load-balancer-controller \ --attach-policy-arn=arn:aws:iam::${AWS_ACCOUNT_ID}:policy/AWSLoadBalancerControllerIAMPolicy \ --override-existing-serviceaccounts \ --approve # 作成したサービスアカウントリソースが存在することを確認します。 kubectl get sa --namespace kube-system aws-load-balancer-controller -o yaml
Helmチャートを使用して、EKSクラスターにAWS Load Balancer Controller をインストールします。
helm repo add eks https://aws.github.io/eks-charts helm repo update kubectl apply \ -k "github.com/aws/eks-charts/stable/aws-load-balancer-controller/crds?ref=master" helm install aws-load-balancer-controller eks/aws-load-balancer-controller \ -n kube-system \ --set clusterName=intdash-cluster \ --set serviceAccount.create=false \ --set serviceAccount.name=aws-load-balancer-controller
(S3を使用する場合のみ)クラスタ上にS3用のサービスアカウントを作成します。
次の内容で policy.json を保存します。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:*" ], "Resource": "arn:aws:s3:::<Media Serviceのバケット名:例 intdash-media-service>" }, { "Effect": "Allow", "Action": [ "s3:*" ], "Resource": "arn:aws:s3:::<Measurement Serviceのバケット名:例 intdash-measurement-service>" } ] }
注釈
バケット名は前述の手順で作成したバケット名を指定してください。
IAMポリシーを作成します。
aws iam create-policy \ --policy-name IntdashServiceS3IAMPolicy \ --policy-document file://policy.json # 作成されたポリシーの情報が出力されます。
サービスアカウントを作成します。
EC2インスタンス上にkindクラスタを構築している場合、インスタンスにロールを割り当てます。 詳細については Amazon EC2 の IAM ロール を参照してください。
EC2インスタンス以外の場合は、IAMロールをアタッチしたIAMユーザーを作成し、IAMユーザーのアクセスキーとアクセスシークレットをアプリケーションの設定ファイルに記述します。
export USER_NAME=<任意のユーザー名:例 test-user> export POLICY_ARN=<前の手順で作成したIAMポリシーのARNを指定します:例 arn:aws:iam::xxxxxxxxxxxx:policy/IntdashServiceS3IAMPolicy>。 aws iam create-user --user-name "${USER_NAME}" aws iam attach-user-policy --user-name "${USER_NAME}" --policy-arn "${POLICY_ARN}" aws iam create-access-key --user-name "${USER_NAME}" # 出力されたアクセスKeyIdとSecretAccessKeyを設定ファイルに記述します。
次のコマンドを実行します。
export NAMESPACE=<名前空間: default> export AWS_ACCOUNT_ID=<AWSアカウントID> # Measurement Service用のサービスアカウントの作成 eksctl create iamserviceaccount \ --cluster=intdash-cluster \ --namespace=${NAMESPACE} \ --name=intdash-measurement-service-sa \ --attach-policy-arn=arn:aws:iam::${AWS_ACCOUNT_ID}:policy/IntdashServiceS3IAMPolicy \ --override-existing-serviceaccounts \ --approve # Media Service用のサービスアカウントの作成 eksctl create iamserviceaccount \ --cluster=intdash-cluster \ --namespace=${NAMESPACE} \ --name=intdash-media-service-sa \ --attach-policy-arn=arn:aws:iam::${AWS_ACCOUNT_ID}:policy/IntdashServiceS3IAMPolicy \ --override-existing-serviceaccounts \ --approve
構築するための変数を設定します。以降はこれらの変数が設定されている前提で進めます。
export CHARTS_VERSION=<チャートのバージョン> export IMAGE_REPOSITORY_BASE=<アカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com
(kindのみ) ノードからイメージをPullできるようにシークレットを作成します。
TOKEN=$(aws ecr get-login-password --region ap-northeast-1) kubectl create secret docker-registry intdash-ecr-token \ --docker-server="${IMAGE_REPOSITORY_BASE}" \ --docker-username="AWS" \ --docker-password="${TOKEN}"
あらかじめ用意しておいたサーバー証明書を登録します。
次のコマンドでサーバー証明書のシークレットを作成します。
export SERVER_CERT=<サーバー証明書のファイルのパス> export SERVER_CERT_KEY=<サーバー証明書のキー> kubectl create secret tls intdash-tls \ --cert=${SERVER_CERT} \ --key=${SERVER_CERT_KEY}注釈
cert-manager などを利用することも可能です。運用に応じて変更してください。
AWS Certificate Manager に証明書を登録します。
export SERVER_CERT=<証明書のパス> export SERVER_CERT_KEY=<証明書キーのパス> aws acm import-certificate \ --certificate fileb://${SERVER_CERT} \ --private-key fileb://${SERVER_CERT_KEY}
Helmチャートの設定ファイルを作成します。まず、共通設定の base.yaml を作成します。
image: registry: "" <---- イメージレジストリ:例 <アカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com ingress: host: "" <---- ホスト名:例 example.com enabled: true tls: true intdashService: config: postgres: address: "" <---- PostgreSQLのアドレス:例 postgresql:5432 password: "" <---- PostgreSQLのパスワード jet-stream: url: "" <---- JetStreamのURL:例 nats://jet-stream:4222 password: "" <---- JetStreamのパスワード nats: url: "" <---- NatsのURL:例 nats://nats:4222 password: "" <---- Natsのパスワード data-point-write-dbs: 0: driver: influx data-point-read-dbs: 0: driver: influx influxdbs: 0: address: "" <---- InfluxDBのアドレス:例 http://influxdb:8086 dbname: "" <---- InfluxDBのDB名 username: "" <---- InfluxDBのユーザー password: "" <---- InfluxDBのパスワード oauth2: issuer-base: "" <---- https://<ホスト名:例 example.com> sign-in-page-url: "" <---- https://<ホスト名:例 example.com>/console/signin/ change-password-page-url: "" <---- https://<ホスト名:例 example.com>/oauth2/authorization/api/password-change/ web-client-redirect-base-urls: - "" <---- https://<ホスト名:例 example.com> user-email: verification-page-uri: "" <---- https://<ホスト名:例 example.com>/console/email/activate/ user-password: recovery-page-uri: "" <---- https://<ホスト名:例 example.com>/ upload: s3-storage: # 変更があるときのみ # bucket-name: "" <---- Measurement Serviceが使用するバケット名:例 intdash-measurement-service # minio のみ # endpoint: "" <---- ストレージのエンドポイント:例 http://storage:9000 # 下記は必要に応じて設定する。 # region = 'ap-northeast-1' # access-key = '' # secret-access-key = '' # force-path-style = true media-filmed: storage: type: s3 s3: # 変更があるときのみ # bucket-name: "" <---- Media Serviceが使用するバケット名:例 intdash-media-service # minio のみ # endpoint: "" <---- ストレージのエンドポイント:例 http://storage-minio:9000 # 下記は必要に応じて設定する。 # region = 'ap-northeast-1' # access-key = '' # secret-access-key = '' # force-path-style = true jet-stream: url: "" <---- JetStreamのURL:例 nats://jet-stream:4222 password: "" <---- JetStreamのパスワード tenant: enable: true basic-password: "" <---- ランダムで生成したパスワード quicNodePort: 32443 <---- QUICのノードポート intdashWebTenants: config: basic-auth: password: "" <---- ランダムで生成したパスワード private-intdash-api: basic-auth: password: "" <---- tenant.basic-passwordで設定したパスワード
注釈
Helmチャートのvalues.yamlの詳細については、 設定リファレンス を参照してください。
9 . 環境に応じた設定ファイルを作成します。
kind.yaml を作成します。
ingress: ingressClassName: "nginx" secretName: "intdash-tls" annotations: nginx.ingress.kubernetes.io/app-root: /console/ imagePullSecrets: - name: intdash-ecr-token # QUICを公開するための設定 intdashApiBroker: quicNodePort: 32443 <---- kindでexportしたポートを指定
aws.yaml を作成します。
ingress: ingressClassName: "alb" annotations: alb.ingress.kubernetes.io/group.name: intdash alb.ingress.kubernetes.io/scheme: internet-facing alb.ingress.kubernetes.io/actions.ssl-redirect: '{"Type": "redirect", "RedirectConfig": { "Protocol": "HTTPS", "Port": "443", "StatusCode": "HTTP_301"}}' alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS": 443}]' alb.ingress.kubernetes.io/ssl-redirect: "443" # QUICを公開するための設定。デフォルトの場合はUDPの11443ポートで公開します。 # QUICはDNSがIngressとは異なることに注意してください。(※ 注釈を参照) intdashApiBroker: annotations: service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing service.beta.kubernetes.io/aws-load-balancer-type: external service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: ip # intdash-web-gatewayに振り分けるトラフィック優先度の設定 # 他のIngressより優先順位の値が高くなるように設定します intdashWebGateway: ingress: annotations: alb.ingress.kubernetes.io/group.order: '100' # vm2m-data-vizに振り分けるトラフィック優先度の設定 # vm2m-data-viz-pluginsのIngressより優先順位の値が高くなるように設定します vm2mDataViz: ingress: enabled: true annotations: alb.ingress.kubernetes.io/group.order: '10'注釈
QUICにアクセスするためのDNS名はIngressとは異なります。 QUICにアクセスするためのDNS名を知るためにはAWSマネジメントコンソールのロードバランサー(NLB)を確認するか、次のコマンドで取得してください。
# kubectl と aws cli を使用します。 targetgroupbindings_name=$(kubectl get targetgroupbindings.elbv2.k8s.aws | grep 11443 | awk '{print $1}') targetgroup_arn=$(kubectl get targetgroupbindings.elbv2.k8s.aws $targetgroupbindings_name -o jsonpath='{.spec.targetGroupARN}') load_balancer_arn=$(aws elbv2 describe-target-groups --query "TargetGroups[?TargetGroupArn=='${targetgroup_arn}'].LoadBalancerArns" --output text) aws elbv2 describe-load-balancers --load-balancer-arn $load_balancer_arn --query 'LoadBalancers[0].DNSName' --output text注釈
証明書を明示的に指定する場合は次のアノテーションをIngressに追加してください。
alb.ingress.kubernetes.io/certificate-arn: "" <---- 証明書のARN:例 arn:aws:acm:ap-northeast-1:111111111111:certificate/11111111-1111-1111-1111-111111111111
次のコマンドでクラスタにHelmチャートをインストールします。
export ENV_VALUES_YAML=<環境に応じたファイル: 例 aws.yaml> helm install intdash oci://"${IMAGE_REPOSITORY_BASE}"/charts/intdash --version "${CHARTS_VERSION}" -f ./base.yaml -f ${ENV_VALUES_YAML}
しばらく待つとサインインURLと初期ユーザーパスワードの表示方法が標準出力に出力されます。初期ユーザーパスワードとアクセスURLは控えておきます。
Intdash is installed successfully! URL: https://<ホスト名:例 example.com> Tenant UI: https://<ホスト名:例 example.com>/internal/tenants You can login with username: intdash and the password generated during the installation. You can find the password by running: kubectl -n default get secret intdash-api-auth-password -o jsonpath="{.data.BOOTSTRAP_USER_PASSWORD}" | base64 --decode Also you can login to Tenant UI with username: intdash and the password generated during the installation. You can find the password by running: kubectl -n default get secret intdash-web-tenants-basic-auth -o jsonpath="{.data.password}" | base64 --decode
クラスタの準備が完了するまで待ちます。
kubectl wait --timeout=600s --for=condition=available deployment/intdash-api-tenant
構築後の設定を行います。
NGINX Ingress Controller を再起動します。
kubectl rollout restart -n ingress-nginx deployment ingress-nginx-controller
名前解決ができるようにDNSの設定をします。運用に応じて設定してください。
ALBの名前解決ができるようにDNSの設定をします。運用に応じて設定してください。
注釈
推奨はしていないですが、以下のように設定することで、ALBに自動的に割り当てられる名前(例: k8s-intdash-xxxxxxxxxx-xxxxxxxxxx.ap-northeast-1.elb.amazonaws.com)でもアクセスは可能です。
ALBの名前を取得します。
# Load Balancerの名前を取得する。 kubectl get ingress -o jsonpath="{.items[0].status.loadBalancer.ingress[0].hostname}"
base.yamlを変更します。<ホスト名> の箇所をすべてALBに割り当てられる名前に置き換えます。
... ingress: ... host: "k8s-intdash-xxxxxxxxxx-xxxxxxxxxx.ap-northeast-1.elb.amazonaws.com" ... (以降同様に変更する)
証明書を作成し、ACMに登録します。
export HOST=k8s-intdash-xxxxxxxxxx-xxxxxxxx.ap-northeast-1.elb.amazonaws.com mkcert "$HOST" aws acm import-certificate \ --certificate fileb://./${HOST}.pem \ --private-key fileb://./${HOST}-key.pem
helm upgradeを実行します。
export ENV_VALUES_YAML=<環境に応じたファイル: 例 aws.yaml> helm upgrade intdash oci://"${IMAGE_REPOSITORY_BASE}"/charts/intdash \ --version "${CHARTS_VERSION}" \ -f ./base.yaml -f "${ENV_VALUES_YAML}"
再起動します。
kubectl rollout restart -n default deployment
Webブラウザーで
https://<ホスト名:例 example.com>/
にアクセスします。次の内容でサインインします。
ユーザー名:intdash
パスワード:<
kubectl -n default get secret intdash-api-auth-password -o jsonpath="{.data.BOOTSTRAP_USER_PASSWORD}" | base64 --decode
で出力されたパスワード>
サインインが完了し、アプリケーションの画面が表示されれば構築完了です。
注釈
kindを使用したローカル環境でアプリケーションにアクセスできない場合は、以下のようにintdashフロントエンドアプリケーションのみを削除し再度 helm upgrade
を実行してください。
kubectl delete deployments.apps \
intdash-web-gateway \
intdash-web-admin-console \
intdash-web-authentication \
intdash-web-client-auth \
intdash-web-edge-finder \
intdash-web-meas-hub \
intdash-web-media-explorer \
intdash-web-my-page \
intdash-web-project-console \
intdash-web-shared-assets \
intdash-web-tenants \
intdash-web-client-auth-redirector
helm upgrade intdash oci://"${IMAGE_REPOSITORY_BASE}"/charts/intdash \
--version "${CHARTS_VERSION}" \
-f ./base.yaml -f ${ENV_VALUES_YAML}