Skip to content
This repository has been archived by the owner on Dec 16, 2021. It is now read-only.

Missing PATH on kubeless.js runtime #62

Open
juanxhos opened this issue Mar 4, 2020 · 8 comments
Open

Missing PATH on kubeless.js runtime #62

juanxhos opened this issue Mar 4, 2020 · 8 comments

Comments

@juanxhos
Copy link

juanxhos commented Mar 4, 2020

Is this a BUG REPORT or FEATURE REQUEST?:
BUG REPORT

What happened:
When I send request with path ping using kubeless.js middleware it send / instead of the path

What you expected to happen:
to send the path requested

How to reproduce it (as minimally and precisely as possible):
curl --header "Host: kubernetes.docker.internal.nip.io" localhost/ping
and logs says

  'event-type': undefined,
  'event-id': undefined,
  'event-time': undefined,
  'event-namespace': undefined,
  data: {},
  extensions: {
    request: IncomingMessage {
      _readableState: [ReadableState],
      readable: true,
      _events: [Object: null prototype],
      _eventsCount: 1,
      _maxListeners: undefined,
      socket: [Socket],
      connection: [Socket],
      httpVersionMajor: 1,
      httpVersionMinor: 1,
      httpVersion: '1.1',
      complete: false,
      headers: [Object],
      rawHeaders: [Array],
      trailers: {},
      rawTrailers: [],
      aborted: false,
      upgrade: false,
      url: '/',
      method: 'GET',
      statusCode: null,
      statusMessage: null,
      client: [Socket],
      _consuming: false,
      _dumped: false,
      next: [Function: next],
      baseUrl: '',
      originalUrl: '/',
      _parsedUrl: [Url],
      params: [Object],
      query: {},
      res: [ServerResponse],
      _startAt: [Array],
      _startTime: 2020-03-04T15:48:55.191Z,
      _remoteAddress: '::ffff:10.1.0.162',
      body: {},
      route: [Route]
    },
    response: ServerResponse {
      _events: [Object: null prototype],
      _eventsCount: 2,
      _maxListeners: undefined,
      outputData: [],
      outputSize: 0,
      writable: true,
      _last: false,
      chunkedEncoding: false,
      shouldKeepAlive: true,
      useChunkedEncodingByDefault: true,
      sendDate: true,
      _removedConnection: false,
      _removedContLen: false,
      _removedTE: false,
      _contentLength: null,
      _hasBody: true,
      _trailer: '',
      finished: false,
      _headerSent: false,
      socket: [Socket],
      connection: [Socket],
      _header: null,
      _onPendingData: [Function: bound updateOutgoingData],
      _sent100: false,
      _expect_continue: false,
      req: [IncomingMessage],
      locals: [Object: null prototype] {},
      _startAt: undefined,
      _startTime: undefined,
      writeHead: [Function: writeHead],
      __onFinished: [Function],
      [Symbol(isCorked)]: false,
      [Symbol(outHeadersKey)]: [Object: null prototype]
    }
  }
}
::ffff:10.1.0.162 - - [04/Mar/2020:15:48:55 +0000] "GET / HTTP/1.1" 200 421 "-" "PostmanRuntime/7.20.1"

