Kubernetes:自动确定另一个Pod /容器的IP地址

时间:2018-07-20 17:07:51

标签: flask kubernetes minikube

我正在使用minikube来测试本地Kubernetes场景。我有两个名为“ frontend.py”和“ interceptor.py”的Python Flask应用程序。基本上,我想对前端应用程序进行GET,然后将其执行到拦截器应用程序的POST,并从拦截器接收回响应。如果我手动找到拦截器应用程序的IP并将其提供在我的'frontend.py'脚本中,则可以正常工作。

我的问题:是否存在一种建议的方法,该方法可以从另一个Pod容器中的应用程序自动确定在一个Pod容器中运行的应用程序的IP地址?

我想知道是否还有其他方法可以通过我创建的Kubernetes Service将pod的信息彼此公开,但是我还没有还没有运气。

以下是我的服务和部署。

flask-frontend-deployment.yaml

apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
  name: frontend-deployment
  labels:
    app: flask
spec:
  selector:
    matchLabels:
      app: flask
  replicas: 1
  template:
    metadata:
      labels:
        app: flask
        tier: frontend
    spec:
      containers:
      - name: flask-frontend
        image: alec/flask/frontend:1.0
        resources:
          requests:
            cpu: 100m
            memory: 100Mi
        env:
        - name: GET_HOSTS_FROM
          value: dns
        ports:
        - containerPort: 5001

flask-frontend-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: frontend-service
spec:
  type: NodePort
  selector:
    app: flask
  ports:
  - protocol: TCP
    port: 5001
    targetPort: 5001

flask-interceptor-deployment.yaml

apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
  name: interceptor-deployment
  labels:
    app: flask
spec:
  selector:
    matchLabels:
      app: inter
      role: mid
      tier: middle
  replicas: 1
  template:
    metadata:
      labels:
        app: inter
        role: mid
        tier: middle
    spec:
      containers:
      - name: flask-interceptor
        image: alec/flask/interceptor:1.0
        resources:
          requests:
            cpu: 100m
            memory: 100Mi
        env:
        - name: GET_HOSTS_FROM
          value: env
        ports:
        - containerPort: 5002

flask-interceptor-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: interceptor-service
spec:
  ports:
  - protocol: TCP
    port: 5002

frontend.py

from flask import Flask
from flask import request
import requests

app = Flask(__name__)

@app.route("/")
def hello():
    address = 'http://172.17.0.5:5002/' #<--- this is the IP I want to get automatically 
    r = requests.post(address, data="---[Token]---")
    return "Frontend Here. Response from Backend = "+str(r.content)

if __name__ == "__main__":
    app.run(debug=True,host='0.0.0.0',port=5001)

interceptor.py

from flask import Flask
from flask import request
import requests

app = Flask(__name__)

content = ""

@app.route("/", methods=['POST'])
def testPost():
    if request.method == 'POST':
        return "Received POST --->>> " + str(request.data)
    else:
        return "Post didnt work"

@app.route("/", methods=['GET'])
def hello():
    return "Hello from the interceptor!"

if __name__ == "__main__":
    app.run(debug=True,host='0.0.0.0',port=5002)

1 个答案:

答案 0 :(得分:2)

只要在@Override public void onBackPressed() { if (getFragmentManager().getBackStackEntryCount() > 0) { if(getFragmentManager().findFragmentById(R.id.ad_container) instanceof FragmentE) { getFragmentManager().popBackStack(); getFragmentManager().popBackStack(); getFragmentManager().popBackStack(); // pop fragment D,C from backstack // navigate to fragment B } } else { super.onBackPressed(); } } 中启用了kube-dns加载项,您就应该能够执行基于DNS的服务发现。我会说这是获取资源IP地址的推荐方法。

要再次检查您是否启用了minikube,请运行kube-dns,默认情况下应启用它。

为您创建的DNS名称将默认来自资源的minikube addons list字段。假设您将使用metadata: name名称空间,那么您的服务DNS名称将是:

default

interceptor-service.default.svc.cluster.local

您可以在应用程序中使用这些完全限定的域名来访问服务,也可以使用较短的版本,例如frontend-service.default.svc.cluster.local原样。之所以可以这样做是因为您的Pod frontend-service将配置为在查询resolv.conf时在default.svc.cluster.local中查找。

要对此进行测试(并在注释中注明),您现在应该可以更改此行:

frontend-service

address = 'http://172.17.0.5:5002/'

在您的Flask应用代码中。

有关Kubernetes中用于服务和Pod的DNS的更多详细信息,请参见this页。