1. 跳转原理

Jumpserver是个好东西,特别是对于线上设备的管控,基本跳转原理如下图所示。详细的系统设计,可以参考其文档

              http                       ssh    [user] <---------> [jumpserver] <----------> [remote machine]

然而,随着kubernetes的普及,越来越多的线上服务采用了kubernetes集群部署。如何通过Jumpserver原理进行kubernetes集群管控就是本文要解决的问题。

2. K8S跳转

kubernetes的管控原理,和管控远程机器的原理基本类似。只是需要在集群内部部署一个持久的POD, 针对 Jumpserver 该POD能够提供 SSHD 服务,其次该POD内部应该自带 kubectl 工具。

2.1 简单的网络架构图

              http                       ssh      /------------------------------------------------\    [user] <---------> [jumpserver] <---------->  |    [kubectl pod] <=> [ kubernetes resource ]   |                                                  \------------------------------------------------/      

2.2 构建POD的IMAGE

按以上原理,构建中间跳转POD的IMAGE。具体Dockerfile如下:

FROM sickp/centos-sshd:latest#安装kubectlRUN curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectlRUN chmod +x ./kubectlRUN mv ./kubectl /usr/local/bin/kubectl#提供默认的ssh keyRUN usermod -p "!" rootADD id_rsa /root/.ssh/id_rsaADD id_rsa.pub /root/.ssh/id_rsa.pubRUN cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys

按此Dockerfile请提前准备好对应的ssh key。并将次IMAGE推送的自己的Docker Registry中。

2.3 在K8S集群中部署

有了中间POD的IMAGE,部署具体的K8S服务很简单。具体定义文件,参考以下manifest定义:

apiVersion: apps/v1kind: StatefulSetmetadata:  name: jump  labels:    app: jumpspec:  serviceName: jump  replicas: 1  selector:    matchLabels:      app: jump  template:    metadata:      labels:        app: jump    spec:      imagePullSecrets:        - name: <YOUR-PULL-SECRET>      serviceAccountName: jump      containers:        - name: jump          image: <YOUR-POD-IMAGE>          ports:          - name: ssh            containerPort: 22---apiVersion: v1kind: ServiceAccountmetadata:  name: jumpimagePullSecrets:   - name: <YOUR-PULL-SECRET>---apiVersion: v1kind: Servicemetadata:  name: jumpspec:  type: LoadBalancer  selector:    app: jump  ports:    - name: ssh      port: 22      targetPort: ssh      protocol: TCP

注意替换相应的集群参数配置。从定义文件中可以看出,中间POD是以LoadBalancer的方式对外提供服务的。需要查出具体的外网服务IP。

$: kubectl get service | grep jumpjump      LoadBalancer   [内网IP]   [外网IP]   22:30525/TCP     75d

该[外网IP]就是JumpServer连接的地址了。

2.4 配置JumpServer

JumpServer中的配置和普通的远程主机配置基本一至,不再赘述了。

更多文章可直接访问个人BLOG:GitDiG.com