如何经过 JumpServer 堡垒机管控 Kubernetes 集群

提出一个问题每每比解决一个更重要。-- 爱因斯坦

1. 跳转原理

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

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

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

2. K8S跳转

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

2.1 简单的网络架构图

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

2.2 构建POD的IMAGE

按以上原理,构建中间跳转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

2.3 在K8S集群中部署

有了中间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链接的地址了。架构

2.4 配置JumpServer

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

更多文章可直接访问我的BLOG:GitDiG.comssh

相关文章
相关标签/搜索