Skip to content

Commit

Permalink
Merge pull request #7 from fanux/terminal
Browse files Browse the repository at this point in the history
Terminal
  • Loading branch information
cuisongliu authored Mar 9, 2019
2 parents 50acf21 + 5774ec2 commit b88887b
Show file tree
Hide file tree
Showing 11 changed files with 82 additions and 19 deletions.
5 changes: 3 additions & 2 deletions .drone.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,10 @@ steps:
- name: publish-fist
image: plugins/docker
settings:
repo: fanux/fist
repo: lameleg/fist
tags: ${DRONE_TAG=latest}
username: fanux
username:
from_secret: docker-hub-user
dockerfile: deploy/Dockerfile
password:
from_secret: docker-hub-pass
Expand Down
3 changes: 2 additions & 1 deletion auth/deploy/auth.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ spec:
spec:
containers:
- name: fist
image: fanux/fist:latest
image: lameleg/fist:latest
command: ["./fist", "auth"]
imagePullPolicy: Always
ports:
Expand Down Expand Up @@ -52,6 +52,7 @@ metadata:
namespace: sealyun
spec:
type: ClusterIP
clusterIP: 10.106.233.67
ports:
- name: fist
port: 8080
Expand Down
1 change: 1 addition & 0 deletions auth/deploy/install.sh
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,6 @@ sh gencert.sh
sleep 3
sh secret.sh
kubectl create -f auth.yaml
kubectl create -f secret.yaml
mkdir /etc/kubernetes/pki/fist/ || true
cp ssl/ca.pem /etc/kubernetes/pki/fist/
19 changes: 19 additions & 0 deletions deploy/config
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUN5RENDQWJDZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRFNU1ETXdPVEExTWpnd01sb1hEVEk1TURNd05qQTFNamd3TWxvd0ZURVRNQkVHQTFVRQpBeE1LYTNWaVpYSnVaWFJsY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTmFVCnlmVVpaTk9GUUI1WHErU3htclM0VzZERitnSlZJZ2p2bkRDcW5OcU9qMVk5M3g5SVVpWFRheHI5RkdlWDIxaksKTTFWd09SaEJUU1F1dXA5c2pmNHN2N05yTGloSEVreURIbjNITjdvVzVGUkVuMGVFUTRoczRHNVh6Q0hQd2VEagpUNncrUkpKTTVGQ2hhMFpVU3psQTVhREtCeExOSEVkY0tCOW1yVEZZTE9lazhtRVlGdE5rSjBvZmlLUTlhMjc3Ck8venQxbXZ1aEFqVWI4eEZacUEwUFBDa3VEVXpNUFBSOHl0ZExPbkZXWnNkL3JCWDN1ejl6bmJPcmZMU0FBM3kKSDJlN1gvZkV1QVRnTGRNQlQzOWtEOUxLT0dXWEtzOGpFaXBURWZWakNJZ2k4d0xHLzFUTUtJdlVsRHlKRzhmcgpJZzR4ZjB6enFjT2dGVHR1Ujc4Q0F3RUFBYU1qTUNFd0RnWURWUjBQQVFIL0JBUURBZ0trTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFMN3VZTmdLWjh6MEJPY1ZhbGNQSjJXZkdteGUKWjBYWkl6OUExRFFEcG5oSW5iWGNoaVhIRUdkc1ZNdzlncFFlWFRDVWlFdFEraGRyUzhzWUYvbVFiOVJRS2VvTApINE9sdUo3dm9OczRURk1ZRW5TSmdyV3RFSHV3RkRQKzMySXBNdnRRN1VScnJkRVFWdE1ObnJwNC94WEYzMXZ6CmFqMFlpWXBwUVhuNUg3Zy84d3c4MzNoRkVHZU9XTUxpdXFYYVg0U29KcVIwZzZSb2lja29UUE1PUlJyKytnOTkKOUoyOU1ZaGFLdGdYQjZNT1FYeEdvdW1uN3B2bVJFem9uSHhmT2dNQllRQk1YRzZQb2k0REswdUcyNWV0WGl4bgpyNlgwVFN3QU84Z1U1OCtQbEVaZWZ5TGllMmhnbFVsQjJ0cFVxNThIdmM2M0EvdTZPVzBKdmR5OTcxdz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=
server: https://fist.lameleg.com:6443
name: kubernetes
contexts:
- context:
cluster: kubernetes
user: kubernetes-admin
name: kubernetes-admin@kubernetes
current-context: kubernetes-admin@kubernetes
kind: Config
preferences: {}
users:
- name: kubernetes-admin
user:
client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM4akNDQWRxZ0F3SUJBZ0lJRXQ4akdmM1NJZkV3RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFR0ExVUUKQXhNS2EzVmlaWEp1WlhSbGN6QWVGdzB4T1RBek1Ea3dOVEk0TURKYUZ3MHlNREF6TURnd05USTRNRE5hTURReApGekFWQmdOVkJBb1REbk41YzNSbGJUcHRZWE4wWlhKek1Sa3dGd1lEVlFRREV4QnJkV0psY201bGRHVnpMV0ZrCmJXbHVNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXdjMW53aHpwR0hLalJXU3kKRHliUmtyV05vSWh4ODkzYytrcDF0YTk4eVp1a3NPS2c2djJIdVhYREZqNUNMRlIzQ3BlclVOT2liL1NwMkVKUwprZ0pldmZ0Zjh2Q21sQWVpRXlDcVg5ZUtIbTZTQ1kxMW1zTEFYb1lXT2Y4S00zd0RQeEkvZHEzcU5tZGkwZ291CkQ0K0hYMGQ1VFlFbk9SRy91L2t2VzJHTnp2M3hqUmZaVWhlVTZDTDNBc285dEFXRGw1R1NhNEt3aXpub3U4NTMKb1FEd0lJTkhrMFVsemJJY0E3QU1FNmRUQTlNZ0NldzNPaTJZUHgwcldtOWN2LytBaGJxSjBmdDRld1lIN01qMwpmRTNPRkRqTTNzM0h5QTNjVm5RZ2VWMWNBaEUvcE5IZ2pITUdBMnEvZjI5Y1YrbU9BUHB0ZUF2dFVrQWgzMUFRCmhiWWhNd0lEQVFBQm95Y3dKVEFPQmdOVkhROEJBZjhFQkFNQ0JhQXdFd1lEVlIwbEJBd3dDZ1lJS3dZQkJRVUgKQXdJd0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFKWG52YTlaUjFDQURYV2Z3MUE5V1V6RHduLzRkT1l2VEk2cQpuS1FCWkk4UU9mblR4OENKaG1JNWNjKzJsR3RnZWFqOVdBZEUwSmhUUlhuK1psOUVnMFZrZHpyeUFvUUZrSWljCmxCbGZaV010RUZmNnJNU1ltbEUrVXVFckVBbE50cmUvUmZDeHN5cUpONkZTb3ZYYmxOSkE3dUpBVFlteHRXL2IKQmZrd0NSQUVyVDQrQm1PZ01RMldpRmF4WHBqeG9tQVVDMWwveTZnTVczVDBXMlo1MzVhWnd0RTZaRzZEVDcvNApicFpKSFhDeUIyeDUyTENrSUhLMlM4bEYxYUwwKzBBbzNJWEdjeDVQVEpPMW9ZOG9Fb2JjSnZ3K3FZamJja0xvCnlGMG5rVzVobFlsbytBMDJaKzFPZ2RmSlh5Z2h6Y0ZGNGkvdkMzbUJtV0VvT1k1a2Zhaz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=
client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFcEFJQkFBS0NBUUVBd2MxbndoenBHSEtqUldTeUR5YlJrcldOb0loeDg5M2Mra3AxdGE5OHladWtzT0tnCjZ2Mkh1WFhERmo1Q0xGUjNDcGVyVU5PaWIvU3AyRUpTa2dKZXZmdGY4dkNtbEFlaUV5Q3FYOWVLSG02U0NZMTEKbXNMQVhvWVdPZjhLTTN3RFB4SS9kcTNxTm1kaTBnb3VENCtIWDBkNVRZRW5PUkcvdS9rdlcyR056djN4alJmWgpVaGVVNkNMM0Fzbzl0QVdEbDVHU2E0S3dpem5vdTg1M29RRHdJSU5IazBVbHpiSWNBN0FNRTZkVEE5TWdDZXczCk9pMllQeDByV205Y3YvK0FoYnFKMGZ0NGV3WUg3TWozZkUzT0ZEak0zczNIeUEzY1ZuUWdlVjFjQWhFL3BOSGcKakhNR0EycS9mMjljVittT0FQcHRlQXZ0VWtBaDMxQVFoYlloTXdJREFRQUJBb0lCQUVtZS9ndC9jQTBaZjJ5ZApGQWN0ZCsrRGlJbXpTNWFZY1ptakw1UVZWaEpBVGcva0I3MDlFcEloYWpySTY5cHJPODJLVUVva0cxRHNZSmtHCm1OZGVqeDhjbnhacTFOem5DV3E2dmY0cW93MXNjNDJ0YnorYk8vaXNkMFVRM1k4eFRRcG9wRE14WGdmTXZuMkwKNEhPSTBxUWZRclZ1bXJmVFJrTGlKbHRRYzg1dGdGYitVeFgxQUc0ZGUyOUlPYmFKVVowNDJuVWZlbWlXS1lxWgpFbEdIcFBPOUlSUFViNmtNWi91ZStlelNFWXhUV1hubG1wcXFWbml0L3h2R2FINFliZHhNbDZ0WHdLbFhUWDhvCllEWXFEb3RqaW90RFphSTVRWXlnSWRJaW11T3ZWeEtCblN1U0FsekJubzR6dExVZ0xLZWh1S1N1a1oycUlLSE0KcEJjZ0xBRUNnWUVBM0FMQ0cyUFQ3M3l6RTdHM29iZ0hWQUlxcTFCM1pQeDE5WHNOS1JzZGdzam1qNnhVVHBhawpzbWZReERveTNNL25taU45QjNuK0RseThpVW9XN1RyVHI5K1RiN2VwT2JiZFc1N25hRG5qUk50MVZweHQrd0hqCnErOHdIbmdDWEJidmM2OFpCaU1TZ1Z5VWkwTFBpVEJVYXpabEhsQU1mSW85NXNELzRhVmlKcGtDZ1lFQTRZRWkKb3IxN1dyR0x3a2ZTV2kvemtvOWZGMVVFNGkzYXpCYWNKK3BQYy9oKzQ5SDlUd1BDMzFObzdqb1NiQVRRejNpSwpuYVo0RlFwNXVhZW10Skw3VW1rQnR0QWdiM1JJV3lDVGxONUhtOEhLZWJvQk1Hc0htYU4yM0tLTFBHWVhVakZhCjZiM0pWMnVSSnVtRUo2RWRyRURrbTI0QzFLK3o3MUNGYmErVndhc0NnWUVBanJEM1JaNXNVVkgyTHhxL041TE0KcGU2MXorQmpYMHJpRW5GWmFzU2NVanVNVmJoMkFYWndvUWoxL0o2bWFGSXJLdXhEWmZyNERFYVhQUStoYVFFVApWR2pVRGN2M1pHZzJqdnF6cVFTS1l4bFdzL0xHM2RvdTJFOU1UU2FXbVRXQzNldTlkaDUvSFFsM2lnNnQzWk5MCjNURXRTZ2l1NElNa2ZLbkdDNG9nNjFrQ2dZRUF4SzhHVDUwbTN3YW1XSENlUnUwMTYrbkN6YTNvMFlHZktZeTYKN0pHUWRSMFRSNCthK1hUVlhrWDQ2bmVhSTc3YmhXbWt0VFpCM0ZCRHRTdEYybytzUnNleHFBckZqNUNEbjMrOQpXUVc2dlY1OFJFbDR5Z3RBR01BYlp2c2FxRFovTnNBM2hGRjFNQnR4QWRpQTNMUEpGcm1PNndZN3o5ZmovK0ppClRqWHNUM3NDZ1lBaXJCbm9tbmxiVlMzaFgvN1pTNnVkMVZrUUlod00wbkpuRFFNUTVrRjY5dGhiYXBuOVc1WHQKVDQ3R05IaHZUTWNKMjZqU0tMblllY25OQzlxMzRDdlB5Q2RLalNYMDNldG5zZXM0N2ZLNWpTazQvTHU0bmQyTQpRUEVtTUtwNkJPUzhkRDNPVWU1M0JtV2Q2ek9EbzRqMWhkYndCWnNQeWVaVXpPYllsSG0xM2c9PQotLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQo=
3 changes: 3 additions & 0 deletions deploy/install.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
cd ../auth/deploy && sh install.sh
echo "10.106.233.67 fist.sealyun.svc.cluster.local" >> /etc/hosts
cd - && cd ../terminal/deploy && kubectl create -f rbac.yaml && kubectl create -f deploy.yaml
2 changes: 2 additions & 0 deletions terminal/README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
# Kuberntes web terminal

