Kubernetes集群——如何部署Go服务

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
图片
阅读原文


作者简介: 一个热爱技术的运维开发,欢迎关注IT运维大爆炸公众号,技术干货第一时间送达!

声明:文中观点不代表本站立场。本文传送门:https://eyangzhen.com/415198.html

联系我们
联系我们
分享本页
返回顶部