【问题标题】:Understanding services in kubernetes?了解 Kubernetes 中的服务?
【发布时间】:2019-07-09 13:31:43
【问题描述】:

我正在从here学习k8s中的服务

我创建了没有选择器和一个端点的服务。我想要做的是我已经安装了 apache,它在端口 80 上运行。我在端口 31000 上创建了一个节点端口服务。现在这个服务应该将 ip:31000 重定向到 ip:80 端口。

它适用于服务的内部 ip,但不适用于外部 ip。

my-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  ports:
  - protocol: TCP
    port: 9376
    targetPort: 80
    nodePort: 31000
  type: NodePort

my-endpoint.yaml

apiVersion: v1
kind: Endpoints
metadata:
  name: my-service
subsets:
  - addresses:
      - ip: <IP>
    ports:
      - port: 80

kubectl get service -o wide 的输出

NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE   SELECTOR
kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP          53m   <none>
my-service   NodePort    10.111.205.207   <none>        9376:31000/TCP   30m   <none>

【问题讨论】:

  • 你是如何运行 apache 的?您是在 pod 内运行 apache 还是直接安装在节点中?另外你在哪里运行这个? Minikube 还是云管理的 kubernetes 集群?
  • 外部IP是什么意思?那是一个可以公开访问的IP吗? NodePort 类型的服务使用${NodeIP}:${NodePort} 使您的服务在集群节点上可用。如果这些节点没有公共 IP,您将无法从网络外部访问您的服务。
  • 我只在节点上运行 Apache。我在云上运行它。 Cloud 有两个工作节点和一个主节点

标签: docker kubernetes devops kubernetes-service


【解决方案1】:

首先,您需要在集群内运行一个 pod,然后使用端口在 Endpoints yaml 中分配该 pod 的 ip,因为服务将 pod 暴露在集群内部或外部,我们必须使用选择器或地址pod 的名称,以便服务可以将其附加到特定的 pod。

apiVersion: v1
kind: Endpoints
metadata:
  name: my-service
subsets:
  - addresses:
      - ip: <ip address of the pod>
    ports:
      - port: <port of the pod>

还有一件事是使用 Statefulset 代替 Deployment 来运行 pod。

【讨论】:

  • 感谢阿伦的解释。现在这对我有用。
【解决方案2】:

有多种类型的服务可以为您提供不同级别的访问权限:

ClusterIP - 可以从另一个 pod 访问服务(仅在 Kubernetes 集群内部)

NodePort - 可以从另一个 pod 以及运行 Kubernetes 集群的机器访问服务

LoadBalancer - 可以从 Kubernetes 集群外部访问服务(使用外部 IP)

LoadBalancers 在 TCP 级别连接时非常有用。如果您有更高级别的连接 ( http ),您还可以使用 Ingress + NodePort

【讨论】:

  • 我期待解决问题中发布的问题。我知道理论
  • 嗯,这就是解决方案...使用 LoadBalancer 服务类型或使用结合 NodePort 服务的 Ingress。如何实现它们取决于您使用的云提供商。通常,您可以在每个云提供商上找到很多关于如何使用这些资源的文档。
  • 你能发布任何例子吗?
【解决方案3】:

服务的用途是在所有不同的 pod 之间建立通信,或者从集群外部访问一个 pod。

因此,您创建的每个 pod 或每个部署总是会附带某种匹配的服务。有几种不同类型的服务。

1.集群 IP: 设置一个易于记忆的 URL 来访问一个 pod。仅公开集群中的 pod。因此,只要您想在集群内的不同 pod 之间建立通信,就可以随时使用集群 IP 服务。

例如:event-bus-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: event-bus-depl
spec:
  replicas: 1
  selector:
    matchLabels:
      app: event-bus
  template:
    metadata:
      labels:
        app: event-bus
    spec:
      containers:
        - name: event-bus
          image: lordrafiq/event-bus:latest
---
apiVersion: v1
kind: Service
metadata:
  name: event-bus-srv
spec:
  selector:
    app: event-bus
  type: ClusterIP
  ports:
    - name: event-bus
      protocol: TCP
      port: 4005
      targetPort: 4005

因此,在您想与事件​​总线通信的任何 pod 内部,您可以在端口 4005 上使用 event-bus-srv。

 await axios.post('http://event-bus-srv:4005/events', {});

2。节点端口: 使 pod 可以从集群外部访问(通常仅用于开发目的)。因此,节点端口可用于您想从集群外部访问 pod 的任何时间,但它仅用于开发目的,负载均衡器是从集群访问 pod 的正确方法。

apiVersion: v1
kind: Service
metadata:
  name: posts-srv
spec:
  type: NodePort
  selector:
    app: posts
  ports:
    - name: posts
      protocol: TCP
      port: 4000
      targetPort: 4000
http://192.168.39.234:31154/posts

31154是我们创建节点端口服务后得到的nodePort。

3.负载均衡器: 使 pod 可以从集群外部访问。这是将 pod 暴露给外界的正确方法。

4.外部名称: 将集群内请求重定向到 CNAME url。

【讨论】:

  • 请不要在可以发布文字的情况下发布图片。图像不容易搜索并降低帖子的质量。而且您不能复制他们的内容,这是在尝试处理问题或答案时的 PITA。
猜你喜欢
  • 2021-01-23
  • 2015-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-15
  • 2020-06-19
  • 2019-07-08
相关资源
最近更新 更多