同一群集上的Pod之间的连接失败。
据我所知,默认情况下-pod暴露在yaml文件中指定的端口上。例如,我已经为我的redis配置了部署文件,如下所示:
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
我尚未创建任何服务。但这是必需的吗?该吊舱将被同一头盔图表中的另一个吊舱访问。使用此设置,尝试访问redis的第二个pod中有错误:
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集群
答案 0 :(得分:1)
您需要Service
才能访问Redis窗格。在您当前的资源redis:6379
不存在的情况下,具有metadata.name: redis
和适当的spec.selector
的服务将使其可用。
请注意,您发布的2个部署的metadata.labels.app
值与myapp
相同,因此您必须将其更改为myapp-redis
,以便该服务将定位到正确的吊舱(在该示例中为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,我强烈建议您使用this stable chart:只需将其与helm install stable/redis
一起安装,便可以使用redis-master:6379
访问您的Redis主服务器,以及使用redis-slave:6379
访问任何只读从服务器。如果您不需要/想要奴隶,则可以避免,只要通过the configuration了解如何。
答案 1 :(得分:0)
由于您没有为redis
Pod创建任何服务,因此需要(01)Pod dns名称或(02)podIP,然后需要端口(6379)才能连接到该服务。有关如何获取Pod的dns名称的信息,请参见dns-pod-service。
您可以使用<pod_name>.namespace.pod.cluster.local
格式获取dns名称,并且连接uri为<pod_name>.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>
,其中
host = redis_service_host or pod_host or redis_servce_ip or pod_ip