如何启动服务并在 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:32212http://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".