在当地的kubernetes上提供服务

时间:2018-03-11 10:52:22

标签: kubernetes

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

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

我创建了:

a)部署包括apache httpd。

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

在我的kubernetes群集中本地访问该服务

我试图在我的Mac上拨打http://192.168.1.10/,但它不起作用。

question涉及类似问题。但解决方案没有帮助,因为我不知道我可以使用哪种IP。

更新

感谢Michael Hausenblas,我使用Ingress制定了一个解决方案。 尽管如此,仍有一些悬而未决的问题:

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

5 个答案:

答案 0 :(得分:4)

有几种解决方案可以在kubernetes中公开服务: http://alesnosek.com/blog/2017/02/14/accessing-kubernetes-pods-from-outside-of-the-cluster/

以下是根据alesnosek针对与docker捆绑在一起的本地kubernetes的解决方案:

<强> 1。 hostNetwork

hostNetwork: true

脏(出于安全原因不应共享主机网络)=&gt;我没有检查这个解决方案。

<强> 2。 HOSTPORT

hostPort: 8086

不适用于服务=&gt;我没有检查这个解决方案。

第3。 NodePort

通过定义nodePort来公开服务:

apiVersion: v1
kind: Service
metadata:
  name: apaches
spec:
  type: NodePort
  ports:
    - port: 80
      nodePort: 30000
  selector:
    app: apache

<强> 4。负载平衡器

不适用于本地kubernetes,因为没有负载均衡器。

<强> 5。入口

<强>一个。安装Ingress Controller

git clone https://github.com/jnewland/local-dev-with-docker-for-mac-kubernetes.git

kubectl apply -f nginx-ingress/namespaces/nginx-ingress.yaml -Rf nginx-ingress

<强>湾配置Ingress

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

现在我可以通过调用http://localhost/

来访问部署了kubernetes的apache

使用local-dev-with-docker-for-mac-kubernetes

的备注

进一步的文档

答案 1 :(得分:3)

正确的方法是使用Ingress,如this post

中所述

答案 2 :(得分:3)

对于那些仍在寻找答案的人。通过添加另一个Kube服务(仅通过浏览器或邮递员将我的应用暴露给localhost调用),我设法实现了这一点:

kind: Service
apiVersion: v1
metadata:
  name: apaches-published
spec:
  ports:
    - name: http
      port: 8080
      targetPort: 80
      protocol: TCP
  selector:
    app: web
  type: LoadBalancer

立即尝试:http://localhost:8080

答案 3 :(得分:0)

正如Matthias女士已经回答的那样,有几种方法。

正如Kubernetes官方文档特别描述了using a Service with a type NodePort,我想描述工作流程。

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

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

设置typeNodePort的服务

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

并使用公开的端口通过localhost访问它。例如

curl http://localhost:31040

答案 4 :(得分:0)

非常简单的例子

方法1

$ kubectl create deployment nginx-dep --image=nginx --replicas=2
  • 获取豆荚
$ kubectl get pods
NAME                        READY   STATUS    RESTARTS   AGE
nginx-dep-5c5477cb4-76t9q   1/1     Running   0          7h5m
nginx-dep-5c5477cb4-9g84j   1/1     Running   0          7h5m
  • 使用 kubectl port
  • 访问 pod
$ kubectl port-forward nginx-dep-5c5477cb4-9g84j 8888:80
Forwarding from 127.0.0.1:8888 -> 80
Forwarding from [::1]:8888 -> 80
  • 现在对curl执行localhost:8888
$ curl -v http://localhost:8888 

方法2

您可以公开部署的 port 80(应用程序运行的地方,即 nginx 端口) 通过 NodePort

$ kubectl expose deployment nginx-dep --name=nginx-dep-svc --type=NodePort --port=80
  • 获取服务
$ kubectl get svc 
NAME            TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
kubernetes      ClusterIP   10.96.0.1      <none>        443/TCP        31d
nginx-dep-svc   NodePort    10.110.80.21   <none>        80:31239/TCP   21m
  • 使用 hte NodePort 访问部署
$ curl http://localhost:31239