Tanzu SQL with Postgres for Kubernetes をTKGm にインストールする

Tanzu Kubernetes Grid(TKGm) にVMware Tanzu SQL with Postgres for Kubernetes をインストールしました。その際の手順になります。


環境

  • Tanzu Kubernetes Grid multicloud(TKGm) v1.3.0
  • Workload Cluster のKubernetesバージョン v1.20.4
  • VMware Tanzu SQL with Postgres for Kubernetes v1.1

前提条件

  • TKGm v1.3.0 がデプロイ済である事
    Supported Platforms に記載はありませんが、問題なくインストールは出来ました。
  • type: LoadBalancer がTKGm のWorkload Cluster で利用出来ること
    ※NSX ALB を利用する事も出来ますが、この環境ではmetalLB を利用し、type: LoadBalancer リソースの払い出しを行っています。

手順

Tanzu SQL with Postgres for Kubernetes(以下Postgres) のインストール

2vCPU/4GB メモリのTKGm ノードに対してインストールを行います。
$ kubectl get nodes
NAME                          STATUS   ROLES                  AGE     VERSION
greco-control-plane-wkzlr     Ready    control-plane,master   3d6h    v1.20.4+vmware.1
greco-md-0-7df88c7d87-ctxbz   Ready    <none>                 4h42m   v1.20.4+vmware.1
greco-md-0-7df88c7d87-j9dz6   Ready    <none>                 4h      v1.20.4+vmware.1
$ kubectl get sc
NAME                PROVISIONER              RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
default (default)   csi.vsphere.vmware.com   Delete          Immediate           true                   3d7h

こちらの「Installing Tanzu SQL with Postgres for Kubernetes」に従ってインストールしていきます。
cert-manager をhelm を利用し、インストールしていきます。
$ helm repo add jetstack https://charts.jetstack.io
$ helm repo update
$ kubectl create ns cert-manager
$ helm install cert-manager jetstack/cert-manager --namespace cert-manager  \
--version v1.0.2 --set installCRDs=true

cert-manager がインストールされた事を確認します。
$ kubectl get all -n cert-manager
NAME                                           READY   STATUS    RESTARTS   AGE
pod/cert-manager-57b65b7fc-24w5b               3/3     Running   0          33s
pod/cert-manager-cainjector-5f988f74c6-cs972   3/3     Running   0          33s
pod/cert-manager-webhook-7cf554f879-mv2pb      3/3     Running   0          33s

NAME                           TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
service/cert-manager           ClusterIP   100.64.55.54     <none>        9402/TCP   33s
service/cert-manager-webhook   ClusterIP   100.65.134.230   <none>        443/TCP    33s

NAME                                      READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/cert-manager              1/1     1            1           33s
deployment.apps/cert-manager-cainjector   1/1     1            1           33s
deployment.apps/cert-manager-webhook      1/1     1            1           33s

NAME                                                 DESIRED   CURRENT   READY   AGE
replicaset.apps/cert-manager-57b65b7fc               1         1         1       33s
replicaset.apps/cert-manager-cainjector-5f988f74c6   1         1         1       33s
replicaset.apps/cert-manager-webhook-7cf554f879      1         1         1       33s

VMware Tanzu Network からPostgre インストール用のファイルをダウンロードしておき、それを展開します。
$ tar xvzf postgres-for-kubernetes-v1.1.0.tar.gz
postgres-for-kubernetes-v1.1.0/
postgres-for-kubernetes-v1.1.0/images/
postgres-for-kubernetes-v1.1.0/images/postgres-instance
postgres-for-kubernetes-v1.1.0/images/postgres-instance-id
postgres-for-kubernetes-v1.1.0/images/postgres-instance-tag
postgres-for-kubernetes-v1.1.0/images/postgres-operator
postgres-for-kubernetes-v1.1.0/images/postgres-operator-id
postgres-for-kubernetes-v1.1.0/images/postgres-operator-tag
postgres-for-kubernetes-v1.1.0/operator/
postgres-for-kubernetes-v1.1.0/operator/crds/
postgres-for-kubernetes-v1.1.0/operator/crds/postgres-instance.yaml
postgres-for-kubernetes-v1.1.0/operator/templates/
postgres-for-kubernetes-v1.1.0/operator/templates/postgres-operator-cluster-role-binding.yaml
postgres-for-kubernetes-v1.1.0/operator/templates/postgres-operator-cluster-role.yaml
postgres-for-kubernetes-v1.1.0/operator/templates/postgres-operator-mutating-webhook-configuration.yaml
postgres-for-kubernetes-v1.1.0/operator/templates/postgres-operator-self-signed-clusterissuer.yaml
postgres-for-kubernetes-v1.1.0/operator/templates/postgres-operator-self-signed-issuer.yaml
postgres-for-kubernetes-v1.1.0/operator/templates/postgres-operator-service-account.yaml
postgres-for-kubernetes-v1.1.0/operator/templates/postgres-operator-serving-cert.yaml
postgres-for-kubernetes-v1.1.0/operator/templates/postgres-operator-validating-webhook-configuration.yaml
postgres-for-kubernetes-v1.1.0/operator/templates/postgres-operator-webhook-service.yaml
postgres-for-kubernetes-v1.1.0/operator/templates/postgres-operator.yaml
postgres-for-kubernetes-v1.1.0/operator/values.yaml
postgres-for-kubernetes-v1.1.0/operator/Chart.yaml
postgres-for-kubernetes-v1.1.0/pg-instance-example.yaml
postgres-for-kubernetes-v1.1.0/s3-secret-example.yaml
postgres-for-kubernetes-v1.1.0/sample-app/
postgres-for-kubernetes-v1.1.0/sample-app/Dockerfile
postgres-for-kubernetes-v1.1.0/sample-app/spring-music.yaml
postgres-for-kubernetes-v1.1.0/sample-app/start.sh
$ cd postgres-for-kubernetes-v1.1.0/

