生产级Golang麻将游戏服务器 NanoServer 二次开发,利用Drone CI/CD打通DevOps上 K8S 迭代流程

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 生产级Golang麻将游戏服务器 NanoServer 二次开发,利用Drone CI/CD打通DevOps上 K8S 迭代流程

笔者已开源修改过(并附有完整 DevOps 流程)的源码:Hacker-Linner/nanoserver


熟悉 K8S 的伙伴也可以忽略此文,可以直接上手此项目的 DevOps!可以直接上手此项目的 DevOps!可以直接上手此项目的 DevOps!


相关 Dockerfile 文件准备



Dockerfile.base


准备项目在线 CI 构建基础 Image。


FROM golang:1.15-alpine
RUN go env -w GO111MODULE=on
RUN go env -w GOPROXY=https://mirrors.aliyun.com/goproxy/,direct
RUN mkdir -p /nanoserver/
WORKDIR /nanoserver
COPY go.mod go.mod
RUN go mod download


生成 Image hackerlinner/nanoserver:base


docker build -f Dockerfile.alpine.base -t hackerlinner/nanoserver:base . --no-cache


Dockerfile.alpine.base


准备项目生产基础 Image。


FROM alpine:3.12
RUN addgroup -S app \
    && adduser -S -g app app \
    && apk --no-cache add \
    ca-certificates curl netcat-openbsd


生成 Image hackerlinner/nanoserver-alpine:base


docker build -f Dockerfile.alpine.base -t hackerlinner/nanoserver-alpine:base . --no-cache


Dockerfile.prod


CI 生产构建所需的 Dockerfile


### nanoserver:base
FROM hackerlinner/nanoserver:base as builder
WORKDIR /nanoserver
COPY . .
RUN CGO_ENABLED=0 go build -a -o bin/nanoserver
### nanoserver-alpine:base
FROM hackerlinner/nanoserver-alpine:base
LABEL maintainer="为少"
WORKDIR /home/app
COPY --from=builder /nanoserver/bin/nanoserver .
COPY ./configs ./configs
RUN chown -R app:app ./
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' >/etc/timezone
USER app
CMD ["./nanoserver"]


相关 Kubernetes 部署文件准备



Helm 3 部署 MySql


相关部署文件在:k8s/mysql

首先在你的集群中分配部署空间,这里我是 nano


kubectl create ns nano


在你的持久化服务器分配文件夹,我这里用的是 NFS


# 分配 MySql 文件夹,持久化数据 
mkdir -p /data/nfs/nano/nanoserver-mysql
chmod -R 777 /data/nfs/nano/nanoserver-mysql


创建 PV & PVC,关联到 NFS

pvc.yaml:k8s/mysql/pvc.yaml


kubectl apply -f pvc.yaml -n nano


部署:


helm install nanoserver-mysql ./mysql -f values.yaml -n nano


数据库创建:

create database


mysql -u root -phacker12345
create database scmj default character set utf8mb4 collate utf8mb4_unicode_ci;


Helm 3 部署 nanoserver


相关部署文件在:k8s/mnanoserverysql

准备 nanoserver 的 configMap,让集群统一管理 Server 配置文件。


apiVersion: v1
kind: ConfigMap
metadata:
  name: nanoserver-config
  labels:
    app: nanoserver
