我们将逐步完成从编写部署YAML文件到构建Docker映像并最终在Kubernetes上部署应用程序的过程。
先决条件
我们开始之前,请确保您在
中有以下先决条件 Docker安装在您的机器上。
Minikube和kubectl安装了用于建立本地Kubernetes群集的安装。
步骤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? %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应用程序,利用容器化和编排的力量。
随意自定义配置并扩展此处涵盖的概念以适合您的特定需求。
快乐的编码和部署!
通讯
如果您喜欢我的内容,请考虑订阅我的免费新闻通讯,以获取直接交付给收件箱的独家,教育,技术,有趣和与职业有关的内容
重要链接
感谢您阅读帖子,请务必遵循以下链接以获取将来更多令人敬畏的内容。
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/