让Kubernetes说话一试
总结
这篇文章是2016年12月21日Kubernetes Advent Calendar的一篇文章。
Kubernetes是一个能够很好地管理分布式应用程序的精彩软件。
我在工作中有时候也会接触它,这次参与AdventCalendar节目,我打算介绍一下Kubernetes,并尝试做一些有趣的东西。
Kubernetes 在用户操作之外以异步方式运作,即使用户发出指令,其结果也需要一些时间才能完全反映出来。
另外,即使用户没有进行操作,若出现故障等情况,系统也会自动恢复到正确的状态。
这种行为对于处理分散式应用程序来说非常好,但对于用户来说,可能很难理解“什么时候,发生了什么事情”
因此,我决定创建一个用于显示“Kubernetes中正在发生的事情”的Web应用程序。
然而,仅仅显示在屏幕上并不有趣,所以我想尝试创建一个名为“说话Kubernetes”的东西。
活动
在Kubernetes资源中有一个被称为事件(Event)的东西。
当我们执行kubectl get events命令时,可以看到这个事件,所以可能有些人已经知道了。
这次我们决定监视这个资源并让它说出在kubernetes中发生的事情。
制作的东西
这里有一个名为client-go的Kubernetes API处理库的示例。
可以参考这个示例来监视Event资源。
然后,我们将通过发布网页来实现让其发言。以图表形式表达如下。
尝试用中文朗读
听起来不错。
我在使用过程中发现,即使在后台也可以与我交谈,这样就不会干扰操作,或许可以在运营业务中实际使用,感觉还挺正常的。
让我用中文朗读一下
既然我是日本人,所以我想用日语交谈。
尽管如此,由于Kubernetes的事件只包含英文信息,我将创建一个英文到日文转换表,强制将其转换成日文。
简要的解释
观看Events。
https://github.com/kubernetes/client-go/tree/master/examples/in-cluster 这个链接是我参考的。
完成clientset后,按照礼仪进行操作。
eventInterface, err := clientset.CoreV1().Events("").Watch(v1.ListOptions{})
eventCh := eventInterface.ResultChan()
创建一个通道,使得当Event资源发生变化时能够发送通知
for {
select {
case event := <-eventCh:
ev, ok := event.Object.(*v1.Event)
if ok {
switch event.Type {
case watch.Added:
fmt.Println("## Added:")
printEvent(ev)
emitEvent(ev, msgCh)
只需编写处理根据发生的事件执行的代码!这次是通过WebSocket向浏览器发送消息。
使用WebSocket进行传输
由于这次我很随意地制作了,所以一次只能在多个浏览器中查看其中一个,其他浏览器不会收到通知。
在浏览器中,它会通过从服务器接收事件资源的变更通知,并利用Web语音合成API进行语音朗读。
我参考了这篇文章:http://qiita.com/kyota/items/da530ad22733b644518a
请用中文进行本地转述的操作:
源代码
虽然不会直接使用这个,但大致上是这种感觉,
https://github.com/inajob/kube-sniff
总结
通过使用Kubernetes,可以非常容易地扩展,并且可以创建与Kubernetes关联的“某物”。
运营分布式应用程序在每个场景中都有各种需求,但是可以将困难的任务委托给Kubernetes,然后使用此文章中的附加功能进行开发,以尽量减少为运营而开发的工作量。