k8s学习六-k8s部署go服务
2023-06-13 09:12:29 时间
go代码
写一个最简单的http服务器:
package main
import (
"flag"
"github.com/gin-gonic/gin"
"net/http"
"os"
)
var version = flag.String("v", "v1", "v1")
func main() {
router := gin.Default()
router.GET("", func(c *gin.Context) {
flag.Parse()
hostname, _ := os.Hostname()
c.String(http.StatusOK, "This is version:%s running in pod %s", *version, hostname)
})
router.Run(":8080")
}
测试下能不能用:
go run main.go
启动成功后,curl测试:
(base) tioncico@appledeMacBook-Pro test % curl 127.0.0.1:8080
This is version:v1 running in pod appledeMacBook-Pro.local%
dockerfile
编写go服务的dockerfile,在main.go同级目录编写(多阶段构建dockerfile):
FROM golang:latest AS build
WORKDIR /go/src/test
COPY . /go/src/test
RUN go env -w GOPROXY=https://goproxy.cn,direct
RUN CGO_ENABLED=0 go build -v -o main .
FROM alpine AS api
RUN mkdir /app
COPY --from=build /go/src/test/main /app
WORKDIR /app
ENTRYPOINT ["./main", "-v" ,"1.0.1"]
构建docker镜像并打包上传
docker build -t go:v1.0.1 . # 编译镜像
docker tag go:v1.0.1 tioncico/go:v1.0.1 # 增加tag
docker push tioncico/go:v1.0.1 # 上传到docker hub
此时,在dockerhub上,即可看到编译好的镜像:
编写k8s yaml文件
新增 go.yaml文件
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: go-deployment
labels:
app: go
spec:
selector:
matchLabels:
app: go
replicas: 3
minReadySeconds: 5
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
template:
metadata:
labels:
app: go
spec:
containers:
- image: tioncico/go:v1.0.1
name: go
imagePullPolicy: Always
command: ["./main","-v","v1.0.1"]
ports:
- containerPort: 8080
protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
name: go-service
labels:
app: go
spec:
selector:
app: go
ports:
- name: go-port
protocol: TCP
port: 8080
targetPort: 8080
nodePort: 30080
type: NodePort
k8s部署
kubectl apply -f go.yaml
即可部署成功,查看pod状态:
root@master:/home/tioncico# kubectl get pods
NAME READY STATUS RESTARTS AGE
go-deployment-86f769995d-6j4pq 1/1 Running 0 2m20s
go-deployment-86f769995d-8pcsd 1/1 Running 0 2m20s
go-deployment-86f769995d-lz7vf 1/1 Running 0 2m20s
nginx-7cbb8cd5d8-w9tn2 1/1 Running 3 (140m ago) 28h
可看到,已经部署了3台,访问 集群任意一个节点ip:30080端口,可查看效果:
root@master:/home/tioncico# curl http://192.168.192.9:30080
This is version:v1.0.1 running in pod go-deployment-86f769995d-lz7vf
root@master:/home/tioncico# curl http://192.168.192.9:30080 ^C
root@master:/home/tioncico# curl http://192.168.192.10:30080
This is version:v1.0.1 running in pod go-deployment-86f769995d-8pcsd
root@master:/home/tioncico#
为什么需要上传到docker hub?
在上面的教程中可以看到,我们先将镜像放到了docker hub,才开始进行k8s部署,这样相当于把自己的项目放到了公共的仓库,十分不安全
原因是: k8s有多个节点,如果我们只在一个节点编译镜像,其他节点就无法获取到这个自己编译后的镜像
解决方案有2种:
1:将所有镜像都编译到其他节点中去
2:创建一个私有的docker仓库,让k8s集群通过私有仓库去进行pull images 即可
本文为仙士可原创文章,转载无需和我联系,但请注明来自仙士可博客www.php20.cn
相关文章
- kubernetes(k8s) 存储动态挂载
- k8s学习一:使用kubeadm安装k8s
- k8s学习三:创建一个nginx服务
- k8s系列(1)-腾讯云CVM手动部署K8S_Dashboard安装1
- k8s安装es单机版
- 如何优雅的通过Shell脚本一键部署GO项目到服务器 |Go主题月
- 从Go程序第一行代码,到在 K8s 上运行,要经历多少步?
- K8s源码分析(21)-client go组件之资源操作对象
- k8s安装使用_setup error怎么解决
- k8s 网络转发问题记录
- K8s API访问控制
- 微服务 - 搭建k8s(kubeadm)模拟复杂的生产环境(上篇)
- k8s之StatefulSet
- mac 上学习k8s系列(52)goreplay流量录制
- 「Go工具箱」一个对语义化版本进行解析、比较的库:go-version
- K8S 生态周报| 集群中应用正常但探针失败,如何解决?
- K8S v1.26:CPUManager 正式发布,生产可用!
- 轻松搞定Go语言连接MySQL(go连接mysql)
- 如何在Linux上安装Go语言?——简单易懂的指南(linux安装go语言)
- Go语言搭建Oracle数据库快速连接方法(go语言连接oracle)
- 数据库Go语言连接Oracle数据库的指南(go如何连接oracle)