Kubernetes - 如何访问 minikube 中的部署?

Kubernetes - How to access deployments in minikube?

我已经使用以下配置在 minikube 上部署了一个应用程序。

部署:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: angular-app
spec:
  replicas: 2
  selector:
    matchLabels:
      run: angular-app
  template:
    metadata:
      labels:
        run: angular-app
    spec:
      containers:
      - name: angular-app
        image: nheidloff/angular-app
        ports:
        - containerPort: 80
        - containerPort: 443
    

服务:

apiVersion: v1
kind: Service
metadata:
  name: angular-app
  labels:
    run: angular-app
spec:
  type: NodePort
  ports:
  - port: 80
    targetPort: 80
    protocol: TCP
    name: http

服务说明:

Name:                     angular-app    
Namespace:                default        
Labels:                   run=angular-app
Annotations:              <none>
Selector:                 <none>
Type:                     NodePort       
IP Family Policy:         SingleStack    
IP Families:              IPv4
IP:                       10.102.174.98  
IPs:                      10.102.174.98
Port:                     http  80/TCP
TargetPort:               80/TCP
NodePort:                 http  31503/TCP
Endpoints:                172.17.0.3:80,172.17.0.4:80
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>

当我尝试访问端点时,链接没有响应。但是在使用 minikube service angular-app 之后。以下出现:

|-----------|-------------|-------------|---------------------------|
| NAMESPACE |    NAME     | TARGET PORT |            URL            |
|-----------|-------------|-------------|---------------------------|
| default   | angular-app | http/80     | http://192.168.49.2:31503 |
|-----------|-------------|-------------|---------------------------|
  Starting tunnel for service angular-app.
|-----------|-------------|-------------|------------------------|
| NAMESPACE |    NAME     | TARGET PORT |          URL           |
|-----------|-------------|-------------|------------------------|
| default   | angular-app |             | http://127.0.0.1:60611 |
|-----------|-------------|-------------|------------------------|

使用此 ip http://127.0.0.1:60611 我可以访问该应用程序。服务描述中给出的端点有什么用?如何访问每个副本?假设我有 4 个副本,我如何访问每个副本?

  • 服务描述中提供的端点是每个pods172.17.0.3:80,172.17.0.4:80的端点,当您部署更多副本时,您将拥有更多端点。

  • angular-app 服务绑定到端口号 31503,您可以从集群节点(而不是您的主机)访问此端口上的服务。

  • minikube service angular-app 将在您的主机和端口 60611 上的群集节点之间创建隧道。这意味着出现在 127.0.0.1:60611 上的任何内容都将被重定向到 192.168.49.2:31503,然后是可用端点之一。

  • 该服务会自动平衡所有副本之间的负载,您无需担心。

  • 如果您想访问特定的 pod,您可以使用以下命令:

kubectl port-forward ${POD_NAME} 80:80

您需要替换上述命令中的 pod 名称,并且该命令假定端口 80 在您的计算机上可用。

~al-waleed-shihadeh 的回答是正确的,但我想提供一些额外的信息。

  • 您也应该能够通过 NodePort 访问该服务,而无需 minikube service 命令:http://192.168.49.2:31503。端口是随机分配的,但您可以在 30000-32767

    范围内选择一个固定端口
    spec:
      type: NodePort
      ports:
      - port: 80
        targetPort: 80
        protocol: TCP
        name: http
        nodePort: 30080
    
  • 如果您希望 'normal' URL 访问该服务,您必须添加允许通过反向代理访问该服务的 Ingress。它将使用 load-balancing.

    路由到您的一项服务 pods
  • 如果您希望将 URL 分别固定到每个 pods,您可以使用 StatefulSet 而不是 Deployment,并使用选择器创建 4 个不同的服务angular-app-0 到 angular-app-3,然后还有 4 个不同的入口。