{"id":26826713,"url":"https://github.com/hslam/pulumi-tidb-serverless","last_synced_at":"2025-06-29T16:34:07.339Z","repository":{"id":177305971,"uuid":"654446705","full_name":"hslam/pulumi-tidb-serverless","owner":"hslam","description":"Deploy a shared storage TiDB cluster on AWS using pulumi.","archived":false,"fork":false,"pushed_at":"2023-12-22T17:50:17.000Z","size":144,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2023-12-22T18:40:27.665Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/hslam.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2023-06-16T06:37:45.000Z","updated_at":"2023-07-24T08:38:31.000Z","dependencies_parsed_at":"2023-12-22T18:37:38.336Z","dependency_job_id":null,"html_url":"https://github.com/hslam/pulumi-tidb-serverless","commit_stats":null,"previous_names":["hslam/pulumi-shared-storage-tidb","hslam/pulumi-tidb-serverless"],"tags_count":0,"template":null,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hslam%2Fpulumi-tidb-serverless","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hslam%2Fpulumi-tidb-serverless/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hslam%2Fpulumi-tidb-serverless/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hslam%2Fpulumi-tidb-serverless/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/hslam","download_url":"https://codeload.github.com/hslam/pulumi-tidb-serverless/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246313653,"owners_count":20757446,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-03-30T11:30:43.694Z","updated_at":"2025-03-30T11:30:44.408Z","avatar_url":"https://github.com/hslam.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# pulumi-tidb-serverless\nDeploy a shared storage TiDB cluster on AWS using pulumi.\n\n## Getting started\n\n### Prerequisites\n\n* [Install Pulumi](https://www.pulumi.com/docs/install/)\n* [Install Node.js](https://nodejs.org/en/download)\n* Install a package manager for Node.js, such as [npm](https://www.npmjs.com/get-npm) or [Yarn](https://classic.yarnpkg.com/en/docs/install).\n* [Configure AWS credentials](https://www.pulumi.com/registry/packages/aws/installation-configuration/)\n* [Install AWS IAM Authenticator for Kubernetes](https://docs.aws.amazon.com/eks/latest/userguide/install-aws-iam-authenticator.html)\n\n### 1. Initializing the Pulumi Project\n1.1 Start by cloning the [pulumi-tidb-serverless](https://github.com/hslam/pulumi-tidb-serverless) to your local machine.\n```\n$ git clone https://github.com/hslam/pulumi-tidb-serverless.git\n$ cd pulumi-tidb-serverless\n```\n1.2 Install the dependencies.\n```\n$ make install\n```\n1.3 Set environment variables for a new Pulumi stack. ***Make sure the `SUFFIX` is your unique ID***\n```\n$ export ENV=dev\n$ export REGION=ap-southeast-1\n$ export SUFFIX=f01\n```\n1.4 Create an empty Pulumi stack named `${ENV}-${REGION}-${SUFFIX}`.\n```\n$ make init\n```\n1.5 Switch the current workspace to the Pulumi stack `${ENV}-${REGION}-${SUFFIX}`.\n```\n$ pulumi stack select ${ENV}-${REGION}-${SUFFIX}\n```\n\n### 2. Provisioning a New EKS Cluster\n2.1 Create the EKS cluster by running `pulumi up`.\n```\n$ pulumi up\nUpdating (dev-ap-southeast-1-f01)\n\n     Type                                          Name                                                         Status              \n +   pulumi:pulumi:Stack                           pulumi-tidb-serverless-dev-ap-southeast-1-f01                 created (779s)      \n +   ├─ eks:index:Cluster                          dev-ap-southeast-1-f01-cluster                                    created (745s)      \n +   ├─ aws:iam:Role                               dev-ap-southeast-1-f01-managed-nodegroup-role                     created (3s)        \n +   ├─ awsx:ec2:Vpc                               dev-ap-southeast-1-f01-vpc                                        created (5s)        \n +   ├─ eks:index:ManagedNodeGroup                 dev-ap-southeast-1-f01-c-pd-standard-0                                 created (3s)        \n +   ├─ eks:index:ManagedNodeGroup                 dev-ap-southeast-1-f01-a-tikv-standard-0                               created (6s)        \n +   ├─ eks:index:ManagedNodeGroup                 dev-ap-southeast-1-f01-b-tikv-standard-0                               created (6s)        \n +   ├─ eks:index:ManagedNodeGroup                 dev-ap-southeast-1-f01-b-pd-standard-0                                 created (6s)        \n +   ├─ eks:index:ManagedNodeGroup                 dev-ap-southeast-1-f01-default-standard-0                         created (7s)        \n +   ├─ eks:index:ManagedNodeGroup                 dev-ap-southeast-1-f01-c-tikv-standard-0                               created (7s)        \n +   ├─ eks:index:ManagedNodeGroup                 dev-ap-southeast-1-f01-tidb-standard-0                            created (8s)        \n +   └─ eks:index:ManagedNodeGroup                 dev-ap-southeast-1-f01-a-pd-standard-0                                 created (8s)        \n\nOutputs:\n    kubeconfig   : {\n        apiVersion     : \"v1\"\n        clusters       : [ ... ]\n        contexts       : [ ... ]\n        current-context: \"aws\"\n        kind           : \"Config\"\n        users          : [ ... ]\n    }\n\nResources:\n    + 73 created\n\nDuration: 17m19s\n```\nThe update takes 15-20 minutes and will create the following resources on AWS:\n- A VPC in the region, with public \u0026 private subnets across the region's 3 availability zones.\n- The IAM Role for node group.\n- An EKS cluster with v1.26 of Kubernetes.\n- Create an ASG across multiple AZs for each component `default, tidb`.\n- Create multiple ASGs for each component `pd, tikv` with one ASG per AZ.\n\n2.2 Once the update is complete, verify the cluster, node groups, and Pods are up and running:\n```\n$ pulumi stack output kubeconfig \u003e kubeconfig.yml \u0026\u0026 export KUBECONFIG=$PWD/kubeconfig.yml\n\n$ kubectl get nodes -l serverless=default\nNAME                          STATUS   ROLES    AGE     VERSION\nip-10-0-154-70.ec2.internal   Ready    \u003cnone\u003e   2m12s   v1.26.4-eks-0a21954\nip-10-0-2-145.ec2.internal    Ready    \u003cnone\u003e   2m39s   v1.26.4-eks-0a21954\nip-10-0-78-173.ec2.internal   Ready    \u003cnone\u003e   2m17s   v1.26.4-eks-0a21954\n\n$ kubectl get nodes -l serverless=pd\nNAME                           STATUS   ROLES    AGE     VERSION\nip-10-0-10-58.ec2.internal     Ready    \u003cnone\u003e   2m47s   v1.26.4-eks-0a21954\nip-10-0-149-139.ec2.internal   Ready    \u003cnone\u003e   2m54s   v1.26.4-eks-0a21954\nip-10-0-76-229.ec2.internal    Ready    \u003cnone\u003e   2m31s   v1.26.4-eks-0a21954\n\n$ kubectl get nodes -l serverless=tikv\nNAME                           STATUS   ROLES    AGE     VERSION\nip-10-0-144-174.ec2.internal   Ready    \u003cnone\u003e   112s    v1.26.4-eks-0a21954\nip-10-0-16-248.ec2.internal    Ready    \u003cnone\u003e   2m39s   v1.26.4-eks-0a21954\nip-10-0-81-0.ec2.internal      Ready    \u003cnone\u003e   2m17s   v1.26.4-eks-0a21954\n\n$ kubectl get nodes -l serverless=tidb\nNAME                          STATUS   ROLES    AGE     VERSION\nip-10-0-150-46.ec2.internal   Ready    \u003cnone\u003e   2m54s   v1.26.4-eks-0a21954\nip-10-0-26-233.ec2.internal   Ready    \u003cnone\u003e   3m12s   v1.26.4-eks-0a21954\n\n\n$ kubectl label --list nodes -l serverless=default | grep \"topology.kubernetes.io/zone\"\n topology.kubernetes.io/zone=ap-southeast-1c\n topology.kubernetes.io/zone=ap-southeast-1a\n topology.kubernetes.io/zone=ap-southeast-1b\n\n$ kubectl label --list nodes -l serverless=pd | grep \"topology.kubernetes.io/zone\"\n topology.kubernetes.io/zone=ap-southeast-1a\n topology.kubernetes.io/zone=ap-southeast-1c\n topology.kubernetes.io/zone=ap-southeast-1b\n\n$ kubectl label --list nodes -l serverless=tikv | grep \"topology.kubernetes.io/zone\"\n topology.kubernetes.io/zone=ap-southeast-1c\n topology.kubernetes.io/zone=ap-southeast-1a\n topology.kubernetes.io/zone=ap-southeast-1b\n\n$ kubectl label --list nodes -l serverless=tidb | grep \"topology.kubernetes.io/zone\"\n topology.kubernetes.io/zone=ap-southeast-1c\n topology.kubernetes.io/zone=ap-southeast-1a\n\n\n$ kubectl -n kube-system get po -o wide\nNAME                       READY   STATUS    RESTARTS   AGE     IP             NODE                           NOMINATED NODE   READINESS GATES\naws-node-2t62m             1/1     Running   0          3m34s   10.0.154.70    ip-10-0-154-70.ec2.internal    \u003cnone\u003e           \u003cnone\u003e\naws-node-69sbp             1/1     Running   0          3m21s   10.0.81.0      ip-10-0-81-0.ec2.internal      \u003cnone\u003e           \u003cnone\u003e\naws-node-87xfd             1/1     Running   0          3m43s   10.0.16.248    ip-10-0-16-248.ec2.internal    \u003cnone\u003e           \u003cnone\u003e\naws-node-b699f             1/1     Running   0          3m49s   10.0.150.46    ip-10-0-150-46.ec2.internal    \u003cnone\u003e           \u003cnone\u003e\naws-node-bvs8d             1/1     Running   0          4m1s    10.0.2.145     ip-10-0-2-145.ec2.internal     \u003cnone\u003e           \u003cnone\u003e\naws-node-d4skr             1/1     Running   0          4m6s    10.0.149.139   ip-10-0-149-139.ec2.internal   \u003cnone\u003e           \u003cnone\u003e\naws-node-h2x5k             1/1     Running   0          2m56s   10.0.144.174   ip-10-0-144-174.ec2.internal   \u003cnone\u003e           \u003cnone\u003e\naws-node-rn9kw             1/1     Running   0          3m59s   10.0.10.58     ip-10-0-10-58.ec2.internal     \u003cnone\u003e           \u003cnone\u003e\naws-node-s6qlv             1/1     Running   0          3m43s   10.0.76.229    ip-10-0-76-229.ec2.internal    \u003cnone\u003e           \u003cnone\u003e\naws-node-sjfdp             1/1     Running   0          3m39s   10.0.78.173    ip-10-0-78-173.ec2.internal    \u003cnone\u003e           \u003cnone\u003e\naws-node-tmx9t             1/1     Running   0          4m6s    10.0.26.233    ip-10-0-26-233.ec2.internal    \u003cnone\u003e           \u003cnone\u003e\ncoredns-55fb5d545d-gcx9b   1/1     Running   0          9m10s   10.0.28.180    ip-10-0-2-145.ec2.internal     \u003cnone\u003e           \u003cnone\u003e\ncoredns-55fb5d545d-vl9pp   1/1     Running   0          9m10s   10.0.2.80      ip-10-0-2-145.ec2.internal     \u003cnone\u003e           \u003cnone\u003e\nkube-proxy-2hxrl           1/1     Running   0          3m34s   10.0.154.70    ip-10-0-154-70.ec2.internal    \u003cnone\u003e           \u003cnone\u003e\nkube-proxy-2vx45           1/1     Running   0          2m56s   10.0.144.174   ip-10-0-144-174.ec2.internal   \u003cnone\u003e           \u003cnone\u003e\nkube-proxy-4rlkl           1/1     Running   0          4m6s    10.0.149.139   ip-10-0-149-139.ec2.internal   \u003cnone\u003e           \u003cnone\u003e\nkube-proxy-9spd8           1/1     Running   0          3m43s   10.0.76.229    ip-10-0-76-229.ec2.internal    \u003cnone\u003e           \u003cnone\u003e\nkube-proxy-dsxwl           1/1     Running   0          3m39s   10.0.78.173    ip-10-0-78-173.ec2.internal    \u003cnone\u003e           \u003cnone\u003e\nkube-proxy-hndws           1/1     Running   0          3m59s   10.0.10.58     ip-10-0-10-58.ec2.internal     \u003cnone\u003e           \u003cnone\u003e\nkube-proxy-rm7vw           1/1     Running   0          4m1s    10.0.2.145     ip-10-0-2-145.ec2.internal     \u003cnone\u003e           \u003cnone\u003e\nkube-proxy-rqgvj           1/1     Running   0          3m43s   10.0.16.248    ip-10-0-16-248.ec2.internal    \u003cnone\u003e           \u003cnone\u003e\nkube-proxy-sghcn           1/1     Running   0          4m6s    10.0.26.233    ip-10-0-26-233.ec2.internal    \u003cnone\u003e           \u003cnone\u003e\nkube-proxy-sqdv4           1/1     Running   0          3m21s   10.0.81.0      ip-10-0-81-0.ec2.internal      \u003cnone\u003e           \u003cnone\u003e\nkube-proxy-z6qht           1/1     Running   0          3m49s   10.0.150.46    ip-10-0-150-46.ec2.internal    \u003cnone\u003e           \u003cnone\u003e\n```\n\n### 3. Deploying Control Plane\n3.1 Set the Pulumi configuration variables for the control plane.\n```\n$ pulumi config set control-plane-enabled true\n```\n3.2 Deploy the control plane components by running `pulumi up`.\n```\n$ pulumi up\nUpdating (dev-ap-southeast-1-f01)\n\n     Type                                                               Name                                          Status              \n     pulumi:pulumi:Stack                                                pulumi-tidb-serverless-dev-ap-southeast-1-f01                      \n     ├─ eks:index:Cluster                                               dev-ap-southeast-1-f01-cluster                                         \n +   ├─ kubernetes:yaml:ConfigFile                                      tidb-operator-crds                            created (2s)        \n +   ├─ kubernetes:helm.sh/v3:Chart                                     aws-cluster-auto-scaler                       created (2s)        \n +   ├─ kubernetes:helm.sh/v3:Release                                   aws-load-balancer-controller                  created (55s)       \n +   ├─ kubernetes:helm.sh/v3:Chart                                     aws-ebs-csi-driver                            created (3s)        \n +   ├─ kubernetes:helm.sh/v3:Release                                   tidb-operator                                 created (51s)       \n +   └─ kubernetes:storage.k8s.io/v1:StorageClass                       ebs-sc                                        created (3s)        \n\nOutputs:\n    kubeconfig   : { ... }\n\nResources:\n    + 47 created\n    73 unchanged\n\nDuration: 1m3s\n```\nThe update takes ~1 minutes and will create the following resources on AWS:\n- A Cluster Autoscaler for node group.\n- An AWS Load Balancer Controller for service.\n- An EBS CSI Driver and an EBS StorageClass.\n- TiDB Operator CRDs and an TiDB Operator.\n\n3.3 Confirm that the control plane components are running, run the following command.\n```\n$ kubectl -n kube-system get po -o wide\nNAME                                                     READY   STATUS    RESTARTS   AGE     IP             NODE                           NOMINATED NODE   READINESS GATES\naws-load-balancer-controller-e2ba6640-59d47ff8ff-4qsw9   1/1     Running   0          34s     10.0.89.142    ip-10-0-78-173.ec2.internal    \u003cnone\u003e           \u003cnone\u003e\naws-load-balancer-controller-e2ba6640-59d47ff8ff-lr7wt   1/1     Running   0          34s     10.0.28.29     ip-10-0-2-145.ec2.internal     \u003cnone\u003e           \u003cnone\u003e\ncluster-autoscaler-6d9499f467-fs2xb                      1/1     Running   0          54s     10.0.131.31    ip-10-0-154-70.ec2.internal    \u003cnone\u003e           \u003cnone\u003e\ncluster-autoscaler-6d9499f467-nmnxx                      1/1     Running   0          54s     10.0.91.107    ip-10-0-78-173.ec2.internal    \u003cnone\u003e           \u003cnone\u003e\nebs-csi-controller-78dc48fd5-p9pv8                       5/5     Running   0          56s     10.0.137.216   ip-10-0-154-70.ec2.internal    \u003cnone\u003e           \u003cnone\u003e\nebs-csi-controller-78dc48fd5-q59tc                       5/5     Running   0          57s     10.0.69.85     ip-10-0-78-173.ec2.internal    \u003cnone\u003e           \u003cnone\u003e\nebs-csi-node-2ndb7                                       3/3     Running   0          56s     10.0.133.130   ip-10-0-154-70.ec2.internal    \u003cnone\u003e           \u003cnone\u003e\nebs-csi-node-4hdlh                                       3/3     Running   0          56s     10.0.18.122    ip-10-0-16-248.ec2.internal    \u003cnone\u003e           \u003cnone\u003e\nebs-csi-node-5rvrc                                       3/3     Running   0          56s     10.0.130.34    ip-10-0-150-46.ec2.internal    \u003cnone\u003e           \u003cnone\u003e\nebs-csi-node-7gsr6                                       3/3     Running   0          56s     10.0.83.181    ip-10-0-76-229.ec2.internal    \u003cnone\u003e           \u003cnone\u003e\nebs-csi-node-cncq4                                       3/3     Running   0          56s     10.0.133.102   ip-10-0-149-139.ec2.internal   \u003cnone\u003e           \u003cnone\u003e\nebs-csi-node-fxs2j                                       3/3     Running   0          56s     10.0.153.17    ip-10-0-144-174.ec2.internal   \u003cnone\u003e           \u003cnone\u003e\nebs-csi-node-mgwsz                                       3/3     Running   0          56s     10.0.7.171     ip-10-0-2-145.ec2.internal     \u003cnone\u003e           \u003cnone\u003e\nebs-csi-node-n8x65                                       3/3     Running   0          56s     10.0.94.41     ip-10-0-78-173.ec2.internal    \u003cnone\u003e           \u003cnone\u003e\nebs-csi-node-p4bl7                                       3/3     Running   0          56s     10.0.10.196    ip-10-0-26-233.ec2.internal    \u003cnone\u003e           \u003cnone\u003e\nebs-csi-node-sffnj                                       3/3     Running   0          56s     10.0.1.216     ip-10-0-10-58.ec2.internal     \u003cnone\u003e           \u003cnone\u003e\nebs-csi-node-tmk9s                                       3/3     Running   0          56s     10.0.82.0      ip-10-0-81-0.ec2.internal      \u003cnone\u003e           \u003cnone\u003e\ntidb-controller-manager-7cb7f9c956-j4g5q                 1/1     Running   0          43s     10.0.84.141    ip-10-0-78-173.ec2.internal    \u003cnone\u003e           \u003cnone\u003e\ntidb-scheduler-59d5fdf9bd-57rsf                          2/2     Running   0          43s     10.0.158.86    ip-10-0-154-70.ec2.internal    \u003cnone\u003e           \u003cnone\u003e\n... other pods ...\n```\n3.4 Verify the `gp3` EBS StorageClass is ready.\n```\n$ kubectl -n kube-system get sc\nNAME            PROVISIONER             RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE\nebs-sc          ebs.csi.aws.com         Delete          WaitForFirstConsumer   true                   97s\n\n$ kubectl -n kube-system describe sc ebs-sc\nName:            ebs-sc\nProvisioner:           ebs.csi.aws.com\nParameters:            fsType=ext4,iops=4000,throughput=400,type=gp3\nAllowVolumeExpansion:  True\nMountOptions:\n  nodelalloc\n  noatime\nReclaimPolicy:      Delete\nVolumeBindingMode:  WaitForFirstConsumer\n```\n\n### 4. Deploying Shared Storage TiDB Cluster\nSet the Pulumi configuration variables for the shared storage TiDB cluster.\n\n4.1 (Optional) If you want to initialize the password when you start the tenant TiDB service for the first time, set the following variables. If you have already initialized the password, you do not need to repeat the initialization when you wake up the tenant TiDB service.\n```\n$ export PASSWORD_TENANT_1=\"admin-1\"\n$ export PASSWORD_TENANT_2=\"admin-2\"\n$ pulumi config set --path 'serverless-keyspaces[0].rootPassword' \"${PASSWORD_TENANT_1}\"\n$ pulumi config set --path 'serverless-keyspaces[1].rootPassword' \"${PASSWORD_TENANT_2}\"\n```\n4.2 Enable the shared storage TiDB cluster.\n```\n$ pulumi config set --path 'serverless-keyspaces[0].tidbReplicas' 1\n$ pulumi config set --path 'serverless-keyspaces[1].tidbReplicas' 1\n$ pulumi config set --path 'serverless-suspend' false\n$ pulumi config set serverless-enabled true\n```\n4.3 Deploy the shared storage TiDB cluster by running `pulumi up`.\n```\n$ pulumi up\nUpdating (dev-ap-southeast-1-f01)\n\n     Type                                                   Name                                               Status              \n     pulumi:pulumi:Stack                                    pulumi-tidb-serverless-dev-ap-southeast-1-f01                           \n     ├─ eks:index:Cluster                                   dev-ap-southeast-1-f01-cluster                                              \n +   ├─ kubernetes:core/v1:Namespace                        dev-ap-southeast-1-f01-serverless-ns                    created (0.77s)     \n +   ├─ kubernetes:yaml:ConfigFile                          dev-ap-southeast-1-f01-serverless-cluster-tenant-2      created (5s)        \n +   ├─ kubernetes:yaml:ConfigFile                          dev-ap-southeast-1-f01-serverless-cluster-tenant-1      created (9s)        \n +   ├─ kubernetes:yaml:ConfigFile                          dev-ap-southeast-1-f01-serverless-cluster               created (9s)        \n +   ├─ kubernetes:core/v1:Secret                           dev-ap-southeast-1-f01-serverless-secret-tenant-2       created (3s)        \n +   ├─ kubernetes:core/v1:Secret                           dev-ap-southeast-1-f01-serverless-secret-tenant-1       created (4s)        \n +   ├─ kubernetes:yaml:ConfigFile                          dev-ap-southeast-1-f01-serverless-initializer-tenant-2  created (2s)        \n +   └─ kubernetes:yaml:ConfigFile                          dev-ap-southeast-1-f01-serverless-initializer-tenant-1  created (4s)        \n\nOutputs:\n    kubeconfig   : { ... }\n\nResources:\n    + 13 created\n    120 unchanged\n\nDuration: 56s\n```\nThe update takes ~1 minutes and will create the following resources on AWS:\n- A tidb-serverless namespace.\n- A shared PD cluster.\n- A shared TiKV cluster.\n- An TiDB cluster as GC workers.\n- Two tenant TiDB cluster.\n\n4.4 View the Namespace status.\n```\n$ kubectl get ns\nNAME              STATUS   AGE\ndefault           Active   20m\nkube-node-lease   Active   20m\nkube-public       Active   20m\nkube-system       Active   20m\ntidb-serverless   Active   48s\n```\n4.5 View the Pod status in the tidb-serverless namespace.\n```\n$ kubectl -n tidb-serverless get po -o wide -l app.kubernetes.io/component=pd\nNAME                      READY   STATUS    RESTARTS   AGE   IP             NODE                           NOMINATED NODE   READINESS GATES\nserverless-cluster-pd-0   1/1     Running   0          57s   10.0.158.134   ip-10-0-149-139.ec2.internal   \u003cnone\u003e           \u003cnone\u003e\nserverless-cluster-pd-1   1/1     Running   0          57s   10.0.69.99     ip-10-0-76-229.ec2.internal    \u003cnone\u003e           \u003cnone\u003e\nserverless-cluster-pd-2   1/1     Running   0          57s   10.0.18.235    ip-10-0-10-58.ec2.internal     \u003cnone\u003e           \u003cnone\u003e\n\n$ kubectl -n tidb-serverless get po -o wide -l app.kubernetes.io/component=tikv\nNAME                        READY   STATUS    RESTARTS   AGE   IP             NODE                           NOMINATED NODE   READINESS GATES\nserverless-cluster-tikv-0   1/1     Running   0          51s   10.0.19.50     ip-10-0-16-248.ec2.internal    \u003cnone\u003e           \u003cnone\u003e\nserverless-cluster-tikv-1   1/1     Running   0          51s   10.0.131.185   ip-10-0-144-174.ec2.internal   \u003cnone\u003e           \u003cnone\u003e\nserverless-cluster-tikv-2   1/1     Running   0          51s   10.0.85.193    ip-10-0-81-0.ec2.internal      \u003cnone\u003e           \u003cnone\u003e\n\n$ kubectl -n tidb-serverless get po -o wide -l app.kubernetes.io/component=tidb\nNAME                                 READY   STATUS    RESTARTS   AGE    IP             NODE                          NOMINATED NODE   READINESS GATES\nserverless-cluster-tenant-1-tidb-0   2/2     Running   0          2m3s   10.0.150.108   ip-10-0-150-46.ec2.internal   \u003cnone\u003e           \u003cnone\u003e\nserverless-cluster-tenant-2-tidb-0   2/2     Running   0          2m2s   10.0.20.77     ip-10-0-26-233.ec2.internal   \u003cnone\u003e           \u003cnone\u003e\nserverless-cluster-tidb-0            2/2     Running   0          21s    10.0.7.203     ip-10-0-2-145.ec2.internal    \u003cnone\u003e           \u003cnone\u003e\n```\n4.6 Get tenant TiDB services in the tidb-serverless namespace.\n```\n$ kubectl -n tidb-serverless get svc -l app.kubernetes.io/component=tidb | grep LoadBalancer\nserverless-cluster-tenant-1-tidb        LoadBalancer   172.20.175.51    k8s-tidbserv-serverle-2e56d1dxxx-892c265c2ab1exxx.elb.ap-southeast-1.amazonaws.com   4000:30429/TCP,10080:31032/TCP   2m26s\nserverless-cluster-tenant-2-tidb        LoadBalancer   172.20.213.180   k8s-tidbserv-serverle-5b6b01axxx-36495fe2ad75dxxx.elb.ap-southeast-1.amazonaws.com   4000:31325/TCP,10080:30186/TCP   2m26s\n```\n### 5. Using `kubectl port-forward` or a bastion host to access the database\nYou can select either `kubectl port-forward` or a bastion host from the following options to access the database.\n\n#### 5.1 (Optional) Using `kubectl port-forward` to access the database\nIf you do not create a bastion host, you can use `kubectl port-forward` to access tenant TiDB service.\n\n5.1.1 Forward tenant TiDB port from the local host to the k8s cluster.\n```\n$ kubectl port-forward -n tidb-serverless svc/serverless-cluster-tenant-1-tidb 14001:4000 \u003e pf14001.out \u0026\n$ kubectl port-forward -n tidb-serverless svc/serverless-cluster-tenant-2-tidb 14002:4000 \u003e pf14002.out \u0026\n```\n5.1.2 Set environment variables for the tenant TiDB service.\n```\n$ export HOST_TENANT_1=127.0.0.1\n$ export HOST_TENANT_2=127.0.0.1\n\n$ export PORT_TENANT_1=14001\n$ export PORT_TENANT_2=14002\n```\n5.1.3 Install the MySQL client on your local machine.\n\n#### 5.2 (Optional) Preparing a bastion host to access the database\nIf you do not use `kubectl port-forward`, you can create a bastion host to access tenant TiDB service.\n\nAllow the bastion host to access the Internet. Select the correct key pair so that you can log in to the host via SSH.\n\n5.2.1 Generate an OpenSSH keypair for use with your server - as per the AWS [Requirements](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html#how-to-generate-your-own-key-and-import-it-to-aws).\n```\n$ ssh-keygen -t rsa -f rsa -m PEM\n```\nThis will output two files, `rsa` and `rsa.pub`, in the current directory. Be sure not to commit these files!\n\n5.2.2 We then need to configure our stack so that the public key is used by our EC2 instance, and the private key used\nfor subsequent SCP and SSH steps that will configure our server after it is stood up.\n```\n$ cat rsa.pub | pulumi config set bastion-public-key --\n$ pulumi config set bastion-enabled true\n```\n5.2.3 From there, you can run `pulumi up` and all bastion resources will be provisioned and configured.\n```\n$ pulumi up\nUpdating (dev-ap-southeast-1-f01)\n\n     Type                      Name                                          Status            \n     pulumi:pulumi:Stack       pulumi-tidb-serverless-dev-ap-southeast-1-f01                    \n +   ├─ aws:ec2:KeyPair        dev-ap-southeast-1-f01-bastion-key-pair            created (2s)      \n +   ├─ aws:ec2:SecurityGroup  dev-ap-southeast-1-f01-bastion-security-group      created (6s)      \n     ├─ eks:index:Cluster      dev-ap-southeast-1-f01-cluster                                       \n +   └─ aws:ec2:Instance       dev-ap-southeast-1-f01-bastion                     created (26s)     \n\nOutputs:\n  + bastionHost     : \"50.16.xx.xx\"\n    kubeconfig      : { ... }\n\nResources:\n    + 3 created\n    133 unchanged\n\nDuration: 1m3s\n```\nThe update takes ~1 minutes and will create a bastion host on AWS.\n\n5.2.4 You can ssh securely into your VPC.\n```\n$ ssh -i rsa ec2-user@$(pulumi stack output bastionHost)\n```\n5.2.5 Install the MySQL client on the bastion host.\n```\n$ sudo yum install mysql -y\n```\n5.2.6 Connect the client to the tenant TiDB cluster. If there is the tenant password, enter the password. Otherwise, press `Enter` directly.\n```\n$ mysql --comments -h ${tidb-nlb-dnsname} -P 4000 -u root -p\nEnter password:\n```\n`${tidb-nlb-dnsname}` is the LoadBalancer domain name of the TiDB service. You can view the domain name in the EXTERNAL-IP field by executing `kubectl -n tidb-serverless get svc -l app.kubernetes.io/component=tidb | grep LoadBalancer` on local host.\n\n5.2.7 Set environment variables on the bastion host.\n```\n$ export HOST_TENANT_1=k8s-tidbserv-serverle-2e56d1dxxx-892c265c2ab1exxx.elb.ap-southeast-1.amazonaws.com\n$ export HOST_TENANT_2=k8s-tidbserv-serverle-5b6b01axxx-36495fe2ad75dxxx.elb.ap-southeast-1.amazonaws.com\n\n$ export PORT_TENANT_1=4000\n$ export PORT_TENANT_2=4000\n```\n\n### 6. Accessing the database\nMake sure you have operated one of the two access options above.\n\n6.1 Access the tenant TiDB service and create a table in the test database.\n```\n$ mysql --comments -h ${HOST_TENANT_1} -P ${PORT_TENANT_1} -u root -p\nEnter password: \nWelcome to the MariaDB monitor.  Commands end with ; or \\g.\nYour MySQL connection id is 553\nServer version: 5.7.25-TiDB-v7.1.0 TiDB Server (Apache License 2.0) Community Edition, MySQL 5.7 compatible\n\nCopyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.\n\nType 'help;' or '\\h' for help. Type '\\c' to clear the current input statement.\n\nMySQL [(none)]\u003e use test;\nDatabase changed\nMySQL [test]\u003e create table if not exists `tenant_1_tbl` (`id` int unsigned auto_increment primary key, `column_name` varchar(100));\nQuery OK, 0 rows affected (0.23 sec)\n\nMySQL [test]\u003e show tables;\n+----------------+\n| Tables_in_test |\n+----------------+\n| tenant_1_tbl   |\n+----------------+\n1 row in set (0.00 sec)\n\nMySQL [test]\u003e exit\nBye\n\n$ mysql --comments -h ${HOST_TENANT_2} -P ${PORT_TENANT_2} -u root -p\nEnter password: \nWelcome to the MariaDB monitor.  Commands end with ; or \\g.\nYour MySQL connection id is 579\nServer version: 5.7.25-TiDB-v7.1.0 TiDB Server (Apache License 2.0) Community Edition, MySQL 5.7 compatible\n\nCopyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.\n\nType 'help;' or '\\h' for help. Type '\\c' to clear the current input statement.\n\nMySQL [(none)]\u003e use test;\nDatabase changed\nMySQL [test]\u003e create table if not exists `tenant_2_tbl` (`id` int unsigned auto_increment primary key, `column_name` varchar(100));\nQuery OK, 0 rows affected (0.21 sec)\n\nMySQL [test]\u003e show tables;\n+----------------+\n| Tables_in_test |\n+----------------+\n| tenant_2_tbl   |\n+----------------+\n1 row in set (0.00 sec)\n\nMySQL [test]\u003e exit\nBye\n```\n\n### 7. Suspending Shared Storage TiDB Cluster\n7.1 If you are connecting to the bastion host, exit it and return to the previous local directory `pulumi-tidb-serverless` .\n```\n[ec2-user@ip-10-0-171-43 ~]$ exit\nlogout\nConnection to 50.16.xx.xx closed.\n```\n7.2 Set the Pulumi configuration variables to suspend the shared storage TiDB cluster.\n```\n$ pulumi config set --path 'serverless-keyspaces[0].rootPassword' \"\"\n$ pulumi config set --path 'serverless-keyspaces[1].rootPassword' \"\"\n$ pulumi config set --path 'serverless-keyspaces[0].tidbReplicas' 0\n$ pulumi config set --path 'serverless-keyspaces[1].tidbReplicas' 0\n$ pulumi config set --path 'serverless-suspend' true\n```\n7.3 Suspend the shared storage TiDB cluster by running `pulumi up`.\n```\n$ pulumi up\nUpdating (dev-ap-southeast-1-f01)\n\n     Type                                                   Name                                               Status              Info\n     pulumi:pulumi:Stack                                    pulumi-tidb-serverless-dev-ap-southeast-1-f01                           \n     ├─ eks:index:Cluster                                   dev-ap-southeast-1-f01-cluster                                              \n     ├─ kubernetes:yaml:ConfigFile                          dev-ap-southeast-1-f01-serverless-cluster                                   \n ~   │  └─ kubernetes:pingcap.com/v1alpha1:TidbCluster      tidb-serverless/serverless-cluster                 updated (0.82s)     [diff: ~spec]\n -   ├─ kubernetes:yaml:ConfigFile                          dev-ap-southeast-1-f01-serverless-initializer-tenant-2  deleted             \n -   ├─ kubernetes:yaml:ConfigFile                          dev-ap-southeast-1-f01-serverless-initializer-tenant-1  deleted             \n -   ├─ kubernetes:core/v1:Secret                           dev-ap-southeast-1-f01-serverless-secret-tenant-2       deleted (3s)        \n -   ├─ kubernetes:yaml:ConfigFile                          dev-ap-southeast-1-f01-serverless-cluster-tenant-2      deleted             \n -   ├─ kubernetes:core/v1:Secret                           dev-ap-southeast-1-f01-serverless-secret-tenant-1       deleted (3s)        \n -   └─ kubernetes:yaml:ConfigFile                          dev-ap-southeast-1-f01-serverless-cluster-tenant-1      deleted             \n\nOutputs:\n    bastionHost     : \"50.16.xx.xx\"\n    kubeconfig      : { ... }\n\nResources:\n    ~ 1 updated\n    - 10 deleted\n    11 changes. 125 unchanged\n\nDuration: 1m31s\n```\nAfter the shared storage TiDB cluster is suspended, all component pods of the cluster are deleted.\n\n### 8. Destroying Shared Storage TiDB Cluster\n8.1 If you still have running kubectl processes that are forwarding ports, end them.\n```\n$ pgrep -lfa kubectl\n10001 kubectl port-forward -n tidb-serverless svc/serverless-cluster-tenant-1-tidb 14001:4000\n10002 kubectl port-forward -n tidb-serverless svc/serverless-cluster-tenant-2-tidb 14002:4000\n$ kill 10001 10002\n```\n8.2 Set the Pulumi configuration variables to destroy the shared storage TiDB cluster.\n```\n$ pulumi config set serverless-enabled false\n```\n8.3 Destroy the shared storage TiDB cluster by running `pulumi up`.\n```\n$ pulumi up\nUpdating (dev-ap-southeast-1-f01)\n\n     Type                                               Name                                          Status            \n     pulumi:pulumi:Stack                                pulumi-tidb-serverless-dev-ap-southeast-1-f01                    \n     ├─ eks:index:Cluster                               dev-ap-southeast-1-f01-cluster                                       \n -   ├─ kubernetes:yaml:ConfigFile                      dev-ap-southeast-1-f01-serverless-cluster          deleted           \n -   └─ kubernetes:core/v1:Namespace                    dev-ap-southeast-1-f01-serverless-ns               deleted (14s)     \n\nOutputs:\n    kubeconfig   : { ... }\n\nResources:\n    - 3 deleted\n    123 unchanged\n\nDuration: 1m1s\n```\n\n### 9. Destroying Control Plane\n9.1 Set the Pulumi configuration variables to destroy the control plane resources.\n```\n$ pulumi config set bastion-enabled false\n$ pulumi config set control-plane-enabled false\n```\n9.2 Destroy the control plane resources by running `pulumi up`.\n```\n$ pulumi up\nUpdating (dev-ap-southeast-1-f01)\n\n     Type                                                               Name                                          Status              \n     pulumi:pulumi:Stack                                                pulumi-tidb-serverless-dev-ap-southeast-1-f01                      \n     ├─ eks:index:Cluster                                               dev-ap-southeast-1-f01-cluster                                         \n -   ├─ kubernetes:storage.k8s.io/v1:StorageClass                       ebs-sc                                        deleted (2s)        \n -   ├─ kubernetes:helm.sh/v3:Chart                                     aws-cluster-auto-scaler                       deleted             \n -   ├─ kubernetes:helm.sh/v3:Chart                                     aws-ebs-csi-driver                            deleted             \n -   ├─ kubernetes:helm.sh/v3:Release                                   aws-load-balancer-controller                  deleted (33s)       \n -   ├─ aws:ec2:Instance                                                dev-ap-southeast-1-f01-bastion                     deleted (39s)       \n -   ├─ kubernetes:helm.sh/v3:Release                                   tidb-operator                                 deleted (23s)       \n -   ├─ kubernetes:yaml:ConfigFile                                      tidb-operator-crds                            deleted             \n -   ├─ aws:ec2:KeyPair                                                 dev-ap-southeast-1-f01-bastion-key-pair            deleted (1s)        \n -   └─ aws:ec2:SecurityGroup                                           dev-ap-southeast-1-f01-bastion-security-group      deleted (4s)        \n\nOutputs:\n  - bastionHost     : \"50.16.xx.xx\"\n    kubeconfig      : { ... }\n\nResources:\n    - 50 deleted\n    73 unchanged\n\nDuration: 2m36s\n```\n\n### 10. Tidying up EKS Cluster\n10.1 Destroy all of its infrastructure with `pulumi destroy`.\n```\n$ pulumi destroy\nDestroying (dev-ap-southeast-1-f01)\n\n     Type                                    Name                                                         Status             \n -   pulumi:pulumi:Stack                     pulumi-tidb-serverless-dev-ap-southeast-1-f01                 deleted            \n -   ├─ eks:index:ManagedNodeGroup           dev-ap-southeast-1-f01-ap-southeast-1c-tikv-standard-0                 deleted            \n -   ├─ eks:index:ManagedNodeGroup           dev-ap-southeast-1-f01-default-standard-0                         deleted            \n -   ├─ aws:iam:Role                         dev-ap-southeast-1-f01-managed-nodegroup-role                     deleted (1s)       \n -   ├─ eks:index:ManagedNodeGroup           dev-ap-southeast-1-f01-ap-southeast-1a-pd-standard-0                   deleted            \n -   ├─ eks:index:ManagedNodeGroup           dev-ap-southeast-1-f01-ap-southeast-1c-pd-standard-0                   deleted            \n -   ├─ eks:index:ManagedNodeGroup           dev-ap-southeast-1-f01-tidb-standard-0                            deleted            \n -   ├─ eks:index:ManagedNodeGroup           dev-ap-southeast-1-f01-ap-southeast-1b-tikv-standard-0                 deleted            \n -   ├─ awsx:x:ec2:Vpc                       dev-ap-southeast-1-f01-vpc                                        deleted            \n -   ├─ eks:index:ManagedNodeGroup           dev-ap-southeast-1-f01-ap-southeast-1b-pd-standard-0                   deleted            \n -   ├─ eks:index:ManagedNodeGroup           dev-ap-southeast-1-f01-ap-southeast-1a-tikv-standard-0                 deleted            \n -   └─ eks:index:Cluster                    dev-ap-southeast-1-f01-cluster                                    deleted            \n\nOutputs:\n  - kubeconfig      : { ... }\n\nResources:\n    - 73 deleted\n\nDuration: 9m18s\n```\nThe resources in the stack have been deleted, but the history and configuration associated with the stack are still maintained.\n\n10.2 If you want to remove the stack completely, run `make clean` or `pulumi stack rm ${ENV}-${REGION}-${SUFFIX}`.\n```\nmake clean\n```\n\n## License\nThis package is licensed under a MIT license (Copyright (c) 2023 Meng Huang)\n\n## Author\npulumi-tidb-serverless was written by Meng Huang.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhslam%2Fpulumi-tidb-serverless","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhslam%2Fpulumi-tidb-serverless","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhslam%2Fpulumi-tidb-serverless/lists"}