go-zero 其他命令

2022-04-22 10:46 更新

其他命令

  • goctl docker
  • goctl kube

goctl docker

goctl docker 可以極速生成一個 Dockerfile,幫助開發(fā)/運維人員加快部署節(jié)奏,降低部署復雜度。

準備工作

  • docker安裝

Dockerfile 額外注意點

  • 選擇最簡單的鏡像:比如alpine,整個鏡像5M左右
  • 設(shè)置鏡像時區(qū)

RUN apk add --no-cache tzdata
ENV TZ Asia/Shanghai

多階段構(gòu)建

  • 第一階段構(gòu)建出可執(zhí)行文件,確保構(gòu)建過程獨立于宿主機
  • 第二階段將第一階段的輸出作為輸入,構(gòu)建出最終的極簡鏡像

Dockerfile編寫過程

  • 首先安裝 goctl 工具

$ GO111MODULE=on GOPROXY=https://goproxy.cn/,direct go get -u github.com/zeromicro/go-zero/tools/goctl

  • 在 greet 項目下創(chuàng)建一個 hello 服務(wù)

$ goctl api new hello

文件結(jié)構(gòu)如下:

greet
├── go.mod
├── go.sum
└── service
    └── hello
        ├── Dockerfile
        ├── etc
        │   └── hello-api.yaml
        ├── hello.api
        ├── hello.go
        └── internal
            ├── config
            │   └── config.go
            ├── handler
            │   ├── hellohandler.go
            │   └── routes.go
            ├── logic
            │   └── hellologic.go
            ├── svc
            │   └── servicecontext.go
            └── types
                └── types.go

  • 在 hello 目錄下一鍵生成 Dockerfile

$ goctl docker -go hello.go

Dockerfile 內(nèi)容如下:

  FROM golang:alpine AS builder
  LABEL stage=gobuilder
  ENV CGO_ENABLED 0
  ENV GOOS linux
  ENV GOPROXY https://goproxy.cn,direct
  WORKDIR /build/zero
  ADD go.mod .
  ADD go.sum .
  RUN go mod download
  COPY . .
  COPY service/hello/etc /app/etc
  RUN go build -ldflags="-s -w" -o /app/hello service/hello/hello.go
  FROM alpine
  RUN apk update --no-cache
  RUN apk add --no-cache ca-certificates
  RUN apk add --no-cache tzdata
  ENV TZ Asia/Shanghai
  WORKDIR /app
  COPY --from=builder /app/hello /app/hello
  COPY --from=builder /app/etc /app/etc
  CMD ["./hello", "-f", "etc/hello-api.yaml"]

  • 在 hello 目錄下 build 鏡像

$ docker build -t hello:v1 -f service/hello/Dockerfile .

  • 查看鏡像

hello v1 5455f2eaea6b 7 minutes ago 18.1MB

可以看出鏡像大小約為18M。

  • 啟動服務(wù)

$ docker run --rm -it -p 8888:8888 hello:v1

  • 測試服務(wù)

$ curl -i http://localhost:8888/from/you
HTTP/1.1 200 OK
Content-Type: application/json
Date: Thu, 10 Dec 2020 06:03:02 GMT
Content-Length: 14
{"message":""}

goctl docker總結(jié)

goctl 工具極大簡化了 Dockerfile 文件的編寫,提供了開箱即用的最佳實踐,并且支持了模板自定義。

goctl kube

goctl kube提供了快速生成一個 k8s 部署文件的功能,可以加快開發(fā)/運維人員的部署進度,減少部署復雜度。

頭疼編寫 K8S 部署文件?

  • K8S yaml 參數(shù)很多,需要邊寫邊查?
  • 保留回滾版本數(shù)怎么設(shè)?
  • 如何探測啟動成功,如何探活?
  • 如何分配和限制資源?
  • 如何設(shè)置時區(qū)?否則打印日志是 GMT 標準時間
  • 如何暴露服務(wù)供其它服務(wù)調(diào)用?
  • 如何根據(jù) CPU 和內(nèi)存使用率來配置水平伸縮?

