简介:

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这个名称可以重新使用了。


写在最后

注意事项

总体来说,安装过程中除了镜像比较大之外,没有其他特别需要吐槽的。大家需要格外注意以下几点:

  1. tarscontroller和tarsframework镜像的版本要一致
  2. 使用本地仓库时,仓库地址一定要到tarscloud目录
  3. 重建tarscontroller时,必须删除所有tars-system的相关资源,否则会重建失败

使用感受

推荐大家通过本地镜像来部署,可以缩短拉取镜像的耗时,提升部署效率。

这种tars与k8s融合的部署方式比原生的部署方式要简便许多,但学习成本也很高,你需要了解k8s、docker、helm、Tars... 如果团队已经具备基础环境了,在官方文档完善的情况下还是推荐选择这种方式来部署。

原生Tars大家可以放心大胆的在生产环境中使用,但是K8SFramework还需要时间验证。

Tars-K8SFramework离线部署相关推荐

  1. 【内网福音】如何离线部署Rancher

    2019独角兽企业重金招聘Python工程师标准>>> 对于在公司内网环境中.无法访问互联网的用户而言,离线安装部署Rancher是解决问题的关键.本文是Rancher离线部署教程, ...

  2. Python 进阶 — 创建本地 PyPI 仓库与 Python 程序的离线部署

    目录 文章目录 目录 创建本地 PyPI 仓库 安装 pypiserver 上传 Python 安装包 使用私有 PyPI 仓库 Python 程序的离线部署 pip download 获取必须的 P ...

  3. EdgeGallery — AIO 离线部署 v1.5 版本

    目录 文章目录 目录 前言 资源配置 软件版本 Pre Installation 安装配置文件解析 hosts-aio var.yml password-var.yml Installation Po ...

  4. Node服务一键离线部署

    背景说明 项目测试通过,到了上线部署阶段.部署的机器安全限制比较严格,不允许访问外网.此外,没有对外网开放ssh服务,无法通过ssh远程操作. 针对上面提到的两条限制条件,通过下面方式解决: 无法访问 ...

  5. centos离线部署gitlab

    centos离线部署gitlab 有的时候因为工作环境需要,不能够连接互联网.而我们工作时又需要使用git进行合作开发,这时就需要在内网部署一个git服务端. 1.下载依赖软件包 yum instal ...

  6. CentOS系统自动下载RPM包及其所有依赖的包(离线部署)

    前几天我尝试去创建一个仅包含我们经常在 CentOS 7 下使用的软件的本地仓库.当然,我们可以使用 curl 或者 wget 下载任何软件包,然而这些命令并不能下载要求的依赖软件包.你必须去花一些时 ...

  7. 《ArcGIS Runtime SDK for Android开发笔记》——(5)、基于Android Studio构建ArcGIS Android开发环境(离线部署)...

    1.前言 在上一篇的内容里我们介绍了基于Android Studio构建ArcGIS Runtime SDK for Android开发环境的基本流程,流程中我们采用的是基于Gradle的构建方式,在 ...

  8. jar k8s 自己的 部署_微服务架构 - 离线部署k8s平台并部署测试实例

    一般在公司部署或者真实环境部署k8s平台,很有可能是内网环境,也即意味着是无法连接互联网的环境,这时就需要离线部署k8s平台.在此整理离线部署k8s的步骤,分享给大家,有什么不足之处,欢迎指正. 1. ...

  9. .Net Core3.1 Centos离线部署

    由于生产环境无法链接外网,只能通过离线部署的方式安装.Net Core Runtime 1.ASP.Net Core Runtime 安装 1.1我们使用微软提供的离线安装包进行安装.首先下载tar. ...

最新文章

  1. Machine Learning | 机器学习简介
  2. NLP领域最近比较火的Prompt,能否借鉴到多模态领域?一文跟进最新进展
  3. 运维学习之进程的定义及其命令的使用
  4. 【DotNetMLLearn】.NET Core人工智能系列-概述
  5. nosql的数据服务_使用NoSQL实现实体服务–第1部分:概述
  6. java项目 建文件夹_java创建文件夹
  7. opencv mat赋值_【3】OpenCV图像处理模块(18)重映射
  8. dedesmc 手机端生成静态页
  9. CCNA初学者应该知道的词
  10. 医疗大数据可能面临的挑战
  11. 自己动手实现一个简单的 IOC,牛皮!!
  12. 深信服智安全 SCSA---1
  13. 短信接口怎么对接?看完这篇文章你就知道了!
  14. 待业在家的6个月,我靠淘宝月入百万:你看不起的行业,往往很赚钱
  15. [转帖]VBS 教程
  16. 国外的大龄程序员在干什么?
  17. iOS 应用崩溃日志分析
  18. MATLAB与DSP(C6657)的TCP/IP通信实现
  19. KERMIT,XMODEM,YMODEM,ZMODEM传输协议小结【转】
  20. 浅谈移动端页面性能优化方案

热门文章

  1. vue热敏打印机_vue h5+app蓝牙打印小票
  2. CruiseControl简介
  3. python分位数函数,Python解释数学系列——分位数Quantile
  4. 国际象棋棋盘有64格,若在第1格放1粒谷;第2格放2粒谷;第3格放4粒谷;第4格放8粒谷……如此一直放到第n格(n小于等于64)。假设2000000粒谷有一吨重,问需要多少吨谷才能存满n格?
  5. 简单使用visio画时序图
  6. C型DIN标准电磁阀插头,3针或4针接线,插针距8mm
  7. HTML5期末大作业:鲜花网站设计——网上鲜花网页设计(5页) HTML+CSS+JavaScript 期末作业HTML代码...
  8. 移动端支付界面制作(小兔鲜项目)
  9. Surface Pro X 系统恢复
  10. 成功不是偶然,追求极致方能超越他人