Docker 为什么可以';我不能通过名称访问ClusterIP服务吗?
我设置了一个简单的redis ClusterIP服务,由集群内的php LoadBalancer服务访问。php日志显示连接超时错误。无法访问redis服务Docker 为什么可以';我不能通过名称访问ClusterIP服务吗?,docker,kubernetes,Docker,Kubernetes,我设置了一个简单的redis ClusterIP服务,由集群内的php LoadBalancer服务访问。php日志显示连接超时错误。无法访问redis服务 'production'.ERROR: Operation timed out {"exception":"[object] (RedisException(code: 0): Operation timed out at /var/www/html/vendor/laravel/framework/src/Illuminate/Redi
'production'.ERROR: Operation timed out {"exception":"[object] (RedisException(code: 0):
Operation timed out at /var/www/html/vendor/laravel/framework/src/Illuminate/Redis
/html/vendor/laravel/framework/src/Illuminate/Redis/Connectors/PhpRedisConnector.php(109):
Redis->connect('redis-svc', '6379', 0, '', 0, 0)
我的redis服务非常简单,所以我不知道出了什么问题:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
labels:
io.kompose.service: redis
name: redis
spec:
replicas: 1
strategy: {}
template:
metadata:
labels:
io.kompose.service: redis
spec:
containers:
- image: redis:alpine
name: redis
resources: {}
ports:
- containerPort: 6379
restartPolicy: Always
status: {}
---
kind: Service
apiVersion: v1
metadata:
name: redis-svc
spec:
selector:
app: redis
ports:
- protocol: TCP
port: 6379
targetPort: 6379
type: ClusterIP
我验证redis svc是否正在运行,为什么其他服务无法访问它
kubectl get service redis-svc git:k8s*
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
redis-svc ClusterIP 10.101.164.225 <none> 6379/TCP 22m
MyPHP是另一个使用env设置redis服务名称的服务
spec:
containers:
- env:
- name: REDIS_HOST # the php code access this variable
value: redis-svc #changed to "redis" when redis service name changed to "redis"
-----更新2------
我无法将我的redis服务名称设置为“redis”的原因是b/c“”,因此使用名称“redis”,将有一个redis\u端口=tcp://10.101.210.23:6379
它会覆盖我自己的REDIS\u PORT=6379
但是我的php只希望REDIS_PORT的值是6379,我运行了您提供的yaml配置,它创建了部署和服务。但是,当我运行以下命令时: kubectl获得svc 名称类型CLUSTER-IP外部IP端口年龄 kubernetes ClusterIP 10.96.0.1 443/TCP 5d14h redis svc ClusterIP 10.105.31.201 6379/TCP 109s >>>>kubectl获取端点 姓名端点年龄 库伯内特斯192.168.99.116:8443 5d14h redis svc 78s 如您所见,redis svc的端点为none,这意味着服务没有要连接的端点。您正在redis svc中使用选择器标签作为
app:redis
。但是pod没有在服务中定义选择器标签。将标签app:redis
添加到pod模板将起作用。部署的完整工作yaml配置如下所示:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
labels:
io.kompose.service: redis
name: redis
spec:
replicas: 1
strategy: {}
template:
metadata:
labels:
io.kompose.service: redis
app: redis
spec:
containers:
- image: redis:alpine
name: redis
resources: {}
ports:
- containerPort: 6379
restartPolicy: Always
status: {}
您的redis吊舱似乎没有
app:redis
标签,因此服务没有路由到它们。尝试将该标签添加到部署的规范
。您是救命恩人!我感到很尴尬:$。我把我的问题留在这里了第二个问题的b/c。我如何验证redis svc是否可以访问?顺便说一句,您完全可以ping服务IP地址,这取决于您选择的网络插件。那么关于我的第二个问题,我如何验证redis svc是否可以访问?端点填充了与服务中定义的spec.selector标签匹配的pods IP。如前所述,在我的上述问题中,kubectl get endpoints最初没有任何pods ip。但是,一旦匹配选择器标签的POD运行,端点就会添加POD的ip地址。嗨,你能检查我更新的问题吗。我在部署和服务中使用了相同的名称,无法再次访问redis。我不明白您到底做了什么更改。到底是什么错误?你能给我一个详细的解释吗?嗨,我找到了原因,就像这个人说的
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
labels:
io.kompose.service: redis
name: redis
spec:
replicas: 1
strategy: {}
template:
metadata:
labels:
io.kompose.service: redis
app: redis
spec:
containers:
- image: redis:alpine
name: redis
resources: {}
ports:
- containerPort: 6379
restartPolicy: Always
status: {}