如何将kubernetes pod暴露给外部IP?

时间:2020-03-12 21:40:38

标签: kubernetes

我有一个看起来像这样的kubernetes文件:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: <some_name>
spec:
  replicas: 1
  template:
    spec:
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      terminationGracePeriodSeconds: 30
      containers:
        - image: <some_image>
          imagePullPolicy: Always
          name: <some_name>
          env:
          - name: ES_HOST
            value: blahblah.us-west-2.es.amazonaws.com
          - name: ES_PORT
            value: "443"
          - name: DATALOADER_QUEUE
            value: some_sqs_queue
          - name: AWS_DEFAULT_REGION
            value: us-west-2
            ...<bunch of variable>
            limits: &main_limits
              cpu: 500m
              memory: 256Mi
            requests: *main_limits

如果我想将此暴露给外界流量,是因为说我的应用程序使用端口上的prometheus暴露了应用程序指标,那么我该如何将该端口暴露给外界?

我的应用程序有这两行来启动需要公开的http服务器:


METRICS_PORT=9100
start_http_server(METRICS_PORT)

那是一个普罗米修斯服务器

4 个答案:

答案 0 :(得分:0)

在本地网络之外公开Prom指标有点奇怪,但除此之外,您还可以使用服务。通常为LoadBalancer类型,但在特殊情况下有时为NodeIP。查看the documentation了解更多信息。

答案 1 :(得分:0)

尝试以下示例

apiVersion: v1
kind: Service
metadata:
  name: hello
spec:
  selector:
    app: hello
  ports:
  - protocol: "TCP"
    port: 80
    targetPort: 80
  type: NodePort
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello
spec:
  selector:
    matchLabels:
      app: hello
  replicas: 1
  template:
    metadata:
      labels:
        app: hello
    spec:
      containers:
      - name: nginx
        image: nginx

您应该可以在http://HOST_IP:NODE_PORT上访问hello服务

答案 2 :(得分:0)

有一些方法可以在Kubernetes中公开您的应用程序。

对于在同一群集中运行的其他应用程序(类型:ClusterIP),服务可以用于内部公开,将主机端口外部绑定到您的应用程序节点(类型:NodePort)或对节点之间的流量进行负载平衡(类型:LoadBalancer) )

ClusterIP :在群集内部IP上公开服务。选择此值将使服务仅可从群集内访问。这是默认的ServiceType。

NodePort :在静态端口(NodePort)的每个节点的IP上公开服务。将自动创建NodePort服务路由到的ClusterIP服务。您可以通过请求:。

从集群外部联系NodePort服务。

LoadBalancer :使用云提供商的负载平衡器在外部公开服务。自动创建外部负载均衡器路由到的NodePort和ClusterIP服务。

如果您使用的是云提供商,则可以使用服务类型 LoadBalancer ,则您的服务将从云提供商处获取外部IP,并且可以公开访问:

apiVersion: v1
kind: Service
metadata:
  name: <<some name>>
spec:
  selector:
    app: my_app_name # << HERE
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  type: LoadBalancer

请注意,要使其正常工作,您需要在部署文件中添加selector,以了解哪些Pod重定向了请求。像这样:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: <some_name>
spec:
  selector:
    app: my_app_name # <= SELECTOR HERE
  replicas: 1
  template:
 ...

要检查一切正常,请使用以下命令并检查EXTERNAL-IP

kubectl get svc <some_name>

参考:

https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types

https://kubernetes.io/docs/concepts/services-networking/service/#with-selectors

https://kubernetes.io/docs/concepts/services-networking/service/#loadbalancer

答案 3 :(得分:0)

通常,建议通过服务公开Pod,而不要直接考虑Pod的短暂性来公开Pod。 如KoopaKiller上文所述,公开服务的方式包括:

  1. ClusterIP:在群集内部IP上公开服务,从而使服务只能从群集内部访问。为了您的目的,这还不够。

  2. NodePort:在静态端口上公开每个节点IP上的服务。为此,您可以通过连接到服务的节点端口来从群集外部连接NodePort服务。

  3. LoadBalancer:使用云提供商的负载平衡器在外部公开服务。这是在较大规模下使用的更安全的选择,但是请注意,某些负载均衡器的成本相当可观。在选择之前,您可能需要考虑到这一点。