on AWS, works fine: because there is path sending...

  "message": "Go Serverless v1.0! Your function executed successfully!",
  "input": {
    "resource": "/users/create",
    "path": "/users/create",
    "httpMethod": "GET",
    "headers": {
      "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
      "Accept-Encoding": "gzip, deflate, br",
      "Accept-Language": "es-ES,es;q=0.9,en;q=0.8",
      "CloudFront-Forwarded-Proto": "https",
      "CloudFront-Is-Desktop-Viewer": "true",
      "CloudFront-Is-Mobile-Viewer": "false",
      "CloudFront-Is-SmartTV-Viewer": "false",
      "CloudFront-Is-Tablet-Viewer": "false",
      "CloudFront-Viewer-Country": "CL",
      "dnt": "1",
      "Host": "u5m2ln50ff.execute-api.us-east-1.amazonaws.com",
      "sec-fetch-dest": "document",
      "sec-fetch-mode": "navigate",
      "sec-fetch-site": "none",
      "upgrade-insecure-requests": "1",
      "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36",
      "Via": "2.0 1ddeacce24f5e91d497c9d8a72218fd2.cloudfront.net (CloudFront)",
      "X-Amz-Cf-Id": "l0OoCHP16-AiD4mWWZTppe3U1wRp1_nvKf4SAv2a11VpLJ4SxSW7ZA==",
      "X-Amzn-Trace-Id": "Root=1-5e5fb4f8-ef67231d936e9b9f5229f781",
      "X-Forwarded-For": "186.10.254.186, 130.176.40.155",
      "X-Forwarded-Port": "443",
      "X-Forwarded-Proto": "https"
    },
    "multiValueHeaders": {
      "Accept": [
        "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9"
      ],
      "Accept-Encoding": [
        "gzip, deflate, br"
      ],
      "Accept-Language": [
        "es-ES,es;q=0.9,en;q=0.8"
      ],
      "CloudFront-Forwarded-Proto": [
        "https"
      ],
      "CloudFront-Is-Desktop-Viewer": [
        "true"
      ],
      "CloudFront-Is-Mobile-Viewer": [
        "false"
      ],
      "CloudFront-Is-SmartTV-Viewer": [
        "false"
      ],
      "CloudFront-Is-Tablet-Viewer": [
        "false"
      ],
      "CloudFront-Viewer-Country": [
        "CL"
      ],
      "dnt": [
        "1"
      ],
      "Host": [
        "u5m2ln50ff.execute-api.us-east-1.amazonaws.com"
      ],
      "sec-fetch-dest": [
        "document"
      ],
      "sec-fetch-mode": [
        "navigate"
      ],
      "sec-fetch-site": [
        "none"
      ],
      "upgrade-insecure-requests": [
        "1"
      ],
      "User-Agent": [
        "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36"
      ],
      "Via": [
        "2.0 1ddeacce24f5e91d497c9d8a72218fd2.cloudfront.net (CloudFront)"
      ],
      "X-Amz-Cf-Id": [
        "l0OoCHP16-AiD4mWWZTppe3U1wRp1_nvKf4SAv2a11VpLJ4SxSW7ZA=="
      ],
      "X-Amzn-Trace-Id": [
        "Root=1-5e5fb4f8-ef67231d936e9b9f5229f781"
      ],
      "X-Forwarded-For": [
        "186.10.254.186, 130.176.40.155"
      ],
      "X-Forwarded-Port": [
        "443"
      ],
      "X-Forwarded-Proto": [
        "https"
      ]
    },
    "queryStringParameters": null,
    "multiValueQueryStringParameters": null,
    "pathParameters": null,
    "stageVariables": null,
    "requestContext": {
      "resourceId": "j246vp",
      "resourcePath": "/users/create",
      "httpMethod": "GET",
      "extendedRequestId": "I3k21EGcIAMFePA=",
      "requestTime": "04/Mar/2020:14:02:32 +0000",
      "path": "/dev/users/create",
      "accountId": "081356250805",
      "protocol": "HTTP/1.1",
      "stage": "dev",
      "domainPrefix": "u5m2ln50ff",
      "requestTimeEpoch": 1583330552468,
      "requestId": "65f053c2-cd2b-4ecf-a272-d6015ab24bad",
      "identity": {
        "cognitoIdentityPoolId": null,
        "accountId": null,
        "cognitoIdentityId": null,
        "caller": null,
        "sourceIp": "186.10.254.186",
        "principalOrgId": null,
        "accessKey": null,
        "cognitoAuthenticationType": null,
        "cognitoAuthenticationProvider": null,
        "userArn": null,
        "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36",
        "user": null
      },
      "domainName": "u5m2ln50ff.execute-api.us-east-1.amazonaws.com",
      "apiId": "u5m2ln50ff"
    },
    "body": null,
    "isBase64Encoded": false
  }
}

Anything else we need to know?:

I found out in runtime:
https://github.com/kubeless/runtimes/blob/master/stable/nodejs/lib/helper.js#L38-L50
there no funtion for *
I would expect something like:

function routeAll(expressApp, promClient) {
  expressApp.get('/*', (req, res) => {
    return {req, res}
  });
}

I do not know if it works

Environment:

  • Kubernetes version:
    Client Version: version.Info{Major:"1", Minor:"17", GitVersion:"v1.17.3", GitCommit:"06ad960bfd03b39c8310aaf92d1e7c12ce618213", GitTreeState:"clean", BuildDate:"2020-02-13T18:08:14Z", GoVersion:"go1.13.8", Compiler:"gc", Platform:"darwin/amd64"}
    Server Version: version.Info{Major:"1", Minor:"15", GitVersion:"v1.15.5", GitCommit:"20c265fef0741dd71a66480e35bd69f18351daea", GitTreeState:"clean", BuildDate:"2019-10-15T19:07:57Z", GoVersion:"go1.12.10", Compiler:"gc", Platform:"linux/amd64"}
  • Kubeless version:
    Kubeless version: v1.0.6
  • Cloud provider or physical cluster:
    Docker 2 Machine
