在Kubernetes上快速部署一套JumpServer堡垒机
最近看到JumpServer堡垒机又出新版本了,目前最新版为v2.21.0,查看了官网更新日志,新版本中修复了不少bug,同时也增加了不少新功能。记录此篇博文的主要目的有两点:其一是为了体验新版本JumpServer的新功能,其二是为了熟练使用k8s云原生技术。
JumpServer部署方式
- 单机模式
单机部署是指所有的服务(包含数据库服务)都部署在一台虚拟机或者主机上。所有的数据没有备份,需要手动做好数据库的定期备份。此模式适用于一般开发测试环境。
- 主备模式
主备部署是指所有的服务(包含数据库服务)都采用主备模式进行部署。该模式能够保证节点故障自动切换,MySQL的主配置简单,故障恢复技术难度较低,一般适用于生产环境要求高可用,资产数量和并发数不多,故障无缝切换的场景。
- 集群模式
集群模式是基于主备模式基础上的升级版,是指所有的服务(包含数据库服务)均采用分布式进行部署,包含MySQL、Redis等。该模式一般适用于大规模资产场景、高并发要求的高性能场景、混合云/多DC/分支机构场景等。
- kubernetes模式
此种模式一般适用于用户拥有Kubernetes环境,或者是容器很多、业务庞大,存在困难的编排、管理和调度问题时也可以考虑通过Kubernetes部署来统一管理JumpServer。
在Kubernetes环境下部署JumpServer
Kubernetes部署的优劣势
- 优势
不再需要有专门的高可用方案,Kubernetes集群自身可以完美解决这点。扩容也不需要人工操作,Kubernetes Deployment的HPA可以解决。Kubernetes部署可以根据CPU、内存使用率等参数进行自动扩展。
- 劣势
需要对Kubernetes有一定了解,JumpServer的可用性依赖于Kubernetes集群,需要同时保障JumpServer和Kubernetes的可用性。
部署方案
- 存储方案
用的存储有CephFS、glusterfs、NFS等网络共享存储类型,本次部署采用ceph分布式存储解决方案。
- 网络方案
开源组件支持容器网络模型,包括Flannel、Calico等,本次环境k8s环境中使用Calico网络插件。
- 镜像仓库方案
在Kubernetes集群中,容器应用都是基于镜像启动的。在私有云环境下建议搭建私有云镜像库对镜像进行统一管理,在公有云环境中可以直接使用云服务商提供的镜像库。
部署环境简介
操作系统为CentOS7系统或者以上,CPU和内存推荐4Core、8GB或者以上,本环境kubernetes集群为一个master节点,9个work节点,存储选择ceph分布式存储。
组件 | 版本 |
Kubernetes | v1.20.4 |
JumpServer | v2.21.0 |
Docker | 19.03.9 |
部署步骤
a、准备kubernetes集群(略)
b、准备ceph存储,可参考我之前的博文Rook部署ceph分布式存储
c、部署Jumpserver堡垒机
在Kubernetes集群上部署应用的传统方式是创建各种资源类型YAML文件,但是对于一个复杂的工程部署起来会非常的麻烦,并且难以维护。此时我们可以使用Helm/Chart进行应用的安装。使用Helm/Chart的好处在于我们不必为每个应用程序手动编写单独的YAML文件,只需创建一个Helm Chart就可以将应用部署到集群。
- 准备Helm Chart
JumpServer官方已经提供了Chart文件,我们只需要将项目下载到本地,略做修改之后便可以使用。
# 添加jumpserver官方Chart仓库
[root@10-x-x-140 <sub>]# helm repo add jumpserver https://jumpserver.github.io/helm-charts
"jumpserver" has been added to your repositories
[root@10-x-x-140 </sub>]# helm repo list
NAME URL
stable http://mirror.azure.cn/kubernetes/charts/
bitnami https://charts.bitnami.com/bitnami
elastic https://helm.elastic.co
jumpserver https://jumpserver.github.io/helm-charts
# 更新Chart仓库
[root@10-x-x-140 ~]# helm repo update
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "elastic" chart repository
...Successfully got an update from the "stable" chart repository
...Successfully got an update from the "jumpserver" chart repository
...Successfully got an update from the "bitnami" chart repository
Update Complete. ⎈ Happy Helming!⎈
- 署mysql和redis
如果没有相当牛逼解决数据库问题的实力,数据库建议不要部署在k8s集群内部,本次为了方便,使用helm部署在k8s集群内。
# 部署mysql
[root@10-x-x-140 ~]# helm pull --untar bitnami/mysql
[root@10-x-x-140 ~]# cd mysql
[root@10-x-x-140 mysql]# kubectl create ns jms
[root@10-x-x-140 mysql]# helm install jms-mysql bitnami/mysql -n jms \
> --set global.storageClass=rook-cephfs \
> --set auth.rootPassword=Password@mysql \
> --set auth.database=jumpserver \
> --set auth.username=jumpserver \
> --set auth.password=Password@mysql
以上部署中的set设置的参数,也可以直接编辑values.yaml,对应进行修改,修改完后执行如下命令可以实现同样的部署效果:
[root@10-x-x-140 mysql]# helm install jms-mysql . -n jms
# 部署redis
[root@10-x-x-140 ~]# helm pull --untar bitnami/redis
[root@10-x-x-140 ~]# cd redis
[root@10-x-x-140 redis]# helm install jms-redis bitnami/redis -n jms \
> --set global.storageClass=rook-cephfs \
> --set auth.enabled=true \
> --set auth.password=Password@Redis
以上部署中的set设置的参数,也可以直接编辑values.yaml,对应进行修改,修改完后执行如下命令可以实现同样的部署效果:
[root@10-x-x-140 redis]# helm install jms-redis . -n jms
- 署jumpserver
[root@10-x-x-140 ~]# helm pull --untar jumpserver/jumpserver
[root@10-x-x-140 ~]# cd jumpserver
[root@10-x-x-140 jumpserver]# helm install jumpserver . -n jms \
> --set core.config.secretKey=GxrLH7rewfsRN8B9Zl6MEGD50Uou4LF6UV \
> --set core.config.bootstrapToken=ilR8RvAbK7lgRTxs \
> --set global.storageClass=rook-cephfs \
> --set externalDatabase.engine=mysql \
> --set externalDatabase.host=jms-mysql \
> --set externalDatabase.port=3306 \
> --set externalDatabase.user=jumpserver \
> --set externalDatabase.password=Password@mysql \
> --set externalDatabase.database=jumpserver \
> --set externalRedis.host=jms-redis-master \
> --set externalRedis.port=6379 \
> --set koko.service.type=NodePort \
> --set web.service.type=NodePort \
> --set externalRedis.password=Password@Redis
以上部署中的set设置的参数,也可以直接编辑values.yaml,对应进行修改,修改完后执行如下命令可以实现同样的部署效果:
[root@10-x-x-140 jumpserver]# helm install jumpserver . -n jms
<u>执行后helm install 后,等待应用创建完成,可通过 kubectl 查看 JumpServer 的资源状态</u>
[root@10-x-x-140 ~]# kubectl get pod,svc,pvc,ingress -n jms
NAME READY STATUS RESTARTS AGE
pod/jms-mysql-0 1/1 Running 0 10h
pod/jms-redis-master-0 1/1 Running 0 10h
pod/jms-redis-replicas-0 1/1 Running 0 10h
pod/jms-redis-replicas-1 1/1 Running 0 10h
pod/jms-redis-replicas-2 1/1 Running 0 10h
pod/jumpserver-jms-celery-7cb468b7bf-8cgnm 1/1 Running 0 10h
pod/jumpserver-jms-celery-7cb468b7bf-jbpqt 1/1 Running 0 10h
pod/jumpserver-jms-core-6b86cc6f9-5h2kb 1/1 Running 0 10h
pod/jumpserver-jms-core-6b86cc6f9-8dfpx 1/1 Running 0 10h
pod/jumpserver-jms-koko-64d7bd6cf9-nq4vs 1/1 Running 0 10h
pod/jumpserver-jms-lion-75df897477-hlmzl 1/1 Running 0 10h
pod/jumpserver-jms-magnus-7bd6b7845c-cf6xb 1/1 Running 0 10h
pod/jumpserver-jms-omnidb-84896885b5-5bjkz 1/1 Running 0 10h
pod/jumpserver-jms-web-54b565f67-c4vdd 1/1 Running 0 10h
pod/jumpserver-jms-web-54b565f67-cztxb 1/1 Running 0 10h
pod/jumpserver-jms-web-54b565f67-m7dcg 1/1 Running 0 10h
pod/jumpserver-jms-xrdp-d6c646f7-6zhfg 1/1 Running 0 10h
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/jms-mysql ClusterIP 10.0.0.80 <none> 3306/TCP 10h
service/jms-mysql-headless ClusterIP None <none> 3306/TCP 10h
service/jms-redis-headless ClusterIP None <none> 6379/TCP 10h
service/jms-redis-master ClusterIP 10.0.0.231 <none> 6379/TCP 10h
service/jms-redis-replicas ClusterIP 10.0.0.72 <none> 6379/TCP 10h
service/jumpserver-jms-core ClusterIP 10.0.0.166 <none> 8080/TCP,8070/TCP 10h
service/jumpserver-jms-koko NodePort 10.0.0.105 <none> 5000:30601/TCP,2222:32291/TCP 10h
service/jumpserver-jms-lion ClusterIP 10.0.0.206 <none> 8081/TCP 10h
service/jumpserver-jms-magnus ClusterIP 10.0.0.43 <none> 33060/TCP,33061/TCP,54320/TCP 10h
service/jumpserver-jms-omnidb ClusterIP 10.0.0.220 <none> 8082/TCP 10h
service/jumpserver-jms-web NodePort 10.0.0.194 <none> 80:31574/TCP 10h
service/jumpserver-jms-xrdp ClusterIP 10.0.0.118 <none> 3389/TCP 10h
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
persistentvolumeclaim/data-jms-mysql-0 Bound pvc-08fb36ca-4c56-4fd3-86bd-a34c13bfa490 8Gi RWO rook-cephfs 10h
persistentvolumeclaim/jumpserver-jms-core-data Bound pvc-3b31a3d9-1932-48db-8778-af48c6a12401 100Gi RWX rook-cephfs 10h
persistentvolumeclaim/jumpserver-jms-core-logs Bound pvc-2d2ad977-f0a5-4352-8adc-d54e84ea7804 100Gi RWX rook-cephfs 10h
persistentvolumeclaim/jumpserver-jms-koko-data Bound pvc-8346fc49-eb67-4ad5-81d0-55002a027dd9 10Gi RWX rook-cephfs 10h
persistentvolumeclaim/jumpserver-jms-lion-data Bound pvc-c64d9e0d-5a49-4f50-92d1-c112f2b76a2e 50Gi RWX rook-cephfs 10h
persistentvolumeclaim/jumpserver-jms-magnus-data Bound pvc-3794140d-d9cb-45fd-aec9-92fcfd2c19a6 10Gi RWX rook-cephfs 10h
persistentvolumeclaim/jumpserver-jms-omnidb-data Bound pvc-bb47fb19-dbb7-411c-8976-802f0c7f1bb1 10Gi RWX rook-cephfs 10h
persistentvolumeclaim/jumpserver-jms-web-logs Bound pvc-b5804aa1-e597-4910-821b-6a935656d650 1Gi RWX rook-cephfs 10h
persistentvolumeclaim/jumpserver-jms-xrdp-data Bound pvc-ca697a30-451e-426e-a584-ba6d1b7dce6a 50Gi RWX rook-cephfs 10h
persistentvolumeclaim/redis-data-jms-redis-master-0 Bound pvc-d6df15a1-33bb-4671-9875-30f713e8b15c 8Gi RWO rook-cephfs 10h
persistentvolumeclaim/redis-data-jms-redis-replicas-0 Bound pvc-22000313-c68f-4d58-b207-8b18f676c386 8Gi RWO rook-cephfs 10h
persistentvolumeclaim/redis-data-jms-redis-replicas-1 Bound pvc-3536b444-fd98-4450-9d36-44cf831211fe 8Gi RWO rook-cephfs 10h
persistentvolumeclaim/redis-data-jms-redis-replicas-2 Bound pvc-cf549b87-8bbc-4d56-b06b-e5e9b5a60d9a 8Gi RWO rook-cephfs 10h
NAME CLASS HOSTS ADDRESS PORTS AGE
ingress.networking.k8s.io/jumpserver-ingress <none> test.jumpserver.org 192.168.80.140,192.168.80.141,192.168.80.142,192.168.80.143,192.168.80.144,192.168.80.145,192.168.80.146,192.168.80.147,192.168.80.148,192.168.80.149 80 10h
从以上命令输出结果可以看出已成功部署完成。
可通过在浏览器中输入:http://NODE_IP:31574进行访问测试,或者输入http://test.jumpserver.org进行访问测试(需要先设置hosts解析)
初始用户名/密码:admin/admin,第一次登录,会强制要求修改密码
按提示修改完密码,即可使用修改后的密码进行登录
总结
将JumpServer堡垒机搬到Kubernetes上,首先需要对Kubernetes有一定的了解,对JumpServer也要有一定了解。以上操作的所有相关资料参考均来自相关产品的官方网站。
如果文章对您有帮助,还想了解更过关于k8s相关的实战经验,请微信扫描下方二维码关注“IT运维图谱”公众号或着通过微信搜一搜关注公众号。