使用 Desktop Docker 设置无法通过节点端口访问 Kubernetes 服务

Kubernetes services are not accessible through nodeport with Desktop Docker setup

我在 windows 10 上使用 Docker 桌面。我生成了 kubernetes NodePort 服务以从客户端 Web 浏览器访问 (http://10.110.201.24:30008/hello/praveen),但无法访问该服务。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  selector:
    matchLabels:
      run: spring-app
  replicas: 1
  template:
    metadata:
      labels:
        run: spring-app
    spec:
      containers:
        - name: spring-boot
          image: praveen1233/spring-boot:v1
          ports:
            - containerPort: 80

服务

apiVersion: v1
kind: Service
metadata:
  name: service
spec:
  type: NodePort
  ports:
    - port: 80
      targetPort: 80
      nodePort: 30008

Docker文件

FROM openjdk:8u212-jdk-slim
LABEL maintainer="praveen.ambati33@gmail.com"
VOLUME /tmp
EXPOSE 5001
ARG JAR_FILE=target/spring-boot-app.jar
ADD ${JAR_FILE} spring-boot-app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/spring-boot-app.jar"]

我已经编写了简单的基于 Web 的 spring 引导应用程序,如下所示

@RestController
public class HelloController {
    @GetMapping( value = "hello/{input}")
    public String getMessage(@PathVariable String input){
        return "Hi "+input;
    }
}

application.properties

server.port=5000

我可以看到就部署、Pod 和服务状态而言,一切看起来都很好。但是我无法访问该应用程序。

kubectl get all
NAME                            READY   STATUS             RESTARTS   AGE
pod/my-app-7b77675f79-wwbfl     1/1     Running            0          32m

NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
service/kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP        6d1h
service/service      NodePort    10.110.201.24   <none>        80:30008/TCP   23m

NAME                       READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/my-app     1/1     1            1           32m

NAME                                  DESIRED   CURRENT   READY   AGE
replicaset.apps/my-app-7b77675f79     1         1         1       32m

我猜他们在 Docker Hub 中访问 ip 的方式可能不同,我无法弄清楚!能否请你帮忙。赞赏!

Docker 和 k8s 版本如下

Client: Docker Engine - Community
 Version:           19.03.8
 API version:       1.40
 Go version:        go1.12.17
 Git commit:        afacb8b
 Built:             Wed Mar 11 01:23:10 2020
 OS/Arch:           windows/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.8
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.17
  Git commit:       afacb8b
  Built:            Wed Mar 11 01:29:16 2020
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          v1.2.13
  GitCommit:        7ad184331fa3e55e52b890ea95e65ba581ae3429
 runc:
  Version:          1.0.0-rc10
  GitCommit:        dc9208a3303feef5b3839f4323d9beb36df0a9dd
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683

你的端口设置不直

部署 yml 中有端口 80,DockerFile 中有端口 5001,应用程序属性中有 5000。他们应该匹配。

更新

另一个问题是您的服务没有选择器。所以 Service 不知道应该将流量路由到哪个 pod。

spec:
  type: NodePort
  ports:
    - port: 5000
      targetPort: 5000
      nodePort: 30008
  selector:
    app: my-app

Deploment 必须有相应的标签。

metadata:
  name: my-app-v1
  labels:
    app: my-app
    version: v1