【问题标题】:How can access running app in my computer localhost inside kubernetes pod?如何在 kubernetes pod 内访问我的计算机 localhost 中正在运行的应用程序?
【发布时间】:2021-11-28 07:36:16
【问题描述】:

我有一个关于 Kubernetes 网络的问题。

我的工作情景:

  • 我的本地主机有一个 Jenkins 容器,这个容器启动并运行。在詹金斯内部,我有一份工作。访问 jenkins,我使用“http://localhost:8080” url。 (jenkins 不在 kubernetes 中运行)
  • 我的烧瓶应用,使用以下命令触发 Jenkins 作业:
    @app.route("/create",methods=["GET","POST"])
def create():
    
    if request.method =="POST":
        dosya_adi=request.form["sendmail"]
        server = jenkins.Jenkins('http://localhost:8080/', username='my-user-name', password='my-password')
        server.build_job('jenkins_openvpn', {'FILE_NAME': dosya_adi}, token='my-token')
  • 然后,我对这个烧瓶应用程序进行了 Dockerize。我的图片名称是:“jenkins-app”
  • 如果我运行这个命令,一切都会完美:

docker run -it --network="host" --name=jenkins-app jenkins-app

但我想用 kubernetes 做同样的事情。为此,我编写了这个 yml 文件。

apiVersion: v1
kind: Pod
metadata:
  name: jenkins-pod
spec:
  hostNetwork: true
  containers:
  - name: jenkins-app
    image: jenkins-app:latest
    imagePullPolicy: Never
    ports:
    - containerPort: 5000
  • 使用此 yml 文件,我使用端口 5000 访问烧瓶应用程序。当我想触发 jenkins 作业时,我收到如下错误:requests.exceptions.ConnectionError

您能否建议是否有办法使用 Kubernetes 做到这一点?

【问题讨论】:

  • 你可以试试kubectl port-forward <name of the pod> 31145:5000。如果这不起作用,则将 5000 与 8080 交换(我永远不确定从外面可以看到哪一个 :))。
  • 主机网络在这里似乎完全没有必要。在 Kubernetes 上下文中,它可能无法按您预期的方式工作,并且可能被集群操作员非常合理地禁止。您能否将 Jenkins 位置配置为调用应用程序中的其他位置,并通过正常方式(Ingress、NodePort 或 LoadBalancer 类型的服务)使其在 Kubernetes 中可见?
  • @DavidMaze 我试过但没用
  • @ennur 你到底尝试了什么?为什么它不起作用:错误/任何东西?下面的答案还有一种将 pod 公开为ClusterIP 的服务的方法。如果您的应用在本地机器上而不是在集群中运行,那么您需要将服务公开为NodePortLoadBalancer(取决于您使用的集群)
  • @moonkotte 我试图在烧瓶应用程序中更改 jenkins IP。与此错误 requests.exceptions.ConnectionError 相同。我将尝试使用节点端口。是否需要为到达詹金斯添加端点? nodeport 会自动执行此操作吗?

标签: docker jenkins kubernetes


【解决方案1】:

首先你公开你的 Jenkins 服务器:

kubectl expose pod jenkins-pod --port=8080 --target-port 5000

然后你检查服务是否存在:

kubectl get svc jenkins-pod -o yaml

将它用于您的 Flask 应用程序以通过此服务连接到您的 Jenkins 服务器:

... jenkins.Jenkins('http://jenkins-pod.default.svc.cluster.local:8080/...'

请注意,假设您在默认命名空间中运行所有内容,否则将“默认”更改为您的命名空间。

【讨论】:

    【解决方案2】:

    我创建了一个endpoint.yml 文件并在命令下面添加了这个文件,这解决了我的问题:

    apiVersion: v1
    kind: Endpoints
    metadata:
        name: jenkins-server
    subsets:
        - addresses:
            - ip: my-ps-ip
        ports:
            - port: 8080
    

    然后,我在我的烧瓶应用程序中更改此行,如下所示:

    server = jenkins.Jenkins('http://my-ps-ip:8080/', username='my-user-name', password='my-password')
    

    【讨论】:

    • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
    猜你喜欢
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 2020-06-08
    • 2010-11-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多