Kubernetes-无法从同一集群上的另一个pod连接到redis pod
同一群集上的POD之间的连接失败 据我所知,默认情况下,POD在yaml文件中指定的端口上公开。例如,我为redis配置了部署文件,如下所示:Kubernetes-无法从同一集群上的另一个pod连接到redis pod,redis,kubernetes,minikube,kubernetes-helm,Redis,Kubernetes,Minikube,Kubernetes Helm,同一群集上的POD之间的连接失败 据我所知,默认情况下,POD在yaml文件中指定的端口上公开。例如,我为redis配置了部署文件,如下所示: apiVersion: extensions/v1beta1 kind: Deployment metadata: name: redis labels: app: myapp spec: replicas: 1 template: metadata: labels: app: myapp
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: redis
labels:
app: myapp
spec:
replicas: 1
template:
metadata:
labels:
app: myapp
spec:
containers:
- env:
- name: REDIS_PASS
value: '**None**'
image: tutum/redis
ports:
- containerPort: 6379
name: redis
restartPolicy: Always
以下是容器尝试访问redis的pod的部署文件:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: jks
labels:
app: myapp
spec:
replicas: 1
template:
metadata:
labels:
app: myapp
spec:
imagePullSecrets:
- name: myappsecret
containers:
- env:
- name: JOBQUEUE
value: vae_jobqueue
- name: PORT
value: "80"
image: repo.url
name: jks
ports:
- containerPort: 80
volumeMounts:
- name: config-vol
mountPath: /etc/sys0
volumes:
- name: config-vol
configMap:
name: config
restartPolicy: Always
2018-11-21T16:12:31.939Z - [33mwarn[39m: Error: Redis connection to redis:6379 failed - getaddrinfo ENOTFOUND redis redis:6379
at errnoException (dns.js:27:10)
at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:78:26)
我还没有创建任何服务。但这是必需的吗?该吊舱将被另一个吊舱访问,该吊舱是同一舵图的一部分。通过此设置,尝试访问redis的第二个pod中出现错误:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: jks
labels:
app: myapp
spec:
replicas: 1
template:
metadata:
labels:
app: myapp
spec:
imagePullSecrets:
- name: myappsecret
containers:
- env:
- name: JOBQUEUE
value: vae_jobqueue
- name: PORT
value: "80"
image: repo.url
name: jks
ports:
- containerPort: 80
volumeMounts:
- name: config-vol
mountPath: /etc/sys0
volumes:
- name: config-vol
configMap:
name: config
restartPolicy: Always
2018-11-21T16:12:31.939Z - [33mwarn[39m: Error: Redis connection to redis:6379 failed - getaddrinfo ENOTFOUND redis redis:6379
at errnoException (dns.js:27:10)
at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:78:26)
如何确保我的pod能够连接到6379端口上的redis pod
----更新----
这就是我的图表现在的样子:
# Source: mychartv2/templates/redis-service.yaml
apiVersion: v1
kind: Service
metadata:
name: redis
spec:
selector:
app: myapp-redis
clusterIP: None
ports:
- name: redis
port: 6379
targetPort: 6379
---
# Source: mychartv2/templates/redis-deployment.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: redis
labels:
app: myapp-redis
spec:
replicas: 1
template:
metadata:
labels:
app: myapp-redis
spec:
containers:
- env:
- name: REDIS_PASS
value: '**None**'
image: tutum/redis
ports:
- containerPort: 6379
name: redis
restartPolicy: Always
---
# Source: mychartv2/templates/jks-deployment.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: jks
labels:
app: myapp-jks
spec:
replicas: 1
template:
metadata:
labels:
app: myapp-jks
spec:
imagePullSecrets:
- name: jkssecret
containers:
- env:
- name: JOBQUEUE
value: jks_jobqueue
- name: PORT
value: "80"
image: repo.url
name: jks
ports:
- containerPort: 80
volumeMounts:
- name: config-vol
mountPath: /etc/sys0
volumes:
- name: config-vol
configMap:
name: jksconfig
restartPolicy: Always
注意:我使用minikube作为我的kubernetes集群您需要一个服务器才能访问Redis吊舱。在您当前的资源redis:6379
不存在的情况下,具有metadata.name:redis
和相应的spec.selector
的服务将使其可用
请注意,您发布的两个部署具有相同的元数据.标签.app
值myapp
,因此您必须将其中一个更改为myapp redis
,例如,这样服务将针对正确的POD(在该示例中为metadata.name:myapp redis
),而不是HTTP应用程序中的POD
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: redis
labels:
app: myapp
spec:
replicas: 1
template:
metadata:
labels:
app: myapp-redis
spec:
containers:
- env:
- name: REDIS_PASS
value: '**None**'
image: tutum/redis
ports:
- containerPort: 6379
name: redis
restartPolicy: Always
apiVersion: v1
kind: Service
metadata:
name: redis
spec:
selector:
app: myapp-redis
ports:
- protocol: TCP
port: 6379
另外,您在问题中添加了标签
kubernetes-helm
,因此如果您使用helm,我强烈建议:只需使用helm-install-stable/redis
安装它,您就可以使用redis-master:6379
访问您的redis-master,使用redis-slave:6379访问任何只读从机。如果您不需要/不想要从站,您可以避免使用从站。只需了解如何使用从站。因为您没有为redis
pod创建任何服务,您需要(01)pod dns名称或(02)podIP,然后是端口(6379)来连接到它。有关如何获取pod的dns名称,请参阅
您可以使用以下格式获取dns名称.namespace.pod.cluster.local
,连接uri为.namespace.pod.cluster.local:6379
您可以从.status.podIP
获取podIP,连接uri为podIP:6379
在集群中,podIP可能会因任何原因发生变化。因此,使用podIP是不明智的。如果您创建服务并使用其dns名称后跟服务端口(在遵循yaml的情况下,它是6379),则会更好。我们可以使用以下配置创建服务:
apiVersion: v1
kind: Service
metadata:
name: redis
spec:
selector:
app: myapp
clusterIP: None
ports:
- name: redis # Actually, no port is needed.
port: 6379
targetPort: 6379
更新:
但是,您可以在要检查连接的pod中使用redis cli
二进制文件来检查redis连接。如果您有此redis cli
,请运行$redis cli-h
,其中
host = redis_service_host or pod_host or redis_servce_ip or pod_ip
你能提供你使用的图表模板吗?@ShudiptaSharma更新了我的问题,就是我按照建议尝试的两个。但我仍然得到同样的错误,它无法连接。有没有办法检查另一个redis吊舱与redis吊舱的连接?有一些事情需要知道为什么它没有发生。(01)
redis.conf
,(02)你所说的是什么意思?我是说,你可以进入第二个pod并检查从那里到redis pod的连接,以了解为什么它无法连接?我已经用我使用的图表更新了我的问题,更新了我的ans。检查itI进入我要检查连接的pod内,并执行:redis cli-h redis
,我能够连接:redis:6379>
。我似乎无法理解为什么容器会抛出错误,尽管我只安装了主机。但我的第二个吊舱试图连接到redis:6379。我如何配置主机以实现此目的?另外,我想安装一个头盔来安装所有东西(包括redis),这可能吗?太好了redis master:6379
是默认的“连接字符串/url”,如果您使用上述Helm图表,其中redis master
是创建的服务的名称。如果您更改了Helm发布名称或有疑问,请通过kubectl get services
获取服务名称,然后使用适当的url更新连接到Redis的代码。