Akemi

go代码封装到k8s中运行

2024/05/01

如果出现无法载图的情况,请检查与github的连通性

各个团队,开发、运维、测试等团队,需要从代码仓库拉取代码,编译代码,比方说java代码,需要编译,mvn编译,生成一个jar或者war结尾的文件;go代码,go build编译,会生成一个二进制文件; python代码不需要编译,如app.py,python app.py

linux安装go环境

在官网下载go的二进制包go1.22.0.linux-amd64.tar.gz

1
2
3
4
5
6
wget https://studygolang.com/dl/golang/go1.22.0.linux-amd64.tar.gz
tar -C /usr/local -xzf go1.22.0.linux-amd64.tar.gz
#修改环境变量
export PATH=$PATH:/usr/local/go/bin
source ~/.bashrc

编译go代码

go代码例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
cat main.go 
package main

import "github.com/gin-gonic/gin"

func main() {
r := gin.Default()
r.GET("/ping", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "welcome to study!!!",
})
})
r.Run(":8888")
}

编译

1
2
3
4
5
6
7
8
9
10
11
12
13
#初始化,会生成一个go.mod
go mod init test

#设置代理,因为代码需要拉取包,没有代理源没法拉取下来
go env -w GOPROXY=https://goproxy.cn,direct

#添加缺少的模块,清理未使用的模块,更新版本
go mod tidy

#构建源码
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o k8s-demo main.go
输出二进制文件k8s-demo,GOOS(系统)=linux GOARCH(cpu架构)=amd64,-o指定名字

容器

Dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
FROM alpine
WORKDIR /data/app/
ADD k8s-demo .
CMD ["/bin/sh","-c","./k8s-demo"]
EXPOSE 8888

#构建镜像
docker build -t=k8s.demo:v1 .
docker save k8s.demo:v1 -o k8sdemo.tar.gz
#将镜像传送到node节点
scp k8sdemo.tar.gz ws-k8s-node1:~
scp k8sdemo.tar.gz ws-k8s-node2:~
scp k8sdemo.tar.gz ws-k8s-node3:~
ctr -n=k8s.io image import k8sdemo.tar.gz #导入
...
#

其实也可以传到harbor里,让k8s拉,但是懒了直接scp得了

k8s

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# 
cat k8s.yaml
kind: Deployment
apiVersion: apps/v1
metadata:
name: go-deployment
spec:
replicas: 1
selector:
matchLabels:
release: stable
template:
metadata:
labels:
release: stable
spec:
containers:
- name: go
image: k8s.demo:v1
imagePullPolicy: Never
#
cat k8s_svc.yaml
apiVersion: v1
kind: Service
metadata:
name: go-service
spec:
selector:
release: stable
type: NodePort
ports:
- name: http
port: 8888
targetPort: 8888
protocol: "TCP"
- name: https
port: 443
targetPort: 443
protocol: "TCP"
#
kubectl apply -f .
deployment.apps/go-deployment created
service/go-service created
#
kubectl get pods
NAME READY STATUS RESTARTS AGE
go-deployment-6cd4b76477-lq8ff 1/1 Running 0 2m11s
#
kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
go-service NodePort 10.111.142.58 <none> 8888:30949/TCP,443:31126/TCP 2m16s

CATALOG
  1. 1. linux安装go环境
  2. 2. 编译go代码
  3. 3. 容器
    1. 3.1. Dockerfile
  4. 4. k8s