【问题标题】:Unable to connect to Cockroach pod in Kubernetes无法连接到 Kubernetes 中的 Cockroach pod
【发布时间】:2021-03-01 04:55:21
【问题描述】:

我正在开发一个带有 Web 服务和持久层的简单 Web 应用程序。 Web 持久层是 Cockroach db。我正在尝试使用单个命令部署我的应用程序:

kubectl apply -f my-app.yaml

应用部署成功。但是,当后端必须在 db 中存储某些内容时,会出现以下错误:

dial tcp: lookup web-service-cockroach on 192.168.65.1:53: no such host

当我启动我的应用程序时,我向 cockroach db 提供以下连接字符串并且连接成功,但是当我尝试在 db 中存储某些内容时,出现上述错误:

postgresql://root@web-service-db:26257/defaultdb?sslmode=disable

由于某种原因,web pod 无法与 db pod 通信。我的整个配置是:


# Service for web application
apiVersion: v1
kind: Service
metadata:
name: web-service
spec:
selector:
 app: web-service
type: NodePort
ports:
 - protocol: TCP
   port: 8080
   targetPort: http
   nodePort: 30103
externalIPs:
 - 192.168.1.9    # < - my local ip
---

# Deployment of web app
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-service
spec:
selector:
 matchLabels:
   app: web-service
replicas: 1
template:
 metadata:
   labels:
     app: web-service
 spec:
   hostNetwork: true
   containers:
     - name: web-service
       image: my-local-img:latest
       imagePullPolicy: IfNotPresent
       ports:
         - name: http
           containerPort: 8080
           hostPort: 8080
       env:
         - name: DB_CONNECT_STRING
           value: "postgresql://root@web-service-db:26257/defaultdb?sslmode=disable"

---
### Kubernetes official doc PersistentVolume
apiVersion: v1
kind: PersistentVolume
metadata:
name: cockroach-pv-volume
labels:
 type: local
spec:
storageClassName: manual
capacity:
 storage: 10Gi
accessModes:
 - ReadWriteOnce
hostPath:
 path: "/tmp/my-local-volueme"

---
### Kubernetes official doc PersistentVolumeClaim
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: cockroach-pv-claim
spec:
storageClassName: manual
accessModes:
 - ReadWriteOnce
resources:
 requests:
   storage: 4Gi
---

# Cockroach used by web-service
apiVersion: v1
kind: Service
metadata:
name: web-service-cockroach
labels:
 app: web-service-cockroach
spec:
selector:
 app: web-service-cockroach
type: NodePort
ports:
 - protocol: TCP
   port: 26257
   targetPort: 26257
   nodePort: 30104
---

# Cockroach stateful set used to deploy locally
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web-service-cockroach
spec:
serviceName: web-service-cockroach
replicas: 1
selector:
 matchLabels:
   app: web-service-cockroach
template:
 metadata:
   labels:
     app: web-service-cockroach
 spec:
   volumes:
     - name: cockroach-pv-storage
       persistentVolumeClaim:
         claimName: cockroach-pv-claim
   containers:
     - name: web-service-cockroach
       image: cockroachdb/cockroach:latest
       command:
         - /cockroach/cockroach.sh
         - start
         - --insecure
       volumeMounts:
         - mountPath: "/tmp/my-local-volume"
           name: cockroach-pv-storage
       ports:
         - containerPort: 26257

部署后一切看起来都很好。

kubectl get service
NAME                      TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)           AGE
kubernetes               ClusterIP   10.96.0.1      <none>        443/TCP           50m
web-service              NodePort    10.111.85.64   192.168.1.9   8080:30103/TCP    6m17s
webs-service-cockroach   NodePort    10.96.42.121   <none>        26257:30104/TCP   6m8s
kubectl get pods
NAME                                  READY   STATUS    RESTARTS   AGE
web-service-6cc74b5f54-jlvd6   1/1     Running   0          24m
web-service-cockroach-0        1/1     Running   0          24m

提前致谢!

【问题讨论】:

  • 如果您使用webs-service-cockroach.default.svc.cluster.local 作为数据库的DNS 名称会发生​​什么?这源自kubernetes.io/docs/concepts/services-networking/dns-pod-service/…
  • 请注意:我不确定您的服务名称是什么。 yaml 有web-service-cockroach,但获取服务命令返回webs-service-cockroach
  • 服务名称是web-service-cockroach。当我尝试使用以下连接字符串时: value: "postgresql://web-service-cockroach.default.svc.cluster.local:26257/defaultdb?sslmode=disable" Db 报告: dial tcp [::1]:26257 : 连接:连接被拒绝
  • 我已经设法通过将 cockroach-service 设置为连接字符串中的地址来使其工作,非常感谢 Ben!

标签: kubernetes deployment yaml kubectl cockroachdb


【解决方案1】:

您的 DNS 似乎有问题。

dial tcp: lookup web-service-cockroach on 192.168.65.1:53: no such host

地址192.168.65.1不喜欢kube-dns服务ip。

如果您在哪里使用主机网络,这可以解释,而且令人惊讶的是您这样做了。 使用hostNetwork: true时,默认使用的dns服务器是主机使用的服务器,绝不是kube-dns。


解决它设置:

spec:
  dnsPolicy: ClusterFirstWithHostNet

它将 dns 服务器设置为 pod 的 k8s 服务器。

查看 kubernetes 文档以获取有关 Pod's DNS Policy 的更多信息。

【讨论】:

  • 谢谢,马特!我在部署规范类别下添加了dnsPolicy: ClusterFirstWithHostNet,现在错误是:dial tcp [::1]:26257: connect: connection refused`
  • 谢谢,马特!我添加了 dnsPolicy: ClusterFirstWithHostNet 后,我​​将 cockroach 的地址设置为指向 cockroach-service 并且它工作正常:) `
猜你喜欢
  • 2021-11-24
  • 2021-05-19
  • 2018-09-03
  • 2021-09-10
  • 1970-01-01
  • 2020-09-01
  • 2019-03-12
  • 2015-06-06
  • 1970-01-01
相关资源
最近更新 更多