云原生环境下软件开发模式的转变

简介

现在云原生时代,软件开发模式有了一些改变。原本软件开发过程中,本地开发、本地调试都不是很复杂,开发完就往服务器上一丢,或者跑CI/CD,部署流程自动化,也不会耗费很长时间,调试的话也能在本地调试好,中间的loop时间不会很长。但是云原生时代,各种软件架构都变得复杂了,各种微服务架构,很多都是部署到k8s中,调试也比较麻烦。如果修改了一段代码,提交到git仓库,触发CI/CD流程,最终部署到k8s中,中间的过程还是需要等待的,并不是立即就能看到效果。 其实也就是分为 inner loop、outloop两部分,其实开发时间中很大一部分时间就被浪费掉了。

参考一下两篇文章:

其实也有一些工具来改善这些情况,下面就来介绍几款这样的工具

skaffold

Skaffold是由Google发布的命令行工具,专注于促进K8S应用的持续deployment。自动化building和deploying到k8s集群的任务,可以让开发者专注于编写代码。

下面就举个例子来试一下:

go的一个工程:

1
2
3
4
5
6
7
8
├── Dockerfile
├── go.mod
├── go.sum
├── main.go
├── manifests
│   ├── gin.deploy.yaml
│   └── gin.svc.yaml
└── skaffold.yaml

main.go

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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": "pong",
})
})
r.Run(":8080") // listen and serve on 0.0.0.0:8080
}

skaffold.yaml:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
apiVersion: skaffold/v4beta8
kind: Config
manifests:
rawYaml:
- manifests/*.yaml
build:
local:
push: false
artifacts:
- image: gin-server-demo
context: .
docker:
dockerfile: Dockerfile

gin.deploy.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
apiVersion: apps/v1
kind: Deployment
metadata:
name: gin-server-demo
spec:
replicas: 3
selector:
matchLabels:
app: gin-server-demo
template:
metadata:
labels:
app: gin-server-demo
spec:
containers:
- name: server
image: gin-server-demo
ports:
- containerPort: 8080
imagePullSecrets:
- name: regcred


gin.svc.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
apiVersion: v1
kind: Service
metadata:
name: gin-server
spec:
type: NodePort
ports:
- port: 80
targetPort: 8080
nodePort: 30080
selector:
app: gin-server-demo

Dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
FROM golang:1.21-alpine AS builder

WORKDIR /app

ENV GO111MODULE=on GOPROXY=https://goproxy.cn,direct

COPY go.mod .
COPY go.sum .
RUN go mod download

COPY *.go .

RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o server -a -installsuffix cgo .

FROM alpine:3.18

WORKDIR /

COPY --from=builder /app/server /server

EXPOSE 8080

ENTRYPOINT ["/server"]

就会在指定的k8s集群中部署服务:

同时给你在本地映射端口: http://127.0.0.1:4503

此时你修改代码,再次点击 触发编译

访问原来接口,就发现已经更改了

看来 Skaffold 就是在本地构建,虽然说节省了一点时间。

telepresence

Telepresence是一款为Kubernetes微服务框架提供快速本地化开发功能的开源软件。Telepresence在Kubernetes集群中运行的Pod中部署双向网络代理,该Pod将Kubernetes环境(如TCP连接,环境变量,卷)中的数据代理到本地进程。本地进程透明地覆盖其网络,以便DNS调用和TCP连接通过代理路由到远程Kubernetes集群,能够获取远端K8S集群的各项资源。

https://www.telepresence.io/

还是简单使用一下

发现gin-server-demo这个deployment 被注入了一个container,查看一下:

此时已经不能访问了

这时候你在本地跑这个应用,就会发现 访问远程服务器的流量已经被拦截在本地了,也就是说你本地起的服务,在远程也可访问到了,很容易做修改,不必等待ci过程了。仅仅受限于你本地编译的速度了。