data:
  config.toml: |-
    [core]
    # enable debug mode
    debug = true
    heartbeat = 30
    consume = "4/2,8/3,16/4" #房卡消耗, 使用逗号隔开, 局数/房卡数, 例如4局消耗1张, 8局消耗1张, 16局消耗2张, 则为: 4/1,8/1,16/2
    #WEB服务器设置
    [webserver]
    addr = "0.0.0.0:12307"                         #监听地址
    enable_ssl = false                            #是否使用https, 如果为true, 则必须配置cert和key的路径
    static_dir = "web/static"
    #证书设置
    [webserver.certificates]
    cert = "configs/****.crt"       #证书路径
    key = "configs/****.key"        #Key路径
    [game-server]
    host = "nanoserver.your-domain.com"
    port = 30251
    # Redis server config
    [redis]
    host = "127.0.0.1"
    port = 6357
    # Mysql server config
    [database]
    host = "nanoserver-mysql"
    port = 3306
    dbname = "scmj"
    password = "hacker12345"
    username = "root"
    args = "charset=utf8mb4"
    buf_size = 10
    max_idle_conns = 20
    max_open_conns = 15
    show_sql = true
    # 微信
    [wechat]
    appid = "YOUR_WX_APPID"
    appsecret = "YOUR_APP_SECRET"
    callback_url = "YOUR_CALLBACK"
    mer_id = "YOUR_MER_ID"
    unify_order_url = "https://api.mch.weixin.qq.com/pay/unifiedorder"
    #Token设置
    [token]
    expires = 21600                        #token过期时间
    #白名单设置
    [whitelist]
    ip = ["10.10.*", "127.0.0.1", ".*"]                 #白名单地址, 支持golang正则表达式语法
    #分享信息
    [share]
    title = "血战到底"
    desc = "纯正四川玩法,快捷便利的掌上血战,轻松组局,随时随地尽情游戏"
    #更新设置
    [update]
    force = true #是否强制更新
    version = "1.9.3"
    android = "https://fir.im/tand"
    ios = "https://fir.im/tios"
    #联系设置
    [contact]
    daili1 = "kefuweixin01"
    daili2 = "kefuweixin01"
    kefu1 = "kefuweixin01"
    #语音账号http://gcloud.qq.com/product/6
    [voice]
    appid = "xxx"
    appkey = "xxx"
    #广播消息
    [broadcast]
    message = ["系统消息:健康游戏,禁止赌博", "欢迎进入游戏"]
    #登陆相关
    [login]
    guest = true
    lists = ["test", "konglai"]


关于 ingressroute-tcp.yaml,因为 nanoserver 本身会启动两个服务器 webgame


apiVersion: traefik.containo.us/v1alpha1
kind: IngressRouteTCP
metadata:
  name: nanoserver-game-route
spec:
  entryPoints:
    - nanoserver-gm # 需要在 traefik 的部署配置中设置
  routes:
    - match: HostSNI(`*`)
      kind: Rule
      services:
        - name: nanoserver
          port: 30251


ingressroute-tcp.yamlgame 对外的入口,因为我用的是 traefik,所以需要它。


Drone CI/CD 配置



.drone.yml


kind: pipeline
type: kubernetes
name: NanoServer
steps:
  - name: 更新 Chart.yaml appVersion
    image: busybox
    commands:
      - echo $DRONE_COMMIT
      - '[ -n "$DRONE_COMMIT" ] && (
          sed -i "s/APP_VERSION/${DRONE_COMMIT}/g" k8s/nanoserver/nanoserver/Chart.yaml;
        )'
      - cat k8s/nanoserver/nanoserver/Chart.yaml
  - name: 构建 Docker Image
    image: plugins/docker
    settings:
      debug: true
      dockerfile: Dockerfile.prod
      repo: hub.your-domain.com/library/nanoserver
      tags: ${DRONE_COMMIT}
      registry: hub.your-domain.com
      username:
        from_secret: docker_user
      password:
        from_secret: docker_pass
  - name: 上云(HelmV3) -> K8S Cluster
    image: pelotech/drone-helm3
    settings:
      helm_command: upgrade
      chart: ./k8s/nanoserver/nanoserver
      release: nanoserver
      vaules_yaml: ./k8s/nanoserver/values.yaml
      namespace: nano
      api_server:
        from_secret: api_server
      kubernetes_token:
        from_secret: k8s_token
      skip_tls_verify: true
trigger:
  branch:
    - master


关于 api_serverk8s_token,玩过 kubernetes 的童鞋应该都知道,我就不赘述了。

微信图片_20220610234646.png

微信图片_20220610234630.png


