【问题标题】:How do you access pods through a service?您如何通过服务访问 pod?
【发布时间】:2020-03-21 10:21:35
【问题描述】:

我有一个包含 2 个副本的部署。我可以通过 curl 访问 pod。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80

我创建了一个服务。

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80

我希望能够通过 EndPoints 通过服务访问 Pod,但我得到的结果是。

{
  "kind": "Status",
  "apiVersion": "v1",
  "metadata": {

  },
  "status": "Failure",
  "message": "forbidden: User \"system:anonymous\" cannot get path \"/\"",
  "reason": "Forbidden",
  "details": {

  },
  "code": 403
}

有人可以帮助我更好地了解这里发生了什么吗?

kubectl 获取服务

NAME            TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
kubernetes      ClusterIP   10.96.0.1      <none>        443/TCP   2d23h
nginx-service   ClusterIP   10.109.19.46   <none>        80/TCP    22h

curl --insecure https://PUBLICIP:6443

【问题讨论】:

  • 能否请您更新 1) kubectl get svc 2) 您尝试访问服务的 curl/wget 命令 3) 您尝试从哪里尝试 curl 命令。 ?
  • 添加在上面,看起来 curl 10.109.19.46 可以工作。我可能误解了用于访问它的 IP。
  • 授权失败。您不是以普通用户身份进行身份验证,而是以“匿名”用户身份进行身份验证。请在问题中添加您正在执行的返回上述结果的命令。

标签: kubernetes


【解决方案1】:

通过您的命令,您尝试访问 Kubernetes API 的 / 路径,但由于您没有为请求提供任何凭据而失败:

curl --insecure https://PUBLICIP:6443

但是无论如何,如果你想访问Service后面的Pods,你不需要访问Kubernetes API,但你需要访问暴露的Service。

您的示例中的 ClusterIP 服务(默认)无法从集群外部访问。如果你想从集群外部访问 Service,你需要创建一个 NodePort 服务:

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  type: NodePort

然后您可以通过其中一个工作节点的 IP 地址和 NodePort 访问 Service(以及其背后的 Pod):

curl NODE_IP:NODE_PORT

您可以使用kubectl get nodes -o wide 获取其中一个节点的NODE_IP,使用kubectl get svc nginx-service 获取Service 的NODE_PORT

【讨论】:

  • 我第一次尝试通过服务访问。在那之后我打算尝试一个入口。
  • 不需要 Ingress,只需要 ClusterIP 以外的 Service。例如 NodePort。
【解决方案2】:

您正在使用的curl 命令将命中Kubernetes API server(默认为6443 端口);不是您创建的服务。

您创建的nginx-service 将创建一个ClusterIP 服务,该服务将无法从外部访问。您必须使用NodePortLoadBalancer 类型的服务。

要访问您的服务,您可以在下面尝试(使用NodePort

kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  type: NodePort

然后从kubectl get svc获取NodePort

NAME            TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
kubernetes      ClusterIP   10.96.0.1      <none>        443/TCP   2d23h
nginx-service   NodePort    10.109.19.46   <none>        80:32474/TCP    22h <<<-- (NodePort is 32474)

您可以使用任何节点的 IP 和端口 32474 组合访问服务。

例如:-

curl http://192.168.10.10:32474

【讨论】:

    【解决方案3】:

    最简单的方法是使用kubectl 将服务公开为"NodePort"

    最初,您必须删除现有服务,

    kubectl delete svc nginx-service //if you have a namespace -n yourNameSpace
    

    然后将您的部署公开为“NodePort”,如下所示,

    kubectl expose deployment nginx-deployment --port=80 --type=NodePort --name=nginx-service //if you have a namespace -n yourNameSpace
    

    现在“NodePort”服务已经创建,你可以通过 curl 访问该服务,

    curl NODE_IP:NODE_PORT
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-23
      • 2018-11-06
      • 2019-04-23
      • 1970-01-01
      • 2021-10-06
      • 2016-03-17
      相关资源
      最近更新 更多