diff --git a/examples/tencentcloud-tke/main.tf b/examples/tencentcloud-tke/main.tf index 5675e544cb..ec8c9a3753 100644 --- a/examples/tencentcloud-tke/main.tf +++ b/examples/tencentcloud-tke/main.tf @@ -41,6 +41,61 @@ resource "tencentcloud_kubernetes_cluster" "managed_cluster" { } } +#examples for MANAGED_CLUSTER cluster with add-on +resource "tencentcloud_kubernetes_cluster" "cluster_with_addon" { + vpc_id = var.vpc + cluster_cidr = "10.1.0.0/16" + cluster_max_pod_num = 32 + cluster_name = "test" + cluster_desc = "test cluster desc" + cluster_max_service_num = 32 + cluster_internet = true + managed_cluster_internet_security_policies = ["3.3.3.3", "1.1.1.1"] + cluster_deploy_type = "MANAGED_CLUSTER" + + worker_config { + count = 1 + availability_zone = "ap-guangzhou-3" + instance_type = var.default_instance_type + system_disk_type = "CLOUD_SSD" + system_disk_size = 60 + internet_charge_type = "TRAFFIC_POSTPAID_BY_HOUR" + internet_max_bandwidth_out = 100 + public_ip_assigned = true + subnet_id = var.subnet + img_id = "img-rkiynh11" + enhanced_security_service = false + enhanced_monitor_service = false + user_data = "dGVzdA==" + password = "ZZXXccvv1212" + } + + extension_addon { + name = "NodeProblemDetectorPlus" + param = "{\"kind\":\"NodeProblemDetector\",\"apiVersion\":\"platform.tke/v1\",\"metadata\":{\"generateName\":\"npd\"},\"spec\":{\"version\":\"v2.0.0\",\"selfCure\":true,\"uin\":\"12345\",\"subUin\":\"12345\",\"policys\":[{\"actions\":{\"CVM\":{\"reBootCVM\":true,\"retryCounts\":1},\"runtime\":{\"reStartDokcer\":true,\"reStartKubelet\":true,\"retryCounts\":1},\"nodePod\":{\"evict\":true,\"retryCounts\":1}},\"conditionType\":\"Ready\"},{\"actions\":{\"runtime\":{\"reStartDokcer\":true,\"reStartKubelet\":true,\"retryCounts\":1}},\"conditionType\":\"KubeletProblem\"},{\"actions\":{\"runtime\":{\"reStartDokcer\":true,\"reStartKubelet\":false,\"retryCounts\":1}},\"conditionType\":\"DockerdProblem\"}]}}" + } + extension_addon { + name = "OOMGuard" + param = "{\"kind\":\"OOMGuard\",\"apiVersion\":\"platform.tke/v1\",\"metadata\":{\"generateName\":\"oom\"},\"spec\":{}}" + } + extension_addon { + name = "DNSAutoscaler" + param = "{\"kind\":\"DNSAutoscaler\",\"apiVersion\":\"platform.tke/v1\",\"metadata\":{\"generateName\":\"da\"},\"spec\":{}}" + } + extension_addon { + name = "COS" + param = "{\"kind\":\"COS\",\"apiVersion\":\"platform.tke/v1\",\"metadata\":{\"generateName\":\"cos\"},\"spec\":{\"version\":\"1.0.0\"}}" + } + extension_addon { + name = "CFS" + param = "{\"kind\":\"CFS\",\"apiVersion\":\"platform.tke/v1\",\"metadata\":{\"generateName\":\"cfs\"},\"spec\":{\"version\":\"1.0.0\"}}" + } + extension_addon { + name = "CBS" + param = "{\"kind\":\"CBS\",\"apiVersion\":\"platform.tke/v1\",\"metadata\":{\"generateName\":\"cbs\"},\"spec\":{}}" + } +} + #examples for MANAGED_CLUSTER VPC-CNI network type cluster with customized master params resource "tencentcloud_kubernetes_cluster" "managed_vpc_cni_cluster" { cluster_version = "1.14.3" diff --git a/tencentcloud/resource_tc_container_cluster.go b/tencentcloud/resource_tc_container_cluster.go index d05b6dd37b..6c647f0afc 100644 --- a/tencentcloud/resource_tc_container_cluster.go +++ b/tencentcloud/resource_tc_container_cluster.go @@ -449,7 +449,7 @@ func resourceTencentCloudContainerClusterCreate(d *schema.ResourceData, meta int runInstancesParas := runInstancesPara.ToJsonString() cvms.Work = []string{runInstancesParas} - id, err := service.CreateCluster(ctx, basic, cAdvanced, cvms, iAdvanced, cidrSet, map[string]string{}, nil, nil, nil) + id, err := service.CreateCluster(ctx, basic, cAdvanced, cvms, iAdvanced, cidrSet, map[string]string{}, nil, nil, nil, nil) if err != nil { return err } diff --git a/tencentcloud/resource_tc_kubernetes_cluster.go b/tencentcloud/resource_tc_kubernetes_cluster.go index 9d1461faf4..83eaaf3aa5 100644 --- a/tencentcloud/resource_tc_kubernetes_cluster.go +++ b/tencentcloud/resource_tc_kubernetes_cluster.go @@ -193,6 +193,81 @@ resource "tencentcloud_kubernetes_cluster" "managed_cluster" { } ``` +Use extension addons + +```hcl +variable "availability_zone_first" { + default = "ap-guangzhou-3" +} + +variable "cluster_cidr" { + default = "10.31.0.0/16" +} + +variable "default_instance_type" { + default = "S5.SMALL1" +} + +data "tencentcloud_vpc_subnets" "vpc_first" { + is_default = true + availability_zone = var.availability_zone_first +} + +resource "tencentcloud_kubernetes_cluster" "cluster_with_addon" { + vpc_id = data.tencentcloud_vpc_subnets.vpc_first.instance_list.0.vpc_id + cluster_cidr = var.cluster_cidr + cluster_max_pod_num = 32 + cluster_name = "test" + cluster_desc = "test cluster desc" + cluster_max_service_num = 32 + cluster_internet = true + managed_cluster_internet_security_policies = ["3.3.3.3", "1.1.1.1"] + cluster_deploy_type = "MANAGED_CLUSTER" + + worker_config { + count = 1 + availability_zone = var.availability_zone_first + instance_type = var.default_instance_type + system_disk_type = "CLOUD_SSD" + system_disk_size = 60 + internet_charge_type = "TRAFFIC_POSTPAID_BY_HOUR" + internet_max_bandwidth_out = 100 + public_ip_assigned = true + subnet_id = data.tencentcloud_vpc_subnets.vpc_first.instance_list.0.subnet_id + img_id = "img-rkiynh11" + enhanced_security_service = false + enhanced_monitor_service = false + user_data = "dGVzdA==" + password = "ZZXXccvv1212" + } + + extension_addon { + name = "NodeProblemDetectorPlus" + param = "{\"kind\":\"NodeProblemDetector\",\"apiVersion\":\"platform.tke/v1\",\"metadata\":{\"generateName\":\"npd\"},\"spec\":{\"version\":\"v2.0.0\",\"selfCure\":true,\"uin\":\"12345\",\"subUin\":\"12345\",\"policys\":[{\"actions\":{\"CVM\":{\"reBootCVM\":true,\"retryCounts\":1},\"runtime\":{\"reStartDokcer\":true,\"reStartKubelet\":true,\"retryCounts\":1},\"nodePod\":{\"evict\":true,\"retryCounts\":1}},\"conditionType\":\"Ready\"},{\"actions\":{\"runtime\":{\"reStartDokcer\":true,\"reStartKubelet\":true,\"retryCounts\":1}},\"conditionType\":\"KubeletProblem\"},{\"actions\":{\"runtime\":{\"reStartDokcer\":true,\"reStartKubelet\":false,\"retryCounts\":1}},\"conditionType\":\"DockerdProblem\"}]}}" + } + extension_addon { + name = "OOMGuard" + param = "{\"kind\":\"OOMGuard\",\"apiVersion\":\"platform.tke/v1\",\"metadata\":{\"generateName\":\"oom\"},\"spec\":{}}" + } + extension_addon { + name = "DNSAutoscaler" + param = "{\"kind\":\"DNSAutoscaler\",\"apiVersion\":\"platform.tke/v1\",\"metadata\":{\"generateName\":\"da\"},\"spec\":{}}" + } + extension_addon { + name = "COS" + param = "{\"kind\":\"COS\",\"apiVersion\":\"platform.tke/v1\",\"metadata\":{\"generateName\":\"cos\"},\"spec\":{\"version\":\"1.0.0\"}}" + } + extension_addon { + name = "CFS" + param = "{\"kind\":\"CFS\",\"apiVersion\":\"platform.tke/v1\",\"metadata\":{\"generateName\":\"cfs\"},\"spec\":{\"version\":\"1.0.0\"}}" + } + extension_addon { + name = "CBS" + param = "{\"kind\":\"CBS\",\"apiVersion\":\"platform.tke/v1\",\"metadata\":{\"generateName\":\"cbs\"},\"spec\":{}}" + } +} +``` + Use node pool global config ```hcl @@ -1143,6 +1218,26 @@ func resourceTencentCloudTkeCluster() *schema.Resource { }, Description: "Specify cluster authentication configuration. Only available for managed cluster and `cluster_version` >= 1.20.", }, + "extension_addon": { + Type: schema.TypeList, + Optional: true, + ForceNew: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "name": { + Type: schema.TypeString, + Required: true, + Description: "Add-on name.", + }, + "param": { + Type: schema.TypeString, + Required: true, + Description: "Description of the add-on resource object in JSON string format.", + }, + }, + }, + Description: "Information of the add-on to be installed.", + }, "tags": { Type: schema.TypeMap, Optional: true, @@ -1643,6 +1738,7 @@ func resourceTencentCloudTkeClusterCreate(d *schema.ResourceData, meta interface iDiskMountSettings []*tke.InstanceDataDiskMountSetting cidrSet ClusterCidrSettings securityPolicies []string + extensionAddons []*tke.ExtensionAddon clusterInternet = d.Get("cluster_internet").(bool) clusterIntranet = d.Get("cluster_intranet").(bool) intranetSubnetId = d.Get("cluster_intranet_subnet_id").(string) @@ -1923,8 +2019,22 @@ func resourceTencentCloudTkeClusterCreate(d *schema.ResourceData, meta interface return fmt.Errorf("master_config+worker_config and exist_instance can not exist at the same time") } + if v, ok := d.GetOk("extension_addon"); ok { + for _, i := range v.([]interface{}) { + dMap := i.(map[string]interface{}) + name := dMap["name"].(string) + param := dMap["param"].(string) + addon := &tke.ExtensionAddon{ + AddonName: helper.String(name), + AddonParam: helper.String(param), + } + extensionAddons = append(extensionAddons, addon) + } + } + + service := TkeService{client: meta.(*TencentCloudClient).apiV3Conn} - id, err := service.CreateCluster(ctx, basic, advanced, cvms, iAdvanced, cidrSet, tags, existInstances, &overrideSettings, iDiskMountSettings) + id, err := service.CreateCluster(ctx, basic, advanced, cvms, iAdvanced, cidrSet, tags, existInstances, &overrideSettings, iDiskMountSettings, extensionAddons) if err != nil { return err } diff --git a/tencentcloud/service_tencentcloud_tke.go b/tencentcloud/service_tencentcloud_tke.go index 6b9aefb8de..7ed435d0e0 100644 --- a/tencentcloud/service_tencentcloud_tke.go +++ b/tencentcloud/service_tencentcloud_tke.go @@ -399,6 +399,7 @@ func (me *TkeService) CreateCluster(ctx context.Context, existedInstance []*tke.ExistedInstancesForNode, overrideSettings *OverrideSettings, iDiskMountSettings []*tke.InstanceDataDiskMountSetting, + extensionAddons []*tke.ExtensionAddon, ) (id string, errRet error) { logId := getLogId(ctx) @@ -468,6 +469,10 @@ func (me *TkeService) CreateCluster(ctx context.Context, request.InstanceAdvancedSettings.DataDisks = iAdvanced.DataDisks } + if len(extensionAddons) > 0 { + request.ExtensionAddons = extensionAddons + } + if len(overrideSettings.Master)+len(overrideSettings.Work) > 0 && len(overrideSettings.Master)+len(overrideSettings.Work) != (len(cvms.Master)+len(cvms.Work)) { return "", fmt.Errorf("len(overrideSettings) != (len(cvms.Master)+len(cvms.Work))") diff --git a/website/docs/r/kubernetes_cluster.html.markdown b/website/docs/r/kubernetes_cluster.html.markdown index 6f0217c186..fe25080803 100644 --- a/website/docs/r/kubernetes_cluster.html.markdown +++ b/website/docs/r/kubernetes_cluster.html.markdown @@ -203,6 +203,81 @@ resource "tencentcloud_kubernetes_cluster" "managed_cluster" { } ``` +Use extension addons + +```hcl +variable "availability_zone_first" { + default = "ap-guangzhou-3" +} + +variable "cluster_cidr" { + default = "10.31.0.0/16" +} + +variable "default_instance_type" { + default = "S5.SMALL1" +} + +data "tencentcloud_vpc_subnets" "vpc_first" { + is_default = true + availability_zone = var.availability_zone_first +} + +resource "tencentcloud_kubernetes_cluster" "cluster_with_addon" { + vpc_id = data.tencentcloud_vpc_subnets.vpc_first.instance_list.0.vpc_id + cluster_cidr = var.cluster_cidr + cluster_max_pod_num = 32 + cluster_name = "test" + cluster_desc = "test cluster desc" + cluster_max_service_num = 32 + cluster_internet = true + managed_cluster_internet_security_policies = ["3.3.3.3", "1.1.1.1"] + cluster_deploy_type = "MANAGED_CLUSTER" + + worker_config { + count = 1 + availability_zone = var.availability_zone_first + instance_type = var.default_instance_type + system_disk_type = "CLOUD_SSD" + system_disk_size = 60 + internet_charge_type = "TRAFFIC_POSTPAID_BY_HOUR" + internet_max_bandwidth_out = 100 + public_ip_assigned = true + subnet_id = data.tencentcloud_vpc_subnets.vpc_first.instance_list.0.subnet_id + img_id = "img-rkiynh11" + enhanced_security_service = false + enhanced_monitor_service = false + user_data = "dGVzdA==" + password = "ZZXXccvv1212" + } + + extension_addon { + name = "NodeProblemDetectorPlus" + param = "{\"kind\":\"NodeProblemDetector\",\"apiVersion\":\"platform.tke/v1\",\"metadata\":{\"generateName\":\"npd\"},\"spec\":{\"version\":\"v2.0.0\",\"selfCure\":true,\"uin\":\"12345\",\"subUin\":\"12345\",\"policys\":[{\"actions\":{\"CVM\":{\"reBootCVM\":true,\"retryCounts\":1},\"runtime\":{\"reStartDokcer\":true,\"reStartKubelet\":true,\"retryCounts\":1},\"nodePod\":{\"evict\":true,\"retryCounts\":1}},\"conditionType\":\"Ready\"},{\"actions\":{\"runtime\":{\"reStartDokcer\":true,\"reStartKubelet\":true,\"retryCounts\":1}},\"conditionType\":\"KubeletProblem\"},{\"actions\":{\"runtime\":{\"reStartDokcer\":true,\"reStartKubelet\":false,\"retryCounts\":1}},\"conditionType\":\"DockerdProblem\"}]}}" + } + extension_addon { + name = "OOMGuard" + param = "{\"kind\":\"OOMGuard\",\"apiVersion\":\"platform.tke/v1\",\"metadata\":{\"generateName\":\"oom\"},\"spec\":{}}" + } + extension_addon { + name = "DNSAutoscaler" + param = "{\"kind\":\"DNSAutoscaler\",\"apiVersion\":\"platform.tke/v1\",\"metadata\":{\"generateName\":\"da\"},\"spec\":{}}" + } + extension_addon { + name = "COS" + param = "{\"kind\":\"COS\",\"apiVersion\":\"platform.tke/v1\",\"metadata\":{\"generateName\":\"cos\"},\"spec\":{\"version\":\"1.0.0\"}}" + } + extension_addon { + name = "CFS" + param = "{\"kind\":\"CFS\",\"apiVersion\":\"platform.tke/v1\",\"metadata\":{\"generateName\":\"cfs\"},\"spec\":{\"version\":\"1.0.0\"}}" + } + extension_addon { + name = "CBS" + param = "{\"kind\":\"CBS\",\"apiVersion\":\"platform.tke/v1\",\"metadata\":{\"generateName\":\"cbs\"},\"spec\":{}}" + } +} +``` + Use node pool global config ```hcl @@ -360,6 +435,7 @@ The following arguments are supported: * `enable_customized_pod_cidr` - (Optional) Whether to enable the custom mode of node podCIDR size. Default is false. * `eni_subnet_ids` - (Optional) Subnet Ids for cluster with VPC-CNI network mode. This field can only set when field `network_type` is 'VPC-CNI'. `eni_subnet_ids` can not empty once be set. * `exist_instance` - (Optional, ForceNew) create tke cluster by existed instances. +* `extension_addon` - (Optional, ForceNew) Information of the add-on to be installed. * `extra_args` - (Optional, ForceNew) Custom parameter information related to the node. * `globe_desired_pod_num` - (Optional, ForceNew) Indicate to set desired pod number in node. valid when enable_customized_pod_cidr=true, and it takes effect for all nodes. * `ignore_cluster_cidr_conflict` - (Optional, ForceNew) Indicates whether to ignore the cluster cidr conflict error. Default is false. @@ -408,6 +484,11 @@ The `exist_instance` object supports the following: * `instances_para` - (Optional, ForceNew) Reinstallation parameters of an existing instance. * `node_role` - (Optional, ForceNew) Role of existed node. value:MASTER_ETCD or WORKER. +The `extension_addon` object supports the following: + +* `name` - (Required) Add-on name. +* `param` - (Required) Description of the add-on resource object in JSON string format. + The `instances_para` object supports the following: * `instance_ids` - (Required, ForceNew) Cluster IDs.