【问题标题】:Memcached Kubernetes Client GolangMemcached Kubernetes 客户端 Golang
【发布时间】:2018-09-21 15:57:02
【问题描述】:

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

我找不到关于如何动态发现 memcached 并确保它会在 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>

【问题讨论】:

    标签: go kubernetes memcached kube-dns


    【解决方案1】:

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

    这样,在客户端中,您只需为您的服务指定内部 DNS 条目,类似于 &lt;service-name&gt;.&lt;k8s-namespace&gt;.svc.cluster.local

    在你的代码中,你需要这样的东西:

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

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

    希望对你有帮助!

    【讨论】:

    • 谢谢!我试过这个但没有用。 mc := memcache.New("memcached.redfalcon.svc.cluster.local") mc.Set(&memcache.Item{Key: "foo", Value: []byte("my value"), Expiration: 1})我得到“memcache:没有配置或可用的服务器”不知道为什么
    • 您是否为您的 memcache 部署创建了 Kubernetes 服务?
    • 是的,称为“memcached”。它是一个 statefulset,所以它是无头的(如果重要的话)
    • 尝试进入另一个 pod,然后ping memcached.redfalcon.svc.cluster.local 看看是否可以解决。在命名空间内尝试,然后在另一个命名空间内尝试。这是为了检查 DNS 是否在您的集群中工作
    • 是的,我检查过了,它可以工作。使用 nslookup 并解析了 IP 地址。非权威回答: 名称:memcached.redfalcon.svc.cluster.local 地址:10.40.2.24 名称:memcached.redfalcon.svc.cluster.local 地址:10.40.1.23 名称:memcached.redfalcon.svc.cluster.local 地址: 10.40.2.24 名称:memcached.redfalcon.svc.cluster.local 地址:10.40.1.23
    【解决方案2】:

    好的,我想通了!这与我用于本地开发的远程呈现(https://www.telepresence.io/)有关。它使我可以访问我的开发环境中的所有 K8s 资源。不幸的是,Linux 存在一个缺陷,它无法使用 K8s FQDN 进行查找。

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

    修复有点像 hack,我移植了我的 K8s pod,在本地开发模式下运行时,我将 URL 更改为“localhost:port”。这行得通,但它并没有真正测试 Memcached,因为 K8s 会使用它。

    当我部署到 K8s 时,它工作正常。

    【讨论】:

      猜你喜欢
      • 2016-09-05
      • 2018-01-23
      • 1970-01-01
      • 1970-01-01
      • 2010-12-09
      • 2010-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多