您如何通过服务访问吊舱?

时间:2019-11-26 03:47:58

标签: kubernetes

我有2个副本的部署。我可以通过curl来访问豆荚。

<table class="table table-borderless table-hover">
        <thead>
            <tr>
                <th>&nbsp;</th>
                <th scope="col">student.Id</th>
                .............
            </tr>
        </thead>
        <tbody>
        @foreach($data as $student)
            <tr class="clickable" data-toggle="collapse" id="row{{ $student['id'] }}" data-target=".row{{ $student['id'] }}">
                <td>{{ $student['id'] }}</td>
            </tr>
            @if ($student['subjects'])
              <tr>
               <td colspan="3">
                <table class="table table-sm table-dark collapse row{{ $student['id'] }}">
                    <thead>
                        <tr>
                            <th scope="col">subject.Id</th>
                             ..............
                        </tr>
                    </thead>
                    <tbody>
                    @foreach($student['subjects'] as $subject)
                        <tr>
                            <td>{{$subject['id']}}</td>
                        </tr>
                        @endforeach
                    </tbody>
                </table>
            </td>
            </tr>
            @endif
        @endforeach
        </tbody>
    </table>

我创建了一项服务。

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

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

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

有人可以帮助我更好地了解这里发生的事情吗?

kubectl获取svc

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

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

  },
  "code": 403
}

卷曲-不安全的https://PUBLICIP:6443

3 个答案:

答案 0 :(得分:1)

使用您的命令试图访问Kubernetes API的/路径,但是由于您没有为请求提供任何凭据,该路径失败了:

curl --insecure https://PUBLICIP:6443

但是无论如何,如果您想访问服务背后的Pod,则不需要访问Kubernetes API,但需要访问公开的服务。

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

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

然后您可以通过一个工作节点之一的IP地址和NodePort访问服务(以及后面的Pod):

curl NODE_IP:NODE_PORT

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

答案 1 :(得分:1)

您正在使用的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

然后从NodePort获得kubectl get svc

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

答案 2 :(得分:0)

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

首先,您必须删除现有服务,

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 NODE_IP:NODE_PORT