基本上,我有一个部署,创建3个自动扩展的容器:PHP-FPM,NGINX和包含应用程序的容器,所有容器都设置了秘密,服务和入口。该应用程序还在PHP-FPM和NGINX之间共享项目,因此全部设置完毕。
由于我想用K8s探索更多,我决定使用Redis创建一个也可以安装持久磁盘的pod(但这并不重要)。我还为redis创建了一个服务,如果我通过SSH进入Redis容器并运行redis-cli
,所有工作都完美无缺。
有趣的是,项目无法连接到Redis所在的pod。我知道pod之间的容器共享相同的“本地”网络,可以使用localhost
访问它们。
如何将我的项目连接到在其他pod中运行的redis服务器,该服务器可以独立扩展? Redis服务有什么问题?
我的Redis服务是这样的:
apiVersion: v1
kind: Service
metadata:
name: redis-service
spec:
ports:
- port: 6379
targetPort: 6379
selector:
app: redis
我的Redis pod由部署配置文件提供支持(我不一定要扩展它,但我会期待它):
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis
labels:
app: redis
spec:
selector:
matchLabels:
app: redis
strategy:
type: Recreate
template:
metadata:
labels:
app: redis
spec:
volumes:
- name: redis-persistent-volume
persistentVolumeClaim:
claimName: redis-pvc
containers:
- image: redis:4.0.11
command: ['redis-server']
name: redis
imagePullPolicy: Always
resources:
limits:
cpu: 250m
memory: 512Mi
requests:
cpu: 250m
memory: 512Mi
ports:
- containerPort: 6379
name: redis
volumeMounts:
- name: redis-persistent-volume
mountPath: /data
此外,当我点击kubectl get service
时,Redis服务器有一个群集IP:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 21h
nginx-service NodePort 10.100.111.16 <none> 80:30312/TCP 21h
redis-service ClusterIP 10.99.80.141 <none> 6379/TCP 6s
如何将我的项目连接到在其他pod中运行的redis服务器,该服务器可以独立扩展?
这里有三种可能的状态:
redis-service
并指定服务端口6379
通过它的当前ClusterIP(kube-dns为您提供DNS解析)来访问它。我猜你在问这个场景。
以下是从另一个pod(在您的情况下)中访问一个pod的示例。第一次运行:
kubectl run -it --rm test --image=busybox --restart=Never -- sh
这将运行新的测试pod并在该pod中为您提供sh
。现在,如果您在那里键入nslookup redis-service
(在测试窗格内),您将检查DNS在pod之间是否正常工作。您还可以尝试查看redis端口是否实际上是使用nc -zv redis-service 6379
打开的。如果您的kube-dns工作正常,您应该看到该端口已打开。实际上,使用服务名称作为主机名工作。我不知道Kubernetes的DNS也设法做到这一点。我之前在Docker Composer中使用过它,在我的容器化应用程序中,我用它来连接服务(即:MySQL,Redis,Elasticsearch)。
为了澄清这一点,在我的应用程序中,我将主机名设置为服务名称,如redis-service
。如果我想连接到Postgres,我可以使用pgsql-service
或该服务的名称。
谢谢!