コンテナイメージをロードします。
$ docker load -i ./images/postgres-instance
c95d2191d777: Loading layer [==================================================>]  65.62MB/65.62MB
27502392e386: Loading layer [==================================================>]  15.87kB/15.87kB
9f10818f1f96: Loading layer [==================================================>]  3.072kB/3.072kB
5fb616d4eb00: Loading layer [==================================================>]  275.1MB/275.1MB
f7fa4b05ae5b: Loading layer [==================================================>]  32.06MB/32.06MB
b02561794839: Loading layer [==================================================>]  26.11kB/26.11kB
af69be33c688: Loading layer [==================================================>]  2.048kB/2.048kB
09461523379f: Loading layer [==================================================>]  439.8kB/439.8kB
d4c0147f871e: Loading layer [==================================================>]  26.62kB/26.62kB
652e18b407a6: Loading layer [==================================================>]  26.62kB/26.62kB
Loaded image: postgres-instance:v1.1.0
$ docker load -i ./images/postgres-operator
cf9d6b241982: Loading layer [==================================================>]  5.632kB/5.632kB
537145274a88: Loading layer [==================================================>]  401.9kB/401.9kB
fa536083205e: Loading layer [==================================================>]  45.85MB/45.85MB
Loaded image: postgres-operator:v1.1.0
$ docker image ls |grep post*
postgres-operator                            v1.1.0                  29ba58d570ba   6 weeks ago    109MB
postgres-instance                            v1.1.0                  b8bb3bbe9708   6 weeks ago    363MB

続いて、ロードしたイメージをPostgres インストール時に利用するコンテナレジストリにアップロードします。この環境ではHarbor を利用しており、以下の手順を実施する前にプロジェクトの作成とプロジェクトにアクセス出来るユーザー作成を実施、コンテナイメージをプッシュ出来る様にしています。
$ REGISTRY="registry.<MYDOMAIN>/postgres"
$ INSTANCE_IMAGE_NAME="${REGISTRY}/postgres-instance:$(cat ./images/postgres-instance-tag)"
$ docker tag $(cat ./images/postgres-instance-id) ${INSTANCE_IMAGE_NAME}
$ docker push ${INSTANCE_IMAGE_NAME}
The push refers to repository [registry.<MYDOMAIN>/postgres/postgres-instance]
652e18b407a6: Pushed
d4c0147f871e: Pushed
09461523379f: Pushed
af69be33c688: Pushed
b02561794839: Pushed
f7fa4b05ae5b: Pushed
5fb616d4eb00: Pushed
9f10818f1f96: Pushed
27502392e386: Pushed
c95d2191d777: Pushed
v1.1.0: digest: sha256:100065f72c41a157ce0f2febecc46d06573dec0a5d8c741b48d8ff19aade16d4 size: 2407
$ OPERATOR_IMAGE_NAME="${REGISTRY}/postgres-operator:$(cat ./images/postgres-operator-tag)"
$ docker tag $(cat ./images/postgres-operator-id) ${OPERATOR_IMAGE_NAME}
$ docker push ${OPERATOR_IMAGE_NAME}
The push refers to repository [registry.<MYDOMAIN>/postgres/postgres-operator]
fa536083205e: Pushed
537145274a88: Pushed
cf9d6b241982: Pushed
9f10818f1f96: Mounted from postgres/postgres-instance
27502392e386: Mounted from postgres/postgres-instance
c95d2191d777: Mounted from postgres/postgres-instance
v1.1.0: digest: sha256:e6aab73b58f1959a853986f882a7c9da7bfb044821bd7e5a271875d7132f4885 size: 1571

