Skip to content

Commit 04ec6c0

Browse files
Atmosphere10shanye997
authored andcommitted
feat: 解决方案build-microservices-on-ack tf文件完成
1 parent 570958e commit 04ec6c0

File tree

5 files changed

+383
-0
lines changed

5 files changed

+383
-0
lines changed
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
## Introduction
2+
<!-- DOCS_DESCRIPTION_CN -->
3+
本示例用于实现解决方案[高效编排与管理容器化应用](https://www.aliyun.com/solution/tech-solution/ack-services), 涉及到专有网络(VPC)、虚拟交换机(VSwitch)、专有网络 NAT 网关(NAT Gateway)、容器服务 Kubernetes 版(ACK)、应用型负载均衡(ALB)、云服务器(ECS)等资源的创建。
4+
<!-- DOCS_DESCRIPTION_CN -->
5+
6+
<!-- DOCS_DESCRIPTION_EN -->
7+
This example is used to implement solution [Efficient orchestration and management of containerized applications](https://www.aliyun.com/solution/tech-solution/ack-services), which involves the creation and deployment of resources such as Virtual Private Cloud (VPC), Virtual Switch (VSwitch), NAT Gateway, Container Service for Kubernetes (ACK), Application Load Balancer (ALB) and Elastic Compute Service (ECS).
8+
<!-- DOCS_DESCRIPTION_EN -->
9+
10+
<!-- BEGIN_TF_DOCS -->
11+
## Providers
12+
13+
| Name | Version |
14+
|------|---------|
15+
| <a name="provider_alicloud"></a> [alicloud](#provider\_alicloud) | n/a |
16+
| <a name="provider_random"></a> [random](#provider\_random) | n/a |
17+
18+
## Modules
19+
20+
No modules.
21+
22+
## Resources
23+
24+
| Name | Type |
25+
|------|------|
26+
| [alicloud_cs_kubernetes_node_pool.node_pool](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/cs_kubernetes_node_pool) | resource |
27+
| [alicloud_cs_managed_kubernetes.ack](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/cs_managed_kubernetes) | resource |
28+
| [alicloud_ram_role.role](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/ram_role) | resource |
29+
| [alicloud_ram_role_policy_attachment.attach](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/ram_role_policy_attachment) | resource |
30+
| [alicloud_ros_stack.deploy_k8s_resource](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/ros_stack) | resource |
31+
| [alicloud_security_group.sg](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/security_group) | resource |
32+
| [alicloud_security_group_rule.ingress_http](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/security_group_rule) | resource |
33+
| [alicloud_security_group_rule.ingress_https](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/security_group_rule) | resource |
34+
| [alicloud_vpc.vpc](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/vpc) | resource |
35+
| [alicloud_vswitch.vswitch1](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/vswitch) | resource |
36+
| [alicloud_vswitch.vswitch2](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/vswitch) | resource |
37+
| [random_integer.default](https://registry.terraform.io/providers/hashicorp/random/latest/docs/resources/integer) | resource |
38+
| [alicloud_ack_service.open_ack](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/data-sources/ack_service) | data source |
39+
| [alicloud_instance_types.default](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/data-sources/instance_types) | data source |
40+
| [alicloud_ram_roles.roles](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/data-sources/ram_roles) | data source |
41+
| [alicloud_zones.default](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/data-sources/zones) | data source |
42+
43+
## Inputs
44+
45+
| Name | Description | Type | Default | Required |
46+
|------|-------------|------|---------|:--------:|
47+
| <a name="input_common_name"></a> [common\_name](#input\_common\_name) | 通用名称 | `string` | `"microservices-on-ack"` | no |
48+
| <a name="input_managed_kubernetes_cluster_name"></a> [managed\_kubernetes\_cluster\_name](#input\_managed\_kubernetes\_cluster\_name) | ACK托管版集群名称,长度5,前缀k8s-hpa-cluster-,必须包含小写字母 | `string` | `"k8s-cluster-example"` | no |
49+
| <a name="input_region"></a> [region](#input\_region) | 地域 | `string` | `"cn-hangzhou"` | no |
50+
<!-- END_TF_DOCS -->
Lines changed: 310 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,310 @@
1+
# 开通ack pro
2+
data "alicloud_ack_service" "open_ack" {
3+
enable = "On"
4+
type = "propayasgo"
5+
}
6+
7+
# 查询实例实例规格
8+
data "alicloud_instance_types" "default" {
9+
instance_type_family = "ecs.g7"
10+
sorted_by = "CPU"
11+
memory_size = "16"
12+
}
13+
14+
# 查询实例规格支持的可用区
15+
data "alicloud_zones" "default" {
16+
available_instance_type = data.alicloud_instance_types.default.ids.0
17+
available_slb_address_type = "classic_internet"
18+
}
19+
20+
locals {
21+
zone1 = data.alicloud_zones.default.ids[length(data.alicloud_zones.default.ids) - 1]
22+
zone2 = data.alicloud_zones.default.ids[length(data.alicloud_zones.default.ids) - 2]
23+
}
24+
25+
# 创建VPC
26+
resource "alicloud_vpc" "vpc" {
27+
cidr_block = "10.0.0.0/8"
28+
vpc_name = "${var.common_name}-vpc"
29+
}
30+
31+
# 创建VSwitch
32+
resource "alicloud_vswitch" "vswitch1" {
33+
vpc_id = alicloud_vpc.vpc.id
34+
cidr_block = "10.0.0.0/24"
35+
zone_id = local.zone1
36+
vswitch_name = "${var.common_name}-vsw"
37+
}
38+
39+
resource "alicloud_vswitch" "vswitch2" {
40+
vpc_id = alicloud_vpc.vpc.id
41+
cidr_block = "10.0.1.0/24"
42+
zone_id = local.zone2
43+
vswitch_name = "${var.common_name}-vsw"
44+
}
45+
46+
# 创建安全组
47+
resource "alicloud_security_group" "sg" {
48+
vpc_id = alicloud_vpc.vpc.id
49+
security_group_name = "${var.common_name}-sg"
50+
}
51+
52+
resource "alicloud_security_group_rule" "ingress_http" {
53+
security_group_id = alicloud_security_group.sg.id
54+
type = "ingress"
55+
ip_protocol = "tcp"
56+
port_range = "80/80"
57+
cidr_ip = "0.0.0.0/0"
58+
}
59+
60+
resource "alicloud_security_group_rule" "ingress_https" {
61+
security_group_id = alicloud_security_group.sg.id
62+
type = "ingress"
63+
ip_protocol = "tcp"
64+
port_range = "443/443"
65+
cidr_ip = "0.0.0.0/0"
66+
}
67+
68+
# 创建ACK集群
69+
resource "alicloud_cs_managed_kubernetes" "ack" {
70+
depends_on = [data.alicloud_ack_service.open_ack, alicloud_ram_role.role, alicloud_ram_role_policy_attachment.attach]
71+
name = var.managed_kubernetes_cluster_name
72+
cluster_spec = "ack.pro.small"
73+
vswitch_ids = [alicloud_vswitch.vswitch1.id, alicloud_vswitch.vswitch2.id]
74+
pod_vswitch_ids = [alicloud_vswitch.vswitch1.id, alicloud_vswitch.vswitch2.id]
75+
service_cidr = "192.168.0.0/16"
76+
new_nat_gateway = true
77+
slb_internet_enabled = true
78+
security_group_id = alicloud_security_group.sg.id
79+
80+
addons {
81+
name = "ack-node-local-dns"
82+
}
83+
addons {
84+
name = "terway-eniip"
85+
config = jsonencode({
86+
IPVlan = "false"
87+
NetworkPolicy = "false"
88+
ENITrunking = "false"
89+
})
90+
}
91+
addons {
92+
name = "csi-plugin"
93+
}
94+
addons {
95+
name = "csi-provisioner"
96+
}
97+
addons {
98+
name = "storage-operator"
99+
config = jsonencode({
100+
CnfsOssEnable = "false"
101+
CnfsNasEnable = "false"
102+
})
103+
}
104+
addons {
105+
name = "nginx-ingress-controller"
106+
disabled = true
107+
}
108+
addons {
109+
name = "logtail-ds"
110+
config = jsonencode({
111+
IngressDashboardEnabled = "true"
112+
})
113+
}
114+
addons {
115+
name = "alb-ingress-controller"
116+
version = ""
117+
config = jsonencode({
118+
albIngress = {
119+
AddressType = "Internet"
120+
ZoneMappings = {
121+
"${local.zone1}" = ["${alicloud_vswitch.vswitch1.id}"]
122+
"${local.zone2}" = ["${alicloud_vswitch.vswitch2.id}"]
123+
}
124+
CreateDefaultALBConfig = true
125+
}
126+
})
127+
}
128+
129+
delete_options {
130+
delete_mode = "delete"
131+
resource_type = "ALB"
132+
}
133+
delete_options {
134+
delete_mode = "delete"
135+
resource_type = "SLB"
136+
}
137+
delete_options {
138+
delete_mode = "delete"
139+
resource_type = "SLS_Data"
140+
}
141+
delete_options {
142+
delete_mode = "delete"
143+
resource_type = "SLS_ControlPlane"
144+
}
145+
delete_options {
146+
delete_mode = "delete"
147+
resource_type = "PrivateZone"
148+
}
149+
}
150+
151+
# 创建节点池
152+
resource "alicloud_cs_kubernetes_node_pool" "node_pool" {
153+
node_pool_name = "${var.common_name}-nodepool"
154+
cluster_id = alicloud_cs_managed_kubernetes.ack.id
155+
vswitch_ids = [alicloud_vswitch.vswitch1.id, alicloud_vswitch.vswitch2.id]
156+
instance_types = [data.alicloud_instance_types.default.ids.0]
157+
system_disk_category = "cloud_essd"
158+
system_disk_size = 120
159+
desired_size = 3
160+
runtime_name = "containerd"
161+
runtime_version = "1.6.28"
162+
}
163+
164+
# 通过ROS在集群内部署资源
165+
resource "random_integer" "default" {
166+
min = 100000
167+
max = 999999
168+
}
169+
170+
resource "alicloud_ros_stack" "deploy_k8s_resource" {
171+
stack_name = "${var.common_name}-k8s-resource-${random_integer.default.result}"
172+
template_url = "https://ros-public-templates.oss-cn-hangzhou.aliyuncs.com/ros-templates/documents/solution/micro/build-microservices-on-ack-k8s-resource.tf.yaml"
173+
parameters {
174+
parameter_key = "cluster_id"
175+
parameter_value = alicloud_cs_managed_kubernetes.ack.id
176+
}
177+
disable_rollback = true
178+
depends_on = [alicloud_cs_kubernetes_node_pool.node_pool]
179+
}
180+
181+
# 定义本地变量,包含所有要创建的 RAM Role 及其策略
182+
locals {
183+
cs_roles = [
184+
{
185+
name = "AliyunCSManagedLogRole"
186+
policy_document = "{\"Statement\":[{\"Action\":\"sts:AssumeRole\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":[\"cs.aliyuncs.com\"]}}],\"Version\":\"1\"}"
187+
description = "集群的日志组件使用此角色来访问您在其他云产品中的资源。"
188+
policy_name = "AliyunCSManagedLogRolePolicy"
189+
},
190+
{
191+
name = "AliyunCSManagedCmsRole"
192+
policy_document = "{\"Statement\":[{\"Action\":\"sts:AssumeRole\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":[\"cs.aliyuncs.com\"]}}],\"Version\":\"1\"}"
193+
description = "集群的CMS组件使用此角色来访问您在其他云产品中的资源。"
194+
policy_name = "AliyunCSManagedCmsRolePolicy"
195+
},
196+
{
197+
name = "AliyunCSManagedCsiRole"
198+
policy_document = "{\"Statement\":[{\"Action\":\"sts:AssumeRole\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":[\"cs.aliyuncs.com\"]}}],\"Version\":\"1\"}"
199+
description = "集群的存储组件使用此角色来访问您在其他云产品中的资源。"
200+
policy_name = "AliyunCSManagedCsiRolePolicy"
201+
},
202+
{
203+
name = "AliyunCSManagedCsiPluginRole"
204+
policy_document = "{\"Statement\":[{\"Action\":\"sts:AssumeRole\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":[\"cs.aliyuncs.com\"]}}],\"Version\":\"1\"}"
205+
description = "集群的存储组件使用此角色来访问您在其他云产品中的资源。"
206+
policy_name = "AliyunCSManagedCsiPluginRolePolicy"
207+
},
208+
{
209+
name = "AliyunCSManagedCsiProvisionerRole"
210+
policy_document = "{\"Statement\":[{\"Action\":\"sts:AssumeRole\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":[\"cs.aliyuncs.com\"]}}],\"Version\":\"1\"}"
211+
description = "集群的存储组件使用此角色来访问您在其他云产品中的资源。"
212+
policy_name = "AliyunCSManagedCsiProvisionerRolePolicy"
213+
},
214+
{
215+
name = "AliyunCSManagedVKRole"
216+
policy_document = "{\"Statement\":[{\"Action\":\"sts:AssumeRole\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":[\"cs.aliyuncs.com\"]}}],\"Version\":\"1\"}"
217+
description = "ACK Serverless集群的VK组件使用此角色来访问您在其他云产品中的资源。"
218+
policy_name = "AliyunCSManagedVKRolePolicy"
219+
},
220+
{
221+
name = "AliyunCSServerlessKubernetesRole"
222+
policy_document = "{\"Statement\":[{\"Action\":\"sts:AssumeRole\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":[\"cs.aliyuncs.com\"]}}],\"Version\":\"1\"}"
223+
description = "集群默认使用此角色来访问您在其他云产品中的资源。"
224+
policy_name = "AliyunCSServerlessKubernetesRolePolicy"
225+
},
226+
{
227+
name = "AliyunCSKubernetesAuditRole"
228+
policy_document = "{\"Statement\":[{\"Action\":\"sts:AssumeRole\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":[\"cs.aliyuncs.com\"]}}],\"Version\":\"1\"}"
229+
description = "集群审计功能使用此角色来访问您在其他云产品中的资源。"
230+
policy_name = "AliyunCSKubernetesAuditRolePolicy"
231+
},
232+
{
233+
name = "AliyunCSManagedNetworkRole"
234+
policy_document = "{\"Statement\":[{\"Action\":\"sts:AssumeRole\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":[\"cs.aliyuncs.com\"]}}],\"Version\":\"1\"}"
235+
description = "集群网络组件使用此角色来访问您在其他云产品中的资源。"
236+
policy_name = "AliyunCSManagedNetworkRolePolicy"
237+
},
238+
{
239+
name = "AliyunCSDefaultRole"
240+
policy_document = "{\"Statement\":[{\"Action\":\"sts:AssumeRole\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":[\"cs.aliyuncs.com\"]}}],\"Version\":\"1\"}"
241+
description = "集群操作时默认使用此角色来访问您在其他云产品中的资源。"
242+
policy_name = "AliyunCSDefaultRolePolicy"
243+
},
244+
{
245+
name = "AliyunCSManagedKubernetesRole"
246+
policy_document = "{\"Statement\":[{\"Action\":\"sts:AssumeRole\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":[\"cs.aliyuncs.com\"]}}],\"Version\":\"1\"}"
247+
description = "集群默认使用此角色来访问您在其他云产品中的资源。"
248+
policy_name = "AliyunCSManagedKubernetesRolePolicy"
249+
},
250+
{
251+
name = "AliyunCSManagedArmsRole"
252+
policy_document = "{\"Statement\":[{\"Action\":\"sts:AssumeRole\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":[\"cs.aliyuncs.com\"]}}],\"Version\":\"1\"}"
253+
description = "集群Arms插件使用此角色来访问您在其他云产品中的资源。"
254+
policy_name = "AliyunCSManagedArmsRolePolicy"
255+
},
256+
{
257+
name = "AliyunCISDefaultRole"
258+
policy_document = "{\"Statement\":[{\"Action\":\"sts:AssumeRole\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":[\"cs.aliyuncs.com\"]}}],\"Version\":\"1\"}"
259+
description = "容器服务(CS)智能运维使用此角色来访问您在其他云产品中的资源。"
260+
policy_name = "AliyunCISDefaultRolePolicy"
261+
},
262+
{
263+
name = "AliyunOOSLifecycleHook4CSRole"
264+
policy_document = "{\"Statement\":[{\"Action\":\"sts:AssumeRole\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":[\"oos.aliyuncs.com\"]}}],\"Version\":\"1\"}"
265+
description = "集群扩缩容节点池依赖OOS服务,OOS使用此角色来访问您在其他云产品中的资源。"
266+
policy_name = "AliyunOOSLifecycleHook4CSRolePolicy"
267+
},
268+
{
269+
name = "AliyunCSManagedAutoScalerRole"
270+
policy_document = "{\"Statement\":[{\"Action\":\"sts:AssumeRole\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":[\"cs.aliyuncs.com\"]}}],\"Version\":\"1\"}"
271+
description = "集群的弹性伸缩组件使用此角色来访问您在其他云产品中的资源。"
272+
policy_name = "AliyunCSManagedAutoScalerRolePolicy"
273+
}
274+
]
275+
}
276+
277+
// 查询RAM角色列表
278+
data "alicloud_ram_roles" "roles" {
279+
policy_type = "Custom"
280+
name_regex = "^Aliyun.*Role$"
281+
}
282+
283+
locals {
284+
# 提取所有所需RAM角色name
285+
all_role_names = [for role in local.cs_roles : role.name]
286+
# 提取已存在的RAM角色name
287+
created_role_names = [for role in data.alicloud_ram_roles.roles.roles : role.name]
288+
# 计算补集:即找出还未创建的所需RAM角色
289+
complement_names = setsubtract(local.all_role_names, local.created_role_names)
290+
# 待创建的RAM角色
291+
complement_roles = [for role in local.cs_roles : role if contains(local.complement_names, role.name)]
292+
}
293+
294+
// 创建角色。
295+
resource "alicloud_ram_role" "role" {
296+
for_each = { for r in local.complement_roles : r.name => r }
297+
role_name = each.value.name
298+
assume_role_policy_document = each.value.policy_document
299+
description = each.value.description
300+
force = true
301+
}
302+
303+
// 角色关联系统权限。
304+
resource "alicloud_ram_role_policy_attachment" "attach" {
305+
for_each = { for r in local.complement_roles : r.name => r }
306+
policy_name = each.value.policy_name
307+
policy_type = "System"
308+
role_name = each.value.name
309+
depends_on = [alicloud_ram_role.role]
310+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
output "cluster_id" {
2+
value = alicloud_cs_managed_kubernetes.ack.id
3+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
provider "alicloud" {
2+
region = var.region
3+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
variable "region" {
2+
description = "地域"
3+
type = string
4+
default = "cn-hangzhou"
5+
}
6+
7+
variable "common_name" {
8+
type = string
9+
description = "通用名称"
10+
default = "microservices-on-ack"
11+
}
12+
13+
variable "managed_kubernetes_cluster_name" {
14+
type = string
15+
description = "ACK托管版集群名称,长度5,前缀k8s-hpa-cluster-,必须包含小写字母"
16+
default = "k8s-cluster-example"
17+
}

0 commit comments

Comments
 (0)