繁体   English   中英

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

[英]How to expose kubernetes pod to outside IP?

我有一个看起来像这样的 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

如果我想将其公开给外部世界的流量,因为假设我的应用程序在端口上使用普罗米修斯公开应用程序指标..我如何将该端口公开给外部世界?

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


METRICS_PORT=9100
start_http_server(METRICS_PORT)

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

在本地网络之外公开 Prom 指标有点奇怪,但除此之外,您使用服务。 通常是 LoadBalancer 类型,但有时在特殊情况下是 NodeIP。 查看文档以获取更多信息。

试试下面的示例

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 服务

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

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

ClusterIP :在集群内部 IP 上公开服务。 选择此值会使服务只能从集群内部访问。 这是默认的服务类型。

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

一般来说,考虑到 Pod 的短暂性,建议通过服务公开 Pod,而不是直接公开 Pod。 正如 KoopaKiller 上面提到的,暴露服务的方式包括:

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

  2. NodePort:在静态端口的每个节点的 IP 上公开服务。 出于您的目的,您将能够通过连接到服务的节点端口来从集群外部连接节点端口服务。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM