Skip to the content.

如何调试

当服务部署在K8S集群中以后, 运维管理确实方便很多, 如何快速简单的调试是大的问题, 这里主要面临两个问题:

那么如果解决上述两个问题?

通过tarsweb来快速发布服务

K8S版本的也带了一个Tarsweb, 能够快速访问部署在K8S上的tars服务, 相关操作都可以通过该平台来完成.

你可以类似之前的Tars环境, 直接提交tgz包到web平台, web平台会调用tarsimage来打包生成docker镜像, 这样调试和发布方式可以和非K8S版本类似, 但是需要注意的是:

tars-tarsimage的configmap有两个参数:

kubectl create secret docker-registry od-image-secret -n tars-dev --docker-server=docker.io --docker-username=${docker_user} --docker-password=${docker_pass}  

类似之前的tarsweb, 也提供了上传tgz包的api.

cmake .. -D 指定以下三个参数:
TARS_K8S_WEB_HOST:         
TARS_K8S_BASE_IMAGE:       tarscloud/tars.cppbase
TARS_K8S_TOKEN:            

就可以通过:

make xxxx-k8s-upload

完成服务的发布

#!/bin/bash

TARS_K8S_WEB_HOST="http://xxx.xxx.xxx"
TARS_K8S_TOKEN=""
TARS_K8S_BASE_IMAGE="tarscloud/tars.nodejsbase"

APP=OD

TARGET=UserServer

TARGET_PATH=tmp/${TARGET}

mkdir -p tmp

echo "mkdir -p ${TARGET_PATH}"
mkdir -p ${TARGET_PATH}

echo "npm run build"
npm run build

echo "rm old build & copy new build"
rm -rf ${TARGET_PATH}/build
cp -rf build ${TARGET_PATH}/
echo "copy package.json"
cp package.json ${TARGET_PATH}/

cd ${TARGET_PATH}
echo "npm install --production"
npm install --production

cd ..

tar czf ${TARGET}.tgz ${TARGET}

echo "curl ${TARGET}.tgz to k8s"

curl ${TARS_K8S_WEB_HOST}/pages/k8s/api/upload_and_publish?ticket=${TARS_K8S_TOKEN} -Fsuse=@${TARGET}.tgz -Fapplication=${APP} -Fmodule_name=${TARGET} -Fserver_type=nodejs  -Fbase_image=${TARS_K8S_BASE_IMAGE} -Fcomment=upload

cd ..

说明:

这里和非K8S版本有一个重要区别是, tars-node-agent这里是没有打包的, 它打包在tarscloud/tars.nodejsbase镜像里面了, 而非K8S的版本, tars-node-agent会打包到源码中发布!!

在集群内部构建编译机器

对于第二点, 我们可以在考虑在集群内部构建编译Pod, 相当于一台虚拟机, 这样因为它就在K8S内部, 可以畅通无阻的访问任何K8S服务, 那调试起来肯定是最简单的!

如何能做到这个效果呢? 思路如下:

具体的yaml文件如下:

apiVersion: k8s.tars.io/v1beta1
kind: TServer
metadata:
  labels:
    tars.io/ServerApp: tars
    tars.io/ServerName: compiler
    tars.io/SubType: normal
  name: tars-compiler
  namespace: tars-dev
spec:
  app: tars
  server: compiler
  important: 3
  subType: normal
  normal:
    ports:
      - isTcp: true
        name: http
        port: 8080
  k8s:
    mounts:
      - mountPath: /data
        name: data
        readOnly: false
        source:
          tLocalVolume: {}
      - name: docker-sock
        source:
          hostPath:
            path: /var/run/docker.sock
            type: Socket
        mountPath: /var/run/docker.sock
    replicas: 1
  release:
    source: tars-compiler
    id: v-0000001
    image:
      tarscloud/base-compiler

说明:

使用步骤

部署tars-compiler

kubectl apply -f debug.yaml

容器在K8S启动以后, 容器内部的/data目录已经映射到宿主机的 /usr/local/app/tars/host-mount/tars-dev/tars.compiler/data

你可以进入容器开发服务了

kubectl exec -it tars-compiler-0 -n tars-dev -- bash

这时候服务可以连接集群中任何服务!主控地址为: tcp -h tars-tarsregistry -p 17890

注意进入容器/data目录开发!