Memcached Kubernetes Client Golang - PullRequest
       8

Memcached Kubernetes Client Golang

0 голосов
/ 21 сентября 2018

Я пытаюсь подключиться к своему экземпляру memcached через golang.И мое приложение, и Memcached будут в Kubernetes.

Я не смог найти хороший способ (или пример), как динамически обнаруживать memcached и гарантировать, что он будет обновляться при масштабировании модулей.

Я могу вручную создать клиента с IP, но не уверен, что это лучший способ динамического создания клиентов в K8 с помощью Golang.Буду признателен за любую помощь, ниже приведена моя тестовая функция, которую я использую (если она помогает).

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 description 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 голосов
/ 26 сентября 2018

Хорошо, я понял это!Это было связано с телеприсутствием (https://www.telepresence.io/), которое я использую для локальной разработки. Это дает мне доступ ко всем ресурсам K8s из моей среды разработки. К сожалению, в Linux есть дефект, из-за которого он не может использовать полное доменное имя K8s для поиска.

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

Исправление - это что-то вроде хака, я перенаправляю перенаправленный мой модуль K8s и при работе в режиме локальной разработки я изменил свой URL на "localhost: port". Это сработало, нона самом деле он не тестирует Memcached, поскольку K8s будет его использовать.

Когда я внедряюсь в K8s, он работает нормально.

0 голосов
/ 21 сентября 2018

Вы можете представить свои экземпляры 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 , чтобы указать эту конфигурацию для вашего приложения..

Надеюсь, это поможет!

...