我正在尝试通过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>
答案 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时,效果很好。