我已经阅读了几篇有关clusterIP abd nodeport服务如何工作的文章(例如this blog)
说我有3个不同的基于微服务的Web应用程序,每个应用程序都在三个单独的节点上运行。每个运行两个副本集。
我的理解是,将为应用程序副本集提供单独的clusterIP服务,而不是一个 适用于所有应用程序类型的clusterIP服务。那是对的吗 ?现在,如果一个Pod需要连接到另一个Pod,它将调用相应的Pod 将clusterIP服务连接到右Pod吗?
答案 0 :(得分:1)
是的,没错。
实际上,您需要忘记关于pod的概念。
正如您所说,您创建了3个基于Web的微型服务。因此,此处的正确术语(和需要)是与(微)服务B 中的(微)服务A 联系。为此,您需要为每个kind: Service
创建一个ReplicaSet
。
例如:
---
# This is one micro-service based on Nginx
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: nginx
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
name: nginx
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:alpine
ports:
- containerPort: 80
---
# This is the ClusterIp service corresponding
apiVersion: v1
kind: Service
metadata:
name: nginx
spec:
selector:
app: nginx
ports:
- port: 8080
targetPort: 80
在上面的示例中,我们有两个基于Nginx的微服务的副本。我们还有一个针对我们的Nginx应用程序的ClusterIP kind: Service
。
现在,如果我们想从另一个Pod联系Nginx,我们要做的就是使用服务名称和从集群内部配置的端口。在我们的情况下,它将是nginx:8080
。
要尝试此操作,您需要创建一个Pod,将其用作集群中的入口点:
---
apiVersion: v1
kind: Pod
metadata:
name: gateway
spec:
containers:
- image: centos:7
name: gateway
command: ["bash", "-c", "sleep infinity"]
现在,如果要从集群联系您的nginx应用,则必须执行以下命令:
kubectl exec -ti gateway curl nginx:8080
答案 1 :(得分:0)
是的,设计看起来不错,对于每个微服务,您都可以部署服务和部署对象。
您总是可以ssh进入任何一个pod,然后在其中键入nslookup“ service_name”,它将为您提供完全限定的域名,并且您可以始终使用该域名进行连接,如果您的应用程序可以通过HTTP进行通信,则可以尝试这样操作(在将ssh转换为POD之后)
卷曲http://service-name.namespace.cluster.local:port
或者您也可以使用nslookup pod-name。
答案 2 :(得分:0)
如果要启用Pod之间的连接,可以在常规ClusterIP上方添加正确的Headless服务(正确的做法是)。
无头服务为部署的每个pod提供DNS条目。使用以下语法解决请求:
<pod_name>.<headless_svc_name>
在这种情况下,我建议您使用Statefulset部署:容器获得稳定的名称,例如“ pod-0”,“ pod-1” ...