首先,你需要知道有這些知識點,其次要把這些知識點都搞明白也不容易,再次,每次編寫依然容易出錯!

創(chuàng)建服務(wù)鏡像

為了演示,這里我們以 redis:6-alpine 鏡像為例。

完整 K8S 部署文件編寫過程

  • 首先安裝 goctl 工具

$ GO111MODULE=on GOPROXY=https://goproxy.cn/,direct go get -u github.com/zeromicro/go-zero/tools/goctl

  • 一鍵生成 K8S 部署文件

$ goctl kube deploy -name redis -namespace adhoc -image redis:6-alpine -o redis.yaml -port 6379

生成的 yaml 文件如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: redis
  namespace: adhoc
  labels:
    app: redis
spec:
  replicas: 3
  revisionHistoryLimit: 5
  selector:
    matchLabels:
      app: redis
  template:
    metadata:
      labels:
        app: redis
    spec:
      containers:
      - name: redis
        image: redis:6-alpine
        lifecycle:
          preStop:
            exec:
              command: ["sh","-c","sleep 5"]
        ports:
        - containerPort: 6379
        readinessProbe:
          tcpSocket:
            port: 6379
          initialDelaySeconds: 5
          periodSeconds: 10
        livenessProbe:
          tcpSocket:
            port: 6379
          initialDelaySeconds: 15
          periodSeconds: 20
        resources:
          requests:
            cpu: 500m
            memory: 512Mi
          limits:
            cpu: 1000m
            memory: 1024Mi
        volumeMounts:
        - name: timezone
          mountPath: /etc/localtime
      volumes:
        - name: timezone
          hostPath:
            path: /usr/share/zoneinfo/Asia/Shanghai
---
apiVersion: v1
kind: Service
metadata:
  name: redis-svc
  namespace: adhoc
spec:
  ports:
    - port: 6379
  selector:
    app: redis
---
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  name: redis-hpa-c
  namespace: adhoc
  labels:
    app: redis-hpa-c
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: redis
  minReplicas: 3
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      targetAverageUtilization: 80
---
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  name: redis-hpa-m
  namespace: adhoc
  labels:
    app: redis-hpa-m
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: redis
  minReplicas: 3
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: memory
      targetAverageUtilization: 80

  • 部署服務(wù),如果 adhoc namespace 不存在的話,請先通過 kubectl create namespace adhoc 創(chuàng)建

$ kubectl apply -f redis.yaml
deployment.apps/redis created
service/redis-svc created
horizontalpodautoscaler.autoscaling/redis-hpa-c created
horizontalpodautoscaler.autoscaling/redis-hpa-m created

  • 查看服務(wù)允許狀態(tài)

$ kubectl get all -n adhoc
NAME                         READY   STATUS    RESTARTS   AGE
pod/redis-585bc66876-5ph26   1/1     Running   0          6m5s
pod/redis-585bc66876-bfqxz   1/1     Running   0          6m5s
pod/redis-585bc66876-vvfc9   1/1     Running   0          6m5s
NAME                TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)    AGE
service/redis-svc   ClusterIP   172.24.15.8   <none>        6379/TCP   6m5s
NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/redis   3/3     3            3           6m6s
NAME                               DESIRED   CURRENT   READY   AGE
replicaset.apps/redis-585bc66876   3         3         3       6m6s
NAME                                              REFERENCE          TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
horizontalpodautoscaler.autoscaling/redis-hpa-c   Deployment/redis   0%/80%    3         10        3          6m6s
horizontalpodautoscaler.autoscaling/redis-hpa-m   Deployment/redis   0%/80%    3         10        3          6m6s

  • 測試服務(wù)

$ kubectl run -i --tty --rm cli --image=redis:6-alpine -n adhoc -- sh
/data # redis-cli -h redis-svc
redis-svc:6379> set go-zero great
OK
redis-svc:6379> get go-zero
"great"

goctl kube 總結(jié)

goctl 工具極大簡化了 K8S yaml 文件的編寫,提供了開箱即用的最佳實踐,并且支持了模板自定義。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號