共计 3708 个字符,预计需要花费 10 分钟才能阅读完成。
Kubernetes,NATS 消息传递,部署 Go 应用程序,Docker 容器化
前提条件
在开始之前,请确保您满足以下:
步骤 1:编写部署 YAML 文件
首先,我们需要为 Go 应用程序和 NATS 消息传递系统定义部署 YAML 文件。让我们创建以下 YAML 文件:
app-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: app-go-img-deployment
spec:
replicas: 1
selector:
matchLabels:
app: app-go
template:
metadata:
labels:
app: app-go
spec:
containers:
- name: app-go-container
image: app-go
imagePullPolicy: Never
ports:
- containerPort: 8080
nats-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nats
spec:
replicas: 1
strategy: {}
selector:
matchLabels:
app: nats
template:
metadata:
labels:
app: nats
spec:
containers:
- name: nats
image: nats:2.7.0-alpine
ports:
- containerPort: 4222
targetPort: 4222
nats-service.yaml
apiVersion: v1
kind: Service
metadata:
name: nats-service
spec:
selector:
app: nats
ports:
- name: client
port: 4222
targetPort: 4222
protocol: TCP
步骤 2:编写 Go 应用程序代码
接下来,我们需要编写 Go 应用程序的代码。创建一个名为 `main.go` 的文件,并添加以下代码:
package main
import (
"fmt"
"log"
"os"
"time"
"github.com/nats-io/nats.go"
)
func main() {url := os.Getenv("NATS_URL")
if url == "" {
url = nats.DefaultURL
// url = "nats://nats-service.default.svc.cluster.local:4222"
// works fine in case of interpod communication
// another way is to use the service-url directly
url = "nats-service:4222"
}
nc, err := nats.Connect(url)
if err != nil {log.Fatalln(err)
}
defer nc.Drain()
nc.Publish("greet.joe", []byte("hello"))
sub, _ := nc.SubscribeSync("greet.*")
msg, _ := sub.NextMsg(10 * time.Millisecond)
fmt.Println("subscribed after a publish...")
fmt.Printf("msg is nil? %vn", msg == nil)
nc.Publish("greet.joe", []byte("hello"))
nc.Publish("greet.pam", []byte("hello"))
msg, _ = sub.NextMsg(10 * time.Millisecond)
fmt.Printf("msg data: %q on subject %qn", string(msg.Data), msg.Subject)
msg, _ = sub.NextMsg(10 * time.Millisecond)
fmt.Printf("msg data: %q on subject %qn", string(msg.Data), msg.Subject)
nc.Publish("greet.bob", []byte("hello"))
msg, _ = sub.NextMsg(10 * time.Millisecond)
fmt.Printf("msg data: %q on subject %qn", string(msg.Data), msg.Subject)
}
该代码将连接到 NATS 消息传递系统,发布和订阅消息,并演示了基本功能。
步骤 3:构建 Docker 镜像
现在,让我们构建 Go 应用程序的 Docker 镜像。我们将使用多阶段的 Dockerfile 来确保获得一个轻量且优化的镜像。创建一个名为 `Dockerfile` 的文件,并添加以下代码:
### 阶段 1:构建 Go 二进制文件
FROM golang:1.17 AS builder
### 在容器内设置工作目录
WORKDIR /app
### 复制 Go 模块文件并下载依赖项
COPY go.mod go.sum ./
RUN go mod download
### 将应用程序源代码复制到容器中
COPY . .
### 构建 Go 应用程序
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o main .
# 阶段 2:创建最终镜像
FROM alpine:latest
# 在容器内设置工作目录
WORKDIR /app
# 从构建阶段复制 Go 二进制文件
COPY --from=builder /app/main .
# 暴露应用程序监听的端口
EXPOSE 8080
# 定义容器启动时运行应用程序的命令
CMD ["./main"]
在 Mac 上构建镜像,请执行以下命令:
docker buildx build --platform linux/amd64 -t app-go-container .
完成后,您的文件夹结构应如下所示:
- app-deployment.yaml
- nats-deployment.yaml
- nats-service.yaml
- main.go
- Dockerfile
步骤 4:在 Kubernetes 上部署应用程序
有了我们准备好的 Docker 镜像,让我们使用 Minikube 在 Kubernetes 上部署应用程序。
首先,执行以下命令确保 Minikube 正在运行:
minikube start
接下来,将 Docker 镜像加载到 Minikube 的镜像存储库中:
minikube image load app-go-container
最后,应用部署和服务的 YAML 文件以在 Kubernetes 上创建所需的资源:
kubectl apply -f app-deployment.yaml
kubectl apply -f nats-deployment.yaml
kubectl apply -f nats-service.yaml
文章总结
本文介绍了如何在 Kubernetes 上部署使用 NATS 消息传递的 Go 应用程序。
我们涵盖了编写部署 YAML 文件、编写 Go 应用程序代码、构建 Docker 镜像以及使用 Minikube 在 Kubernetes 上部署应用程序的过程。
通过按照这些步骤,您可以轻松地在 Kubernetes 集群上部署使用 NATS 消息传递的 Go 应用程序,充分利用容器化和编排的强大功能。 文章来源:https://www.toymoban.com/diary/golang/663.html
请随意根据您的特定需求自定义配置并扩展本文介绍的概念。 文章来源地址 https://www.toymoban.com/diary/golang/663.html
到此这篇关于在 K8S 上部署使用 NATS 消息传递的 Go 应用程序的文章就介绍到这了, 更多相关内容可以在右上角搜索或继续浏览下面的相关文章,希望大家以后多多支持 TOY 模板网!
原文地址:https://www.toymoban.com/diary/golang/663.html
如若转载,请注明出处:如若内容造成侵权 / 违法违规 / 事实不符,请联系站长进行投诉反馈,一经查实,立即删除!