@juanxhos
Copy link
Author

juanxhos commented Mar 4, 2020

My test escenario https://github.com/jcalonsoh/test-kubeless

@andresmgot
Copy link
Contributor

andresmgot commented Mar 5, 2020

mm, I am not able to reproduce your issue, are you using an HTTP trigger?

In my case, I have deployed the sample nodejs function and a simple HTTP trigger:

▶ kubeless function deploy get-nodejs --runtime nodejs6 --handler helloget.foo --from-file nodejs/helloget.js
▶ kubeless trigger http create get-nodejs --function-name get-nodejs

I can see the path logged when I am doing requests:

▶ curl -H "Host: get-nodejs.127.0.0.1.nip.io" localhost:30080/foobar
hello world!%                                                                                                                  
▶ kubectl logs get-nodejs-5bd7c8848b-hz5pf | grep foobar            
        url: '/foobar',
        originalUrl: '/foobar',
     url: '/foobar',
     originalUrl: '/foobar',
        pathname: '/foobar',
        path: '/foobar',
        href: '/foobar',
        _raw: '/foobar' },
     params: { '0': '/foobar' },
        url: '/foobar',
        originalUrl: '/foobar',
::ffff:10.244.0.5 - - [05/Mar/2020:10:48:42 +0000] "GET /foobar HTTP/1.1" 200 - "-" "curl/7.58.0"

@juanxhos
Copy link
Author

juanxhos commented Mar 5, 2020

mm, I am not able to reproduce your issue, are you using an HTTP trigger?

In my case, I have deployed the sample nodejs function and a simple HTTP trigger:

▶ kubeless function deploy get-nodejs --runtime nodejs6 --handler helloget.foo --from-file nodejs/helloget.js
▶ kubeless trigger http create get-nodejs --function-name get-nodejs

I can see the path logged when I am doing requests:

▶ curl -H "Host: get-nodejs.127.0.0.1.nip.io" localhost:30080/foobar
hello world!%                                                                                                                  
▶ kubectl logs get-nodejs-5bd7c8848b-hz5pf | grep foobar            
        url: '/foobar',
        originalUrl: '/foobar',
     url: '/foobar',
     originalUrl: '/foobar',
        pathname: '/foobar',
        path: '/foobar',
        href: '/foobar',
        _raw: '/foobar' },
     params: { '0': '/foobar' },
        url: '/foobar',
        originalUrl: '/foobar',
::ffff:10.244.0.5 - - [05/Mar/2020:10:48:42 +0000] "GET /foobar HTTP/1.1" 200 - "-" "curl/7.58.0"

can you share your repo, please
and what version are you using ??

@andresmgot
Copy link
Contributor

I am using the helloget example from this repo (I only added a console.log of the request to print more info):

https://github.com/kubeless/runtimes/blob/master/stable/nodejs/examples/helloget.js

I am using kubeless 1.0.6.

In your case, I believe it's an issue with the HTTP trigger/ingress configuration. How did you create it? What ingress controller are you using?

@juanxhos
Copy link
Author

juanxhos commented Mar 6, 2020

Thanks I found out the problem, it's on plugin serverless-kubeless

https://github.com/serverless/serverless-kubeless/blob/master/lib/deploy.js#L533

looks like there is no definition function to create HTTPTrigger

apiVersion: kubeless.io/v1beta1
kind: HTTPTrigger
metadata:
 name: cors-trigger
 annotations:
  nginx.ingress.kubernetes.io/enable-cors: "true"
  nginx.ingress.kubernetes.io/cors-allow-methods: "GET"
spec:
 function-name: get-python
 host-name: example.com
 path: echo

I know there are 3 types of httptrigger, but at least can do something for at least nginx default type ?

@andresmgot
Copy link
Contributor

Ah, yes, the serverless-kubeless creates an Ingress resource directly rather than creating an HTTP Trigger (which is the Kubeless abstraction). I recommend you to use the kubeless CLI to create the HTTP trigger since the serverless plugin is a bit behind regarding functionality.

In any case we are open to contributions for any project in case anyone wants to fix the issue there.

@juanxhos
Copy link
Author

juanxhos commented Mar 6, 2020

Nice... I am looking forward. Better if you have a Doc to setup an dev env for help on issues.

@andresmgot
Copy link
Contributor

We have a bit of documentation for the Kubeless main project (https://kubeless.io/docs/dev-guide/) but unfortunately not here

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants