1、简介
随着云计算和容器化技术的普及,Kubernetes(简称K8S)已经成为了现代软件开发和部署的标准之一。它提供了一个强大的平台,用于自动化、扩展和管理容器化应用程序,使得开发人员可以更轻松地构建和部署他们的应用,而无需担心底层基础设施的复杂性。
Go语言作为一种简洁、高效、并发性强的编程语言,越来越受到开发者的青睐。在本文中,我们将探讨如何将Go语言编写的服务部署到Kubernetes集群中。
2、特点
- 简单高效的部署流程:由于Go语言天生支持静态编译,并且Kubernetes提供了灵活的容器化部署机制,因此将Go服务部署到Kubernetes上非常简单高效。您只需将Go服务打包为Docker镜像,并通过Kubernetes的部署描述文件指定部署配置即可。
- 快速的启动和响应时间:Go语言以其高效的并发模型和快速的启动时间而闻名,使得Go服务能够迅速响应请求并处理大量并发连接。在Kubernetes集群中部署的Go服务可以利用Kubernetes的弹性伸缩功能,动态调整实例数量以应对流量变化,从而保持良好的性能表现。
- 轻量级的资源消耗:Go语言编写的服务通常具有较低的内存消耗和更高的性能,这使得它们非常适合在资源受限的环境中部署,如容器化平台。在Kubernetes集群中部署的Go服务可以有效地利用集群资源,并在需要时动态调整资源配额。
- 跨平台兼容性:Go语言的跨平台特性使得Go服务可以在不同的操作系统和硬件架构上运行,这为在多云环境或混合云环境中部署提供了便利。Kubernetes作为一个跨云平台的容器编排工具,可以在各种云提供商的基础设施上运行,因此将Go服务部署到Kubernetes集群中具有良好的可移植性和可扩展性。
- 灵活的部署和管理:Kubernetes提供了丰富的部署、扩展、监控和管理功能,可以帮助您轻松地管理和运维Go服务。您可以使用Kubernetes的命令行工具kubectl或图形化的管理界面来管理应用程序的生命周期,并根据需要进行水平扩展、滚动更新等操作,从而实现灵活的部署和管理策略。
3、部署
安装go
[root@mast01 ~]# yum install go -y
查看版本
[root@mast01 ~]# go version
go version go1.20.12 linux/amd64
创建源码文件
#创建目录
[root@master1 ~]# mkdir test
#进入目录
[root@master1 ~]# cd test/
#编写程序
[root@master1 test]# cat main.go
package main
import (
"net/http"
"github.com/gin-gonic/gin"
)
func statusOKHandler(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{"status": "success~welcome to study"})
}
func versionHandler(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{"version": "v1.1版本"})
}
func main() {
router := gin.New()
router.Use(gin.Recovery())
router.GET("/", statusOKHandler)
router.GET("/version", versionHandler)
router.Run(":8080")
}
Go mod初始化项目
[root@master1 test]# go mod init test
设置代理
[root@master1 test]# go env -w GOPROXY=https://goproxy.cn,direct
管理Go模块依赖
[root@master1 test]# go mod tidy
构建源码为二进制文件
[root@master1 test]# CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o k8s-demo main.go
编写dockerfile文件,容器里封装二进制代码
[root@master1 test]# cat Dockerfile
FROM alpine
ADD k8s-demo /data/app/
WORKDIR /data/app/
CMD ["/bin/sh","-c","./k8s-demo"]
构建镜像
[root@master1 test]# docker build -t david/k8sdemo:v1 .
打包镜像
[root@master1 test]# docker save -o k8sdemo.tar.gz david/k8sdemo:v1
传到k8s工作节点
[root@master1 test]# scp k8sdemo.tar.gz node1:/root/
在node节点解压镜像
[root@master1 test]# docker load -i k8sdemo.tar.gz
4、上传镜像仓库
#查看镜像仓库
[root@10-60-249-255 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
david/k8sdemo v1 6e9fbf4a5ef3 2 days ago 16.8MB
<none> <none> 058f7b592b0b 10 days ago 16.8MB
#登录镜像仓库
[root@10-60-249-255 ~]# docker login --username=周二蛋 registry.cn-shanghai.aliyuncs.com
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
#给镜像打标签
[root@10-60-249-255 ~]# docker tag david/k8sdemo:v1 registry.cn-shanghai.aliyuncs.com/study-03/david-project:v1
#推送到镜像仓库
[root@10-60-249-255 ~]# docker push registry.cn-shanghai.aliyuncs.com/study-03/david-project:v1
The push refers to repository [registry.cn-shanghai.aliyuncs.com/study-03/david-project]
5f70bf18a086: Pushed
ddfe254665ab: Pushed
8d3ac3489996: Pushed
v1: digest: sha256:d7a7dc151b6871dcf8c393d1b877a3ccf78517abff6b4faaf38070f76b158f7b size: 945
5、部署k8s应用
创建deployment的yaml文件
[root@mast01 go]# cat k8s.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: k8s-demo
namespace: default
labels:
app: k8s-demo
spec:
selector:
matchLabels:
app: k8s-demo
replicas: 4
template:
metadata:
labels:
app: k8s-demo
spec:
containers:
- image: registry.cn-shanghai.aliyuncs.com/study-03/david-project:v1
imagePullPolicy: IfNotPresent
name: k8s-demo
ports:
- containerPort: 8080
protocol: TCP
resources:
limits:
cpu: 100m
memory: 100Mi
requests:
cpu: 50m
memory: 50Mi
livenessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 10
timeoutSeconds: 3
readinessProbe:
httpGet:
path: /
port: 8080
initialDelaySeconds: 10
timeoutSeconds: 2
---
apiVersion: v1
kind: Service
metadata:
name: k8s-demo-svc
namespace: default
labels:
app: k8s-demo
spec:
ports:
- name: api
port: 8080
protocol: TCP
targetPort: 8080
selector:
app: k8s-demo
更新yaml文件
[root@mast01 go]# kubectl apply -f k8s.yaml
查看pod和svc
[root@mast01 go]# kubectl get pods,svc
NAME READY STATUS RESTARTS AGE
pod/k8s-demo-d745459b7-4wlb2 1/1 Running 0 2m40s
pod/k8s-demo-d745459b7-9hf8j 1/1 Running 0 2m40s
pod/k8s-demo-d745459b7-hxdnx 1/1 Running 0 2m40s
pod/k8s-demo-d745459b7-tkzz7 1/1 Running 0 2m40s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/k8s-demo-svc ClusterIP 10.105.100.197 <none> 8080/TCP 2m40s
修改svc的type类型变成nodePort
[root@mast01 go]# vim k8s.yaml
apiVersion: v1
kind: Service
metadata:
name: k8s-demo-svc
namespace: default
labels:
app: k8s-demo
spec:
type: NodePort #添加一行
ports:
- name: api
port: 8080
protocol: TCP
targetPort: 8080
selector:
app: k8s-demo
查看svc
[root@mast01 go]# kubectl get svc阅读原文
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
k8s-demo-svc NodePort 10.105.100.197 <none> 8080:32644/TCP 11m