[more imformations of terminal](https://sealyun.com/post/fist-terminal/)

![](./terminal.jpeg)

![](./show-terminal.png)
Expand Down
2 changes: 1 addition & 1 deletion terminal/deploy/deploy.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ spec:
serviceAccountName: admin
containers:
- name: fist-terminal
image: fanux/fist:latest
image: lameleg/fist:latest
command: ["./fist", "terminal"]
imagePullPolicy: Always
ports:
Expand Down
13 changes: 7 additions & 6 deletions terminal/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,28 +27,28 @@ func createTerminal(request *restful.Request, response *restful.Response) {
t := newTerminal()
err := request.ReadEntity(t)
if err != nil {
response.WriteError(http.StatusInternalServerError, err)
tools.ResponseError(response, err)
return
}

err = t.Create()
if err != nil {
response.WriteError(http.StatusInternalServerError, err)
tools.ResponseError(response, err)
return
}
response.WriteEntity(t)
tools.ResponseSuccess(response, t)
}

func handleHeartbeat(request *restful.Request, response *restful.Response) {
//get client of k8s
clientset, err := tools.GetK8sClient()
if err != nil {
response.WriteError(http.StatusInternalServerError, err)
tools.ResponseError(response, err)
return
}
tid := request.QueryParameter("tid")
if tid == "" {
response.WriteError(http.StatusInternalServerError, errors.New("the param tid is empty"))
tools.ResponseError(response, errors.New("the param tid is empty"))
return
}
namespace := request.QueryParameter("namespace")
Expand All @@ -59,9 +59,10 @@ func handleHeartbeat(request *restful.Request, response *restful.Response) {
hbInterface = NewHeartbeater(tid, namespace)
err = hbInterface.UpdateTimestamp(clientset)
if err != nil {
response.WriteError(http.StatusInternalServerError, err)
tools.ResponseError(response, err)
return
}
tools.ResponseSuccess(response, nil)
}

//Serve start a terminal server
Expand Down
16 changes: 8 additions & 8 deletions terminal/terminal.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,16 +34,16 @@ var (
//Terminal is
type Terminal struct {
//input field
User string
UserToken string
Apiserver string // just using default apiserver
Namespace string // the kubeconfig default context namespace
WithoutToken bool // if true, mount the kubeconfig file, using ttyd instead the start-terminal.sh
TTYKubeImage string //default is "fanux/fist-tty-tools:v1.0.0"
User string `json:"user,omitempty"`
UserToken string `json:"userToken,omitempty"`
Apiserver string `json:"apiServer,omitempty"` // just using default apiserver
Namespace string `json:"namespace,omitempty"` // the kubeconfig default context namespace
WithoutToken bool `json:"withoutToken,omitempty"` // if true, mount the kubeconfig file, using ttyd instead the start-terminal.sh
TTYKubeImage string `json:"ttyKubeImage,omitempty"` //default is "fanux/fist-tty-tools:v1.0.0"

//output append field
TerminalID string
EndPoint string
TerminalID string `json:"terminalID,omitempty"`
EndPoint string `json:"endPoint,omitempty"`
}

func newTerminal() *Terminal {
Expand Down
18 changes: 17 additions & 1 deletion tools/k8s.go
Original file line number Diff line number Diff line change
@@ -1,10 +1,15 @@
package tools

import (
"flag"
"k8s.io/api/core/v1"
apiv1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/rest"
"k8s.io/client-go/tools/clientcmd"
"k8s.io/client-go/util/homedir"
"path/filepath"
)

//GetK8sClient get a kubernetes in cluster clientset
Expand All @@ -15,7 +20,12 @@ func GetK8sClient() (*kubernetes.Clientset, error) {
)
config, err = rest.InClusterConfig()
if err != nil {
return nil, err
var kubeconfig = filepath.Join(homedir.HomeDir(), ".kube", "config")
flag.Parse()
config, err = clientcmd.BuildConfigFromFlags("", kubeconfig)
if err != nil {
return nil, err
}
}
// creates the clientSet
client, err := kubernetes.NewForConfig(config)
Expand All @@ -41,3 +51,9 @@ func CreateNamespace(client *kubernetes.Clientset, namespace string) error {
}
return nil
}

//GetSecrets
func GetSecrets(namespace string, name string, clientset *kubernetes.Clientset) (*v1.Secret, error) {
secret, err := clientset.CoreV1().Secrets(namespace).Get(name, metav1.GetOptions{})
return secret, err
}
19 changes: 19 additions & 0 deletions tools/response.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package tools

import "github.com/emicklei/go-restful"

type responseObject struct {
Message string `json:"message"`
Code int32 `json:"code"`
Data interface{} `json:"data"`
}

//ResponseSuccess
func ResponseSuccess(response *restful.Response, data interface{}) {
response.WriteEntity(responseObject{Code: 200, Message: "success", Data: data})
}

//ResponseError
func ResponseError(response *restful.Response, err error) {
response.WriteEntity(responseObject{Code: 500, Message: err.Error(), Data: ""})
}

0 comments on commit b88887b

Please sign in to comment.