Deploy Kubernetes PVC using New OBS
Application Scenario
Cloud Container Engine (CCE) is a high-reliability, high-performance enterprise-grade container management service that supports Kubernetes community native applications and tools. Persistent Volume Claim (PVC) is an abstract interface in Kubernetes for requesting storage resources, allowing Pods to request storage resources declaratively without caring about the specific implementation of the underlying storage. Object Storage Service (OBS) is a highly available, highly reliable, high-performance, secure, and low-cost object storage service provided by Huawei Cloud, which can serve as a persistent storage backend for Kubernetes clusters.
By using OBS buckets as persistent storage for Kubernetes, you can provide scalable and highly available storage solutions for container applications. This approach is particularly suitable for application scenarios that require shared storage, large-capacity storage, or cross-availability zone data replication. Unlike using existing OBS buckets, this best practice automatically creates OBS buckets and Persistent Volumes through PVC, simplifying the deployment process. This best practice will introduce how to use Terraform to automatically deploy a complete solution for managing PVC with new OBS, including querying availability zones and instance flavors, as well as creating infrastructure such as VPC, subnet, Elastic IP, CCE cluster, node, and Kubernetes Secret, Persistent Volume Claim, and Deployment.
Related Resources/Data Sources
This best practice involves the following main resources and data sources:
Data Sources
Resources
Resource/Data Source Dependencies
Implementation Steps
1. Script Preparation
Prepare the TF file (such as main.tf) for writing the current best practice script in the specified workspace, ensuring that it (or other TF files in the same directory) contains the provider version declaration and Huawei Cloud authentication information required for deploying resources. For configuration introduction, refer to the introduction in Preparation Before Deploying Huawei Cloud Resources.
2. Configure Kubernetes Provider
Since this best practice requires using the Kubernetes provider to create Kubernetes resources, you need to configure the Kubernetes provider in the providers.tf file. Add the following script to the providers.tf file:
Parameter Description:
host: The address of the Kubernetes API server, if the EIP address is specified, use that value, otherwise reference the address of the Elastic IP resource (huaweicloud_vpc_eip.test[0]), port is 5443
cluster_ca_certificate: Cluster CA certificate, obtained and decoded from the certificate information of the CCE cluster resource (huaweicloud_cce_cluster.test)
client_certificate: Client certificate, obtained and decoded from the certificate information of the CCE cluster resource (huaweicloud_cce_cluster.test)
client_key: Client key, obtained and decoded from the certificate information of the CCE cluster resource (huaweicloud_cce_cluster.test)
Note: The Kubernetes provider needs to access the CCE cluster's API server, so it needs to configure the correct cluster address and certificate information. This information can be obtained from the CCE cluster resource.
3. Query Availability Zones Required for PVC Resource Creation Through Data Source
Add the following script to the TF file (such as main.tf) to inform Terraform to perform a data source query, the query results are used to create PVC related resources:
Parameter Description:
count: The number of data source creations, used to control whether to execute the availability zone list query data source, only when
var.availability_zoneis empty, create the data source (i.e., execute the availability zone list query)
4. Create VPC Resource (Optional)
Add the following script to the TF file to inform Terraform to create a VPC resource (if VPC ID and subnet ID are not specified):
Parameter Description:
count: The number of resource creations, used to control whether to create VPC resource, only when both
var.vpc_idandvar.subnet_idare empty, create VPC resourcename: The name of the VPC, assigned by referencing the input variable
vpc_namecidr: The CIDR block of the VPC, assigned by referencing the input variable
vpc_cidr, default is "192.168.0.0/16"
5. Create VPC Subnet Resource (Optional)
Add the following script to the TF file to inform Terraform to create a VPC subnet resource (if subnet ID is not specified):
Parameter Description:
count: The number of resource creations, used to control whether to create VPC subnet resource, only when
var.subnet_idis empty, create VPC subnet resourcevpc_id: The VPC ID to which the subnet belongs, if VPC ID is specified, use that value, otherwise reference the ID of the VPC resource (huaweicloud_vpc.test[0]) for assignment
name: The name of the subnet, assigned by referencing the input variable
subnet_namecidr: The CIDR block of the subnet, if subnet CIDR is specified, use that value, otherwise automatically calculate based on the VPC's CIDR block through the
cidrsubnetfunctiongateway_ip: The gateway IP of the subnet, if gateway IP is specified, use that value, otherwise automatically calculate based on subnet CIDR or automatically calculated subnet CIDR through the
cidrhostfunctionavailability_zone: The availability zone where the subnet is located, if availability zone is specified, use that value, otherwise use the first availability zone from the availability zone list query data source
6. Create Elastic IP Resource (Optional)
Add the following script to the TF file to inform Terraform to create an Elastic IP resource (if EIP address is not specified):
Parameter Description:
count: The number of resource creations, used to control whether to create Elastic IP resource, only when
var.eip_addressis empty, create Elastic IP resourcepublicip: Public IP configuration block
type: Public IP type, assigned by referencing the input variable
eip_type, default is "5_bgp" indicating full dynamic BGP
bandwidth: Bandwidth configuration block
name: The name of the bandwidth, assigned by referencing the input variable
bandwidth_namesize: Bandwidth size (Mbps), assigned by referencing the input variable
bandwidth_size, default is 5share_type: Bandwidth sharing type, assigned by referencing the input variable
bandwidth_share_type, default is "PER" indicating dedicatedcharge_mode: Bandwidth billing mode, assigned by referencing the input variable
bandwidth_charge_mode, default is "traffic" indicating pay-per-traffic
7. Create CCE Cluster Resource
Add the following script to the TF file to inform Terraform to create a CCE cluster resource:
Parameter Description:
name: The name of the CCE cluster, assigned by referencing the input variable
cluster_nameflavor_id: The flavor ID of the CCE cluster, assigned by referencing the input variable
cluster_flavor_id, default is "cce.s1.small" indicating small-scale clustercluster_version: The version of the CCE cluster, assigned by referencing the input variable
cluster_version, if null, use the latest versioncluster_type: The type of the CCE cluster, assigned by referencing the input variable
cluster_type, default is "VirtualMachine" indicating virtual machine typecontainer_network_type: Container network type, assigned by referencing the input variable
container_network_type, default is "overlay_l2" indicating L2 networkvpc_id: VPC ID, if VPC ID is specified, use that value, otherwise reference the ID of the VPC resource (huaweicloud_vpc.test[0]) for assignment
subnet_id: Subnet ID, if subnet ID is specified, use that value, otherwise reference the ID of the VPC subnet resource (huaweicloud_vpc_subnet.test[0]) for assignment
eip: Elastic public IP address, if EIP address is specified, use that value, otherwise reference the address of the Elastic IP resource (huaweicloud_vpc_eip.test[0]) for assignment
authentication_mode: Cluster authentication mode, assigned by referencing the input variable
authentication_mode, default is "rbac" indicating role-based access controldelete_all: Whether to delete all resources on termination, assigned by referencing the input variable
delete_all_resources_on_terminal, default is "true" indicating delete all resourcesenterprise_project_id: Enterprise project ID, assigned by referencing the input variable
enterprise_project_id, default is "0" indicating default enterprise project
8. Query Instance Flavors Required for Node Resource Creation Through Data Source
Add the following script to the TF file to inform Terraform to query instance flavors that meet the conditions:
Parameter Description:
count: The number of data source queries, used to control whether to query instance flavor information, only when
var.node_flavor_idis empty, query instance flavor informationperformance_type: Performance type, assigned by referencing the input variable
node_performance_type, default is "general" indicating general-purposecpu_core_count: CPU core count, assigned by referencing the input variable
node_cpu_core_count, default is 4 coresmemory_size: Memory size (GB), assigned by referencing the input variable
node_memory_size, default is 8GBavailability_zone: The availability zone where the instance flavor is located, if availability zone is specified, use that value, otherwise use the first availability zone from the availability zone list query data source
9. Create Key Pair Resource
Add the following script to the TF file to inform Terraform to create a key pair resource:
Parameter Description:
name: The name of the key pair, assigned by referencing the input variable
keypair_name
10. Create CCE Node Resource
Add the following script to the TF file to inform Terraform to create a CCE node resource:
Parameter Description:
cluster_id: The CCE cluster ID to which the node belongs, assigned by referencing the ID of the CCE cluster resource (huaweicloud_cce_cluster.test)
name: The name of the node, assigned by referencing the input variable
node_nameflavor_id: The flavor ID of the node, if node flavor ID is specified, use that value, otherwise assign based on the return result of the compute flavor list query data source
availability_zone: The availability zone where the node is located, if availability zone is specified, use that value, otherwise use the first availability zone from the availability zone list query data source
key_pair: The key pair name used by the node, assigned by referencing the name of the key pair resource (huaweicloud_kps_keypair.test)
root_volume: Root volume configuration block
volumetype: Root volume type, assigned by referencing the input variable
root_volume_type, default is "SATA"size: Root volume size (GB), assigned by referencing the input variable
root_volume_size, default is 40GB
data_volumes: Data volume configuration block (dynamic block), dynamically created based on the input variable
data_volumes_configurationvolumetype: Data volume type, assigned by referencing the data volume configuration in the input variable
size: Data volume size (GB), assigned by referencing the data volume configuration in the input variable
11. Create Kubernetes Secret Resource
Add the following script to the TF file to inform Terraform to create a Kubernetes Secret resource:
Parameter Description:
metadata: Metadata configuration block
name: The name of the Secret, assigned by referencing the input variable
secret_namenamespace: The namespace where the Secret is located, assigned by referencing the input variable
namespace_name, default is "default"labels: The labels of the Secret, assigned by referencing the input variable
secret_labels, default includes "secret.kubernetes.io/used-by" label
data: The data of the Secret, assigned by referencing the input variable
secret_data, containing OBS access key and secret keytype: The type of the Secret, assigned by referencing the input variable
secret_type, default is "cfe/secure-opaque"lifecycle: Lifecycle configuration block, used to ignore changes to the
dataparameter, because Secret data may be modified externally
12. Create Kubernetes Persistent Volume Claim Resource
Add the following script to the TF file to inform Terraform to create a Kubernetes Persistent Volume Claim resource:
Parameter Description:
metadata: Metadata configuration block
name: The name of the Persistent Volume Claim, assigned by referencing the input variable
pvc_namenamespace: The namespace where the Persistent Volume Claim is located, assigned by referencing the input variable
namespace_nameannotations: Annotations, containing OBS volume type, file system type, Secret reference, and enterprise project ID
spec: Specification configuration block
access_modes: Access mode list, assigned by referencing the input variable
pvc_access_modes, default is ["ReadWriteMany"] indicating multi-node read-writeresources: Resource request configuration block
requests: Resource requests, containing storage size request
storage: Storage size, assigned by referencing the input variable
pvc_storage, default is "1Gi"
storage_class_name: Storage class name, assigned by referencing the input variable
pvc_storage_class_name, default is "csi-obs", when using this storage class, Kubernetes will automatically create Persistent Volume and OBS bucket
Note: Unlike using existing OBS buckets, this best practice uses the storage class (storage_class_name) directly through PVC, and Kubernetes will automatically create Persistent Volume and OBS bucket without manually creating these resources.
13. Create Kubernetes Deployment Resource
Add the following script to the TF file to inform Terraform to create a Kubernetes Deployment resource:
Parameter Description:
metadata: Metadata configuration block
name: The name of the Deployment, assigned by referencing the input variable
deployment_namenamespace: The namespace where the Deployment is located, assigned by referencing the input variable
namespace_name
spec: Specification configuration block
replicas: Pod replica count, assigned by referencing the input variable
deployment_replicas, default is 2selector: Selector configuration block, used for selecting Pods
match_labels: Match labels, containing application name label
template: Pod template configuration block
metadata: Pod metadata configuration block
labels: Pod labels, containing application name label
spec: Pod specification configuration block
container: Container configuration block (dynamic block), dynamically created based on the input variable
deployment_containersname: Container name, assigned by referencing the container configuration in the input variable
image: Container image, assigned by referencing the container configuration in the input variable
volume_mount: Volume mount configuration block (dynamic block), dynamically created based on the container volume mount configuration in the input variable
name: Volume name, assigned by referencing the input variable
deployment_volume_name, default is "pvc-obs-volume"mount_path: Mount path, assigned by referencing the volume mount configuration in the input variable
image_pull_secrets: Image pull secrets configuration block (dynamic block), dynamically created based on the input variable
deployment_image_pull_secretsname: Secret name, assigned by referencing the image pull secrets string in the input variable
volume: Volume configuration block
name: Volume name, assigned by referencing the input variable
deployment_volume_namepersistent_volume_claim: Persistent volume claim configuration block
claim_name: Claim name, assigned by referencing the name of the Kubernetes Persistent Volume Claim resource (kubernetes_persistent_volume_claim.test)
depends_on: Explicit dependency, ensuring that the CCE node resource is created before creating the Deployment
14. Preset Input Parameters Required for Resource Deployment (Optional)
In this practice, some resources and data sources use input variables to assign configuration content, and these input parameters need to be manually entered during subsequent deployment. At the same time, Terraform provides a method to preset these configurations through tfvars files, which can avoid repeated input each time it is executed.
Create a terraform.tfvars file in the working directory, with example content as follows:
Usage:
Save the above content as a
terraform.tfvarsfile in the working directory (this filename allows users to automatically import the content in thistfvarsfile when executing terraform commands, other names need to add.autobefore tfvars, such asvariables.auto.tfvars)Modify parameter values according to actual needs
When executing
terraform planorterraform apply, Terraform will automatically read the variable values in this file
In addition to using the terraform.tfvars file, you can also set variable values in the following ways:
Command line parameters:
terraform apply -var="vpc_name=my-vpc" -var="subnet_name=my-subnet"Environment variables:
export TF_VAR_vpc_name=my-vpcCustom named variable file:
terraform apply -var-file="custom.tfvars"
Note: If the same variable is set through multiple methods, Terraform will use variable values according to the following priority: command line parameters > variable file > environment variables > default values.
15. Initialize and Apply Terraform Configuration
After completing the above script configuration, execute the following steps to create resources:
Run
terraform initto initialize the environmentRun
terraform planto view the resource creation planAfter confirming that the resource plan is correct, run
terraform applyto start creating the complete solution for managing PVC with new OBSRun
terraform showto view the created complete solution for managing PVC with new OBS
Reference Information
Last updated