本文目标
- 打包一个go http程序为镜像并上传到gitea
- 从k3s中运行这个镜像
- 通过gateway api 访问http服务
在k3s中,对gateway api的配置请参考我的上一篇文章这里.
打包一个go http 程序,简单点,从go-echo官方复制一个吧~
package main
import (
"net/http"
"github.com/labstack/echo/v4"
)
func main() {
e := echo.New()
e.GET("/", func(c echo.Context) error {
return c.String(http.StatusOK, "Hello, World!")
})
e.Logger.Fatal(e.Start(":1323"))
}
写一个dockerfile
FROM golang:1.21-alpine
WORKDIR /app
ENV GO111MODULE=on
ENV GOPROXY=https://goproxy.io,direct
COPY go.mod ./
COPY go.sum ./
RUN go mod download
COPY *.go ./
RUN go build -o /docker-go-server-ping
EXPOSE 1323
CMD ["/docker-go-server-ping"]
莫急,有两个坑要说明
- 在
docker login http地址时,http地址要配置你的docker客户端允许访问才可以。
// 一般在这个位置:/etc/docker/daemon.json
{
"insecure-registries": [
"域名或者ip"
]
}
- 第二个坑,http(非https) k3s拉取的坑,
mirrors:
docker.io:
endpoint:
- "http://mycustomreg.com:5000"
务必添加gitea的地址在docker.io下。
准备上传到gitea了,这一步,要准备官方强调的,按命名规则来{registry}/{owner}/{image},分别是gitea地址/拥有者/镜像名+标签
官网
正式开始
创建pod
apiVersion: apps/v1
kind: Deployment
metadata:
name: test-echo
spec:
replicas: 1
selector:
matchLabels:
app: test-echo
version: v1
template:
metadata:
labels:
app: test-echo
version: v1
spec:
containers:
- name: gin-test
image: v3v6/gin-test:0.2
ports:
- containerPort: 1323
创建service
apiVersion: v1
kind: Service
metadata:
name: my-service-echo
spec:
selector:
env: prod
ports:
- name: http
port: 1323
targetPort: 1323
type: NodePort
创建httpgateway
注意,这里我已经创建了一个gateway,请参照上一篇
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: backend
spec:
parentRefs:
- name: eg
hostnames:
- "*.test-echo.com"
rules:
- backendRefs:
- group: ""
kind: Service
name: my-service-echo
port: 1323
weight: 1
matches:
- path:
type: PathPrefix
value: /
然后测试:
curl --header "Host: www.test-echo.com" http://192.168.124.130/
输出:
Hello, World!