基于Websocket的简易webshell实现

我们在很多场合都看到过基于浏览器的shell,你可以在里面输入一些和你本机相同的命令,然后从远程服务器获得对应的输出。本篇文章就是用来讲解这个基于web的shell的实现方法的。我们之所以研究这个问题,另一方面也是因为kubernetes的Dashboard里面也包含了这个功能。在研究kubernetes的Dashboard的时候,我们会发现那个功能是基于WebSocket来实现的。所以本篇也就是讲解基于WebSocket的shell实现方法。思路我们如果仔细地思考一下,其实这个webshell的主要功能就是将这个命令发送到远程服务器,然后远程服务器执行这个命令,然后把结果返回给客户端就可以了。所以在这个客户端和服务器的交互场景下,有很多的方案可以选择,比[...]

继续阅读 »

使用alpine:latest构建golang镜像

在使用alpine基础镜像做测试的时候,发现基于网络的golang程序跑不起来。在使用了Docker官方的golang镜像却可以,但是alpine的镜像会有如下的错误:standard_init_linux.go:190:execuserprocesscaused“nosuchfileordirectory”针对这种情况,是因为编译的时候标准库中的net库采用了动态编译的方法,这个库依赖glibc,但是alpine里面却没有。于是我们需要完全采用静态编译的方法来编译程序,可以尝试用下面的命令:CGO_ENABLED=0gobuild-a-ldflags'-extldflags[...]

继续阅读 »

使用基于Docker运行的phpmyadmin访问本地的MySQL服务器

这个帖子主要是讲如何在本地Docker里面跑一个phpmyadmin来访问安装在本机的MySQL8.0数据库。注意这里的数据库版本是MySQL8.0,因为这个版本的有些命令和之前的版本已经不同了,有微小而合理的调整。拉取phpmyadmin镜像到本地$dockerpullphpmyadmin/phpmyadmin这个镜像是phpmyadmin的官方镜像。配置本地的MySQL允许远程访问因为phpmyadmin是跑在Docker里面的,而MySQL是跑在本地的物理机器上面的,所以对于phpmyadmin来说,这个MySQL服务器就是个[...]

继续阅读 »

Kubernetes API访问鉴权之Basic模式

Kubernetes支持多种模式的API访问鉴权方式。包括私钥+证书模式,Basic用户名密码模式,BearerToken模式等。其中最常用的是基于ServiceAccount的私钥+证书模式。不过另外两种模式也在支持范畴,所以我们也了解一下,方便特殊场景下的使用。Basic用户鉴权首先,我们在API服务端的/etc/kubernetes/目录下新建一个users.csv文件,内容如下:[root@ksnode1kubernetes]#catusers.csvpass123,jemy,1007,"developer"然后在APIServer的启动命令[...]

继续阅读 »

go-xorm 通过 Ping 方法维持数据库连接心跳

在使用go-xorm操作数据库的时候,为了监控连接的状态,可以使用Ping方法来定时检测连接状态,如果出现错误,可以及时报警。例如下面的代码,可以在Ping出错的时候加上监控,当连接恢复之后,Ping也会恢复正常。packagemainimport("fmt""time"_"github.com/go-sql-driver/mysql""github.com/go-xorm/xorm""k8s.io/apimachinery/pkg/util/wait")varengine*xorm.Enginefuncping(engine*xorm.Engine){[...]

继续阅读 »

K8S broken pipe for writing the log 错误分析

最近发现从kubelet的日志中发现一些Error级别的错误。主要的错误信息为write:brokenpipewhenwritinglogforlogfile和write:connectionresetbypeerwhenwritinglogforlogfile,详细信息如下:2018-09-1313:36TestCluster1-132.example.netkubelet--E091313:36:00.0112855203kuberuntime_logs.go:201]Failedwitherrwritetcp10.8.1.132:10250->10.8.1.55:62786:write:broken[...]

继续阅读 »

K8S 使用 imagePullSecret 来拉取容器的镜像

最近在做部署工具的时候,将应用(Deployment)发布到集群后,发现Pod启动不起来,使用kubectldescribepodxxx发现错误如下:-------------------------NormalScheduled1mdefault-schedulerSuccessfullyassigneddefault/echo-java-5bb694886c-7wkkvto10.8.1.76NormalPulling25s(x3over1m)kubelet,10.8.1.76pullingimage"reg.example.com/java-apps/e[...]

继续阅读 »

Go Context 中 WithCancel 的使用方法

在一般的项目中,存在一个函数调用另外一个函数的情况,而这另外的一个函数还会再去调用其他的函数。一般项目越复杂,调用的层级就也多。这个时候,如果让这种调用关系一直执行到底,那么也没有什么问题,如果有错误发生就一级一级往上抛。在服务端的编程中,可能会存在一种情况,在一个请求进来的处理过程中,后端的服务会依赖多个其他的微服务的API,在这种级连的服务调用过程中,假设需要取消这个过程的执行,那么就会需要多个API的调用同时取消并且完成相应的清理工作。在Golang中,标准库提供了一个协程安全的包context,这个包里面提供了几个有用的方法来实现这个过程。其中一个叫context.WithCancel可以用来派生出一个新的context对象和一个cancelFunc函数,该派生出的新的context对象的方法Done[...]

继续阅读 »

K8S 项目中的 wait 相关的方法实现(1)

周期性执行一个函数在某些情况下,我们需要周期性地执行一些动作,比如发送心跳请求给master,那么可以使用wait库中的Forever功能。这里给一个简单的例子,每隔一秒钟输出当前的时间。packagemainimport("fmt""time""k8s.io/apimachinery/pkg/util/wait")funcmain(){wait.Forever(func(){fmt.Println(time.Now().String())},time.Second)}带StopS[...]

继续阅读 »

K8S 构建 API 服务的依赖库 go-restful 简介

在K8S的APIServer的代码中,依赖了一个叫做go-restful的库来构建HTTP的API。在学习K8S的代码过程中,我们要对这个库做些了解,这样才能更加方便地知道APIServer的Restful服务是如何构建的。这个项目在Github上面的地址是:https://github.com/emicklei/go-restful。我们也很容易地找到了作者的一篇介绍使用方法的博客。帖子的地址在:http://ernestm[...]

继续阅读 »