Triển khai Go-Zero Short Link lên Kubernetes với Drone CI/CD

Giới thiệu dự án Go-Zero Short Link

Go-Zero là một framework microservice mạnh mẽ cho Go. Bài viết này sẽ hướng dẫn cách xây dựng một dịch vụ rút gọn link (short link) bằng Go-Zero và triển khai nó lên Kubernetes (K8s) sử dụng Drone CI/CD để tự động hóa quy trình build và deploy.

Chuẩn bị

Trước khi bắt đầu, cần có một cluster Kubernetes đã được cài đặt và sẵn sàng. Ngoài ra, cần triển khai các dịch vụ phụ trợ như MySQL, Redis, và Etcd. Đối với môi trường sản xuất, việc sử dụng các dịch vụ cơ sở dữ liệu được quản lý bởi nhà cung cấp đám mây là khuyến khích.

Cấu hình Dockerfile

Dưới đây là các file Dockerfile được cấu hình để build các microservice.

Dockerfile.base.alpine

FROM alpine:3.18

RUN addgroup -S microsvc \
    && adduser -S -g microsvc microsvc \
    && apk --no-cache add \
    ca-certificates curl netcat-openbsd

USER microsvc

Dockerfile.builder.go

FROM golang:1.21-alpine AS builder

RUN go env -w GO111MODULE=on
RUN go env -w GOPROXY=https://proxy.golang.org,direct
RUN mkdir -p /app/shortlink

WORKDIR /app/shortlink
COPY go.mod go.mod
RUN go mod download

Dockerfile.service.transform

### shortlink:builder
FROM my-registry.com/shortlink/shortlink:builder AS builder

