在kubernetes的港口错了?

d4so4syb  于 2023-08-03  发布在  Kubernetes
关注(0)|答案(2)|浏览(78)

我想在kubernetes中运行ASP.NET应用程序,特别是我的本地minikube示例。
1.我创建了Dockerfile:

FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
EXPOSE 80
EXPOSE 443
# omitted

FROM base AS final
# omited
ENTRYPOINT [ "dotnet", "Application.dll", "--urls http://0.0.0.0:80;https://0.0.0.0:443" ]

字符串
1.我正在使用Windows和PowerShell,所以我将docker重定向到我的minikube的docker:

& minikube -p minikube docker-env --shell powershell  | Invoke-Expression


1.我创建了secret/configMap/deployment/service yaml文件:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: identities-deployment
  labels:
    app: identities
spec:
  replicas: 1
  selector:
    matchLabels:
      app: identities
  template:
    metadata:
      labels:
        app: identities
    spec:
      containers:
      - name: identities
        image: identities-service:latest
        imagePullPolicy: Never
        ports:
        - containerPort: 80
        - containerPort: 443
---
apiVersion: v1
kind: Service
metadata:
  name: identities-service
spec:
  type: NodePort
  selector:
    app: identities
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
      nodePort: 30001
      name: http
    - protocol: TCP
      port: 443
      targetPort: 443
      nodePort: 30002
      name: https


1.我通过运行minikube ip获得minikube的IP。返回192.168.49.2
1.我向192.168.49.2:30001发送了一个http请求来检查应用程序的健康状况(应该返回200),但是它超时了。
1.我在应用程序的容器中获得一个shell,并确保可以从localhost:80处的应用程序获得响应(它返回200,所以没关系)

kubectl exec --stdin --tty identities-deployment-d794d7866-6bnhn -- /bin/bash
curl localhost:80


1.我在minikube的容器中获取一个shell,并确保我可以从localhost:30001处的应用程序获得响应(它返回200,所以没关系)

docker exec -it 46cca50fc3b3 sh 
curl localhost:30001


1.我运行minikube service identities-service --url并得到:

http://127.0.0.1:51504
http://127.0.0.1:51505
❗  Because you are using a Docker driver on windows, the terminal needs to be open to run it.


1.我向localhost:51504发送请求,它返回200(成功)
我的问题是,在第5步,为什么它超时了,如何解决它?我希望我的应用程序暴露在端口30001,我不确定51504是从哪里来的。顺便说一句,如果我运行docker ps -a(使用我的本地Docker,而不是minikubes),我会得到:

CONTAINER ID   IMAGE                                 COMMAND                  CREATED          STATUS
    PORTS
                      NAMES
46cca50fc3b3   gcr.io/k8s-minikube/kicbase:v0.0.39   "/usr/local/bin/entr…"   55 minutes ago   Up 55 minutes
    127.0.0.1:58799->22/tcp, 127.0.0.1:58800->2376/tcp, 127.0.0.1:58802->5000/tcp, 127.0.0.1:58803->8443/tcp, 127.0.0.1:58801->32443/tcp   minikube


我不希望端口30001被Map到minikube的容器中,因为我通过minikube的ip访问我的应用程序,但我越想越觉得端口30001和30002被Map到minikube的容器中与我的本地机器,而不仅仅是在k8s集群中。这是解决办法吗?如果是这样,我如何Map这些端口?我只运行了minikube start

oxf4rvwz

oxf4rvwz1#

使用NodePort公开的服务应该可以在minikube_IP:NodePort上访问,在您的示例中是192.168.49.2:30001,但由于服务在主机上的端口5150451505上公开,因此它超时了。
你可以通过在minikube中使用tunnel来实现:

minikube tunnel
kubectl get services deploymentName

字符串
这提供了访问应用所需的外部IP地址。
有关更多信息,请点击此official doc

goucqfw6

goucqfw62#

我发现通过运行kubectl port-forward svc/identities-service 30001:80,我得到了在端口30001应答请求的服务。但我需要打开终端。kubectl有办法推断出这一点吗?

相关问题