712 lines
12 KiB
Markdown
712 lines
12 KiB
Markdown
# Waypoint 集成示例
|
|
|
|
本文档提供了将Waypoint与现有基础设施和工具集成的具体示例。
|
|
|
|
## 1. 与Nomad集成
|
|
|
|
### 1.1 基本Nomad部署配置
|
|
|
|
```hcl
|
|
app "api-service" {
|
|
build {
|
|
use "docker" {
|
|
dockerfile = "Dockerfile"
|
|
disable_entrypoint = true
|
|
}
|
|
}
|
|
|
|
deploy {
|
|
use "nomad" {
|
|
// Nomad集群地址
|
|
address = "http://nomad-server:4646"
|
|
|
|
// 部署配置
|
|
datacenter = "dc1"
|
|
namespace = "default"
|
|
|
|
// 资源配置
|
|
resources {
|
|
cpu = 500
|
|
memory = 256
|
|
}
|
|
|
|
// 服务配置
|
|
service_provider = "consul" {
|
|
service_name = "api-service"
|
|
tags = ["api", "v1"]
|
|
|
|
check {
|
|
type = "http"
|
|
path = "/health"
|
|
interval = "10s"
|
|
timeout = "2s"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
### 1.2 高级Nomad配置
|
|
|
|
```hcl
|
|
app "web-app" {
|
|
deploy {
|
|
use "nomad" {
|
|
// 基本配置...
|
|
|
|
// 存储卷配置
|
|
volume_mount {
|
|
volume = "app-data"
|
|
destination = "/data"
|
|
read_only = false
|
|
}
|
|
|
|
// 网络配置
|
|
network {
|
|
mode = "bridge"
|
|
port "http" {
|
|
static = 8080
|
|
to = 80
|
|
}
|
|
}
|
|
|
|
// 环境变量
|
|
env {
|
|
NODE_ENV = "production"
|
|
}
|
|
|
|
// 健康检查
|
|
health_check {
|
|
timeout = "5m"
|
|
check {
|
|
name = "http-check"
|
|
route = "/health"
|
|
method = "GET"
|
|
code = 200
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
## 2. 与Vault集成
|
|
|
|
### 2.1 从Vault获取静态密钥
|
|
|
|
```hcl
|
|
app "database-service" {
|
|
deploy {
|
|
use "nomad" {
|
|
// 基本配置...
|
|
|
|
env {
|
|
// 从Vault获取数据库凭据
|
|
DB_USERNAME = dynamic("vault", {
|
|
path = "kv/data/database/creds"
|
|
key = "username"
|
|
})
|
|
|
|
DB_PASSWORD = dynamic("vault", {
|
|
path = "kv/data/database/creds"
|
|
key = "password"
|
|
})
|
|
}
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
### 2.2 使用Vault动态密钥
|
|
|
|
```hcl
|
|
app "api-service" {
|
|
deploy {
|
|
use "nomad" {
|
|
// 基本配置...
|
|
|
|
template {
|
|
destination = "secrets/db-creds.txt"
|
|
data = <<EOF
|
|
{{- with secret "database/creds/api-role" -}}
|
|
DB_USERNAME={{ .Data.username }}
|
|
DB_PASSWORD={{ .Data.password }}
|
|
{{- end -}}
|
|
EOF
|
|
}
|
|
|
|
env_from_file = ["secrets/db-creds.txt"]
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
## 3. 与Consul集成
|
|
|
|
### 3.1 服务发现配置
|
|
|
|
```hcl
|
|
app "frontend" {
|
|
deploy {
|
|
use "nomad" {
|
|
// 基本配置...
|
|
|
|
service_provider = "consul" {
|
|
service_name = "frontend"
|
|
|
|
meta {
|
|
version = "v1.2.3"
|
|
team = "frontend"
|
|
}
|
|
|
|
tags = ["web", "frontend"]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
### 3.2 使用Consul KV存储配置
|
|
|
|
```hcl
|
|
app "config-service" {
|
|
deploy {
|
|
use "nomad" {
|
|
// 基本配置...
|
|
|
|
template {
|
|
destination = "config/app-config.json"
|
|
data = <<EOF
|
|
{
|
|
"settings": {{ key "config/app-settings" | toJSON }},
|
|
"features": {{ key "config/features" | toJSON }}
|
|
}
|
|
EOF
|
|
}
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
## 4. 与Gitea Actions集成
|
|
|
|
### 4.1 基本CI/CD流水线
|
|
|
|
```yaml
|
|
name: Build and Deploy
|
|
|
|
on:
|
|
push:
|
|
branches: [ main ]
|
|
|
|
jobs:
|
|
deploy:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v2
|
|
|
|
- name: Install Waypoint
|
|
run: |
|
|
curl -fsSL https://releases.hashicorp.com/waypoint/0.11.0/waypoint_0.11.0_linux_amd64.zip -o waypoint.zip
|
|
unzip waypoint.zip
|
|
sudo mv waypoint /usr/local/bin/
|
|
|
|
- name: Configure Waypoint
|
|
run: |
|
|
waypoint context create \
|
|
-server-addr=${{ secrets.WAYPOINT_SERVER_ADDR }} \
|
|
-server-auth-token=${{ secrets.WAYPOINT_AUTH_TOKEN }} \
|
|
-set-default ci-context
|
|
|
|
- name: Build and Deploy
|
|
run: waypoint up
|
|
```
|
|
|
|
### 4.2 多环境部署流水线
|
|
|
|
```yaml
|
|
name: Multi-Environment Deploy
|
|
|
|
on:
|
|
push:
|
|
branches: [ main, staging, production ]
|
|
|
|
jobs:
|
|
deploy:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v2
|
|
|
|
- name: Install Waypoint
|
|
run: |
|
|
curl -fsSL https://releases.hashicorp.com/waypoint/0.11.0/waypoint_0.11.0_linux_amd64.zip -o waypoint.zip
|
|
unzip waypoint.zip
|
|
sudo mv waypoint /usr/local/bin/
|
|
|
|
- name: Configure Waypoint
|
|
run: |
|
|
waypoint context create \
|
|
-server-addr=${{ secrets.WAYPOINT_SERVER_ADDR }} \
|
|
-server-auth-token=${{ secrets.WAYPOINT_AUTH_TOKEN }} \
|
|
-set-default ci-context
|
|
|
|
- name: Determine Environment
|
|
id: env
|
|
run: |
|
|
if [[ ${{ github.ref }} == 'refs/heads/main' ]]; then
|
|
echo "::set-output name=environment::development"
|
|
elif [[ ${{ github.ref }} == 'refs/heads/staging' ]]; then
|
|
echo "::set-output name=environment::staging"
|
|
elif [[ ${{ github.ref }} == 'refs/heads/production' ]]; then
|
|
echo "::set-output name=environment::production"
|
|
fi
|
|
|
|
- name: Build and Deploy
|
|
run: |
|
|
waypoint up -workspace=${{ steps.env.outputs.environment }}
|
|
```
|
|
|
|
## 5. 多云部署示例
|
|
|
|
### 5.1 AWS ECS部署
|
|
|
|
```hcl
|
|
app "microservice" {
|
|
build {
|
|
use "docker" {}
|
|
}
|
|
|
|
deploy {
|
|
use "aws-ecs" {
|
|
region = "us-west-2"
|
|
cluster = "production"
|
|
|
|
service {
|
|
name = "microservice"
|
|
desired_count = 3
|
|
|
|
load_balancer {
|
|
target_group_arn = "arn:aws:elasticloadbalancing:us-west-2:..."
|
|
container_name = "microservice"
|
|
container_port = 8080
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
### 5.2 Google Cloud Run部署
|
|
|
|
```hcl
|
|
app "api" {
|
|
build {
|
|
use "docker" {}
|
|
}
|
|
|
|
deploy {
|
|
use "google-cloud-run" {
|
|
project = "my-gcp-project"
|
|
location = "us-central1"
|
|
|
|
port = 8080
|
|
|
|
capacity {
|
|
memory = 512
|
|
cpu_count = 1
|
|
max_requests_per_container = 10
|
|
request_timeout = 300
|
|
}
|
|
|
|
auto_scaling {
|
|
max_instances = 10
|
|
}
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
### 5.3 多云部署策略
|
|
|
|
```hcl
|
|
// 使用变量决定部署目标
|
|
variable "deploy_target" {
|
|
type = string
|
|
default = "nomad"
|
|
}
|
|
|
|
app "multi-cloud-app" {
|
|
build {
|
|
use "docker" {}
|
|
}
|
|
|
|
deploy {
|
|
// 根据变量选择部署平台
|
|
use dynamic {
|
|
value = var.deploy_target
|
|
|
|
// Nomad部署配置
|
|
nomad {
|
|
datacenter = "dc1"
|
|
// 其他Nomad配置...
|
|
}
|
|
|
|
// AWS ECS部署配置
|
|
aws-ecs {
|
|
region = "us-west-2"
|
|
cluster = "production"
|
|
// 其他ECS配置...
|
|
}
|
|
|
|
// Google Cloud Run部署配置
|
|
google-cloud-run {
|
|
project = "my-gcp-project"
|
|
location = "us-central1"
|
|
// 其他Cloud Run配置...
|
|
}
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
## 6. 高级发布策略
|
|
|
|
### 6.1 蓝绿部署
|
|
|
|
```hcl
|
|
app "web-app" {
|
|
build {
|
|
use "docker" {}
|
|
}
|
|
|
|
deploy {
|
|
use "nomad" {
|
|
// 基本部署配置...
|
|
}
|
|
}
|
|
|
|
release {
|
|
use "nomad-bluegreen" {
|
|
service = "web-app"
|
|
datacenter = "dc1"
|
|
namespace = "default"
|
|
|
|
// 流量转移配置
|
|
traffic_step = 25 // 每次转移25%的流量
|
|
confirm_step = true // 每步需要确认
|
|
|
|
// 健康检查
|
|
health_check {
|
|
timeout = "2m"
|
|
check {
|
|
route = "/health"
|
|
method = "GET"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
### 6.2 金丝雀发布
|
|
|
|
```hcl
|
|
app "api-service" {
|
|
build {
|
|
use "docker" {}
|
|
}
|
|
|
|
deploy {
|
|
use "nomad" {
|
|
// 基本部署配置...
|
|
}
|
|
}
|
|
|
|
release {
|
|
use "nomad-canary" {
|
|
service = "api-service"
|
|
datacenter = "dc1"
|
|
|
|
// 金丝雀配置
|
|
canary {
|
|
percentage = 10 // 先发布到10%的实例
|
|
duration = "15m" // 观察15分钟
|
|
}
|
|
|
|
// 自动回滚配置
|
|
auto_rollback = true
|
|
|
|
// 指标监控
|
|
metrics {
|
|
provider = "prometheus"
|
|
address = "http://prometheus:9090"
|
|
query = "sum(rate(http_requests_total{status=~\"5..\"}[5m])) / sum(rate(http_requests_total[5m])) > 0.01"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
## 7. 自定义插件示例
|
|
|
|
### 7.1 自定义构建器插件
|
|
|
|
```go
|
|
// custom_builder.go
|
|
package main
|
|
|
|
import (
|
|
"context"
|
|
sdk "github.com/hashicorp/waypoint-plugin-sdk"
|
|
)
|
|
|
|
// CustomBuilder 实现自定义构建逻辑
|
|
type CustomBuilder struct {
|
|
config BuildConfig
|
|
}
|
|
|
|
type BuildConfig struct {
|
|
Command string `hcl:"command"`
|
|
}
|
|
|
|
// ConfigSet 设置配置
|
|
func (b *CustomBuilder) ConfigSet(config interface{}) error {
|
|
c, ok := config.(*BuildConfig)
|
|
if !ok {
|
|
return fmt.Errorf("invalid configuration")
|
|
}
|
|
b.config = *c
|
|
return nil
|
|
}
|
|
|
|
// BuildFunc 执行构建
|
|
func (b *CustomBuilder) BuildFunc() interface{} {
|
|
return b.build
|
|
}
|
|
|
|
func (b *CustomBuilder) build(ctx context.Context, ui terminal.UI) (*Binary, error) {
|
|
// 执行自定义构建命令
|
|
cmd := exec.CommandContext(ctx, "sh", "-c", b.config.Command)
|
|
cmd.Stdout = ui.Output()
|
|
cmd.Stderr = ui.Error()
|
|
|
|
if err := cmd.Run(); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &Binary{
|
|
Source: "custom",
|
|
}, nil
|
|
}
|
|
|
|
// 注册插件
|
|
func main() {
|
|
sdk.Main(sdk.WithComponents(&CustomBuilder{}))
|
|
}
|
|
```
|
|
|
|
### 7.2 使用自定义插件
|
|
|
|
```hcl
|
|
app "custom-app" {
|
|
build {
|
|
use "custom" {
|
|
command = "make build"
|
|
}
|
|
}
|
|
|
|
deploy {
|
|
use "nomad" {
|
|
// 部署配置...
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
## 8. 监控和可观测性集成
|
|
|
|
### 8.1 Prometheus集成
|
|
|
|
```hcl
|
|
app "monitored-app" {
|
|
deploy {
|
|
use "nomad" {
|
|
// 基本配置...
|
|
|
|
// Prometheus注解
|
|
service_provider = "consul" {
|
|
service_name = "monitored-app"
|
|
|
|
meta {
|
|
"prometheus.io/scrape" = "true"
|
|
"prometheus.io/path" = "/metrics"
|
|
"prometheus.io/port" = "8080"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
### 8.2 与ELK堆栈集成
|
|
|
|
```hcl
|
|
app "logging-app" {
|
|
deploy {
|
|
use "nomad" {
|
|
// 基本配置...
|
|
|
|
// 日志配置
|
|
logging {
|
|
type = "fluentd"
|
|
config {
|
|
fluentd_address = "fluentd.service.consul:24224"
|
|
tag = "app.${nomad.namespace}.${app.name}"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
## 9. 本地开发工作流
|
|
|
|
### 9.1 本地开发配置
|
|
|
|
```hcl
|
|
app "dev-app" {
|
|
build {
|
|
use "docker" {}
|
|
}
|
|
|
|
deploy {
|
|
use "docker" {
|
|
service_port = 3000
|
|
|
|
// 开发环境特定配置
|
|
env {
|
|
NODE_ENV = "development"
|
|
DEBUG = "true"
|
|
}
|
|
|
|
// 挂载源代码目录
|
|
binds {
|
|
source = abspath("./src")
|
|
destination = "/app/src"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
### 9.2 本地与远程环境切换
|
|
|
|
```hcl
|
|
variable "environment" {
|
|
type = string
|
|
default = "local"
|
|
}
|
|
|
|
app "fullstack-app" {
|
|
build {
|
|
use "docker" {}
|
|
}
|
|
|
|
deploy {
|
|
// 根据环境变量选择部署方式
|
|
use dynamic {
|
|
value = var.environment
|
|
|
|
// 本地开发
|
|
local {
|
|
use "docker" {
|
|
// 本地Docker配置...
|
|
}
|
|
}
|
|
|
|
// 开发环境
|
|
dev {
|
|
use "nomad" {
|
|
// 开发环境Nomad配置...
|
|
}
|
|
}
|
|
|
|
// 生产环境
|
|
prod {
|
|
use "nomad" {
|
|
// 生产环境Nomad配置...
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
## 10. 多应用协调
|
|
|
|
### 10.1 依赖管理
|
|
|
|
```hcl
|
|
project = "microservices"
|
|
|
|
app "database" {
|
|
// 数据库服务配置...
|
|
}
|
|
|
|
app "backend" {
|
|
// 后端API配置...
|
|
|
|
// 声明依赖关系
|
|
depends_on = ["database"]
|
|
}
|
|
|
|
app "frontend" {
|
|
// 前端配置...
|
|
|
|
// 声明依赖关系
|
|
depends_on = ["backend"]
|
|
}
|
|
```
|
|
|
|
### 10.2 共享配置
|
|
|
|
```hcl
|
|
// 定义共享变量
|
|
variable "version" {
|
|
type = string
|
|
default = "1.0.0"
|
|
}
|
|
|
|
variable "environment" {
|
|
type = string
|
|
default = "development"
|
|
}
|
|
|
|
// 共享函数
|
|
function "service_name" {
|
|
params = [name]
|
|
result = "${var.environment}-${name}"
|
|
}
|
|
|
|
// 应用配置
|
|
app "api" {
|
|
build {
|
|
use "docker" {
|
|
tag = "${var.version}"
|
|
}
|
|
}
|
|
|
|
deploy {
|
|
use "nomad" {
|
|
service_provider = "consul" {
|
|
service_name = service_name("api")
|
|
}
|
|
|
|
env {
|
|
APP_VERSION = var.version
|
|
ENVIRONMENT = var.environment
|
|
}
|
|
}
|
|
}
|
|
} |