欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

golang服务部署到kubernetes

程序员文章站 2022-03-26 14:47:52
本篇主要讲解如何将golang的服务部署到kubernetes集群里,附带相关的golang的demo和yml文件内容。纯新手入门方式,生产服务需要完整的CI/CD流程来支持。 golang服务代码 这里简单写一个k8s-demo的服务,提供两个接口ping和version接口,main.go文件代 ......

本篇主要讲解如何将golang的服务部署到kubernetes集群里,附带相关的golang的demo和yml文件内容。纯新手入门方式,生产服务需要完整的ci/cd流程来支持。

golang服务代码

这里简单写一个k8s-demo的服务,提供两个接口ping和version接口,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"})
}

func versionhandler(c *gin.context) {
	c.json(http.statusok, gin.h{"version": "v1.0"})
}

func main() {
	router := gin.new()
	router.use(gin.recovery())
	router.get("/ping", statusokhandler)
	router.get("/version", versionhandler)
	router.run(":8080")
}


构建命令:cgo_enabled=0 goos=linux goarch=amd64 go build -o k8s-demo main.go

dockerfile文件

这里只提供最基础的demo写法,如果有额外的需求在dockerfile文件内补充就行,dockerfile文件内容如下:

from alpine
add k8s-demo /data/app/
workdir /data/app/
cmd ["/bin/bash","-c","./k8s-demo"]

ci构建脚本

写一个build.sh,用于编译二进制文件,然后进行docker镜像打包和推送进行到镜像仓库:

#!/bin/bash

set -e

cgo_enabled=0 goos=linux goarch=amd64 go build -o k8s-demo main.go
docker build -t www.5bug.wang/docker/k8s-demo:1.0 .
docker push www.5bug.wang/docker/k8s-demo:1.0

执行build.sh脚本文件即可,请确保此步骤成功将镜像推送到你的镜像仓库里。

kubernetes部署

准备创建deployment的yaml文件

kubernetes版本1.18,我这里使用yaml文件创建deployment来部署k8s-demo服务到k8s集群里,k8s-demo.yaml文件内容如下:

---
    apiversion: apps/v1
    kind: deployment
    metadata:
      name: k8s-demo
      namespace: default
      labels:
        app: k8s-demo
    spec:
      selector:
        matchlabels:
          app: k8s-demo
      replicas: 4
      revisionhistorylimit: 10
      minreadyseconds: 5
      strategy:
        type: rollingupdate
        rollingupdate:
          maxsurge: 1
          maxunavailable: 1
      template:
        metadata:
          labels:
            app: k8s-demo
        spec:
          containers:
          - image: www.5bug.wang/docker/k8s-demo:1.0
            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: /ping
                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
    
---
    apiversion: extensions/v1beta1
    kind: ingress
    metadata:
      name: k8s-demo-ingress
      namespace: default
    spec:
      rules:
      - host: k8s-demo.local
        http:
          paths:
          - path: /
            backend:
              servicename: k8s-demo-svc
              serviceport: api


此yaml文件里主要定义了三种资源:deployment、service、ingress,都配置在默认的namespace里,yaml文件里的每项内容做什么用的下一篇再补充,这里先把服务部署起来找找成就感!

k8s部署

在已经搭建好k8s环境的master节点里使用kubectl命令来执行部署,命令如下:

kubectl apply -f k8s-demo.yaml

执行效果如下:

golang服务部署到kubernetes

稍等会通过通过查询pods列表的命令:kubectl get pods 来查看pod运行状态,如下图:

golang服务部署到kubernetes

配置外部访问

k8s的服务支持外部访问的方式有好几种,我这里我采用了ingress的方式,由于是本地使用,所以这里需要绑下host文件,通过查询ingress的命令查询ingress列表可以得知host绑什么ip地址,如下::

5bug.wang-macbook:~/codes/projects/k8s-demo$ kubectl get ingress
name               class    hosts            address          ports   age
k8s-demo-ingress   <none>   k8s-demo.local   192.168.99.103   80      7m26s

修改/etc/hosts文件,增加:192.168.99.103  k8s-demo.local即可。

浏览器里访问:http://k8s-demo.local/ping即可看到ping接口的返回值了,到这里k8s-demo成功部署到k8s集群里了。

转自:https://www.cnblogs.com/5bug/p/12733738.html