Git Product home page Git Product logo

fist's Introduction

Build Status Go Report Card

                    __                        _____      __ 
   ________  ____ _/ /_  ____  ______        / __(_)____/ /_
  / ___/ _ \/ __ `/ / / / / / / / __ \______/ /_/ / ___/ __/
 (__  )  __/ /_/ / / /_/ / /_/ / / / /_____/ __/ (__  ) /_  
/____/\___/\__,_/_/\__, /\__,_/_/ /_/     /_/ /_/____/\__/  
                  /____/                                    

Fist = (One punch to solve everything)

  • A lightweight JWT User token creater. RBAC and PSP manager.
  • A powerful webterminal
  • Ldap support
  • Muti tenant namespace manager
  • Web yaml render

Install

cd deploy
sh init.sh
sh install.sh

Uninstall

kubectl delete ns sealyun
kubectl delete ns sealyun-tty
rm -rf /etc/kubernetes/pki/fist

and delete oidc config in kube-apiserver.yaml (/etc/kuberentes/manifests/kube-apiserver.yaml)

    - --oidc-issuer-url=https://fist.sealyun.svc.cluster.local:8443
    - --oidc-client-id=sealyun-fist
    - --oidc-ca-file=/etc/kubernetes/pki/fist/ca.pem
    - --oidc-username-claim=name
    - --oidc-groups-claim=groups

Auth

Create a kubernetes user token

README

Webterminal

terminal show

README

Templates

Render your yaml files quickly.

README

Contributing

Contributing guide

fist's People

Contributors

charnet1019 avatar cuisongliu avatar fanux avatar vimerr avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

fist's Issues

template从文件读取模板功能

从文件中读取template文件到内存中,以文件名作为key,value为文件内容.
默认模板目录 /etc/fist/templates

map[string]string

RBAC模块以及重构功能

新增rbac模块

主要功能负责用户相关的鉴权等功能

  1. 提供主要接口在authenticate.go 实现Authenticate 接口
  2. 提供用户实体类在user.go 的UserInfo 结构体

重构代码

  1. 操作k8s相关类在tools/k8s_(svc,ns,screts).go 中
  2. 统一日志使用 logger.INFO logger.ERROR
  3. 尽量使用gotest进行单元测试保证代码正确性
  4. 使用golint测试代码是否ok。在fist目录下执行 golint ./... 即可

pipeline功能

支持如k8s原生pipeline的功能。具体实现不定。 大概是可以在定义一个按钮,按钮下是用户自定的一个pipeline,用于解决一些复杂的流程编排。

用户管理,创建用户

  1. 实现一个http接口获取用户基本信息
POST /user
{
   name
   passwd
 ...
}
  1. 获取到之后为用户创建一个secret
  2. 用于用户登录时校验

token接口使用http

在auth中再起一个http服务(单独协程), 把token的handle直接放进去。

执行器设计

前端渲染好的模板需要执行,这的实现方式有几种:

  1. 把yaml文件传给后台,起一个临时的kubectl容器去执行 (效率低下,依赖变多)
  2. 解析yaml文件使用client-go,调用apiserver去创建对象。 其实这还是挺复杂的,基本每种对象都需要实现一遍,曾经有个项目就是基于这种方式实现的,虽然代码足够解耦,增加一种类型的object增加一个实现即可,但是还是偏复杂了,而且后续最好还是能支持CRD的创建。
  3. 参考kubectl的实现并复用其代码。

因为如这种中间带有---的yaml,其实是在kubectl这块做切分的

kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: admin
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin
  namespace: sealyun
  labels:
    kubernetes.io/cluster-service: "true"
   这个切分虽然不难,但是需要考虑一些细节,比如有时confimap里也有---应该如何处理。 这块代码我之前已经复用过kubectl里的函数进行处理了。

  但是切分完成后我们依然要根据kind判断去实例化一个object 然后调用client-go进行创建。 这里最好能复用kubectl的代码。

 fist相比kubectl更复杂的地方在于fist是多租户系统,client-set也需要根据租户的token 或者特定的kubeconfig字符串进行创建,这块实现我也已经做过:

ldap集成

type Authenticater interface {
       Authenticat(user, passwd string) *UserInfo //失败返回nil  成功返回用户信息
}

auth目录下新建ldap.go 实现该接口,再来个NewLdap函数

tty清理功能无效

切一个bug fix分支,修复这个bug。

  • 不需要每个terminal都创建一个协程
  • 主程序启动时创建一个tty清理线程即可,每隔10min清理一下 sealyun-tty namespace下的超时 tty

oidc增加prefix参数

部署时apiserver增加这两个参数

--oidc-username-prefix=“-”
--oidc-groups-prefix=“-”

修改部署脚本
不加用户名和组名会加很长一个前缀

RBAC模块的验证功能

新增用户时 name正则 防止新增screts时候报错
目前我感觉用于登录, 只允许英文字符即可。
用户信息增加 niceName,用于展示使用。
admin的niceName 固定为administrator

cmd 参数

在cmd/auth.go 增加参数功能
目前想到就是

  1. auth-type 默认password 包含选项 password/ldap
  2. ldap相关参数说明
  3. "/etc/fist/cert.pem", "/etc/fist/key.pem" 这俩证书地址也可以参数化

cmd/root.go 增加参数功能

  1. 增加端口参数 默认8080

还有什么好的想法可以这里再想一下。

获取终端列表

获取用户已打开存活状态的terminal列表。 否则前端用户切到别的页面再切回来就看不到之前已经打开的终端了

APP store功能

支持用户将mysql redis prometheus等等APP装到自己的namespace中。 可能需要依赖rook当作存储基础。

auth加admin账户与密码

  1. 安装时创建一个secrect fist-admin 里面包含admin账户与密码
  2. auth模块启动时去读取这个secrect,存在全局变量中,新建一个auth/admin.go中实现
  3. 实现一个接口,判断该用户是否是管理员
type Admin struct {
    Name string
    Passwd string
}
type Adminer interface {
      LoadSecret()
      IsAdmin(user string)
}

这个功能会用于fist前端管理员登录时的校验,管理员登录后会调用创建token的接口为管理员创建token,并绑定最高权限。

Namespace管理与PSP

管理员具有namespace创建 Quota,把namespace绑定给具体用户等权限,也需要给角色绑定PSP防止用户进行越权操作如挂载宿主机目录,启用特权模式,等。

CD部署安全优化与模板优化

http://plugins.drone.io/vallard/drone-kube/

vallard/drone-kube插件支持以下几个参数

    template: deployment.yaml
    namespace: mynamespace
    server: https://10.93.234.28:6433
    ca: k8scastring
    token: xxx

然后可以用模板让部署镜像的tag与构建的关联,在deployment.yaml里用 {{ build.tag }}
把kubeconfig放在代码里非常不安全。
然后就可以用drone的secret放server地址和token,解决CD时部署安全性问题

授权模块接口抽象

  1. 校验用户并创建token使用
  2. 校验过程目前通过ldap或者k8s secret去校验用户名密码是否正确

cant get group list from url

curl -k https://fist.sealyun.svc.cluster.local:8080/token?user=fanux&group=dev&group=test
groups := request.Request.URL.Query()["group"]

invalid bearer token

Unable to authenticate the request due to an error: [invalid bearer token, [invalid bearer token, oidc: verify token: failed to verify signature: failed to verify id token signature]]

是否可以删除 PrefixSvc , PrefixDeploy

func (t *Terminal) Create() error {
t.TerminalID =

//create tty deployment and service
return CreateTTYcontainer(t)

}
这里 t.TerminalID = DefaultNamespace + newUUID()
就不用到处加前缀了. 直接用 t.TerminalID 当参数即可

--cacert ca.pem not work in container

curl: (60) Peer's certificate has an invalid signature.
More details here: http://curl.haxx.se/docs/sslcerts.html

curl performs SSL certificate verification by default, using a "bundle"
 of Certificate Authority (CA) public keys (CA certs). If the default
 bundle file isn't adequate, you can specify an alternate file
 using the --cacert option.
If this HTTPS server uses a certificate signed by a CA represented in
 the bundle, the certificate verification probably failed due to a
 problem with the certificate (it might be expired, or the name might
 not match the domain name in the URL).
If you'd like to turn off curl's verification of the certificate, use
 the -k (or --insecure) option.

[root@iZj6cegflzze2l7fpcqoerZ deploy]# cat token.sh
curl https://fist.sealyun.svc.cluster.local:8080/token --cacert ssl/ca.pem

[TODO]新建工具类

在fist/terminal下新建工具类

  1. 创建utils.go 主要写相关k8s的工具类和其他的一些工具类
    暂定3个方法: CreateNamespace(clientset *kubernetes.Clientset)
    GetK8sClient(withoutToken bool)
    newUUID

Render 功能

帮助用户渲染yaml文件,实现类似helm的核心功能,但是不需要tiller这个服务端。 通过UI上填一些参数生成 deployment service configmap等配置,并可以运行

todo [Terminal]: 完善WithoutToken功能

在k8s环境下完善WithoutToken功能
做法:

  1. 在部署Terminal时候挂载kubeConfig文件。
  2. 在Terminal项目中加载器中的配置文件到Secrets 并绑定到ttyd的k8s-volume中。
    对于Terminal的请求参数新增KubeConfigPath参数 主要是绑定Terminal环境中配置文件的路径。这样可以做到多个Terminal使用不同的配置文件。
  3. 每新建一个TerminalID且WithoutToken=true的时候会自动创建新的Secrets(name为secrets+ t.TerminalID)
  4. Heartbeater定时扫描需要删除deploy时候同时删除对应的Secrets(name为secrets+ t.TerminalID)

webterminal访问入口

我下载的master分支并按照部署说明部署,请问,下面这个webterminal的访问入口是什么,通过fist和fist-terminal的nodeport端口都无法打开;通过Create a terminal可以访问并打开一个namespace为sealyun-tty下的pod,但是界面跟下图不同,看不到左侧功能菜单。

image

轮训检查terminal是否存活

每个terminal会起一个容器,多租户场景下用户连很多terminal就会创建很多容器,所以需要有一种机制去定时清理掉已经没有用户在用的terminal

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.