在本地kubernetes上公开服务

在本地kubernetes上公开服务,kubernetes,Kubernetes,我在Mac OS上运行一个与docker捆绑的本地kubernetes 如何公开服务,以便通过Mac上的浏览器访问该服务 我创造了: a) 包括apachehttpd的部署 b) 通过yaml提供的服务: apiVersion: v1 kind: Service metadata: name: apaches spec: selector: app: web type: NodePort ports: - protocol: TCP port: 80 ex

我在Mac OS上运行一个与docker捆绑的本地kubernetes

如何公开服务,以便通过Mac上的浏览器访问该服务

我创造了:

a) 包括apachehttpd的部署

b) 通过yaml提供的服务:

apiVersion: v1
kind: Service
metadata:
  name: apaches
spec:
  selector:
    app: web
  type: NodePort
  ports:
  - protocol: TCP
    port: 80
  externalIPs:
  - 192.168.1.10 # Network IP of my Mac
我的服务看起来像:

$ kubectl get service apaches
NAME      TYPE       CLUSTER-IP       EXTERNAL-IP    PORT(S)        AGE
apaches   NodePort   10.102.106.158   192.168.1.10   80:31137/TCP   14m
我可以通过
wget$cluster-IP

我试着打开我的Mac电脑,但它不起作用

这涉及到一个类似的问题。但是这个解决方案没有帮助,因为我不知道我可以使用哪个IP

更新

多亏了迈克尔·豪森布拉斯,我用计算机解决了这个问题。 尽管如此,仍有一些悬而未决的问题:

  • 服务的externalIP是什么意思?当我不直接从外部访问服务时,为什么需要外部IP
  • 服务端口31137的含义是什么
    • kubernetes文档描述了一种方法[通过NodePort在minikube中发布服务][4]。在docker上捆绑kubernetes也可以吗

在kubernetes中公开服务有几种解决方案:

以下是我根据alesnosek为本地kubernetes与docker捆绑的解决方案:

1。主机网络

hostNetwork: true
脏(出于安全原因不应共享主机网络)=>我没有检查此解决方案

2。主机端口

hostPort: 8086
不适用于服务=>我没有检查此解决方案

3。节点端口

hostPort: 8086
通过定义节点端口公开服务:

apiVersion: v1
kind: Service
metadata:
  name: apaches
spec:
  type: NodePort
  ports:
    - port: 80
      nodePort: 30000
  selector:
    app: apache
4。负载平衡器

编辑 @马修发帖了

5。入口

a。安装

b。配置入口

kubectl apply-f apache ing.yaml

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: apache-ingress
spec:
  rules:
  - host: localhost
    http:
      paths:
      - path: /
        backend:
          serviceName: apaches
          servicePort: 80
现在我可以通过调用

使用说明

  • 回购协议简化了交易流程
  • 对于生产使用,我将遵循以下步骤
  • 回购协议附带了一个新的条款。对于快速获得工作示例应用程序非常有用
进一步的文档


正如Matthias Ms答案中所述,有几种方法

正如官方的Kubernetes文档特别描述的那样,我想描述一下工作流

NodePort
:在静态端口(NodePort)的每个节点的IP上公开服务。自动创建
节点端口
服务路由的
集群
服务。您可以通过请求
,从集群外部联系
节点端口
服务

如果将
类型
字段设置为
节点端口
,则Kubernetes控制平面从
--服务节点端口范围
标志指定的范围(默认值:30000-32767)分配端口。每个节点将该端口(每个节点上的端口号相同)代理到您的服务中。您的服务在其
.spec.ports[*].nodePort
字段中报告分配的端口

使用
节点端口的
类型设置服务

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: MyApp
  ports:
    - protocol: TCP
      port: 80
      targetPort: 9376
  clusterIP: 10.0.171.239
  type: NodePort
然后,您可以通过检查服务暴露于哪个端口

kubectl get svc

NAME                           TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
my-service                     NodePort       10.103.218.215   <none>        9376:31040/TCP               52s

对于那些仍在寻找答案的人。我通过添加另一个Kube服务来实现这一点,只是为了将我的应用程序暴露于本地主机呼叫(通过浏览器或邮递员):


现在试试:

我没有为类型:Loadbalancer:apaches Loadbalancer 10.98.28.154获取外部ip…可能是因为您的8080端口已被占用?例如,您有另一个本地服务或程序使用此端口?首先我会尝试两件事:1)docker ps-a
(查看正在运行的进程)2)尝试像
8743
8090
这样的奇特端口,而不是
8080
,以确保没有其他应用程序在使用它3)我正在使用docker Desktop,也许你在Linux上,那里的工作方式有点不同4)我也在使用
kubectl
,你可能在使用
minikube
?你说得对,在修复了不正确的端口后,我可以访问该服务。你检查过它是否在127.0.0.1上公开了吗?
curl http://localhost:31040
kind: Service
apiVersion: v1
metadata:
  name: apaches-published
spec:
  ports:
    - name: http
      port: 8080
      targetPort: 80
      protocol: TCP
  selector:
    app: web
  type: LoadBalancer