WORKDIR /app/shortlink/transform
COPY . .
RUN CGO_ENABLED=0 go build -a -o bin/transform-service transform/*.go

### shortlink:base.alpine
FROM my-registry.com/shortlink/shortlink:base.alpine

LABEL maintainer="DevOps Team"

WORKDIR /home/microsvc
COPY --from=builder /app/shortlink/transform/bin/transform-service .
COPY ./transform/etc ./transform/etc
RUN chown -R microsvc:microsvc ./
RUN ln -sf /usr/share/zoneinfo/Asia/Ho_Chi_Minh /etc/localtime
RUN echo 'Asia/Ho_Chi_Minh' >/etc/timezone
USER microsvc
CMD ["./transform-service", "-f", "transform/etc/transform.yaml"]

Dockerfile.service.gateway

### shortlink:builder
FROM my-registry.com/shortlink/shortlink:builder AS builder

WORKDIR /app/shortlink/gateway
COPY . .
RUN CGO_ENABLED=0 go build -a -o bin/api-gateway gateway/*.go

### shortlink:base.alpine
FROM my-registry.com/shortlink/shortlink:base.alpine

LABEL maintainer="DevOps Team"

WORKDIR /home/microsvc
COPY --from=builder /app/shortlink/gateway/bin/api-gateway .
COPY ./gateway/etc ./gateway/etc
RUN chown -R microsvc:microsvc ./
RUN ln -sf /usr/share/zoneinfo/Asia/Ho_Chi_Minh /etc/localtime
RUN echo 'Asia/Ho_Chi_Minh' >/etc/timezone
USER microsvc
CMD ["./api-gateway", "-f", "gateway/etc/gateway.yaml"]

Cấu hình Kubernetes

Các file ConfigMap sau định nghĩa cấu hình cho các microservice.

configmap-gateway.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: api-gateway
data:
  gateway.yaml: |-
    Name: api-gateway
    Host: 0.0.0.0
    Port: 8080
    Transform:
      Etcd:
        Hosts:
          - etcd-cluster-ip:2379
        Key: transform.service

configmap-transform.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: transform-service
data:
  transform.yaml: |-
    Name: transform.service
    Log:
      Mode: console
    ListenOn: 0.0.0.0:9090
    Etcd:
      Hosts:
      - etcd-cluster-ip:2379
      Key: transform.service
    DataSource: root:password@tcp(mysql-cluster-ip:3306)/shortlink?charset=utf8mb4&parseTime=true&loc=Asia%2FHo_Chi_Minh
    Table: shortlinks
    Cache:
      - Host: redis-cluster-ip:6379

Pipeline CI/CD với Drone

File `.drone.yml` định nghĩa quy trình tự động build và deploy ứng dụng.

kind: pipeline
type: kubernetes
name: Transform Service Pipeline

steps:

  - name: Cập nhật Helm Chart
    image: busybox
    commands:
      - echo $DRONE_COMMIT
      - '[ -n "$DRONE_COMMIT" ] && (
          sed -i "s/APP_VERSION/${DRONE_COMMIT}/g" charts/shortlink/Chart.yaml;
          sed -i "s/SERVICE_NAME/transform-service/g" charts/shortlink/Chart.yaml;
          sed -i "s/IMAGE_NAME/transform-service/g" charts/shortlink/values.yaml;
          sed -i "s/CONFIGMAP_NAME/transform-service/g" charts/shortlink/values.yaml;
          sed -i "s/CONTAINER_PORT/9090/g" charts/shortlink/values.yaml;
          sed -i "s/ENABLE_INGRESS/false/g" charts/shortlink/values.yaml;
          sed -i "s/8080/9090/g" charts/shortlink/templates/NOTES.txt;
        )'
      - cat charts/shortlink/Chart.yaml
      - cat charts/shortlink/values.yaml

  - name: Build Docker Image
    image: plugins/docker
    settings:
      debug: true
      dockerfile: Dockerfile.service.transform
      repo: my-registry.com/shortlink/transform-service
      tags: ${DRONE_COMMIT}
      registry: my-registry.com
      username:
        from_secret: docker_username
      password:
        from_secret: docker_password

  - name: Deploy to K8s with Helm
    image: pelotech/drone-helm3
    settings:
      helm_command: upgrade
      chart: ./charts/shortlink
      release: transform-service
      namespace: shortlink
      api_server:
        from_secret: k8s_api_server
      kubernetes_token:
        from_secret: k8s_token
      skip_tls_verify: true

trigger:
  branch:
    - main
---
kind: pipeline
type: kubernetes
name: API Gateway Pipeline

steps:

  - name: Cập nhật Helm Chart
    image: busybox
    commands:
      - echo $DRONE_COMMIT
      - '[ -n "$DRONE_COMMIT" ] && (
          sed -i "s/APP_VERSION/${DRONE_COMMIT}/g" charts/shortlink/Chart.yaml;
          sed -i "s/SERVICE_NAME/api-gateway/g" charts/shortlink/Chart.yaml;
          sed -i "s/IMAGE_NAME/api-gateway/g" charts/shortlink/values.yaml;
          sed -i "s/CONFIGMAP_NAME/api-gateway/g" charts/shortlink/values.yaml;
          sed -i "s/CONTAINER_PORT/8080/g" charts/shortlink/values.yaml;
          sed -i "s/ENABLE_INGRESS/true/g" charts/shortlink/values.yaml;
          sed -i "s/8080/8080/g" charts/shortlink/templates/NOTES.txt;
        )'
      - cat charts/shortlink/Chart.yaml
      - cat charts/shortlink/values.yaml

  - name: Build Docker Image
    image: plugins/docker
    settings:
      debug: true
      dockerfile: Dockerfile.service.gateway
      repo: my-registry.com/shortlink/api-gateway
      tags: ${DRONE_COMMIT}
      registry: my-registry.com
      username:
        from_secret: docker_username
      password:
        from_secret: docker_password

  - name: Deploy to K8s with Helm
    image: pelotech/drone-helm3
    settings:
      helm_command: upgrade
      chart: ./charts/shortlink
      release: api-gateway
      namespace: shortlink
      api_server:
        from_secret: k8s_api_server
      kubernetes_token:
        from_secret: k8s_token
      skip_tls_verify: true

trigger:
  branch:
    - main

Xác thực

Sau khi triển khai, có thể kiểm tra dịch vụ bằng các lệnh curl.

Gọi API rút gọn link

# curl -i "http://your-domain.com/shorten?url=https://example.com"
curl -i "http://shortlink.your-company.com/shorten?url=https://example.com"

Gọi API mở rộng link

# curl -i "http://your-domain.com/expand?shorten=abc123"
curl -i "http://shortlink.your-company.com/expand?shorten=abc123"

Thẻ: go-zero Kubernetes Drone-CI/CD Helm docker

Đăng vào ngày 29 tháng 6 lúc 09:28