TarsCloud K8SFrameWork 每次发布都会有相同版本号的 Controller 和 Framework 两个 Helm Chart
版本号格式为: “主版本号.次版本号.修订号-附注说明”.
为了直观说明安装、升级 “Controller”,”Framework” 时的兼容性情况, 我们制定了基于版本号的兼容性规则:
你在执行各项升降级操作前,请先执行如下兼容性检查,
不兼容的升级可能造成您的业务服务中断,业务数据丢失
您可以选择如下一种方式:
您可以在 github 查看和下载 Helm Chart,包名分别为 tarscontroller-${vesion}.tgz,tarsframework-${version}.tgz
Helm Repo
您可以 添加 tars-k8s repo, 然后在需要时通过 helm 指令获取
helm repo add tars-k8s https://tarscloud.github.io/K8SFramework/charts # 添加 tars-k8s repo helm repo update tars-k8s # 更新 tars-k8s repo 索引 helm search repo tars-k8s -l # 查看 tars-k8s repo 索引
源码构建
您可以参考 «构建»文档, 从源码构建 Helm Chart
您可以执行如下指令查看当前安装了哪些 Framework 版本
helm list -f tarsframework -A
您可以看到如下输出:
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
tarsframework tars 1 2022-06-01 11:09:09.034451845 deployed tarsframework-1.3.2 v1beta3
CHAT 参数即代表了您已安装的 Framework 版本
您可以执行如下指令查看当前安装了哪些 Controller 版本
helm list -f tarscontroller -A
您可以看到如下输出:
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
tarscontroller default 1 2022-06-01 11:09:09.034451845 deployed tarscontroller-1.3.2 v1beta3
CHAT 参数即代表了您已安装的 Controller 版本
如果您是通过 “直接下载” 或者 “源码构建” 方式获取的 Helm Chart, 执行如下指令:
# 您需要将 ${version} 替换成实际 版本号
helm upgrade tarscontroller tarscontroller-${version}.tgz
如果您是通过 Helm Repo 方式获取 Helm Chart, 执行如下指令:
# 您需要将 ${version} 替换成实际 版本号
helm repo update tars-k8s # 更新 tars-k8s repo 索引
helm search repo tars-k8s -l # 查看 tars-k8s repo 索引
helm upgrade tarscontroller tars-k8s/tarscontroller --version=${version}
操作后,您可以使用如下命令查看 Controller 启动详情, 如果操作报错,请参考 «升级Controller常见问题»
kubectl get pods -n tars-system -o wide
我们列举了在升级 Controller 过程中常见故障,您可以参照处理
“cannot convert int64 to float64” 错误
此错误为低版本(<=1.19.15) Kubernetes bug 导致, 此错误也意味着您无法再次使用 helm 执行 upgrade controller 操作,建议您尽快升级集群版本(>=1.19.16), 你也可以参照如下说明执行升级:
# "直接下载" 或者 "源码构建" 方式获取的 Helm Chart: helm install tarscontroller charts/tarscontroller-${version}.tgz --dry-run | kubectl apply --validate=false -f - # helm Repo 方式获取 Helm Chart, 执行如下指令: helm install tarscontroller tars-k8s/tarscontroller --version=${version} --dry-run | kubectl apply --validate=false -f -
如果得到如下输出,表示升级成功 (忽略最后一行 error)
namespace/tars-system unchanged serviceaccount/tars-agent unchanged serviceaccount/tars-controller unchanged configmap/tars-agent unchanged storageclass.storage.k8s.io/tars-storage-class unchanged customresourcedefinition.apiextensions.k8s.io/taccounts.k8s.tars.io unchanged customresourcedefinition.apiextensions.k8s.io/tconfigs.k8s.tars.io unchanged customresourcedefinition.apiextensions.k8s.io/tendpoints.k8s.tars.io unchanged customresourcedefinition.apiextensions.k8s.io/texitedrecords.k8s.tars.io unchanged customresourcedefinition.apiextensions.k8s.io/tframeworkconfigs.k8s.tars.io unchanged customresourcedefinition.apiextensions.k8s.io/tframeworkkey.k8s.tars.io unchanged customresourcedefinition.apiextensions.k8s.io/timages.k8s.tars.io unchanged customresourcedefinition.apiextensions.k8s.io/tplugins.k8s.tars.io unchanged customresourcedefinition.apiextensions.k8s.io/tservers.k8s.tars.io configured customresourcedefinition.apiextensions.k8s.io/ttemplates.k8s.tars.io unchanged customresourcedefinition.apiextensions.k8s.io/ttrees.k8s.tars.io unchanged clusterrole.rbac.authorization.k8s.io/tars-system:tars-agent unchanged clusterrole.rbac.authorization.k8s.io/tars-system:tars-controller unchanged clusterrolebinding.rbac.authorization.k8s.io/tars-system:tars-agent unchanged clusterrolebinding.rbac.authorization.k8s.io/tars-system:tars-controller unchanged role.rbac.authorization.k8s.io/tars-controller unchanged rolebinding.rbac.authorization.k8s.io/tars-controller unchanged service/tars-webhook-service unchanged daemonset.apps/tars-agent configured deployment.apps/tars-controller-manger unchanged mutatingwebhookconfiguration.admissionregistration.k8s.io/tars-mutating-webhook configured validatingwebhookconfiguration.admissionregistration.k8s.io/tars-validating-webhook unchanged error: unable to decode "STDIN": Object 'Kind' is missing in '{"HOOKS":null,"LAST DEPLOYED":"Mon Oct 31 17:01:58 2022","MANIFEST":null,"NAME":"tarscontroller","NAMESPACE":"default","REVISION":1,"STATUS":"pending-install","TEST SUITE":"None"}'
“missing key” 和 “missing name” 错误:
这是因为您之前手动安装过(kubectl apply ) CRD 资源对象,但这些 CRD 资源没有包含 Helm Chart 管理相关的标签和注解. 您可以执行如下指令,然后重试
#!/usr/bin/env bash ControllerName="tarscontroller" ControllerNameSpace="default" WithoutHelmTarsCrd=$(kubectl get crd -l '!app.kubernetes.io/managed-by' 2>/dev/null | grep 'k8s.tars.io' | awk '{print $1}') for CRD in "${WithoutHelmTarsCrd[@]}"; do kubectl label crd ${CRD} 'app.kubernetes.io/managed-by=Helm' --overwrite kubectl annotate crd ${CRD} "meta.helm.sh/release-namespace=${ControllerNameSpace}" "meta.helm.sh/release-name=${ControllerName}" --overwrite done
您可以执行如下指令查看当前安装的 Controller 版本
helm list -f tarscontroller -A
您可以看到如下输入内容:
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
tarscontroller tars-system 1 2022-06-01 11:09:09.034451845 deployed tarscontroller-1.3.2 v1beta3
CHART 值 即为当前已安装的 Controller 版本
新建 tarsframework.yaml 文件, 按说明填充值
# TarsCloud K8SFramework 内置了镜像编译服务,可以将您的原生程序包编译成 Docker镜像,请将您准备的镜像仓库地址填充到 upload.registry
# 如果您的镜像仓库地址需要账号密码认证,那就需要新建一个 Kubernetes docker-registry secret,并将 secret 名字填充到 upload.secret
# 新建 docker-registry secret 的指令为: kubectl create secret docker-registry ${secret-name} -n ${namespace} --docker-server=${registry} --docker-username=${user} --docker-password=${pass}
upload:
registry: ""
secret: ""
# 如果您的 Kubernetes 集群安装了 Ingress, 可以通过此域名访问 TarsCloud K8SFramework 管理平台
web: ""
如果您是通过 “直接下载” 或者 “源码构建” 方式获取的 Helm Chart, 请执行如下指令:
# 您需要将 ${namespace} 替换成实际 命名空间
# 您需要将 ${version} 替换成实际 版本号
helm upgrade tarsframework -n ${namespace} --create-namespace -f tarsframework.yaml tarsframework-${version}.tgz
如果您是通过 Helm Repo 方式获取 Helm Chart, 请执行如下指令:
# 您需要将 ${namespace} 替换成实际 命名空间
# 您需要将 ${version} 替换成实际 版本号
helm repo update tars-k8s # 更新 tars-k8s repo 索引
helm search repo tars-k8s -l # 查看 tars-k8s repo 索引
helm upgrade tarsframework -n ${namespace} --create-namespace -f tarsframework.yaml tars-k8s/tarsframework --version=${version}
您可以执行如下指令查看 Framework 服务的 Pod 启动状态:
kubectl get pods -n ${namespace} -o wide