1,k8s admin dashboard

项目地址:
https://github.com/kubernetes/dashboard

项目使用的是golang 作为后端,然后使用angular 作为前段框架的。
项目依赖kubernetes 的api服务,不能单独跑起来。
参考之前写的 centos 安装 kubernetes 1.5 :
Centos7 安装 kubernetes 1.5 版本
详情:新智云(www.enncloud.cn

2,启动项目

beego 是个好东西,可将任何main 函数入口的都带起来并且可以实时的检查变化。
然后自动重启。我在使用beego 开发的时候手动启动的次数就很少。
非常的方便。

项目main函数在:
$GOPATH/src/github.com/kubernetes/dashboard/src/app/backend
doc 下面有很多的文档,讲如何将dashboard 启动起来。
启动的时候需要增加环境变量:

export KUBERNETES_SERVICE_HOST=127.0.0.1
export KUBERNETES_SERVICE_PORT=8080
go run dashboard.go

报错:
open /var/run/secrets/kubernetes.io/serviceaccount/token: no such file or directory

需要配置 ssl 调用kubernetes ,要有个密钥,同时需要token。
想想算了。还是使用http链接得了,反正也是个测试环境。
启用测试没有找到直接使用 http 链接:

func InClusterConfig() (*Config, error) {
host, port := os.Getenv("KUBERNETES_SERVICE_HOST"), os.Getenv("KUBERNETES_SERVICE_PORT")
if len(host) == 0 || len(port) == 0 {
return nil, fmt.Errorf("unable to load in-cluster configuration, KUBERNETES_SERVICE_HOST and KUBERNETES_SERVICE_PORT must be defined")
}

token, err := ioutil.ReadFile("/var/run/secrets/kubernetes.io/serviceaccount/" + api.ServiceAccountTokenKey)
if err != nil {
return nil, err
}
tlsClientConfig := TLSClientConfig{}
rootCAFile := "/var/run/secrets/kubernetes.io/serviceaccount/" + api.ServiceAccountRootCAKey
if _, err := certutil.NewPool(rootCAFile); err != nil {
glog.Errorf("Expected to load root CA config from %s, but got err: %v", rootCAFile, err)
} else {
tlsClientConfig.CAFile = rootCAFile
}

return &Config{
// TODO: switch to using cluster DNS.
Host: "https://" + net.JoinHostPort(host, port),
BearerToken: string(token),
TLSClientConfig: tlsClientConfig,
}, nil
}

修改成:

func InClusterConfig() (*Config, error) {
host, port := os.Getenv("KUBERNETES_SERVICE_HOST"), os.Getenv("KUBERNETES_SERVICE_PORT")
if len(host) == 0 || len(port) == 0 {
return nil, fmt.Errorf("unable to load in-cluster configuration, KUBERNETES_SERVICE_HOST and KUBERNETES_SERVICE_PORT must be defined")
}

_, err := ioutil.ReadFile("/var/run/secrets/kubernetes.io/serviceaccount/" + api.ServiceAccountTokenKey)
if err != nil {
fmt.Println("read file err: ", err)
}
tlsClientConfig := TLSClientConfig{}
rootCAFile := "/var/run/secrets/kubernetes.io/serviceaccount/" + api.ServiceAccountRootCAKey
if _, err := certutil.NewPool(rootCAFile); err != nil {
glog.Errorf("Expected to load root CA config from %s, but got err: %v", rootCAFile, err, tlsClientConfig)
}
return &Config{
// TODO: switch to using cluster DNS.
Host: "http://" + net.JoinHostPort(host, port),
}, nil
}

修改成http 即可。然后就可以启动了。

方式二:

设置KUBECONFIG=/etc/kubernetes/admin.conf的环境变量

config源自$HOME/.kube/config

cd $GOPATH/src/github.com/kubernetes/dashboard/src/app/backend
go run dashboard.go
Using HTTP port: 9090
Creating API server client for http://127.0.0.1:8080
Successful initial request to the apiserver, version: v1.5.2
Creating in-cluster Heapster client
Using service account token for csrf signing

查看 namespace :

curl 127.0.0.1:9090/api/v1/namespace
{
"listMeta": {
"totalItems": 2
},
"namespaces": [
{
"objectMeta": {
"name": "default",
"creationTimestamp": "2017-04-14T00:07:27Z"
},
"typeMeta": {
"kind": "namespace"
},
"phase": "Active"
},
{
"objectMeta": {
"name": "kube-system",
"creationTimestamp": "2017-04-14T00:07:27Z"
},
"typeMeta": {
"kind": "namespace"
},
"phase": "Active"
}
]
}

这个只是后端的部分,没有前端,前段是nodejs,不会。

3,项目的意义

admin dashboard 是一个非常好的demo。讲述如何调用kubernetes的 api。
如果一个企业需要使用 kubernetes 需要自己定制开发的话。
直接使用 kubernetes 的api 就行了。其实最重要的就是 直接调研 API。
都是做应用的底层的东西度没有时间经历去修改。
只能在外围做些定制化的开发。
但是看了代码才发现项目拆分的非常细。模块拆分的非常多。
而且前后端拆分的非常洗。

4,代码分析

入口就是 dashboard.Go
首先查看环境变量,或者是配置文件,查找 kubernetes api 地址。然后:
apiserverClient, config, err := client.CreateApiserverClient(*argApiserverHost, *argKubeConfigFile)
只有全部启动正确之后才行,否则会报错。

handler/apihandler.go
是主要的函数,路由配置。讲请求转换成 kubernetes client 接口调用。

剩下的就是最重要的各种资源:
cluster
common
config
configmap
container
daemonset
dataselect
deployment
discovery
event
horizontalpodautoscaler
ingress
job
limitrange
logs
metric
namespace
node
owner
persistentvolume
persistentvolumeclaim
pod
rbacrolebindings
rbacroles
replicaset
replicationcontroller
resourcequota
secret
service
statefulset
storageclass
thirdpartyresource
workload

这些资源都是使用 kubernetes 客户端进行调用的。同时都汇总到 apihandler.go 这个类当中。
返回给前端页面进行展示。

前端的入口是 index.html,然后加载资源,也是一堆的资源,每一个一个文件夹。
基本上和后端的资源都对齐了。前端使用 Angular module 将模块拆分成一个一个的。
按照模块化进行开发了。
真的是非常的细致。可惜看不到全局,整体的东西了。

BrowserSync (9090) —> Dashboard backend (9091) —> Kubernetes API server (8080)

前端的技术比较复杂,使用的SASS,ES6,Angular,最后都编译成一个单页面的ajax 应用。
作为我一个后端hold 不住了。只会点jQuery。

4,总结

kubernetes 真的是一个非常好的项目。
kubernetes自带的dashboard 使用的前后端拆分。后端有简单的业务逻辑。
前端使用nodejs 开发,用gulp 编译。使用ES6,+angular 开发。
要搭建一个简单的paas 平台的话,需要研究 kubernetes api。
底层的东西修改的很少主要是做应用写自己的业务逻辑。

gin-k8s 运行的问题的更多相关文章

  1. k8s运行容器之Job(四)--技术流ken

    Job 容器按照持续运行的时间可分为两类:服务类容器和工作类容器. 服务类容器通常持续提供服务,需要一直运行,比如 http server,daemon 等.工作类容器则是一次性任务,比如批处理程序, ...

  2. k8s运行容器之deployment(三)--技术流ken

    deployment 我们已经知道k8s是通过各种controller来管理pod的生命周期.为了满足不同业务场景,k8s开发了Deployment.ReplicaSet.DaemonSet.Stat ...

  3. K8s运行dashboard命令启动报错:"no endpoints available for service \"kubernetes-dashboard\""

    今天启动k8s dashboard的时候报错:"no endpoints available for service \"kubernetes-dashboard\"&q ...

  4. k8s运行容器之Job(四)

    Job 容器按照持续运行的时间可分为两类:服务类容器和工作类容器. 服务类容器通常持续提供服务,需要一直运行,比如 http server,daemon 等.工作类容器则是一次性任务,比如批处理程序, ...

  5. k8s运行容器之deployment(三)

    deployment 我们已经知道k8s是通过各种controller来管理pod的生命周期.为了满足不同业务场景,k8s开发了Deployment.ReplicaSet.DaemonSet.Stat ...

  6. k8s运行容器之Job应用(6)

    容器按照持续运行的时间可分为两类:服务类容器和工作类容器. 服务类容器通常持续提供服务,需要一直运行,比如 http server,daemon 等.工作类容器则是一次性任务,比如批处理程序,完成后容 ...

  7. Dapr + .NET Core实战(十-终篇)K8S运行Dapr

    工作原理 为了实现在k8s上安装Dapr,Dapr需要部署dapr-sidecar-injector.dapr-operator.dapr-placement和dapr-sentry服务. dapr- ...

  8. gin中运行多个服务

    运行服务的返回类型为 :http.Handler .gin.New(),gin.Default() 返回的就是此类型.使用&http.Server{....} 设置服务参数使用g.Go(fun ...

  9. 用 k8s 运行一次性任务 - 每天5分钟玩转 Docker 容器技术(132)

    容器按照持续运行的时间可分为两类:服务类容器和工作类容器. 服务类容器通常持续提供服务,需要一直运行,比如 http server,daemon 等.工作类容器则是一次性任务,比如批处理程序,完成后容 ...

  10. k8s 运行应用

    一.deployment 创建过程 kubect创建deployment —> deployment 创建ReplicaSet—>根据ReplicaSet 创建Pod 命名方式 relic ...

随机推荐

  1. 如何在 C# 程序中注入恶意 DLL?

    一:背景 前段时间在训练营上课的时候就有朋友提到一个问题,为什么 Windbg 附加到 C# 程序后,程序就处于中断状态了?它到底是如何实现的? 其实简而言之就是线程的远程注入,这一篇就展开说一下. ...

  2. 第十五章 部署zookeeper集群

    1.集群规划 主机名 角色 IP hdss7-11.host.com k8s代理节点1.zk1 10.4.7.11 hdss7-12.host.com k8s代理节点2.zk2 10.4.7.12 h ...

  3. Openstack neutron:目录

    为什么? 最近一直在学习SDN方面的知识,本着"最好的学习就是分享"的精神,记录下本系列的文章,尝试更好地去理解SDN这一正当红的技术. 如何? SDN领域现在已经充斥了大量的公司 ...

  4. thinkphp5.1中适配百度富文本编辑器ueditor

    百度富文本编辑器ueditor虽然很老,但是功能齐全,我近期需要能批量粘贴图片的功能,但是找不到,很无奈.然后现在就分享一下如何把ueditor适配到thinkphp5.1,有知道如何批量上传图片的艾 ...

  5. ProxySQL Cluster 概述

    文章转载自:https://blog.csdn.net/n88Lpo/article/details/79608639 前言 在ProxySQL 1.4.2 之前,ProxySQL 单点的解决方法有配 ...

  6. 使用Prometheus和Grafana监控emqx集群

    以 Prometheus为例: emqx_prometheus 支持将数据推送至 Pushgateway 中,然后再由 Promethues Server 拉取进行存储. 注意:emqx_promet ...

  7. 了解Elasticsearch写入磁盘的数据

    文章转载自: https://mp.weixin.qq.com/s?__biz=MzI2NDY1MTA3OQ==&mid=2247484171&idx=1&sn=985a71a ...

  8. 关于将Azure云上磁盘导出-使用VirtualBox转换成vmdk格式的方法记录

    在工作中,经常会遇到虚拟磁盘文件格式的转换需求,尤其是在虚拟化迁移及云环境迁移到DC的虚拟化环境中 或者中转处理,如最近笔者遇到一个需要将Azure Cloud上的磁盘导出到VMware中,但Azur ...

  9. HDU4991 Ordered Subsequence (树状数组优化DP)

    dp[i][j]表示以a[i]结尾的长度为j的上升子序列个数. 方程:dp[i][j]=sum(dp[k][j-1]),a[k]<a[i],1<=k<i. 求解目标:sum(dp[k ...

  10. 洛谷P1438 无聊的数列 (线段树+差分)

    变了个花样,在l~r区间加上一个等差数列,等差数列的显著特点就是公差d,我们容易想到用线段树维护差分数组,在l位置加上k,在l+1~r位置加上d,最后在r+1位置减去k+(l-r)*d,这样就是在差分 ...