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) のインストール
- Postgres Operator のデプロイ
- Postgres インスタンスのデプロイ
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 上にインストールする事が出来ました。