如何启动服务并在 minikube 中访问它
How to start a service and access it in minikube
我在 minikube 中部署了一个网络应用。
部署:
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
replicas: 3
selector:
matchLabels:
app: maypp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: myapp
imagePullPolicy: Never
ports:
- containerPort: 8080
restartPolicy: Always
服务:
apiVersion: v1
kind: Service
metadata:
name: myservice
spec:
type: NodePort
ports:
- port: 8080
部署kubectl apply -f .
后全部为运行。
kubectl get po
NAMESPACE NAME READY STATUS RESTARTS AGE
default myapp-5d042b65c8-h7kag 1/1 Running 0 10m
kubectl get svc
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
default myservice NodePort 10.102.128.35 <none> 8080:32212/TCP 10m
运行 minikube service
在浏览器中打开服务:
minikube service myservice
|----------------|--------------------|-------------|---------------------------|
| NAMESPACE | NAME | TARGET PORT | URL |
|----------------|--------------------|-------------|---------------------------|
| default | myservice | 8080 | http://192.168.49.2:32212 |
|----------------|--------------------|-------------|---------------------------|
Starting tunnel for service myservice.
|----------------|--------------------|-------------|------------------------|
| NAMESPACE | NAME | TARGET PORT | URL |
|----------------|--------------------|-------------|------------------------|
| default | myservice | | http://127.0.0.1:55401 |
|----------------|--------------------|-------------|------------------------|
Opening service default/myservice in default browser...
在浏览器中,我无法同时使用 http://192.168.49.2:32212
和 http://127.0.0.1:55401
访问我的应用程序。甚至 http://127.0.0.1:8080
.
从 pod 的日志来看,容器中的 Web 服务器是 运行:
kubectl logs -f myapp-5d042b65c8-h7kag
...
____________________________________O/_______
O\
⇨ http server started on [::]:8080
但是没有得到正确访问端点的方法。所以没有发生任何流量。
如果我使用 docker 部署容器,它可以使用 http://127.0.0.1:8080
。
问题是 Service
中缺少 selector
字段。
apiVersion: v1
kind: Service
metadata:
name: myservice
spec:
type: NodePort
selector:
app: myapp
ports:
- port: 8080
服务根据服务规范中定义的选择器将流量路由到 pods,该选择器与 pods 上定义的标签相匹配。
来自文档的 defining-a-service 部分:
The controller for the Service selector continuously scans for Pods
that match its selector, and then POSTs any updates to an Endpoint
object also named "my-service".
我在 minikube 中部署了一个网络应用。
部署:
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
replicas: 3
selector:
matchLabels:
app: maypp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: myapp
imagePullPolicy: Never
ports:
- containerPort: 8080
restartPolicy: Always
服务:
apiVersion: v1
kind: Service
metadata:
name: myservice
spec:
type: NodePort
ports:
- port: 8080
部署kubectl apply -f .
后全部为运行。
kubectl get po
NAMESPACE NAME READY STATUS RESTARTS AGE
default myapp-5d042b65c8-h7kag 1/1 Running 0 10m
kubectl get svc
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
default myservice NodePort 10.102.128.35 <none> 8080:32212/TCP 10m
运行 minikube service
在浏览器中打开服务:
minikube service myservice
|----------------|--------------------|-------------|---------------------------|
| NAMESPACE | NAME | TARGET PORT | URL |
|----------------|--------------------|-------------|---------------------------|
| default | myservice | 8080 | http://192.168.49.2:32212 |
|----------------|--------------------|-------------|---------------------------|
Starting tunnel for service myservice.
|----------------|--------------------|-------------|------------------------|
| NAMESPACE | NAME | TARGET PORT | URL |
|----------------|--------------------|-------------|------------------------|
| default | myservice | | http://127.0.0.1:55401 |
|----------------|--------------------|-------------|------------------------|
Opening service default/myservice in default browser...
在浏览器中,我无法同时使用 http://192.168.49.2:32212
和 http://127.0.0.1:55401
访问我的应用程序。甚至 http://127.0.0.1:8080
.
从 pod 的日志来看,容器中的 Web 服务器是 运行:
kubectl logs -f myapp-5d042b65c8-h7kag
...
____________________________________O/_______
O\
⇨ http server started on [::]:8080
但是没有得到正确访问端点的方法。所以没有发生任何流量。
如果我使用 docker 部署容器,它可以使用 http://127.0.0.1:8080
。
问题是 Service
中缺少 selector
字段。
apiVersion: v1
kind: Service
metadata:
name: myservice
spec:
type: NodePort
selector:
app: myapp
ports:
- port: 8080
服务根据服务规范中定义的选择器将流量路由到 pods,该选择器与 pods 上定义的标签相匹配。
来自文档的 defining-a-service 部分:
The controller for the Service selector continuously scans for Pods that match its selector, and then POSTs any updates to an Endpoint object also named "my-service".