Kubernetes从另一个Pod中查找Pod IP

ene*_*enq 5 kubernetes kubernetes-ingress

我有以下豆荚hello-abchello-def

我想从发送数据hello-abchello-def

pod如何hello-abc知道的IP地址hello-def

我想以编程方式执行此操作。

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
Run Code Online (Sandbox Code Playgroud)

yos*_*row 5

前言

由于已经定义了路由到每个部署的服务,因此,如果您已将服务和部署都部署到了相同的名称空间,则在许多现代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

警告:如果Service端口更改,则很有可能只有在相同名称空间中更改后创建的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中的两个容器将共享相同的虚拟网络适配器,并且可以通过以下方式访问localhost:$port

https://kubernetes.io/docs/concepts/workloads/pods/pod/#uses-of-pods


服务发现

当Pod在节点上运行时,kubelet为每个活动的Service添加一组环境变量。它既支持Docker链接兼容变量(请参阅makeLinkVariables),也支持更简单的{SVCNAME} _SERVICE_HOST和{SVCNAME} _SERVICE_PORT变量,其中服务名称为大写字母,并且破折号转换为下划线。

在此处阅读有关服务发现的更多信息:https : //kubernetes.io/docs/concepts/services-networking/service/#environment-variables