【问题标题】:Exposing kubernetes service outside the cluster for development purposes为开发目的在集群外公开 Kubernetes 服务
【发布时间】:2020-04-25 16:18:29
【问题描述】:

是否有可能以某种方式将 Kubernetes 服务暴露给外界? 我目前正在开发一个需要与服务通信的应用程序,为此我需要知道 pod ip 和端口地址,我使用 kubernetes 集群可以通过链接到它的 kubernetes 服务获得,但在集群之外我好像找不到,还是暴露了?

apiVersion: v1
kind: Service
metadata:
  name: kafka-broker
spec:
  ports:
  - name: broker
    port: 9092
    protocol: TCP
    targetPort: kafka
  selector:
    app: kafka
  sessionAffinity: None
  type: ClusterIP

我可以将应用程序容器化,将它放在一个 pod 中,然后在 kubernetes 中运行它,但是对于快速开发来说,为了测试诸如连接性之类的小事情,似乎必须经历这些似乎很乏味?

我可以通过某种方式公开服务,从而在其选择器中访问应用程序?

【问题讨论】:

标签: api kubernetes development-environment


【解决方案1】:

为了将您的 Kubernetes 服务公开到互联网,您必须更改 ServiceType

您的服务使用默认值 ClusterIP,它将服务暴露在集群内部 IP 上,使其只能在集群内访问

1 - 如果您使用 AWS 或 GCP 等云提供商,您最好的选择是使用 LoadBalancer 服务类型:,它使用提供商负载均衡器自动向互联网公开。

运行: kubectl expose deployment deployment-name --type=LoadBalancer --name=service-name

deployment-name 必须替换为您的实际部署名称。所需的service-name

也是如此

等待几分钟,kubectl get svc 命令将为您提供外部 IP 和端口:

owilliam@minikube:~$ kubectl get svc
NAME               TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)      AGE
kubernetes         ClusterIP      10.96.0.1       <none>        443/TCP      4d21h
nginx-service-lb   LoadBalancer   10.96.125.208   0.0.0.0     80:30081/TCP   36m

2 - 如果您在本地运行 Kubernetes(如 Minikube),最好的选择是 Nodeport 服务类型: 它将服务公开给集群节点(托管计算机)。 对于测试目的而言,这比将服务暴露在整个互联网上更安全。

运行:kubectl expose deployment deployment-name --type=NodePort --name=service-name

其中deployment-name 必须替换为您的实际部署名称。所需的service-name

也是如此

下面是我将 Nginx 网络服务器暴露给 NodePort 后的输出供您参考:

user@minikube:~$ kubectl get svc
NAME           TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
kubernetes     ClusterIP   10.96.0.1     <none>        443/TCP        4d21h
service-name   NodePort    10.96.33.84   <none>        80:31198/TCP   4s

user@minikube:~$ minikube service list
|----------------------|---------------------------|-----------------------------|-----|
|      NAMESPACE       |           NAME            |         TARGET PORT         | URL |
|----------------------|---------------------------|-----------------------------|-----|
| default              | kubernetes                | No node port                |
| default              | service-name              | http://192.168.39.181:31198 |
| kube-system          | kube-dns                  | No node port                |
| kubernetes-dashboard | dashboard-metrics-scraper | No node port                |
| kubernetes-dashboard | kubernetes-dashboard      | No node port                |
|----------------------|---------------------------|-----------------------------|-----|
user@minikube:~$ curl http://192.168.39.181:31198 
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
...//// suppressed output
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
user@minikube:~$

【讨论】:

    【解决方案2】:

    您可以使用:其他答案中提到的 NodePort 或负载均衡器类型的服务。甚至入口。

    但由于您只要求开发人员,我建议在给定的命名空间中启动一个测试 pod 并检查该 pod 的连接性。您可以通过 SSH 访问正在运行的 pod kubectl exec -it {PODNAME} /bin/sh

    您也可以尝试以下工具 - kubefwd - squash - stern

    【讨论】:

      【解决方案3】:

      使用服务类型作为 NodePort 或 Loadbalancer。如果您在 Azure、AWS 或 GCD 等云中运行,建议使用后者

      参考下同

      apiVersion: v1
      kind: Service
      metadata:
        name: kafka-broker
      spec:
        ports:
        - name: broker
          port: 9092
          protocol: TCP
          targetPort: kafka
        selector:
          app: kafka
        sessionAffinity: None
        type: NodePort
      

      【讨论】:

      • 如何访问`?
      • 使用 HOSTNAME:NODEPORT
      猜你喜欢
      • 2021-12-21
      • 2019-01-05
      • 2017-02-13
      • 2020-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-13
      相关资源
      最近更新 更多