Memcached Kubernetes客户端Golang

时间:2018-09-21 15:57:03

标签: go kubernetes memcached kube-dns

我正在尝试通过golang连接到我的memcached实例。我的应用程序和Memcached都将在Kubernetes中。

我找不到如何动态发现内存缓存并确保在pod扩展时将其更新的好方法(或示例)。

我可以使用IP手动创建客户端,但是不确定使用Golang在K8s中动态创建客户端的最佳方法。任何帮助将不胜感激,下面是我正在使用的测试功能(如果有帮助的话)。

func TestMemcached(t *testing.T) {
    mc := memcache.New("10.40.1.18:11211", "10.40.2.16:11211")
    mc.Set(&memcache.Item{Key: "foo", Value: []byte("my value"), Expiration: 1})

    it, err := mc.Get("foo")
    if err != nil {
        t.Error("Error pulling from cache:" + err.Error())
    }
    fmt.Println("Key: " + string(it.Key) + "Value: " + string(it.Value))
    //Sleep for a second and a half to let the key expire
    time.Sleep(1500 * time.Millisecond)
    it, err = mc.Get("foo")
    if err == nil {
        t.Error("Got a hit when I didn't expect it:" + err.Error())
    }
}

kubectl描述svc memcached:

Name:              memcached
Namespace:         redfalcon
Labels:            app=memcached
                   chart=memcached-2.3.1
                   heritage=Tiller
                   release=memcached
Annotations:       <none>
Selector:          app=memcached
Type:              ClusterIP
IP:                None
Port:              memcache  11211/TCP
TargetPort:        memcache/TCP
Endpoints:         10.40.1.23:11211,10.40.2.24:11211
Session Affinity:  None
Events:            <none>

2 个答案:

答案 0 :(得分:1)

您可以在Kubernetes中将Memcache实例公开为[服务](https://kubernetes.io/docs/concepts/services-networking/service/

通过这种方式,您可以在客户端中仅为服务指定内部DNS条目,例如<service-name>.<k8s-namespace>.svc.cluster.local

在您的代码中,您将需要以下内容:

mc := memcache.New("memcached.redfalcon.svc.cluster.local:11211")

您还可以使用ConfigMaps为您的应用程序指定此配置。

希望有帮助!

答案 1 :(得分:1)

好,我知道了!它与我用于本地开发的网真(https://www.telepresence.io/)有关。它使我可以从自己的developmentmnet环境访问所有K8s资源。不幸的是,Linux中存在一个缺陷,即它无法使用K8s FQDN进行查找。

https://github.com/telepresenceio/telepresence/issues/161

修复有点麻烦,我将端口转发了我的K8s Pod,并且在本地开发模式下运行时,我将URL更改为“ localhost:port”。这行得通,但是并没有像K8那样真正测试Memcached。

当我部署到K8s时,效果很好。