Go 项目容器化部署:Docker 与 Kubernetes 上线实践

来自AI助手的总结
介绍Go微服务的Docker与K8s容器化部署流程
Go 项目容器化部署:Docker 与 Kubernetes 上线实践

一、使用Docker容器化部署Go语言微服务

1.1 安装Docker

1.1 Rocky9安装Docker

1、每台主机关闭防火墙、swap分区、dnsmasq、selinux

(1)在每台机器上执行以下命令关闭防火墙


$ systemctl disable --now firewalld

(2)在每台机器上执行以下命令关闭selinux


$ setenforce 0

$ sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/sysconfig/selinux

$ sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config

(3)在每台机器上执行以下命令关闭swap分区


#临时关闭

$ swapoff -a && sysctl -w vm.swappiness=0

#永久关闭

$ sed -ri '/^[^#]*swap/s@^@#@' /etc/fstab

2、每台机器配置基础源


sed -e 's|^mirrorlist=|#mirrorlist=|g' \

    -e 's|^#baseurl=http://dl.rockylinux.org/$contentdir|baseurl=https://mirrors.aliyun.com/rockylinux|g' \

    -i.bak \

    /etc/yum.repos.d/rocky-*.repo

# 重新生成缓存

dnf makecache

3、每台机器上安装必备工具


yum install wget jq psmisc vim net-tools telnet yum-utils device-mapper-persistent-data lvm2 git -y

4、安装docker


[root@rock9-12 ~]# vim install_docker_offline.sh

#!/bin/bash

#支持在线和离线安装

DOCKER_VERSION=28.0.4

#DOCKER_VERSION=27.5.1

#DOCKER_VERSION=26.1.4

#DOCKER_VERSION=26.0.0

#DOCKER_VERSION=24.0.7

#DOCKER_VERSION=24.0.5

#DOCKER_VERSION=23.0.3

#DOCKER_VERSION=20.10.19

URL=https://mirrors.tuna.tsinghua.edu.cn

#URL=https://mirrors.aliyun.com

#URL=https://download.docker.com

color () {

    RES_COL=60

    MOVE_TO_COL="echo -en \\033[${RES_COL}G"

    SETCOLOR_SUCCESS="echo -en \\033[1;32m"

    SETCOLOR_FAILURE="echo -en \\033[1;31m"

    SETCOLOR_WARNING="echo -en \\033[1;33m"

    SETCOLOR_NORMAL="echo -en \E[0m"

    echo -n "$1" && $MOVE_TO_COL

    echo -n "["

    if [ $2 = "success" -o $2 = "0" ] ;then

        ${SETCOLOR_SUCCESS}

        echo -n $"  OK  "

    elif [ $2 = "failure" -o $2 = "1"  ] ;then

        ${SETCOLOR_FAILURE}

        echo -n $"FAILED"

    else

        ${SETCOLOR_WARNING}

        echo -n $"WARNING"

    fi

    ${SETCOLOR_NORMAL}

    echo -n "]"

    echo

}

prepare () {

    if [ ! -e docker-${DOCKER_VERSION}.tgz ];then

        #wget ${URL}/docker-ce/linux/static/stable/x86_64/docker-${DOCKER_VERSION}.tgz

        wget ${URL}/docker-ce/linux/static/stable/x86_64/docker-${DOCKER_VERSION}.tgz

    fi

    [ $? -ne 0  ] && { echo "文件下载失败"; exit; }

}

