让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资源。

然后,我们将通过发布网页来实现让其发言。以图表形式表达如下。

image

尝试用中文朗读

kubernetes speaking

听起来不错。
我在使用过程中发现,即使在后台也可以与我交谈,这样就不会干扰操作,或许可以在运营业务中实际使用,感觉还挺正常的。

让我用中文朗读一下

既然我是日本人,所以我想用日语交谈。

しゃべるkubernetes

尽管如此,由于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,然后使用此文章中的附加功能进行开发,以尽量减少为运营而开发的工作量。

广告
将在 10 秒后关闭
bannerAds