创建一个基于Go程序的持续集成/持续部署(CI/CD)流水线,涉及到代码拉取、镜像构建、镜像推送以及在Kubernetes(K8s)上启动服务等多个步骤。下面是一个简化的步骤说明,以及对应的命令行操作或配置文件示例,帮助你构建这样的流水线。
步骤一:环境准备
安装Git:用于代码拉取。
安装Docker:用于镜像构建和推送。
安装kubectl:用于与Kubernetes集群交互。
配置Docker Hub或私有仓库(如Harbor):用于存储Docker镜像。
配置Kubernetes集群:确保你有权限访问一个Kubernetes集群。
步骤二:编写Go程序
确保你的Go项目在GitHub(或其他Git服务)上有版本控制。以下是一个简单的hello.go示例:
go复制代码 package main import ( "fmt" "net/http" ) func handler(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hello, Kubernetes!") } func main() { http.HandleFunc("/", handler) fmt.Println("Server is listening on 8080") if err := http.ListenAndServe(":8080", nil); err != nil { panic(err) } }
步骤三:Dockerfile编写
在项目根目录下创建Dockerfile,用于构建镜像:
Dockerfile复制代码 # 使用官方Go运行时作为父镜像 FROM golang:1.16 # 设置工作目录 WORKDIR /app # 将当前目录内容复制到位于/app中的容器中 COPY . . # 构建Go应用 RUN go build -o hello-app # 指定容器运行时执行的命令 CMD ["./hello-app"] # 暴露端口 EXPOSE 8080
步骤四:使用CI/CD工具(以GitHub Actions为例)
在GitHub仓库中创建.github/workflows/ci-cd.yml文件,配置CI/CD流程:
yaml复制代码 name: CI/CD on: push: branches: [ main ] jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v1 - name: Login to DockerHub uses: docker/login-action@v1 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} - name: Build and push id: docker_build uses: docker/build-push-action@v2 with: push: true tags: yourusername/hello-app:latest - name: Deploy to Kubernetes cluster uses: azure/k8s-deploy@v1 with: namespace: default manifests: | deployment.yaml image-pull-secrets: | name: regcred kubectl-version: latest
注意:你需要配置secrets.DOCKER_USERNAME和secrets.DOCKER_PASSWORD在GitHub仓库设置中。
步骤五:编写Kubernetes部署文件
在项目根目录下创建deployment.yaml:
yaml复制代码 apiVersion: apps/v1 kind: Deployment metadata: name: hello-app spec: replicas: 1 selector: matchLabels: app: hello-app template: metadata: labels: app: hello-app spec: containers: - name: hello-app image: yourusername/hello-app:latest ports: - containerPort: 8080
步骤六:运行流水线
每次将代码推送到main分支时,GitHub Actions将自动触发CI/CD流程,包括构建Docker镜像、推送镜像到Docker Hub,并在Kubernetes集群中部署应用。
这只是一个基础的示例,根据你的具体需求,你可能需要调整Dockerfile、Kubernetes配置文件或CI/CD流程。
效果: