K8s 集成 Jenkins 部署Go Web项目

风离不摆烂学习日志 Day9 K8s 集成 Jenkins 部署Go Web项目

Dockerfile

FROM golang:alpine as builder # 需要go环境 MAINTAINER fl1906 WORKDIR /work # 源 RUN go env -w GOPROXY=https://goproxy.cn && go env -w CGO_ENABLED=0 && go env -w GO111MODULE=on COPY go.mod go.sum ./ RUN go mod download COPY . . RUN go build -o main main.go FROM alpine:latest # 设置时区 RUN apk add --no-cache tzdata && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo "Asia/Shanghai" > /etc/timezone WORKDIR / # 复制到工作区 COPY --from=builder /work/ ./ # COPY --from=builder /work/config ./config # 对外端口 EXPOSE 8080 # 执行 CMD ["./main"]

踩坑 build的时候走到下载mod包会报错:“dial tcp: lookup goproxy.cn on 223.6.6.6:53: read udp 172.17.0.2:41803->223.6.6.6:53: i/o timeout”。

go语言 Dockerfile builddial tcp: lookup 报错解决方案 build的时候走到下载mod包会报错:“dial tcp: lookup goproxy.cn on 223.6.6.6:53: read udp 172.17.0.2:41803->223.6.6.6:53: i/o timeout”。 开始以为是DNS问题,然后怀疑是代理不对?最终排除了这两个部分,于是大胆的考虑容器里是不是不通外网? 还真是如此。 因为之前的build指令没有特殊指定网络,所以修正指令后如下: docker build --network host ... 即可正常build镜像。

Jenkinsfile

pipeline { agent { node { label go16 } } stages { stage(从仓库拉取代码) { agent none steps { container(base) { git(credentialsId: gitee-id, url: https://gitee.com/fl1906249647/learning-gin.git, branch: master, changelog: true, poll: false) } } } stage(构建推送镜像到阿里云仓库 ) { agent none steps { container(go) { sh docker build --network host -f Dockerfile -t $REGISTRY/$DOCKERHUB_NAMESPACE/go-admin:SNAPSHOT-$BUILD_NUMBER . withCredentials([usernamePassword(credentialsId : aliyun-docker-registry ,passwordVariable : DOCKER_PWD_VAR ,usernameVariable : DOCKER_USER_VAR ,)]) { sh docker login -u "$DOCKER_USER_VAR" -p "$DOCKER_PWD_VAR" $REGISTRY sh docker push $REGISTRY/$DOCKERHUB_NAMESPACE/go-admin:SNAPSHOT-$BUILD_NUMBER } } } } stage(部署到线上) { steps { container (go) { withCredentials([ kubeconfigFile( credentialsId: env.KUBECONFIG_CREDENTIAL_ID, variable: KUBECONFIG) ]) { sh envsubst < deploy/go-admin.yaml | kubectl apply -f - } } } } } environment { KUBECONFIG_CREDENTIAL_ID = demo-kubeconfig REGISTRY = registry.cn-hangzhou.aliyuncs.com DOCKERHUB_NAMESPACE = choose-course-system APP_NAME = learning-gin } }

go-admin.yaml

apiVersion: apps/v1 kind: Deployment metadata: labels: app: go-admin name: go-admin namespace: go-admin #一定要写名称空间 spec: progressDeadlineSeconds: 600 replicas: 1 selector: matchLabels: app: go-admin strategy: rollingUpdate: maxSurge: 50% maxUnavailable: 50% type: RollingUpdate template: metadata: labels: app: go-admin spec: imagePullSecrets: - name: aliyun-docker-registry #提前在项目下配置访问阿里云的账号密码 containers: - image: $REGISTRY/$DOCKERHUB_NAMESPACE/go-admin:SNAPSHOT-$BUILD_NUMBER imagePullPolicy: Always name: app ports: - name: http-admin containerPort: 8080 protocol: TCP resources: limits: cpu: 3 memory: 3000Mi requests: cpu: 60m memory: 50Mi terminationMessagePath: /dev/termination-log terminationMessagePolicy: File dnsPolicy: ClusterFirst restartPolicy: Always terminationGracePeriodSeconds: 30 --- apiVersion: v1 kind: Service metadata: labels: app: go-admin name: go-admin namespace: go-admin spec: ports: - name: http port: 8080 protocol: TCP targetPort: 8080 selector: app: go-admin sessionAffinity: None type: ClusterIP

代码推送至仓库 自动触发流水线

在Gitee仓库配置 WebHook 提交代码

项目代码结构

成功

经验分享 程序员 微信小程序 职场和发展