Kubernetes 从另一个 Pod 中查找 Pod IP
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 记录的更多信息 here
此外 Kubernetes 功能 "Service Discovery" 它将服务的端口和 ip 公开到部署到同一名称空间的任何容器中。
解决方案
这意味着,要访问 hello-def,您可以这样做
curl http://hello-def-service:${HELLO_DEF_SERVICE_PORT}
基于服务发现https://kubernetes.io/docs/concepts/services-networking/service/#environment-variables
警告:如果服务端口发生变化,很可能只有在同一命名空间中更改后创建的 pods 才能接收新的环境变量。
外部访问
此外,由于您使用的是 NodePort 功能,因此您也可以从外部访问您的服务,只要您的 NodePort 范围可以从外部访问。
这需要您通过 node-ip:nodePort
访问您的服务
您可以通过 kubectl describe svc/hello-def-service
找到随机分配给您的服务的 NodePort
入口
要从外部访问您的服务,您应该实施入口服务,例如 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
服务发现
When a Pod is run on a Node, the kubelet adds a set of environment
variables for each active Service. It supports both Docker links
compatible variables (see makeLinkVariables) and simpler
{SVCNAME}_SERVICE_HOST and {SVCNAME}_SERVICE_PORT variables, where the
Service name is upper-cased and dashes are converted to underscores.
在此处阅读有关服务发现的更多信息:
https://kubernetes.io/docs/concepts/services-networking/service/#environment-variables
您应该能够通过此处指定的 DNS 从 hello-abc
中的 pods 访问 hello-def-service
:https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/#services
但是,kube-dns
或 CoreDNS
必须在您的 k8s 集群中 configured/installed 才能在您的集群中使用 DNS 记录。
具体来说,您应该可以通过与 hello-abc-service
相同命名空间中的服务 运行 的 DNS 记录 http://hello-def-service
访问 hello-def-service
并且您应该能够通过 DNS 记录 hello-def-service.other_namespace.svc.cluster.local
.
访问另一个命名空间 ohter_namespace
中的 hello-def-service
运行
如果由于某种原因,您的集群中没有安装 DNS 附加组件,您仍然可以通过 hello-abc
[=35] 中的环境变量找到 hello-def-service
的虚拟 IP =].正如记录 here.
我有以下 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 记录的更多信息 here
此外 Kubernetes 功能 "Service Discovery" 它将服务的端口和 ip 公开到部署到同一名称空间的任何容器中。
解决方案
这意味着,要访问 hello-def,您可以这样做
curl http://hello-def-service:${HELLO_DEF_SERVICE_PORT}
基于服务发现https://kubernetes.io/docs/concepts/services-networking/service/#environment-variables
警告:如果服务端口发生变化,很可能只有在同一命名空间中更改后创建的 pods 才能接收新的环境变量。
外部访问
此外,由于您使用的是 NodePort 功能,因此您也可以从外部访问您的服务,只要您的 NodePort 范围可以从外部访问。
这需要您通过 node-ip: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
服务发现
When a Pod is run on a Node, the kubelet adds a set of environment variables for each active Service. It supports both Docker links compatible variables (see makeLinkVariables) and simpler {SVCNAME}_SERVICE_HOST and {SVCNAME}_SERVICE_PORT variables, where the Service name is upper-cased and dashes are converted to underscores.
在此处阅读有关服务发现的更多信息: https://kubernetes.io/docs/concepts/services-networking/service/#environment-variables
您应该能够通过此处指定的 DNS 从 hello-abc
中的 pods 访问 hello-def-service
:https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/#services
但是,kube-dns
或 CoreDNS
必须在您的 k8s 集群中 configured/installed 才能在您的集群中使用 DNS 记录。
具体来说,您应该可以通过与 hello-abc-service
http://hello-def-service
访问 hello-def-service
并且您应该能够通过 DNS 记录 hello-def-service.other_namespace.svc.cluster.local
.
ohter_namespace
中的 hello-def-service
运行
如果由于某种原因,您的集群中没有安装 DNS 附加组件,您仍然可以通过 hello-abc
[=35] 中的环境变量找到 hello-def-service
的虚拟 IP =].正如记录 here.