クロスプレーン構成

Crossplaneをインストールしたら、使用するために設定する必要があります。

クロスプレーンの設定プロセスには、以下のものが含まれます:

  1. RBAC権限の設定。
  2. クラウドプロバイダーとのクロスプレーンの設定
  3. マネージドサービスアクセスの設定
  4. リソースクラスの設定
  5. Auto DevOpsの設定オプションを使用します。
  6. PostgreSQLインスタンスに接続します。

CrossplaneがPostgreSQLなどのクラウドサービスをプロビジョニングできるようにするには、クラウドプロバイダスタックにユーザーアカウントを設定する必要があります。 たとえば、以下のようになります:

  • GCPのサービスアカウント。
  • AWSのIAMユーザー。

重要な注意事項

  • このガイドではGCPを例にしていますが、AWSとAzureのプロセスは似ています。
  • Crossplaneでは、ポッドのIPアドレスがGCPネットワーク内でルーティング可能なように、エイリアスIPを有効にしたVPCネイティブのKubernetesクラスタが必要です。

まず、このガイドを通して使用される環境変数を宣言する必要があります:

export PROJECT_ID=crossplane-playground # the GCP project where all resources reside.
export NETWORK_NAME=default # the GCP network where your GKE is provisioned.
export REGION=us-central1 # the GCP region where the GKE cluster is provisioned.

RBAC権限の設定

  • GitLabが管理するクラスターでは、RBACは自動的に設定されます。

  • GitLabで管理されていないクラスターの場合は、提供されたトークンのサービスアカウントがdatabase.crossplane.io APIグループのリソースを管理できることを確認してください:

    1. 以下のYAMLをcrossplane-database-role.yamlとして保存します:

      apiVersion: rbac.authorization.k8s.io/v1
      kind: ClusterRole
      metadata:
        name: crossplane-database-role
        labels:
          rbac.authorization.k8s.io/aggregate-to-edit: "true"
      rules:
        - apiGroups:
            - database.crossplane.io
          resources:
            - postgresqlinstances
          verbs:
            - get
            - list
            - create
            - update
            - delete
            - patch
            - watch
      
    2. クラスターにクラスター・ロールを適用します:

      kubectl apply -f crossplane-database-role.yaml
      

クラウドプロバイダーによるクロスプレーンの構成

インストールされたクラウドプロバイダスタックをユーザーアカウントで構成するには、「クラウドプロバイダーアカウントの構成」を参照してください。

シークレットと、シークレットを参照するProviderリソースは、ガイドのgitlab-managed-apps 名前空間に適用する必要があることに注意してください。 プロセスに従って変更することを確認してください。

プロバイダーの設定

マネージド・サービス・アクセスの設定

PostgreSQLデータベースとGKEクラスター間の接続を設定する必要があります。 これは以下のどちらかの方法で行うことができます:

  • 下記のようにクロスプレーンを使用します。
  • GCPコンソールで直接、非公開サービスへのアクセスを設定します。 GlobalAddressとConnectionリソースを作成します:
cat > network.yaml <<EOF
---
# gitlab-ad-globaladdress defines the IP range that will be allocated for cloud services connecting to the instances in the given Network.

apiVersion: compute.gcp.crossplane.io/v1alpha3
kind: GlobalAddress
metadata:
  name: gitlab-ad-globaladdress
spec:
  providerRef:
    name: gcp-provider
  reclaimPolicy: Delete
  name: gitlab-ad-globaladdress
  purpose: VPC_PEERING
  addressType: INTERNAL
  prefixLength: 16
  network: projects/$PROJECT_ID/global/networks/$NETWORK_NAME
---
# gitlab-ad-connection is what allows cloud services to use the allocated GlobalAddress for communication. Behind
# the scenes, it creates a VPC peering to the network that those service instances actually live.

apiVersion: servicenetworking.gcp.crossplane.io/v1alpha3
kind: Connection
metadata:
  name: gitlab-ad-connection
spec:
  providerRef:
    name: gcp-provider
  reclaimPolicy: Delete
  parent: services/servicenetworking.googleapis.com
  network: projects/$PROJECT_ID/global/networks/$NETWORK_NAME
  reservedPeeringRangeRefs:
    - name: gitlab-ad-globaladdress
EOF

以下のコマンドを使用して、ファイルで指定された設定を適用します:

kubectl apply -f network.yaml

ネットワーク・リソースの作成は、以下のコマンドで確認できます。 これらのリソースの両方のステータスが準備完了であり、同期していることを確認します。

kubectl describe connection.servicenetworking.gcp.crossplane.io gitlab-ad-connection
kubectl describe globaladdress.compute.gcp.crossplane.io gitlab-ad-globaladdress

リソースクラスの設定

リソースクラスは、必要なマネージドサービスの設定を定義する方法です。 PostgreSQLリソースクラスを定義します。

  • gcp-postgres-standard.yaml リソースクラスを定義します。
  1. デフォルトの CloudSQLInstanceClass。
  2. ラベルを持つ CloudSQLInstanceClass。
