提出一个问题每每比解决一个更重要。-- 爱因斯坦
Jumpserver是个好东西,特别是对于线上设备的管控,基本跳转原理以下图所示。详细的系统设计,能够参考其文档linux
http ssh [user] <---------> [jumpserver] <----------> [remote machine]
然而,随着kubernetes
的普及,愈来愈多的线上服务采用了kubernetes
集群部署。如何经过Jumpserver
原理进行kubernetes
集群管控就是本文要解决的问题。git
kubernetes
的管控原理,和管控远程机器的原理基本相似。只是须要在集群内部部署一个持久的POD, 针对 Jumpserver
该POD可以提供 SSHD
服务,其次该POD内部应该自带 kubectl
工具。github
http ssh /------------------------------------------------\ [user] <---------> [jumpserver] <----------> | [kubectl pod] <=> [ kubernetes resource ] | \------------------------------------------------/
按以上原理,构建中间跳转POD的IMAGE。具体Dockerfile
以下:centos
FROM sickp/centos-sshd:latest #安装kubectl RUN curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl RUN chmod +x ./kubectl RUN mv ./kubectl /usr/local/bin/kubectl #提供默认的ssh key RUN usermod -p "!" root ADD id_rsa /root/.ssh/id_rsa ADD id_rsa.pub /root/.ssh/id_rsa.pub RUN cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys
按此Dockerfile请提早准备好对应的ssh key
。并将次IMAGE推送的本身的Docker Registry
中。api
有了中间POD的IMAGE,部署具体的K8S服务很简单。具体定义文件,参考如下manifest
定义:bash
apiVersion: apps/v1 kind: StatefulSet metadata: name: jump labels: app: jump spec: 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: v1 kind: ServiceAccount metadata: name: jump imagePullSecrets: - name: <YOUR-PULL-SECRET> --- apiVersion: v1 kind: Service metadata: name: jump spec: type: LoadBalancer selector: app: jump ports: - name: ssh port: 22 targetPort: ssh protocol: TCP
注意替换相应的集群参数配置。从定义文件中能够看出,中间POD是以LoadBalancer
的方式对外提供服务的。须要查出具体的外网服务IP。网络
$: kubectl get service | grep jump jump LoadBalancer [内网IP] [外网IP] 22:30525/TCP 75d
该[外网IP]就是JumpServer
链接的地址了。架构
JumpServer
中的配置和普通的远程主机配置基本一至,再也不赘述了。app
更多文章可直接访问我的BLOG:GitDiG.comssh