本篇主要内容为go镜像相关
打包go代码为二进制
https://github.com/goreleaser/goreleaser
架构即代码,没有运行时,自动编排
实现多云管理的基础设施即代码的工具包括 Terraform
、Pulumi
等等,Terraform
更为流行,使用更加广泛。在使用 Terraform
管理基础设施时,有一个最大的痛点:“配置语法太过简单,导致配置繁琐,需要额外地学习 HasiCorp
创造的表达式语言 DSL-HCL
”。作为后起之秀,也许使用 Pulumi
能帮助我们解决这个问题
2000 年之后,随着 IT 技术发展,用户的需求越来越复杂,软件系统以及基础设施也变的越来越复杂。最早的运维都是手工式的,面临着几个问题:
IaC 就是在这个时期出现的想要解决这些问题的概念,维基百科定义的 IaC 指通过 machine-readable 的定义文件,而不是物理硬件配置或交互式配置工具来管理和配置计算机数据中心的过程。该过程管理的 IT 基础设施包括物理设备(如 Bare-metal 或 VM),以及相关的配置资源。定义文件可能在版本控制系统 VCS 中,文件中代码可能使用脚本或者声明式定义,但 IaC 通常使用声明式方法管理基础设施。
IaC 有几个核心特征:
这个时期出现了一些 IaC 工具,典型的如 Puppet、Chef、Ansible,实际上这些工具,可能设计上各有所取舍(比如 Pull/Push 模型的取舍),但是其核心的特征不会变化:
云上资源编排
2006 年 8 月 Amazon 正式发布了 EC2 服务,从这时整个基础设施开始快步向 Cloud 时代迈进。截止目前,各家云厂商提供了各种各样的服务,经过十多年的演进,诞生出了诸如 IaaS,PaaS,DaaS,FaaS 等等各种各样的服务模式。这些服务模式,让我们的基础设施的构建,变得更加的简单,更加的快速。但是这些服务模式,也带来了一些问题:
云时代的,面向云资源管理的新型 IaC 工具的需求也愈发的迫切,这个时候,Terraform 这样的新型工具应运而生。Terraform 通过声明式定义描述 ECS、RDS、Redis、MQ 等多种基础设施,使资源编排变得十分简单,使用 Terraform 很容易就能定义一台 ECS 实例
同时随着各家 SaaS 的发展,研发人员也尝试着将这些 SaaS 服务也进行代码化 / 描述式配置化。以 Terraform 为例,我们可以通过 Terraform 的 Provider 来进行对接,比如 GitLab Provider、GitHub Provider 等等。
在 IaC 工具帮助我们完成基础设施描述的标准化之后,在此基础上能做更多有趣的事情:比如我们可以基于 Infracost 来计算每次资源变更所带来的资源花费变更;利用 atlantis 来基于 PR 实现 Terraform 流程自动化。
Terraform 已经能够解决多云资源编排场景下的绝大多数问题了,不过并不意味着 Terraform 在各个地方都是完美的,Terraform 也存在一些问题,使得其他资源编排工具有了存在的必要
https://www.zhenran.me/posts/terraform-pulumi-crossplane/
Pulumi 是一个基础设施即代码(IaC,Infrastructure as Code)平台,支持使用如 Go、Java、Python、JavaScript、C# 等常见编程语言及相关工具,以实现云基础设施的构建、部署和管理
https://www.pulumi.com/docs/clouds/aws/get-started/begin/
https://juejin.cn/post/7018373444928536584
package main
import (
appsv1 "github.com/pulumi/pulumi-kubernetes/sdk/v4/go/kubernetes/apps/v1"
corev1 "github.com/pulumi/pulumi-kubernetes/sdk/v4/go/kubernetes/core/v1"
metav1 "github.com/pulumi/pulumi-kubernetes/sdk/v4/go/kubernetes/meta/v1"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)
package main
import (
appsv1 "github.com/pulumi/pulumi-kubernetes/sdk/v4/go/kubernetes/apps/v1"
corev1 "github.com/pulumi/pulumi-kubernetes/sdk/v4/go/kubernetes/core/v1"
metav1 "github.com/pulumi/pulumi-kubernetes/sdk/v4/go/kubernetes/meta/v1"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)
func main() {
pulumi.Run(func(ctx *pulumi.Context) error {
appLabels := pulumi.StringMap{
"app": pulumi.String("nginx"),
}
deployment, err := appsv1.NewDeployment(ctx, "app-dep", &appsv1.DeploymentArgs{
Spec: appsv1.DeploymentSpecArgs{
Selector: &metav1.LabelSelectorArgs{
MatchLabels: appLabels,
},
Replicas: pulumi.Int(1),
Template: &corev1.PodTemplateSpecArgs{
Metadata: &metav1.ObjectMetaArgs{
Labels: appLabels,
},
Spec: &corev1.PodSpecArgs{
Containers: corev1.ContainerArray{
corev1.ContainerArgs{
Name: pulumi.String("nginx"),
Image: pulumi.String("nginx"),
}},
},
},
},
})
if err != nil {
return err
}
ctx.Export("name", deployment.Metadata.Name())
return nil
})
}
发布