install_docker () {

    tar xf docker-${DOCKER_VERSION}.tgz -C /usr/local/

    cp /usr/local/docker/* /usr/local/bin/

    cat > /lib/systemd/system/docker.service <<-EOF

[Unit]

Description=Docker Application Container Engine

Documentation=https://docs.docker.com

After=network-online.target firewalld.service

Wants=network-online.target

[Service]

Type=notify

# the default is not to use systemd for cgroups because the delegate issues still

# exists and systemd currently does not support the cgroup feature set required

# for containers run by docker

ExecStart=/usr/local/bin/dockerd -H unix://var/run/docker.sock

ExecReload=/bin/kill -s HUP \$MAINPID

# Having non-zero Limit*s causes performance problems due to accounting overhead

# in the kernel. We recommend using cgroups to do container-local accounting.

LimitNOFILE=infinity

LimitNPROC=infinity

LimitCORE=infinity

# Uncomment TasksMax if your systemd version supports it.

# Only systemd 226 and above support this version.

#TasksMax=infinity

TimeoutStartSec=0

# set delegate yes so that systemd does not reset the cgroups of docker containers

Delegate=yes

# kill only the docker process, not all processes in the cgroup

KillMode=process

# restart the docker process if it exits prematurely

Restart=on-failure

StartLimitBurst=3

StartLimitInterval=60s

[Install]

WantedBy=multi-user.target

EOF

    systemctl daemon-reload

}

config_docker () {

    mkdir -p /etc/docker

    tee /etc/docker/daemon.json <<-'EOF'

    {

      "registry-mirrors": ["https://docker.m.daocloud.io","https://docker.1panel.live","https://docker.1ms.run","https://docker.xuanyuan.me"],

      "insecure-registries": ["harbor.wang.org"]

     }

EOF

    #systemctl restart docker

}

start_docker (){

    systemctl enable --now docker

    docker version && color "Docker 安装成功" 0 ||  color "Docker 安装失败" 1

}

config_docker_completion () {

    wget -P /etc/bash_completion.d http://www.wangxiaochun.com:8888/testdir/docker/docker_completion

    #source /etc/bash_completion.d/docker_completion

}

prepare

install_docker

config_docker

start_docker

config_docker_completion

# 执行安装脚本

[root@rock9-12 ~]# bash install_docker_offline.sh

1.1 Ubuntu2404安装Docker

Ubuntu2404安装Docker


apt install -y docker.io

1.2 代码编译

1、使用vscode工具打开scaffold-demo文件夹,按ctrl+j组合键打开终端视图

2、修改环境变量

cmd
SET CGO_ENABLED=0
SET GOOS=linux
SET GOARCH=amd64

验证


echo CGO_ENABLED=%CGO_ENABLED%

echo GOOS=%GOOS%

echo GOARCH=%GOARCH%

3、windows电脑方式进行编译,会在scaffold-demo文件夹下面生成一个名为demo的二进制文件


go build -o demo main.go

编译完成后,还原windows环境


SET CGO_ENABLED=1

SET GOOS=windows

SET GOARCH=amd64

4、将名为demo的二进制文件上传到linux服务器上并测试运行


[root@rock9-12 ~]# chmod +x demo

[root@rock9-12 ~]# ./demo

[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.

[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.

 - using env:   export GIN_MODE=release

 - using code:  gin.SetMode(gin.ReleaseMode)

{"file":"C:/zq/宽哥/云原生全栈开发/云原生开发-Go、Gin入门到项目实战/课程笔记/Day014-Go项目容器化部署上线/Day015-Go项目容器化部署上线-代码/scaffold-demo/utils/logs/logs.go:11","func":"scaffold-demo/utils/logs.Info","level":"info","msg":"启动程序成功","time":"2025-05-18 13:40:23"}

[GIN-debug] GET    /debug/routes             --> main.main.func1 (4 handlers)

[GIN-debug] POST   /api/auth/login           --> scaffold-demo/controllers/auth.Login (4 handlers)

[GIN-debug] GET    /api/auth/logout          --> scaffold-demo/controllers/auth.Logout (4 handlers)

[GIN-debug] [WARNING] You trusted all proxies, this is NOT safe. We recommend you to set a value.

Please check https://pkg.go.dev/github.com/gin-gonic/gin#readme-don-t-trust-all-proxies for details.

[GIN-debug] Listening and serving HTTP on :8080

5、linux服务器上编写Dockerfile并进行构建镜像


[root@rock9-12 ~]# vim Dockerfile

FROM registry.cn-hangzhou.aliyuncs.com/abroad_images/alpine:3.9-tomcat

COPY demo ./

ENTRYPOINT ./demo

#构建镜像

[root@rock9-12 ~]# docker build -t registry.cn-hangzhou.aliyuncs.com/abroad_images/demo:v1 .

1.3 部署启动

1、使用docker利用上面的镜像启动


[root@rock9-12 ~]#

docker run -itd --name demo -p 8080:8080 -e LOG_LEVEL=info -e USERNAME=<encrypted-credential> -e PASSWORD=<encrypted-credential> -e GIN_MODE=release registry.cn-hangzhou.aliyuncs.com/abroad_images/demo:v1

验证


[root@rock9-12 ~]# ss -lntup | grep 8080

tcp   LISTEN 0      4096         0.0.0.0:8080      0.0.0.0:*    users:(("docker-proxy",pid=31183,fd=7))

tcp   LISTEN 0      4096            [::]:8080         [::]:*    users:(("docker-proxy",pid=31190,fd=7))

2、查看启动容器的日志


[root@rock9-12 ~]# docker logs -f demo

{"file":"logs.go","func":"scaffold-demo/utils/logs.Info","level":"info","msg":"启动程序成功","time":"2025-05-18 06:36:02"}

3、使用Postman工具进行POST请求测试,模拟登录,观察到测试成功

填写Uri内容:http://your-service-host:8080/api/auth/login后,选择【Body】-【raw】

填写json内容后,点击【Send】

{
    "username": "<encrypted-credential>",
    "password": "<encrypted-credential>"
}

image-20250518141125868

Postman工具回显内容如下

{
    "status": 200,
    "message": "登录成功",
    "data": {
        "token": "<your-jwt-token>"
    }
}

二、使用K8s容器化部署Go语言微服务

1、定义名为demo-deploy.yaml配置文件

[root@rock9-12 ~]# vim demo-deploy.yaml
# deployment.yam
apiVersion: apps/v1
kind: Deployment
metadata:
  name: demo
  labels:
    app: demo
spec:
  replicas: 1
  selector:
    matchLabels:
      app: demo
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
  template:
    metadata:
      labels:
        app: demo
    spec:
      affinity: {}
      containers:
      - name: demo
        image: registry.cn-hangzhou.aliyuncs.com/abroad_images/demo:v1
        lifecycle: {}
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 8080
          name: web
          protocol: TCP
        resources:
          limits:
            cpu: "1"
            memory: "1024Mi"
          requests:
            cpu: "200m"
            memory: "256Mi"
        env:
        - name: TZ
          value: Asia/Shanghai
        - name: LANG
          value: C.UTF-8
        - name: GIN_MODE
          value: release
        - name: LOG_LEVEL
          value: info
        - name: PASSWORD
          value: <encrypted-credential>
        - name: USERNAME
          value: <encrypted-credential>
        livenessProbe:
          failureThreshold: 2
          initialDelaySeconds: 10
          periodSeconds: 10
          successThreshold: 1
          tcpSocket:
            port: 8080
          timeoutSeconds: 2
        readinessProbe:
          failureThreshold: 2
          initialDelaySeconds: 10
          periodSeconds: 10
          successThreshold: 1
          tcpSocket:
            port: 8080
          timeoutSeconds: 2
---
# service.yaml
apiVersion: v1
kind: Service
metadata:
  labels:
    app: demo
  name: demo
spec:
  type: NodePort
  selector:
    app: demo
  ports:
  - protocol: TCP
    port: 8080
    targetPort: 8080
    nodePort: 30080

2、创建应用


[root@k8s-master01 ~]# kaf demo-deploy.yaml

验证


#查看svc和deploy

[root@k8s-master01 ~]# kg svc,deploy demo

NAME           TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE

service/demo   NodePort   10.108.134.151   <none>        8080:30080/TCP   51s

NAME                   READY   UP-TO-DATE   AVAILABLE   AGE

deployment.apps/demo   1/1     1            1           51s

#查看pod

[root@k8s-master01 ~]# kgp | grep demo

demo-74df6877b7-96gz2          1/1     Running   0             3m58s

#查看pod日志信息

[root@k8s-master01 ~]# k logs -f demo-74df6877b7-96gz2

{"file":"logs.go","func":"scaffold-demo/utils/logs.Info","level":"info","msg":"启动程序成功","time":"2025-05-18 07:05:05"}

{"file":"logs.go","func":"scaffold-demo/utils/logs.Info","level":"info","msg":"开始验证登录信息","time":"2025-05-18 07:06:44","密码":"<encrypted-credential>","用户名":"<encrypted-credential>"}

{"file":"logs.go","func":"scaffold-demo/utils/logs.Info","level":"info","msg":"登录成功","time":"2025-05-18 07:06:44","用户名":"<encrypted-credential>"}

[GIN] 2025/05/18 - 07:06:44 | 200 |     286.331µs |  192.168.32.128 | POST     "/api/auth/login"

3、使用Postman工具进行POST请求测试,模拟登录,观察到测试成功

填写Uri内容:http://your-k8s-node:30080/api/auth/login后,选择【Body】-【raw】

填写json内容后,点击【Send】

{
    "username": "<encrypted-credential>",
    "password": "<encrypted-credential>"
}

image-20250518150719623

Postman工具回显内容如下

{
    "status": 200,
    "message": "登录成功",
    "data": {
        "token": "<your-jwt-token>"
    }
}

4、资源还原


[root@k8s-master01 ~]# k delete -f  demo-deploy.yaml

© 版权声明
THE END
喜欢就支持一下吧
点赞5 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容