基本上,我有一个Deployment,它会创建3个可自动缩放的容器:PHP-FPM,NGINX和包含应用程序的容器,所有这些容器都设置有机密,服务和入口。该应用程序还在PHP-FPM和NGINX之间共享该项目,因此已全部完成。
由于我想使用K8s进行更多探索,因此我决定使用Redis创建一个Pod,该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
答案 0 :(得分:3)
我如何将我的项目连接到在其他Pod中运行,可独立扩展的Redis服务器?
您在这里有三种可能的状态:
要从内部与运行Redis Pod的同一名称空间中运行的其他Pod从连接到Redis Pod。在这种情况下,您将使用服务名称redis-service
并指定服务端口6379
以通过当前的ClusterIP到达该端口(kube-dns正在那里为您进行DNS解析)。我猜您是在要求这种情况。
这里仅是从另一个容器中访问一个容器的示例(在您的情况下)。首次运行:
kubectl run -it --rm test --image=busybox --restart=Never -- sh
这将运行新的测试容器,并在该容器中提供sh
。现在,如果您在测试窗格中键入nslookup redis-service
,您将检查DNS在各个窗格之间是否正常工作。您也可以尝试使用nc -zv redis-service 6379
查看redis端口是否真正打开。如果您的kube-dns工作正常,您应该会看到该端口已打开。
要从内连接到Redis Pod,在同一kubernetes集群中运行,但在不同命名空间中。在这种情况下,您将使用由服务名称和名称空间名称组成的FQDN,就像在the documentation中给出的一样。
要从kubernetes集群的外部连接到Redis Pod。在这种情况下,您将需要一些入口之王或类似机制的nodePort才能将redis服务公开给外界。有关更多信息,请参见the official documentation。
答案 1 :(得分:1)
实际上,使用服务名称作为主机名是可行的。我不知道Kubernetes的DNS也可以做到这一点。我以前在Docker Composer中使用过它,在我的容器化应用程序中,我已经使用它来连接到服务(即:MySQL,Redis,Elasticsearch)。
为澄清这一点,在我的应用程序中,我将主机名设置为服务名,例如redis-service
。如果我想连接到Postgres,可以使用pgsql-service
或该服务的名称。
谢谢!
答案 2 :(得分:0)
如果您使用的是MicroK8s,请查看他们的documentation
我很难与另一个Pod通信,而另一个也不如预期的那样是通过使用服务名称与服务进行通信(DNS查找似乎无法将服务名称转换为IP )。
无论如何,我需要执行MicroK8s documentation内的一些相关步骤,然后所有内容突然开始工作。
还要确保您确实安装了MicroK8s DNS服务:
microk8s.enable dns
请参考MicroK8s documentation,以了解最新信息,但以下是截至今天的步骤: