在Kubernetes上使用NATS消息部署GO应用程序
#go #docker #eventdriven #kubernetes

我们将逐步完成从编写部署YAML文件到构建Docker映像并最终在Kubernetes上部署应用程序的过程。
先决条件

我们开始之前,请确保您在

中有以下先决条件

Docker安装在您的机器上。
Minikubekubectl安装了用于建立本地Kubernetes群集的安装。

步骤1

编写部署yaml文件

要开始,我们需要为我们的GO应用程序和NATS消息传递系统定义部署YAML文件。让我们创建以下YAML文件:

  1. 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
  1. 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
  1. 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? %v\n", 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 %q\n", string(msg.Data), msg.Subject)

 msg, _ = sub.NextMsg(10 * time.Millisecond)
 fmt.Printf("msg data: %q on subject %q\n", string(msg.Data), msg.Subject)

 nc.Publish("greet.bob", []byte("hello"))

 msg, _ = sub.NextMsg(10 * time.Millisecond)
 fmt.Printf("msg data: %q on subject %q\n", string(msg.Data), msg.Subject)


}

此代码连接到NATS消息系统,发布并订阅消息并演示基本功能。
步骤3

构建Docker图像

现在,让我们为我们的GO应用程序构建Docker映像。我们将使用多阶段的Dockerfile来确保轻量级和优化的图像。创建一个名为Dockerfile的文件,并添加以下代码:

### Stage 1: Build the Go binary
FROM golang:1.17 AS builder

### Set the working directory inside the container
WORKDIR /app

### Copy the Go modules files and download dependencies

COPY go.mod go.sum ./
RUN go mod download


### Copy the application source code to the container
COPY . .

### Build the Go application

RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o main .

# Stage 2: Create the final image
FROM alpine:latest

# Set the working directory inside the container
WORKDIR /app

# Copy the Go binary from the builder stage
COPY --from=builder /app/main .

# Expose the port that the application listens on
EXPOSE 8080

# Define the command to run the application when the container starts
CMD ["./main"]

要在Mac上构建图像,请执行以下命令:

docker buildx build --platform linux/amd64 -t app-go-container .

完成所有操作后,您的文件夹结构应该看起来像

步骤4

在kubernetes上部署应用程序

使用我们的Docker Image准备就绪,让S使用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群集上轻松部署GO应用程序,利用容器化和编排的力量。

随意自定义配置并扩展此处涵盖的概念以适合您的特定需求。

快乐的编码和部署!

通讯

如果您喜欢我的内容,请考虑订阅我的免费新闻通讯,以获取直接交付给收件箱的独家,教育,技术,有趣和与职业有关的内容

https://dsysd.beehiiv.com/subscribe

重要链接

感谢您阅读帖子,请务必遵循以下链接以获取将来更多令人敬畏的内容。

Twitter:https://twitter.com/dsysd_dev
YouTube:https://www.youtube.com/@dsysd-dev
github:https://github.com/dsysd-dev
媒介:https://medium.com/@dsysd-dev
电子邮件:dsysd.mail@gmail.com
LinkedIn:https://www.linkedin.com/in/dsysd-dev/
新闻通讯:https://dsysd.beehiiv.com/subscribe
Gumroad:https://dsysd.gumroad.com/