在Kubernetes上快速部署一套JumpServer堡垒机

在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就可以将应用部署到集群。

  1. 准备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!⎈
  1. 署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
  1. 署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,第一次登录,会强制要求修改密码

在Kubernetes上快速部署一个生产可用的JumpServer堡垒机_JumpServer_02

按提示修改完密码,即可使用修改后的密码进行登录

在Kubernetes上快速部署一个生产可用的JumpServer堡垒机_Kubernetes_03

总结

将JumpServer堡垒机搬到Kubernetes上,首先需要对Kubernetes有一定的了解,对JumpServer也要有一定了解。以上操作的所有相关资料参考均来自相关产品的官方网站。

GitHub地址:https://github.com/jumpserver/helm-charts

如果文章对您有帮助,还想了解更过关于k8s相关的实战经验,请微信扫描下方二维码关注“IT运维图谱”公众号或着通过微信搜一搜关注公众号。

在Kubernetes上快速部署一个生产可用的JumpServer堡垒机_JumpServer_04