[英]Kubernetes to find Pod IP from another Pod
我有以下pods hello-abc
和hello-def
。
我想将数据从hello-abc
发送到hello-def
。
pod hello-abc
如何知道hello-def
的IP地址?
我想以编程方式执行此操作。
hello-abc
找到hello-def
的最简单方法是什么?
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: hello-abc-deployment
spec:
replicas: 1
template:
metadata:
labels:
app: hello-abc
spec:
containers:
- name: hello-abc
image: hello-abc:v0.0.1
imagePullPolicy: Always
args: ["/hello-abc"]
ports:
- containerPort: 5000
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: hello-def-deployment
spec:
replicas: 1
template:
metadata:
labels:
app: hello-def
spec:
containers:
- name: hello-def
image: hello-def:v0.0.1
imagePullPolicy: Always
args: ["/hello-def"]
ports:
- containerPort: 5001
---
apiVersion: v1
kind: Service
metadata:
name: hello-abc-service
spec:
ports:
- port: 80
targetPort: 5000
protocol: TCP
selector:
app: hello-abc
type: NodePort
---
apiVersion: v1
kind: Service
metadata:
name: hello-def-service
spec:
ports:
- port: 80
targetPort: 5001
protocol: TCP
selector:
app: hello-def
type: NodePort
前言
由于您已定义了路由到每个部署的服务,因此如果您已将服务和部署部署到同一命名空间,则可以在许多现代kubernetes集群中利用kube-dns并简单地按名称引用服务。
不幸的是,如果您的群集中未配置kube-dns
(尽管不太可能),则无法通过名称引用它。
您可以在此处阅读有关服务的DNS记录的更多信息
此外,Kubernetes还具有“服务发现”功能,可将服务的端口和ips暴露在部署到同一名称空间的任何容器中。
解
这意味着,要达到hello-def,你可以这样做
curl http://hello-def-service:${HELLO_DEF_SERVICE_PORT}
基于服务发现https://kubernetes.io/docs/concepts/services-networking/service/#environment-variables
警告 :如果服务端口发生更改,则很可能只有在同一命名空间中更改后创建的pod才会收到新的环境变量。
外部访问
此外,只要您可以从外部访问NodePort范围,您就可以在外部使用NodePort功能从外部获得此服务。
这将要求您通过node-ip:nodePort访问您的服务
你可以找到随机分配给你的服务的NodePort,用kubectl describe svc/hello-def-service
入口
要从外部访问您的服务,您应该实现入站服务,例如nginx-ingress
https://github.com/helm/charts/tree/master/stable/nginx-ingress https://github.com/kubernetes/ingress-nginx
边门
如果您的2项服务紧密耦合,您可以使用Kubernetes Sidecar功能将它们包含在同一个pod中。 在这种情况下,pod中的两个容器将共享相同的虚拟网络适配器,并可通过localhost:$port
https://kubernetes.io/docs/concepts/workloads/pods/pod/#uses-of-pods
服务发现
当Pod在节点上运行时,kubelet为每个活动服务添加一组环境变量。 它支持Docker链接兼容变量(请参阅makeLinkVariables)和更简单的{SVCNAME} _SERVICE_HOST和{SVCNAME} _SERVICE_PORT变量,其中服务名称为大写,短划线转换为下划线。
在此处阅读有关服务发现的更多信息: https : //kubernetes.io/docs/concepts/services-networking/service/#environment-variables
您应该能够通过DNS在hello-abc
通过pod获取hello-def-service
,如下所示: https : //kubernetes.io/docs/concepts/services-networking/dns-pod-service/#services
但是,在群集中使用DNS记录之前,必须在k8s群集中配置/安装kube-dns
或CoreDNS
。
具体来说,您应该达到hello-def-service
通过DNS记录http://hello-def-service
在相同的命名空间运行服务hello-abc-service
您应该能够通过DNS记录hello-def-service.other_namespace.svc.cluster.local
在另一个名称空间ohter_namespace
运行hello-def-service
。
如果由于某种原因,您没有在群集中安装DNS加载项,您仍然可以通过hello-abc
pod中的环境变量找到hello-def-service
的虚拟IP。 正如此处所述 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.