この後Harbor からTKGm のWorkload Cluster 上にコンテナイメージをPull してきますので、事前にコンテナレジストリアクセス用のSecret を作成しておきます。
$ kubectl -n postgres create secret docker-registry regsecret \
 --docker-server=registry.<MYDOMAIN> \
 --docker-username=devops \
 --docker-password="xxxxx"

Postgres Operator のデプロイ

こちらの「Creating a Postgres Operator Release」に従ってPostgres Operator をデプロイしていきます。
values.yaml をご自身の環境に応じて変更します。
$ vim operator/values.yaml
$ cat operator/values.yaml
---
# specify the url for the docker image for the operator, e.g. gcr.io/<my_project>/postgres-operator
operatorImageRepository: registry.<MYDOMAIN>/postgres/postgres-operator
operatorImageTag: v1.1.0

# specify the docker image for postgres instance, e.g. gcr.io/<my_project>/postgres-instance
postgresImageRepository: registry.<MYDOMAIN>/postgres/postgres-instance
postgresImageTag: v1.1.0

# specify the name of the docker-registry secret to allow the cluster to authenticate with the container registry for pulling images
dockerRegistrySecretName: regsecret

helm でインストールします。この環境ではdefault Namespace を利用していますが、Namespace を指定してデプロイする事も出来ます。
$ helm upgrade --install postgres-operator operator/

デプロイが無事完了したか確認します。
$ helm list
NAME             	NAMESPACE	REVISION	UPDATED                                	STATUS  	CHART                   	APP VERSION
postgres-operator	default  	1       	2021-04-07 12:32:44.624915869 +0000 UTC	deployed	postgres-operator-v1.1.0	v1.1.0
$ kubectl get pods
NAME                                                          READY   STATUS    RESTARTS   AGE
postgres-operator-75c799698d-84grd                            3/3     Running   0          15s

Postgres インスタンスのデプロイ

こちらの「Deploying a New Postgres Instance」に従って、Postgres のインスタンスをデプロイしていきます。
$ vim pg-instance-example.yaml
$ cat pg-instance-example.yaml
apiVersion: sql.tanzu.vmware.com/v1
kind: Postgres
metadata:
  name: pg-instance-example
spec:
  memory: 800Mi
  cpu: "0.8"
  storageClassName: default
  storageSize: 10G
  pgConfig:
    dbname: pg-instance-example
    username: pgadmin
  serviceType: LoadBalancer
  highAvailability:
    enabled: false

CPU はミリコア単位で計測されます。このマニフェストファイルをapply します。
$ kubectl apply -f pg-instance-example.yaml

Postgres インスタンスのPod とPostgres インスタンスが要求したPVC リソースが作成されました。
$ kubectl get pods
NAME                                                          READY   STATUS    RESTARTS   AGE
pg-instance-example-0                                         3/3     Running   0          29s
pg-instance-example-monitor-0                                 3/3     Running   0          59s
postgres-operator-75c799698d-84grd                            3/3     Running   0          4m40s
$ kubectl get pvc
NAME                                                        STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
pg-instance-example-monitor-pg-instance-example-monitor-0   Bound    pvc-f7c9573d-8936-41ae-93fe-677b5851dfd3   954Mi      RWO            default        40m
pg-instance-example-pgdata-pg-instance-example-0            Bound    pvc-e9be3710-0128-49b8-9aaf-416384301d0f   10Gi       RWO            default        40m

実際にインスタンスにアクセスしてみます。
$ kubectl exec -it pg-instance-example-0 -- bash -c "psql"
Defaulting container name to pg-container.
Use 'kubectl describe pod/pg-instance-example-0 -n default' to see all of the containers in this pod.
psql (11.10 (VMware Postgres 11.10.1))
Type "help" for help.
                                   List of databases
        Name         |  Owner   | Encoding | Collate |  Ctype  |   Access privileges
---------------------+----------+----------+---------+---------+-----------------------
 pg-instance-example | postgres | UTF8     | C.UTF-8 | C.UTF-8 |
 postgres            | postgres | UTF8     | C.UTF-8 | C.UTF-8 |
 template0           | postgres | UTF8     | C.UTF-8 | C.UTF-8 | =c/postgres          +
                     |          |          |         |         | postgres=CTc/postgres
 template1           | postgres | UTF8     | C.UTF-8 | C.UTF-8 | =c/postgres          +
                     |          |          |         |         | postgres=CTc/postgres
(4 rows)
postgres=# show server_encoding;
 server_encoding
-----------------
 UTF8
(1 row)

簡単にPostgres をTKGm のWorkload Cluster 上にインストールする事が出来ました。

このブログの人気の投稿