cat > gcp-postgres-standard.yaml <<EOF
apiVersion: database.gcp.crossplane.io/v1beta1
kind: CloudSQLInstanceClass
metadata:
  name: cloudsqlinstancepostgresql-standard
  labels:
    gitlab-ad-demo: "true"
specTemplate:
  writeConnectionSecretsToNamespace: gitlab-managed-apps
  forProvider:
    databaseVersion: POSTGRES_11_7
    region: $REGION
    settings:
      tier: db-custom-1-3840
      dataDiskType: PD_SSD
      dataDiskSizeGb: 10
      ipConfiguration:
        privateNetwork: projects/$PROJECT_ID/global/networks/$NETWORK_NAME
  # this should match the name of the provider created in the above step
  providerRef:
    name: gcp-provider
  reclaimPolicy: Delete
---
apiVersion: database.gcp.crossplane.io/v1beta1
kind: CloudSQLInstanceClass
metadata:
  name: cloudsqlinstancepostgresql-standard-default
  annotations:
    resourceclass.crossplane.io/is-default-class: "true"
specTemplate:
  writeConnectionSecretsToNamespace: gitlab-managed-apps
  forProvider:
    databaseVersion: POSTGRES_11_7
    region: $REGION
    settings:
      tier: db-custom-1-3840
      dataDiskType: PD_SSD
      dataDiskSizeGb: 10
      ipConfiguration:
        privateNetwork: projects/$PROJECT_ID/global/networks/$NETWORK_NAME
  # this should match the name of the provider created in the above step
  providerRef:
    name: gcp-provider
  reclaimPolicy: Delete
EOF

以下のコマンドを使用して、リソース・クラス設定を適用します:

kubectl apply -f gcp-postgres-standard.yaml

以下のコマンドを使用して、Resourceクラスの作成を確認します:

kubectl get cloudsqlinstanceclasses

リソース・クラスでは、マネージド・サービスのサービス・クラスを定義することができます。 より大きなディスクやより高速なディスクを要求する別のCloudSQLInstanceClass を作成することもできます。 また、特定のバージョンのデータベースを要求することもできます。

自動DevOps設定オプション

Auto DevOpsパイプラインは以下のオプションで実行できます:

Crossplaneを使用してPostgreSQLをプロビジョニングするには、環境変数AUTO_DEVOPS_POSTGRES_MANAGEDAUTO_DEVOPS_POSTGRES_MANAGED_CLASS_SELECTOR を設定する必要があります。

また、以下のオプションは、Helmチャートの値からオーバーライドすることもできます。

  • postgres.managed を true に設定すると、デフォルトのリソース・クラスが選択されます。 リソース・クラスにはアノテーションresourceclass.crossplane.io/is-default-class: "true"を付ける必要があります。CloudSQLInstanceClasscloudsqlinstancepostgresql-standard-default がクレームを満たすために使用されます。

  • postgres.managed true postgres.managedClassSelectorはラベルに基づいて選択するリソースクラスを提供します。この場合、 の値は、CloudSQLInstance クラス を選択し、クレーム要求を満たします。postgres.managedClassSelector.matchLabels.gitlab-ad-demo="true"cloudsqlinstancepostgresql-standard

Auto DevOpsパイプラインが正常に実行されると、PostgresqlInstanceがプロビジョニングされるはずです。

PostgreSQLインスタンスの作成を確認します。

kubectl get postgresqlinstance

サンプル出力:PostgresqlInstance のSTATUS フィールドは、プロビジョニングに成功するとBOUND に遷移します。

NAME            STATUS   CLASS-KIND              CLASS-NAME                            RESOURCE-KIND      RESOURCE-NAME                               AGE
staging-test8   Bound    CloudSQLInstanceClass   cloudsqlinstancepostgresql-standard   CloudSQLInstance   xp-ad-demo-24-staging-staging-test8-jj55c   9m

PostgreSQLインスタンスのエンドポイントとユーザークレデンシャルは、同じプロジェクト名前空間内のapp-postgres というシークレットに存在します。

以下のコマンドで、データベース情報を含むシークレットが作成されていることを確認します:

kubectl describe secret app-postgres

出力例:

Name:         app-postgres
Namespace:    xp-ad-demo-24-staging
Labels:       <none>
Annotations:  crossplane.io/propagate-from-name: 108e460e-06c7-11ea-b907-42010a8000bd
              crossplane.io/propagate-from-namespace: gitlab-managed-apps
              crossplane.io/propagate-from-uid: 10c79605-06c7-11ea-b907-42010a8000bd

Type:  Opaque

Data
====
privateIP:                            8 bytes
publicIP:                             13 bytes
serverCACertificateCert:              1272 bytes
serverCACertificateCertSerialNumber:  1 bytes
serverCACertificateCreateTime:        24 bytes
serverCACertificateExpirationTime:    24 bytes
username:                             8 bytes
endpoint:                             8 bytes
password:                             27 bytes
serverCACertificateCommonName:        98 bytes
serverCACertificateInstance:          41 bytes
serverCACertificateSha1Fingerprint:   40 bytes

PostgreSQLインスタンスへの接続

CloudSQL上で新しくプロビジョニングされたPostgreSQLデータベース・インスタンスに接続する場合は、このGCPガイドに従ってください。