我在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
我试图在我的Mac上拨打http://192.168.1.10/,但它不起作用。
此question涉及类似问题。但解决方案没有帮助,因为我不知道我可以使用哪种IP。
更新
感谢Michael Hausenblas,我使用Ingress制定了一个解决方案。 尽管如此,仍有一些悬而未决的问题:
答案 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
答案 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
字段中报告分配的端口。
设置type
为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
并使用公开的端口通过localhost访问它。例如
curl http://localhost:31040
答案 4 :(得分:0)
非常简单的例子
$ 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
$ 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
您可以公开部署的 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
$ curl http://localhost:31239