1. 环境准备
安装Go语言环境:
- 访问Go官网下载并安装适合你操作系统的Go版本。
- 设置GOPATH和GOROOT环境变量。GOPATH是你的工作空间,GOROOT是Go的安装目录。
安装Docker:
- 访问Docker官网下载并安装Docker Desktop(对于Mac和Windows用户)或Docker Engine(对于Linux用户)。
安装Kubectl:
- 访问Kubernetes官网下载并安装kubectl。
设置Kubernetes集群:
- 如果你没有现成的Kubernetes集群,可以使用Minikube来快速搭建一个单节点的集群。访问Minikube官网查看安装和启动指南。
2. 编写Go应用程序
在GOPATH下的src目录中创建一个新的Go模块(假设你的模块名为github.com/yourusername/myapp
),并在该模块下创建main.go
文件。
go复制代码 package main import ( "fmt" "net/http" ) func handler(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hello, Kubernetes from Go! This is version 1.0 of my app.") } func main() { http.HandleFunc("/", handler) fmt.Println("Server is listening on port 8080...") if err := http.ListenAndServe(":8080", nil); err != nil { panic(err) } }
3. 构建Docker镜像
在同一目录下创建Dockerfile
,并添加以下内容:
Dockerfile复制代码 # 使用官方的Golang镜像作为基础镜像 FROM golang:1.17-alpine AS build-env # 设置工作目录 WORKDIR /app # 将当前目录下的所有文件复制到容器中的/app目录下 COPY . . # 安装依赖(如果有的话) # RUN go mod tidy # 编译Go应用程序 RUN CGO_ENABLED=0 GOOS=linux go build -o myapp . # 使用一个轻量级的Alpine Linux镜像来运行编译好的程序 FROM alpine:latest # 将编译好的程序从build-env阶段复制到当前镜像 COPY --from=build-env /app/myapp /usr/local/bin/myapp # 设置容器启动时运行的命令 ENTRYPOINT ["/usr/local/bin/myapp"] # 暴露端口 EXPOSE 8080
注意:这里使用了多阶段构建来减小最终镜像的大小。
在包含main.go
和Dockerfile
的目录下运行以下命令来构建Docker镜像:
bash复制代码 docker build -t myapp:latest .
4. 编写K8s部署文件
在项目根目录下创建deployment.yaml
文件,并添加以下内容:
yaml复制代码 apiVersion: apps/v1 kind: Deployment metadata: name: myapp-deployment labels: app: myapp spec: replicas: 1 selector: matchLabels: app: myapp template: metadata: labels: app: myapp spec: containers: - name: myapp image: myapp:latest ports: - containerPort: 8080
5. 部署应用到K8s集群
确保你的kubectl已经配置好并指向了你的Kubernetes集群。然后,使用以下命令部署应用:
bash复制代码 kubectl apply -f deployment.yaml
6. 验证应用运行状态
通过以下命令检查Pod的状态:
bash复制代码 kubectl get pods -l app=myapp
查看Pod的日志以确认应用是否正常运行:
bash复制代码 kubectl logs <pod-name>
其中<pod-name>
是myapp-deployment
部署的Pod名称,你可以通过上面的get pods
命令获取。
7. 访问应用
由于Pod的IP地址在集群内部是动态分配的,并且通常不会直接暴露给外部网络,你需要创建一个Service来将Pod的端口映射到集群的一个固定IP和端口上。
创建一个名为service.yaml
的文件,并添加以下内容:
yaml复制代码 apiVersion: v1 kind: Service metadata: name: myapp-service spec: type: NodePort selector: app: myapp ports: - port: 8080 targetPort: 8080 nodePort: 30080
然后,使用以下命令应用Service配置:
bash复制代码 kubectl apply -f service.yaml
现在,你可以通过访问http://<任一集群节点IP>:30080
来访问你的应用了。<任一集群节点IP>
是Kubernetes集群中任一节点的IP地址。
总结
通过以上详细步骤,我们成功地将一个使用Go编写的简单HTTP服务器应用程序部署到了Kubernetes集群中,并通过Service将其暴露给外部网络。这个案例涵盖了从环境准备、代码编写、镜像构建、部署到验证的完整流程,为在Kubernetes中使用Go语言开发应用程序提供了详尽的参考。