相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
4月前
|
Kubernetes Devops 持续交付
DevOps实践:使用Docker和Kubernetes实现持续集成和部署网络安全的守护盾:加密技术与安全意识的重要性
【8月更文挑战第27天】本文将引导读者理解并应用DevOps的核心理念,通过Docker和Kubernetes的实战案例,深入探讨如何在现代软件开发中实现自动化的持续集成和部署。文章不仅提供理论知识,还结合真实示例,旨在帮助开发者提升效率,优化工作流程。
|
2月前
|
Prometheus Kubernetes 监控
k8s部署针对外部服务器的prometheus服务
通过上述步骤,您不仅成功地在Kubernetes集群内部署了Prometheus,还实现了对集群外服务器的有效监控。理解并实施网络配置是关键,确保监控数据的准确无误传输。随着监控需求的增长,您还可以进一步探索Prometheus生态中的其他组件,如Alertmanager、Grafana等,以构建完整的监控与报警体系。
128 60
|
2月前
|
Prometheus Kubernetes 监控
k8s部署针对外部服务器的prometheus服务
通过上述步骤,您不仅成功地在Kubernetes集群内部署了Prometheus,还实现了对集群外服务器的有效监控。理解并实施网络配置是关键,确保监控数据的准确无误传输。随着监控需求的增长,您还可以进一步探索Prometheus生态中的其他组件,如Alertmanager、Grafana等,以构建完整的监控与报警体系。
235 62
|
20天前
|
存储 监控 Devops
DevOps实践:持续集成/持续部署(CI/CD)的实战指南
DevOps实践:持续集成/持续部署(CI/CD)的实战指南
|
2月前
|
Kubernetes 持续交付 Docker
探索DevOps实践:利用Docker与Kubernetes实现微服务架构的自动化部署
【10月更文挑战第18天】探索DevOps实践:利用Docker与Kubernetes实现微服务架构的自动化部署
89 2
|
2月前
|
Devops jenkins 测试技术
DevOps实践:持续集成与持续部署(CI/CD)的实现之路
【9月更文挑战第33天】在软件开发的海洋中,DevOps是一艘能够加速航行、提升航程质量的巨轮。本文将作为你的航海图,指引你理解并实现DevOps文化中的核心环节——持续集成(CI)与持续部署(CD)。我们将从基础概念出发,逐步深入到实际操作,带你领略代码到部署的全过程。准备好扬帆起航,让我们共同探索如何通过自动化工具和流程优化,让软件交付变得既高效又可靠。
|
1月前
|
运维 安全 Devops
DevOps实践:持续集成与持续部署(CI/CD)的自动化之路
【10月更文挑战第22天】在软件交付的快速迭代中,DevOps文化和实践成为企业加速产品上市、保证质量和提升客户满意度的关键。本文将通过一个实际案例,深入探讨如何利用持续集成(Continuous Integration, CI)和持续部署(Continuous Deployment, CD)实现软件开发流程的高效自动化,包括工具选择、流程设计以及问题解决策略。我们将一起探索代码从编写到部署的全自动化旅程,揭示其对企业运维效率和产品质量所带来的深远影响。
|
3月前
|
监控 Devops 测试技术
DevOps实践: 持续集成和持续部署(CI/CD)的入门指南
【9月更文挑战第10天】在快速迭代的软件开发世界中,DevOps已经成为加速产品交付、提升软件质量和团队协作的关键策略。本文将深入浅出地介绍DevOps的核心组成部分——持续集成(Continuous Integration, CI)与持续部署(Continuous Deployment, CD)的基本概念、实施步骤以及它们如何革新传统的软件开发流程。你将学习到如何通过自动化工具简化开发流程,并理解为什么CI/CD是现代软件开发不可或缺的一环。
|
4月前
|
运维 Kubernetes Devops
阿里云云效操作报错合集之k8s直接返回401,该如何排查
本合集将整理呈现用户在使用过程中遇到的报错及其对应的解决办法,包括但不限于账户权限设置错误、项目配置不正确、代码提交冲突、构建任务执行失败、测试环境异常、需求流转阻塞等问题。阿里云云效是一站式企业级研发协同和DevOps平台,为企业提供从需求规划、开发、测试、发布到运维、运营的全流程端到端服务和工具支撑,致力于提升企业的研发效能和创新能力。
阿里云云效操作报错合集之k8s直接返回401,该如何排查
|
3月前
|
Devops jenkins Shell
DevOps实践:持续集成与持续部署(CI/CD)的探索之旅
【9月更文挑战第3天】在软件开发的世界里,DevOps已经成为了提升效率、加速产品迭代的关键。本文将深入浅出地探讨DevOps文化中的核心实践——持续集成(Continuous Integration,CI)和持续部署(Continuous Deployment,CD),并展示如何通过实际操作来优化开发流程。我们将一起踏上这段旅程,解锁自动化的魅力,让代码更流畅地转化为价值。