现在,我们已经做好了一切准备,准备进入云提供商中的Kubernetes集群。事实上,在任何云提供商中手动创建集群是一项困难的任务。此外,如果我们想要自动化这个部署,我们需要一些东西来帮助我们完成这项繁琐的任务。在本文中,我们将看到如何创建Kubernetes集群及其所需的所有对象,以及如何使用Terraform部署Alexa技能。弹性库伯奈特斯服务.
先决条件
在这里,您有在这个项目中使用的技术:
- Node.js v12.x
- VisualStudio代码
- 码头19.x
- MongoDB Atlas账户
- 仁爱
- GO>=1.11
- TerraForm 12.x
- AWS帐户
- AWS CLI
- AWS IAM认证器CLI
TerraForm
TerraForm是一种用于安全高效地构建、更改和版本控制基础设施的工具。TerraForm可以管理现有和流行的服务提供商,以及自定义内部解决方案.
配置文件向Terraform描述运行单个应用程序或整个数据中心所需的组件。TerraForm生成一个执行计划,描述它将如何达到所需的状态。然后,它执行它来构建所描述的基础结构。随着配置的改变,Terraform能够确定哪些更改并创建可以应用的增量执行计划。
基础设施Terraform包括低级组件,如计算实例、存储和网络,以及诸如DNS条目、SaaS特性等高级组件。
TerraForm文件
在简要概述Terraform之后,我将解释所有Terraform文件及其对象,我们将使用它们来部署集群和Alexa技能。中可以找到与此部署相关的所有文件。terraform/eks
文件夹。
TerraForm提供者
提供者负责理解API交互和公开资源。大多数可用的提供商对应于一个云或现场基础设施平台,并提供与该平台的每个功能相对应的资源类型。
对于ElasticKubernetes服务,我们将使用aws
提供者。此提供程序允许我们创建创建Alexa技能堆栈所需的所有AWS对象:
JavaScript
1 provider “aws” {
2 region = “eu-central-1”
3 }
由于我们将部署Helm图表,因此需要将helm
提供者:
JavaScript
1 provider “aws” {
2 region = “eu-central-1”
3 }
对于集群,有一个kubernetes
提供者:
JavaScript
1
provider “kubernetes” {
2
host = data.aws_eks_cluster.cluster.endpoint
3
cluster_ca_certificate = base64decode(data.aws_eks_cluster.cluster.certificate_authority.0.data)
4
token = data.aws_eks_cluster_auth.cluster.token
5
load_config_file = false
6
}
TerraForm模块与资源
EKS集群最重要的资源之一是网络。因此,我们必须创建虚拟私有云网络和子网。为此,我们需要使用vpc
模块:
JavaScript
1
module “vpc” {
2
source = “terraform-aws-modules/vpc/aws”
3
version = “2.64.0”
4
5
name = “k8s-vpc”
6
cidr = “172.16.0.0/16”
7
azs = data.aws_availability_zones.available.names
8
private_subnets = [“172.16.1.0/24”, “172.16.2.0/24”, “172.16.3.0/24”]
9
public_subnets = [“172.16.4.0/24”, “172.16.5.0/24”, “172.16.6.0/24”]
10
enable_nat_gateway = true
11
single_nat_gateway = true
12
enable_dns_hostnames = true
13
14
public_subnet_tags = {
15
“kubernetes.io/cluster/${local.cluster_name}” = “shared”
16
“kubernetes.io/role/elb” = “1”
17
}
18
19
private_subnet_tags = {
20
“kubernetes.io/cluster/${local.cluster_name}” = “shared”
21
“kubernetes.io/role/internal-elb” = “1”
22
}
23
}
一旦创建了私有云网络,我们就可以创建用于该VPC的集群。为此,我们需要使用eks
模块:
JavaScript
1
module “eks” {
2
source = “terraform-aws-modules/eks/aws”
3
version = “13.2.1”
4
5
cluster_name = local.cluster_name
6
cluster_version = “1.18”
7
subnets = module.vpc.private_subnets
8
wait_for_cluster_cmd = “until curl -k -s $ENDPOINT/healthz >/dev/null; do sleep 4; done”
9
wait_for_cluster_interpreter = [“C:/Program Files/Git/bin.exe”, “-c”]
10
11
vpc_id = module.vpc.vpc_id
12
13
node_groups = {
14
first = {
15
desired_capacity = 2
16
max_capacity = 10
17
min_capacity = 2
18
19
instance_type = “m5.large”
20
}
21
}
22
23
write_kubeconfig = true
24
config_output_path = “./”
25
26
workers_additional_policies = [aws_iam_policy.worker_policy.arn]
27
}此外,我们将为我们的Kubernetes集群节点创建一些特定的AWS IAM策略,以便可以从互联网上访问。为此,我们将使用aws_iam_policy
资源:
JavaScript
1
resource “aws_iam_policy” “worker_policy” {
2
name = “worker-policy”
3
description = “Worker policy for the ALB Ingress”
4
5
policy = file(“iam-policy.json”)
6
}
上述所有资源和模块都与Kubernetes集群相关。现在,是时候部署我们的Alexa技能了,从ngingx-ingress-controller
:
JavaScript
1
2
resource “helm_release” “ingress” {
3
name = “nginx-ingress-controller”
4
chart = “nginx-ingress-controller”
5
repository = “https://charts.bitnami.com/bitnami”
6
7
set {
8
name = “rbac.create”
9
value = “true”
10
}
11
}
之后,我们可以自豪地在Kubernetes云集群中部署Alexa技能Helm图表:
JavaScript
1
resource “helm_release” “alexa-skill” {
2
name = “alexa-skill”
3
chart = “../../helm/alexa-skill-chart”
4
depends_on = [helm_release.ingress]
5
}
TerraForm变量
我们提供了一些您可以轻松修改的变量,以便更改集群的名称或部署集群的区域。为此,可以在main.tf
:
1
locals {
2
cluster_name = “alexa-cluster”
3
region = “eu-central-1”
4
}
部署堆栈
为了使提供者在Terraform上可用,我们需要terraform init
。这些命令下载任何插件,我们需要我们的供应商。在那之后,我们必须执行terraform plan
.
Terraform plan命令用于创建执行计划。它不会修改基础设施中的东西。除非显式禁用,否则TerraForm将执行刷新,然后确定实现配置文件中指定的所需状态所需的操作。此命令是一种检查一组更改的执行计划是否符合您的期望的方便方法,而无需对实际资源或状态进行任何更改。然后,我们需要执行terraform apply
。TerraformApply命令用于应用达到所需配置状态所需的更改。TerraFormApply还会将数据写入terraform.tfstate文件。一旦应用程序完成,资源将立即可用。
在这里,您有完整的命令列表:
壳
1
terraform init
2
terraform plan
3
terraform appyly
在运行terraform apply
,我们可以看看ElasticKubernetes服务,看看我们的集群现在出现了。
我们需要等待大约10分钟才能创建集群。一旦创建了集群,现在我们就可以看到完整的规范了。
创建集群之后,Terraform将部署所有Helm图表。在那里,你可以看到所有的库伯内特斯波兹部署。
在那里,我们可以看到Kubernetes服务和nginx-ingress-controller
。我们要用这个IP来请求Alexa。
测试请求
我肯定你已经知道那个著名的工具电话了邮递员。RESTAPI已经成为为您的服务提供公共和安全接口的新标准。虽然REST已经变得无处不在,但它并不总是容易测试的。Postman使测试和管理HTTPRESTAPI更加容易。Postman为我们提供了导入、测试和共享API的多种特性,这将帮助您和您的团队从长远来看更有效率。
运行应用程序后,将有一个可用的端点。这里。有了邮差,你可以模仿任何阿列克谢的请求。
例如,您可以测试LaunchRequest
:
杰森
1
2
{
3
“version”: “1.0”,
4
“session”: {
5
“new”: true,
6
“sessionId”: “amzn1.echo-api.session.[unique-value-here]”,
7
“application”: {
8
“applicationId”: “amzn1.ask.skill.[unique-value-here]”
9
},
10
“user”: {
11
“userId”: “amzn1.ask.account.[unique-value-here]”
12
},
13
“attributes”: {}
14
},
15
“context”: {
16
“AudioPlayer”: {
17
“playerActivity”: “IDLE”
18
},
19
“System”: {
20
“application”: {
21
“applicationId”: “amzn1.ask.skill.[unique-value-here]”
22
},
23
“user”: {
24
“userId”: “amzn1.ask.account.[unique-value-here]”
25
},
26
“device”: {
27
“supportedInterfaces”: {
28
“AudioPlayer”: {}
29
}
30
}
31
}
32
},
33
“request”: {
34
“type”: “LaunchRequest”,
35
“requestId”: “amzn1.echo-api.request.[unique-value-here]”,
36
“timestamp”: “2020-03-22T17:24:44Z”,
37
“locale”: “en-US”
38
}
39
}
摧毁堆栈
如果要删除Terraform创建的所有堆栈,只需运行:
壳
1
terraform destroy
结语
现在,我们的Alexa技能运行在我们的云提供商的Kubernetes集群中,使用Terraform的所有自动化技术;它可以在我们的实时Alexa技能中使用。
我希望这个例子项目对你有帮助。
你可以找到密码这里.
全是这些人!编码愉快!