我对我的 minikube 集群有一些疑问,特别是为什么需要隧道、隧道的实际含义以及端口号的来源。
我显然是一个完全的 kubernetes 初学者......并且没有大量的网络经验。
好的。我有以下 docker 镜像,我已将其推送到 docker hub。这是一个 hello express 应用,它只是在 /
路线上打印出“Hello world”。
Docker 文件:
FROM node:lts-slim
RUN mkdir /code
COPY package*.json server.js /code/
WORKDIR /code
RUN npm install
EXPOSE 3000
CMD ["node", "server.js"]
我有以下 pod 规格:
web-pod.yaml:
apiVersion: v1
kind: Pod
metadata:
name: web-pod
spec:
containers:
- name: web
image: kahunacohen/hello-kube:latest
ports:
- containerPort: 3000
以下服务:
web-service.yaml
apiVersion: v1
kind: Service
metadata:
name: web-service
spec:
type: NodePort
selector:
app: web-pod
ports:
- port: 8080
targetPort: 3000
protocol: TCP
name: http
以及以下部署:
web-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-deployment
spec:
replicas: 2
selector:
matchLabels:
app: web-pod
service: web-service
template:
metadata:
labels:
app: web-pod
service: web-service
spec:
containers:
- name: web
image: kahunacohen/hello-kube:latest
ports:
- containerPort: 3000
protocol: TCP
在我使用 kubectl 创建它们之后,所有对象都已启动并运行并且看起来不错。
我这样做:
$ kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 7h5m
web-service NodePort 10.104.15.61 <none> 8080:32177/TCP 25m
$ curl $(minikube ip):8080 # or :32177, # or :3000
我没有得到任何回应。
我在执行此操作时发现,但是我可以通过转到 http://127.0.0.1:52650/
来访问该应用程序:
$ minikube service web-service
|-----------|-------------|-------------|---------------------------|
| NAMESPACE | NAME | TARGET PORT | URL |
|-----------|-------------|-------------|---------------------------|
| default | web-service | http/8080 | http://192.168.49.2:32177 |
|-----------|-------------|-------------|---------------------------|
? Starting tunnel for service web-service.
|-----------|-------------|-------------|------------------------|
| NAMESPACE | NAME | TARGET PORT | URL |
|-----------|-------------|-------------|------------------------|
| default | web-service | | http://127.0.0.1:52472 |
|-----------|-------------|-------------|------------------------|
kubectl get services
时,这行是什么意思:web-service NodePort 10.104.15.61 <none> 8080:32177/TCP 25m
具体来说,端口映射是什么意思,32177
来自哪里?
答案 0 :(得分:3)
让我回答你所有的问题。
0 - 不需要单独创建 pods(除非它是要测试的东西),这应该通过创建部署(或 statefulsets,取决于应用程序和需求)来完成,这将创建一个 replicaset
负责在操作条件下保持适量的豆荚。 (您可以熟悉deployments in kubernetes。
1 - Tunnel 用于从运行 minikube 的 VM 内部向主机网络公开服务。适用于 LoadBalancer
服务类型。请参阅access applications in minikube。
1.1 - 无法在 localhost:NodePort
上访问应用程序的原因是 NodePort 暴露在运行 minikube
的 VM 中,而不是在您的本地计算机上。
您可以通过运行 minikube IP
和 curl %GIVEN_IP:NodePort
来找到 minikube 虚拟机的 IP。您应该会收到应用的回复。
2 - targetPort
表示应与其建立端口连接的服务。请参阅define the service。
在 minikube
中,它可能会令人困惑,因为它指向的是 service port
,而不是服务中定义的 targetPort
。我认为想法是指出集群内可以访问哪个端口 service
。
3 - 至于这个问题,有标题,你可以按字面意思对待它们。例如:
$ kubectl get svc -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
web-service NodePort 10.106.206.158 <none> 80:30001/TCP 21m app=web-pod
NodePort
来自 web-service.yaml
对象的 service
。 Type
被明确指定,因此 NodePort
被分配。如果您不指定服务的 type
,它将被创建为 ClusterIP
类型,并且只能在 kubernetes 集群中访问。请参阅Publishing Services (ServiceTypes)。
使用 ClusterIP
类型创建服务时,输出中不会有 NodePort
。例如
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
web-service ClusterIP 10.106.206.158 <none> 80/TCP 23m
External-IP
会在使用 LoadBalancer
服务类型时弹出。此外,一旦您在不同的 shell 中运行 minikube
,minikube tunnel
的地址将出现。在您的主机上可以通过 External-IP
+ service port
访问您的服务之后。
4 - 这种映射没有问题。此外,这是 kubernetes 的默认行为:
<块引用>注意:服务可以将任何传入端口映射到目标端口。默认情况下 为方便起见,targetPort 设置为与 端口字段。
编辑:
取决于 minikube
的 driver(通常这是一个 virtual box
或 docker
- 可以在 .minikube/profiles/minikube/config.json
中的 linux VM 上检查),{{ 1}} 可以有不同的端口转发。例如。我有一个基于 minikube
驱动程序的 minikube
,我可以看到一些映射:
docker
例如 22 用于 ssh 到 $ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ebcbc898b557 gcr.io/k8s-minikube/kicbase:v0.0.23 "/usr/local/bin/entr…" 5 days ago Up 5 days 127.0.0.1:49157->22/tcp, 127.0.0.1:49156->2376/tcp, 127.0.0.1:49155->5000/tcp, 127.0.0.1:49154->8443/tcp, 127.0.0.1:49153->32443/tcp minikube
的 ssh。这可能是您收到 minikube VM