我有一些关于我的迷你集群的问题,特别是为什么需要一个隧道,隧道实际上意味着什么,以及端口号来自哪里。
背景
我显然是一个完全的库伯内特斯beginner...and,没有一吨的网络经验。
好的。我有下面的码头形象,我推到码头枢纽。这是一个hello应用程序,它只在/路径上打印出"Hello“。
DockerFile:
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.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从何而来?
发布于 2021-07-13 08:48:26
让我回答你所有的问题。
0-没有必要单独创建豆荚(除非需要测试),这应该通过创建部署(或状态集,取决于应用程序和需求)来完成,这将创建一个replicaset,负责在操作条件下保持适当数量的吊舱。(你可以熟悉在kubernetes的部署。
1- 隧道用于从VM内部公开服务,其中minikube正在运行到主机的网络。适用于LoadBalancer服务类型。请参考minikube的access应用程序。
1.1 -在localhost:NodePort上无法访问应用程序的原因是在运行minikube的VM中公开的,而不是在本地机器上。
您可以通过运行minikube IP和curl %GIVEN_IP:NodePort来找到minikube的IP。你应该从你的应用程序中得到回复。
2- targetPort表示应该与之建立端口连接的服务。请参考定义服务。
在minikube中,这可能会令人困惑,因为它指向的是service port,而不是服务中定义的targetPort。我认为这样做的目的是表明集群中哪个端口service是可访问的。
对于这个问题,这里有标题,你可以按字面处理。例如:
$ 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-podNodePort来自于web-service.yaml for service对象。显式地指定了Type,因此分配了NodePort。如果您不指定type of service,它将被创建为ClusterIP类型,并且只能在kubernetes集群中访问。请参考出版服务(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 23mExternal-IP将在使用LoadBalancer服务类型时弹出。另外,对于minikube,一旦在不同的shell中运行minikube tunnel,地址就会出现。在您的服务可以通过External-IP + service port在您的主机上访问之后。
4.这种绘图不存在任何问题。此外,这是kubernetes的默认行为:
注意:服务可以将任何传入端口映射到targetPort。默认情况下,为了方便起见,将targetPort设置为与端口字段相同的值。
请参阅定义服务
编辑:
根据司机 of minikube (通常这是一个virtual box或docker -可以在.minikube/profiles/minikube/config.json中的linux上检查),minikube可以有不同的端口转发。例如,我有一个基于minikube驱动程序的docker,我可以看到一些映射:
$ 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例如,22将ssh到ssh转换为minikube VM。这可能是你得到http://127.0.0.1:52650/回应的原因之一
https://stackoverflow.com/questions/68336875
复制相似问题