Довольно просто, ваш процесс не может разрешить имя хоста host.docker.internal
.
Go Программа, запущенная в модуле на k8s
Предполагается, что ваша программа Go работает в контейнера в кластере Kubernetes, вам нужно принять несколько мер, как описано ниже.
Если вы используете Kubernetes, должна быть служба, которая экспортирует Kubernetes в остальную часть вашего кластера, обычно под ip кластера и hostname <servicename>.<namespace>.<clusterdomain>
.
Ниже вы можете увидеть, как подойти к этому:
$ kubectl --namespace=mynamespace get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
centraldb-cockroachdb ClusterIP None <none> 26257/TCP,8080/TCP 21d
centraldb-cockroachdb-public ClusterIP 10.110.105.151 <none> 26257/TCP,8080/TCP 21d
$ kubectl get --namespace=mynamespace service centraldb-cockroachdb-public -o json | jq ".spec"
{
"clusterIP": "10.110.105.151",
"ports": [
{
"name": "grpc",
"port": 26257,
"protocol": "TCP",
"targetPort": "grpc"
},
{
"name": "http",
"port": 8080,
"protocol": "TCP",
"targetPort": "http"
}
],
"selector": {
"app.kubernetes.io/component": "cockroachdb",
"app.kubernetes.io/instance": "centraldb",
"app.kubernetes.io/name": "cockroachdb"
},
"sessionAffinity": "None",
"type": "ClusterIP"
}
Как вы видите, я запускаю cockroachdb и его публичный c grp c порт доступен через 10.110.105.151:26257, а его http-порт доступен через 10.110.105.151:8080.
Теперь, как нам узнать наше DNS-имя?
Мы развернем маленького помощника в том же пространстве имен.
Сначала мы создаем файл yaml bb.yaml
apiVersion: v1
kind: Pod
metadata:
name: busybox
spec:
containers:
- image: busybox:latest
command:
- sleep
- "7200"
name: busybox
restartPolicy: Always
Затем мы применяем его к тому же пространству имен , что и сервис, который мы хотим чтобы получить DNS-имя для:
$ kubectl --namespace=mynamespace apply -f bb.yaml
pod/busybox created
Теперь мы можем найти полное DNS-имя вашей службы через:
$ kubectl exec --namespace=mynamespace busybox -- nslookup centraldb-cockroachdb-public
Server: 10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local
Name: centraldb-cockroachdb-public
Address 1: 10.110.105.151 centraldb-cockroachdb-public.mynamespace.svc.cluster.local
(обратите внимание, что IP-платья и DNS-имена, очевидно, могут различаться в вашей установке).
Итак, мы должны быть в состоянии достичь Сеть CockroachDB через "centraldb-cockroachdb-publi c .mynamespace.sv c .cluster.local: 8080" из кластера .
Go программа, работающая вне k8s
Что делать здесь сильно зависит от вашей установки. Если вы используете Docker для рабочего стола, как я полагаю, самый простой способ - раскрыть рассматриваемое развертывание:
$ kubectl port-forward svc/$yourServiceName $localport:$serviceport
Это сделает http-порт службы "centraldb-cockroachdb-publi c "доступно через localhost: 9000:
$ kubectl port-forward --namespace=mynamespace svc/centraldb-cockroachdb-public 9000:8080
Forwarding from 127.0.0.1:9000 -> 8080
Forwarding from [::1]:9000 -> 8080
Теперь мы открываем другую оболочку и вызываем http://localhost: 9000 :
$ curl -sI http://localhost:9000
HTTP/1.1 307 Temporary Redirect
Content-Type: text/html; charset=utf-8
Location: https://localhost:9000/
Date: Thu, 05 Mar 2020 12:17:09 GMT
Чтобы сделать это постоянный, вам нужно либо изменить тип службы на NodePort , либо использовать то, что Kubernetes называет «LoadBalancer» .