Tars-K8SFramework离线部署
简介:
K8SFramework是Tars基金会中的一个子项目,致力于将K8s与Tars微服务框架深度融合,可以同时使用TarsWeb和K8S控制台(如Kubesphere,等)来管理微服务。本文主要介绍如何实现K8SFramework离线部署。
一、环境准备
- 安装了Dokcer环境,v20.10.8
- 安装了k8s环境,v1.19.8
- 安装了helm3
- 操作系统Debian 10(这是我的安装环境,也可以是其他Linux)
二、搭建本地仓库
您可以使用 Harbor 或者其他任意私有镜像仓库。本教程以 Docker 仓库作为示例,并使用自签名证书(如果您有自己的私有镜像仓库,可以跳过这一步)。
使用自签名证书
执行以下命令生成您自己的证书:
mkdir -p certsopenssl req \
-newkey rsa:4096 -nodes -sha256 -keyout certs/domain.key \
-x509 -days 36500 -out certs/domain.crt
当您生成自己的证书时,请确保在字段 Common Name
中指定一个域名(必须!)。例如,本示例中该字段被指定为 dockerhub.kubekey.local,如下图:
启动 Docker 仓库
docker run -d \--restart=always \--name registry \-v "$(pwd)"/certs:/certs \-v /home/dockerRegistry:/var/lib/registry \-e REGISTRY_HTTP_ADDR=0.0.0.0:443 \-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \-e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \-p 443:443 \registry:2
注意:
Docker 使用
/var/lib/docker
作为默认路径来存储所有 Docker 相关文件(包括镜像)。建议您添加附加存储卷,给/var/lib/docker
挂载至少 100G(根据业务需要)。或者您可以通过修改/etc/docker/daemon.json文件,来修改Docker文件的存储路径。
配置仓库
1、在 /etc/hosts
中添加一个条目,将主机名(即仓库域名;在本示例中是dockerhub.kubekey.local
)映射到您机器的私有 IP 地址,如下所示:
# docker registry
172.20.10.8 dockerhub.kubekey.local
2、执行以下命令,复制证书到指定目录,并使 Docker 信任该证书。
mkdir -p /etc/docker/certs.d/dockerhub.kubekey.localcp certs/domain.crt /etc/docker/certs.d/dockerhub.kubekey.local/ca.crt
说明:
证书的路径与域名相关联。当您复制路径时,如果与上面设置的路径不同,请使用实际域名。
当然,您也可以通过修改客户端docker配置来实现仓库访问,即修改 /etc/docker/daemon.json,添加如下行:
"insecure-registries": ["dockerhub.kubekey.local"],
截图:
3、要验证私有仓库是否有效,您可以先复制一个镜像到您的本地机器,然后使用 docker push
和 docker pull
来测试。
也可以执行如下命令进行测试:
root@node-1:/home/parallels/soft# curl --ssl --cacert `pwd`/certs/domain.crt https://dockerhub.kubekey.local/v2/_catalog
{"repositories":[]}
会以json格式返回仓库中的内容。上述结果说明仓库是空的。
镜像导入后,得到的结果如下图:
三、镜像导入
镜像拉取
需要下载K8SFramework相关镜像,然后导入到本地仓库(https://dockerhub.kubekey.local中)。
镜像包括:
##k8s-crd镜像
docker pull tarscloud/tarscontroller:latest
docker pull tarscloud/tarsagent:latest##tars-k8s framework镜像
docker pull tarscloud/tars.tarsconfig:latest
docker pull tarscloud/tars.tarsimage:latest
docker pull tarscloud/tars.tarskevent:latest
docker pull tarscloud/tars.tarslog:latest
docker pull tarscloud/tars.tarsnode:latest
docker pull tarscloud/tars.tarsnotify:latest
docker pull tarscloud/tars.tarsproperty:latest
docker pull tarscloud/tars.tarsqueryproperty:latest
docker pull tarscloud/tars.tarsquerystat:latest
docker pull tarscloud/tars.tarsregistry:latest
docker pull tarscloud/tars.tarsstat:latest
docker pull tarscloud/tars.tarsweb:latest
docker pull tarscloud/tars.cppbase:latest
###如果启用es作为日志收集器,就需要拉取这个镜像
docker pull tarscloud/tars.elasticsearch:latest##编译环境的镜像,包含了所有语言
docker pull tarscloud/base-compiler:latest ##其他语言运行环境镜像,按需下载
docker pull tarscloud/tars.javabase:latest
docker pull tarscloud/tars.nodejsbase:latest
docker pull tarscloud/tars.php74base:latest
注意:
下载的镜像版本一定要保持一致!
由于这个项目较新,更新很频繁,有时版本差了0.0.1也会导致运行异常。可以统一把lastest修改成你想下载的版本(同时也需要修改helm包中的版本)。
如果版本不一致,可能会产生如下错误:
Error: failed pre-install: warning: Hook pre-install tarsframework/templates/tars-frameworkconfig.yaml failed: admission webhook "validating.crd.tars.io-0" denied the request: unsupported validating CREATE v1beta2.TFrameworkConfig
root@node-1:/home/parallels#
root@node-1:/home/parallels#
我第一次部署时tarscontroller是最新版的,Framework是1.2.5版本。对比了下tarscontroller源码,在最新版本中已经把CREATE/UPDATE/DELETE TFrameworkConfig 给去掉了。所以大家要引以为戒,一定要拉齐版本!
这里再吐槽一下:镜像很大,总共加起来超过12G。
镜像导入本地仓库
可以手动retag镜像,然后导入到上一步骤创建的仓库中,如:
docker tag tarscloud/tarscontroller:latest dockerhub.kubekey.local/tarscloudtarscontroller:latestdocker push dockerhub.kubekey.local/tarscloudtarscontroller:latest
也可以使用下面这个脚本,批量导入:
./retag-and-push.sh -l images-list.txt -r dockerhub.kubekey.local
参数说明:
-l:镜像列表文件
-r: 镜像仓库地址
脚本内容如下:
#!/usr/bin/env bashregistryurl=""func() {echo "Usage:"echoecho " $0 [-l IMAGES-LIST] [-r PRIVATE-REGISTRY] "echoecho "Description:"echo " -l IMAGES-LIST : text file with list of images."echo " -r PRIVATE-REGISTRY : target private registry:port."echo " -h : usage message"echo echo "Examples:"echoecho "retag-and-push.sh -l images-list.txt -r dockerhub.kubekey.local"exit
}while getopts 'bsl:r:d:v:h' OPT; docase $OPT inb) binary="true";;l) ImagesList="$OPTARG";;r) Registry="$OPTARG";;h) func;;?) func;;*) func;;esac
doneif [ -n "${Registry}" ]; thenregistryurl=${Registry}
fiif [[ -n ${registryurl} ]]; thenfor image in $(<${ImagesList}); doif [[ ${image} =~ ^\#\#.* ]]; thencontinuefiurl=${image%%/*}ImageName=${image#*/}echo $imageif [ $url == $registryurl ]; thenif [[ $ImageName != */* ]]; thenimageurl=$registryurl"/library/"$ImageNameelseimageurl=$imagefielif [ "$(echo $url | grep ':')" != "" ]; thenimageurl=$registryurl"/library/"$imageelseimageurl=$registryurl"/"$imagefi## push imageecho $imageurldocker tag $image $imageurldocker push $imageurldone
fi
image-list.txt文件的内容就是镜像列表,可以如下:
tarscloud/base-compiler:latest
tarscloud/tarsagent:latest
tarscloud/tarscontroller:latest
tarscloud/tars.cppbase:latest
tarscloud/tars.elasticsearch:latest
tarscloud/tars.javabase:latest
tarscloud/tars.nodejsbase:latest
tarscloud/tars.php74base:latest
tarscloud/tars.tarsconfig:latest
tarscloud/tars.tarsimage:latest
tarscloud/tars.tarskevent:latest
tarscloud/tars.tarslog:latest
tarscloud/tars.tarsnode:latest
tarscloud/tars.tarsnotify:latest
tarscloud/tars.tarsproperty:latest
tarscloud/tars.tarsqueryproperty:latest
tarscloud/tars.tarsquerystat:latest
tarscloud/tars.tarsregistry:latest
tarscloud/tars.tarsstat:latest
tarscloud/tars.tarsweb:latest
镜像准备好后,就可以按照官方文档安装K8SFramework了。
四、K8SFramework安装
准备安装节点
需要对节点打标签,让Tars相关服务可以部署到上面。
kubectl label nodes node-1 node-2 tars.io/node.tars-dev=
其中,node-1、node-2是主机名, tars-dev 是目标 namespace。
如果要在其他 namespace 中部署tars框架,如 tars-dev2,就可以按照如下命令打标签:
kubectl label nodes node-1 node-2 tars.io/node.tars-dev2=
给支持LocalPV的节点打标签
K8SFramework提供了本地存储方案,需要通过给节点设置标签来启用。在node-1和node-2上都启用LocalPV:
kubectl label nodes node-1 node-2 tars.io/SupportLocalVolume=
可以看到,LocalPV只跟节点关联,不依赖命名空间。
安装tarscontroller
这个步骤中会安装tarscontroller和tarsagent到k8s中。
1、添加helm远程仓库
helm repo add tars-k8s https://tarscloud.github.io/K8SFramework/charts
2、拉取helm安装包到本地
helm pull tars-k8s/tarscontroller
成功后,当前目录下会有这个文件:
tarscontroller-1.2.0.tgz
3、安装controller
需要提前修改values.yaml中的仓库地址(版本号按需修改,建议不动),如下:
注意:
registry这里,一定要到 tarscloud 目录中!
然后执行安装:
##重新打包
helm package tarscontroller##安装
helm install tarscontroller tarscontroller-1.2.0.tgz
当然,我们也可以直接传入参数进行安装,如下:
helm install tarscontroller --set 'helm.dockerhub.registry=dockerhub.kubekey.local/tarscloud' tarscontroller-1.2.0.tgz
安装成功之后,会在k8s中看到tarscontroller和tarsagent已经启动了:
root@node-1:/home/parallels# kubectl get pods -n tars-system -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
tars-agent-92x9c 1/1 Running 0 2m34s 10.233.69.127 node-2 <none> <none>
tars-agent-w5kjv 1/1 Running 0 2m33s 10.233.112.145 node-1 <none> <none>
tars-controller-manger-848d948d48-mjsmn 1/1 Running 0 3m55s 10.233.69.123 node-2 <none> <none>
4、创建 secret
创建 secret ,指定命名空间为 tars-dev2:
kubectl create secret docker-registry tars-image-secret -n tars-dev2 --docker-server=dockerhub.kubekey.local --docker-username=docker_user --docker-password=docker_pass
官方文档中对参数的解释是:
# 建立 k8s 访问 镜像仓库时使用的 secret
# docker_registry 是您的镜像仓库地址
# docker_user 是您的镜像仓库访问账号
# docker_pass 是您的镜像仓库访问密码
# 如果您没有镜像仓库, 可以暂时填充一个域名占位, 比如 example.com/tars
# 如果您的镜像仓库无需账号密码访问, 可以使用任意账号/密码占位, 比如 docker_user/docker_pass
我们建的仓库没有账号密码,所以这里只修改了命名空间和仓库地址两项:
-n tars-dev2
--docker-server=dockerhub.kubekey.local
其余参数默认不变。
5、安装tarsframework
安装tarsframework到tars-dev2的命名空间中:
helm install tarsframework -n tars-dev2 --set 'helm.dockerhub.registry=dockerhub.kubekey.local/tarscloud,dockerRegistry=dockerhub.kubekey.local/tarsservice,web=web.k8s-tars.com' tarsframework-1.3.1.tgz
参数说明:
#指定tarsframework的镜像仓库
helm.dockerhub.registry=dockerhub.kubekey.local/tarscloud#指定业务服务的镜像仓库
dockerRegistry=dockerhub.kubekey.local/tarsservice#指定tarsweb的域名,随便写
web=web.k8s-tars.com
这里的参数跟(tarsframework-1.3.1.tgz中的)values.ymal文件是一一对应的,如下:
注意:
tarsframework镜像仓库的地址,一定要写到tarscloud目录!即dockerhub.kubekey.local/tarscloud
到这里,不出意外的话你已经完成了tarsframework的安装。正常情况下Pod状态:
6、开启tarsweb
这时候,tarsweb并不可以直接访问,需要修改一些配置。这里只介绍其中一种方式,其他方式参考原文。我们需要执行下面的指令,修改 tserver/tarsweb.spec.k8s.hostNetwork 值为 true:
kubectl edit tserver -n tars-dev2 tars-tarsweb
之后,我们就可以通过 http://$(ip):3000 访问tarsweb管理平台了!
K8S版本的TarsWeb跟原生的TarsWeb区别比较大,后续我们再慢慢研究~
五、异常处理
1、清理 tars-system 空间(和tarscontroller)
如果tarscontroller安装时出现异常,想重新安装,需要清理所有资源,整理如下:
#删掉tars-system下的所有资源(包括namespace)##删除ns
kubectl delete ns tars-system##删除strageclass
kubectl delete sc tars-storage-class##删除clusterRole
kubectl delete ClusterRole tars-system:tars-agent-image-downloader
kubectl delete ClusterRole tars-system:tars-controllerkubectl delete clusterrolebinding tars-system:tars-controller tars-system:tars-agent-local-provisioner tars-system:tars-agent-image-downloader##继续删
kubectl delete MutatingWebhookConfiguration tars-mutating-webhook
kubectl delete ValidatingWebhookConfiguration tars-validating-webhook
你以为到这里就结束了?NO!如果这时你重新安装tarscontroller,会报错:
Error: cannot re-use a name that is still in use
这是由于helm的release列表还没有清理。
##可以先查看
helm list -n tars-system
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
tarscontroller default 1 2022-05-26 21:24:37.634303236 +0800 CST deployed tarscontroller-1.2.0 v1beta2 ##需要删除
helm delete tarscontroller -n tars-system##删除之后再安装
helm install tarscontroller tarscontroller-1.2.0.tgz
2、清理tarsframework的空间
K8SFramework可以将不同的tars集群安装到不同的namespace中。如果我们发现安装集群时出现错误,怎么办?
我在首次安装时(安装到tars-dev空间),由于tarsframework的仓库地址填写错了(没有写目录 tarscloud),导致拉取不到镜像。这时,我们可以快速搭建一个新的集群,把namespace更换成tars-dev2,即可。
如果想把失败的tars-dev删掉,怎么办?直接删除ns:
root@node-1:/home/parallels# kubectl delete ns tars-dev
namespace "tars-dev" deleted
这个过程中会删除tars-dev2空间下的Pod、配置、磁盘挂载信息。
但是还有一些tarsweb的认证信息没有删除。如果想重建账号体系(注意:此步骤非必须),还需要删除下面这些资源:
##删除clusterRole
root@node-2:/home/parallels# kubectl delete ClusterRole tars-dev:tars-tarsweb
clusterrole.rbac.authorization.k8s.io "tars-dev:tars-tarsweb" deleted
root@node-2:/home/parallels# kubectl delete ClusterRole tars-dev:tars-tarskevent
clusterrole.rbac.authorization.k8s.io "tars-dev:tars-tarskevent" deleted
root@node-2:/home/parallels# ##删除clusterrolebinding
root@node-2:/home/parallels# kubectl delete clusterrolebinding tars-dev:tars-tarsweb tars-dev:tars-tarskevent
clusterrolebinding.rbac.authorization.k8s.io "tars-dev:tars-tarsweb" deleted
clusterrolebinding.rbac.authorization.k8s.io "tars-dev:tars-tarskevent" deleted
root@node-2:/home/parallels#
到此,tars-dev这个空间才算完全清理干净。tars-dev这个名称可以重新使用了。
写在最后
注意事项
总体来说,安装过程中除了镜像比较大之外,没有其他特别需要吐槽的。大家需要格外注意以下几点:
- tarscontroller和tarsframework镜像的版本要一致
- 使用本地仓库时,仓库地址一定要到tarscloud目录
- 重建tarscontroller时,必须删除所有tars-system的相关资源,否则会重建失败
使用感受
推荐大家通过本地镜像来部署,可以缩短拉取镜像的耗时,提升部署效率。
这种tars与k8s融合的部署方式比原生的部署方式要简便许多,但学习成本也很高,你需要了解k8s、docker、helm、Tars... 如果团队已经具备基础环境了,在官方文档完善的情况下还是推荐选择这种方式来部署。
原生Tars大家可以放心大胆的在生产环境中使用,但是K8SFramework还需要时间验证。
Tars-K8SFramework离线部署相关推荐
- 【内网福音】如何离线部署Rancher
2019独角兽企业重金招聘Python工程师标准>>> 对于在公司内网环境中.无法访问互联网的用户而言,离线安装部署Rancher是解决问题的关键.本文是Rancher离线部署教程, ...
- Python 进阶 — 创建本地 PyPI 仓库与 Python 程序的离线部署
目录 文章目录 目录 创建本地 PyPI 仓库 安装 pypiserver 上传 Python 安装包 使用私有 PyPI 仓库 Python 程序的离线部署 pip download 获取必须的 P ...
- EdgeGallery — AIO 离线部署 v1.5 版本
目录 文章目录 目录 前言 资源配置 软件版本 Pre Installation 安装配置文件解析 hosts-aio var.yml password-var.yml Installation Po ...
- Node服务一键离线部署
背景说明 项目测试通过,到了上线部署阶段.部署的机器安全限制比较严格,不允许访问外网.此外,没有对外网开放ssh服务,无法通过ssh远程操作. 针对上面提到的两条限制条件,通过下面方式解决: 无法访问 ...
- centos离线部署gitlab
centos离线部署gitlab 有的时候因为工作环境需要,不能够连接互联网.而我们工作时又需要使用git进行合作开发,这时就需要在内网部署一个git服务端. 1.下载依赖软件包 yum instal ...
- CentOS系统自动下载RPM包及其所有依赖的包(离线部署)
前几天我尝试去创建一个仅包含我们经常在 CentOS 7 下使用的软件的本地仓库.当然,我们可以使用 curl 或者 wget 下载任何软件包,然而这些命令并不能下载要求的依赖软件包.你必须去花一些时 ...
- 《ArcGIS Runtime SDK for Android开发笔记》——(5)、基于Android Studio构建ArcGIS Android开发环境(离线部署)...
1.前言 在上一篇的内容里我们介绍了基于Android Studio构建ArcGIS Runtime SDK for Android开发环境的基本流程,流程中我们采用的是基于Gradle的构建方式,在 ...
- jar k8s 自己的 部署_微服务架构 - 离线部署k8s平台并部署测试实例
一般在公司部署或者真实环境部署k8s平台,很有可能是内网环境,也即意味着是无法连接互联网的环境,这时就需要离线部署k8s平台.在此整理离线部署k8s的步骤,分享给大家,有什么不足之处,欢迎指正. 1. ...
- .Net Core3.1 Centos离线部署
由于生产环境无法链接外网,只能通过离线部署的方式安装.Net Core Runtime 1.ASP.Net Core Runtime 安装 1.1我们使用微软提供的离线安装包进行安装.首先下载tar. ...
最新文章
- Machine Learning | 机器学习简介
- NLP领域最近比较火的Prompt,能否借鉴到多模态领域?一文跟进最新进展
- 运维学习之进程的定义及其命令的使用
- 【DotNetMLLearn】.NET Core人工智能系列-概述
- nosql的数据服务_使用NoSQL实现实体服务–第1部分:概述
- java项目 建文件夹_java创建文件夹
- opencv mat赋值_【3】OpenCV图像处理模块(18)重映射
- dedesmc 手机端生成静态页
- CCNA初学者应该知道的词
- 医疗大数据可能面临的挑战
- 自己动手实现一个简单的 IOC,牛皮!!
- 深信服智安全 SCSA---1
- 短信接口怎么对接?看完这篇文章你就知道了!
- 待业在家的6个月,我靠淘宝月入百万:你看不起的行业,往往很赚钱
- [转帖]VBS 教程
- 国外的大龄程序员在干什么?
- iOS 应用崩溃日志分析
- MATLAB与DSP(C6657)的TCP/IP通信实现
- KERMIT,XMODEM,YMODEM,ZMODEM传输协议小结【转】
- 浅谈移动端页面性能优化方案
热门文章
- vue热敏打印机_vue h5+app蓝牙打印小票
- CruiseControl简介
- python分位数函数,Python解释数学系列——分位数Quantile
- 国际象棋棋盘有64格,若在第1格放1粒谷;第2格放2粒谷;第3格放4粒谷;第4格放8粒谷……如此一直放到第n格(n小于等于64)。假设2000000粒谷有一吨重,问需要多少吨谷才能存满n格?
- 简单使用visio画时序图
- C型DIN标准电磁阀插头,3针或4针接线,插针距8mm
- HTML5期末大作业:鲜花网站设计——网上鲜花网页设计(5页) HTML+CSS+JavaScript 期末作业HTML代码...
- 移动端支付界面制作(小兔鲜项目)
- Surface Pro X 系统恢复
- 成功不是偶然,追求极致方能超越他人