【问题标题】:k8s ngnix container return json responsek8s nginx容器返回json响应
【发布时间】:2017-03-25 22:47:35
【问题描述】:

我有一个 k8s 集群,除此之外还有一个运行 nginx 的东西。 当我这样做时curl -v <url> 我得到了

    HTTP/1.1 200 OK
< Content-Type: text/html
< Date: Fri, 24 Mar 2017 15:25:27 GMT
< Server: nginx
< Strict-Transport-Security: max-age=15724800; includeSubDomains; preload
< Content-Length: 0
< Connection: keep-alive
<
* Curl_http_done: called premature == 0
* Connection #0 to host <url> left intact

但是当我curl -v &lt;url&gt; -H 'Accept: application/json' 我得到了

< HTTP/1.1 200 OK
< Content-Type: text/html
< Date: Fri, 24 Mar 2017 15:26:10 GMT
< Server: nginx
< Strict-Transport-Security: max-age=15724800; includeSubDomains; preload
< Content-Length: 0
< Connection: keep-alive
<
* Curl_http_done: called premature == 0
* Connection #0 to host <url> left intact
* Could not resolve host: application
* Closing connection 1
curl: (6) Could not resolve host: application

我的任务是获取返回 json 而不是 html 的请求。 据我了解,我必须创建一个入口控制器并以某种方式修改 ngnix.conf,我已经尝试了几天但无法做到正确。任何形式的帮助将不胜感激。

以下是我一直在使用的 yaml 文件:

配置图:

apiVersion: v1
data:
  server-tokens: "false"
  proxy-body-size: "4110m"
  server-name-hash-bucket-size: "128"
kind: ConfigMap
metadata:
  name: nginx-load-balancer-conf
  labels:
    app: nginx-ingress-lb

守护进程:

apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
  name: nginx-ingress-lb
  labels:
    app: nginx-ingress-lb
spec:
  template:
    metadata:
      labels:
        name: nginx-ingress-lb
        app: nginx-ingress-lb

    spec:
      terminationGracePeriodSeconds: 60
      nodeSelector:
        NodeType: worker
      containers:
      - image: gcr.io/google_containers/nginx-ingress-controller:0.9.0-beta.1

        name: nginx-ingress-lb
        imagePullPolicy: Always
        readinessProbe:
          httpGet:
            path: /healthz
            port: 10254
            scheme: HTTP
        livenessProbe:
          httpGet:
            path: /healthz
            port: 10254
            scheme: HTTP
          initialDelaySeconds: 10
          timeoutSeconds: 1
        # use downward API
        env:
          - name: POD_NAME
            valueFrom:
              fieldRef:
                fieldPath: metadata.name
          - name: POD_NAMESPACE
            valueFrom:
              fieldRef:
                fieldPath: metadata.namespace
        ports:
        - containerPort: 80
          hostPort: 80
        - containerPort: 443
          hostPort: 443
        args:
        - /nginx-ingress-controller
        - --default-backend-service=$(POD_NAMESPACE)/default-http-backend
        - --configmap=$(POD_NAMESPACE)/nginx-load-balancer-conf

部署:

apiVersion: extensions/v1beta1
kind: Deployment

metadata:
  name: default-http-backend
  labels:
    app: default-http-backend

spec:
  replicas: 2
  template:

    metadata:
      labels:
        app: default-http-backend

    spec:
      terminationGracePeriodSeconds: 60
      containers:
      - name: default-http-backend
        # Any image is permissable as long as:
        # 1. It serves a 404 page at /
        # 2. It serves 200 on a /healthz endpoint
        image: gcr.io/google_containers/defaultbackend:1.2
        livenessProbe:
          httpGet:
            path: /healthz
            port: 8080
            scheme: HTTP
          initialDelaySeconds: 30
          timeoutSeconds: 5
        ports:
        - containerPort: 8080
        resources:
          limits:
            cpu: 100m
            memory: 20Mi
          requests:
            cpu: 100m
            memory: 20Mi

服务:

apiVersion: v1
kind: Service
metadata:
  name: default-http-backend
  labels:
    app: default-http-backend
spec:
  selector:
    app: default-http-backend
  ports:
  - port: 80
    targetPort: 8080

【问题讨论】:

    标签: nginx kubernetes


    【解决方案1】:

    删除curl -v &lt;url&gt; -H 'Accept: application/json'中冒号后的空格

    错误消息Could not resolve host: application 表示它将application/json 作为URL,而不是标题。

    【讨论】:

    • 感谢您解决了这个问题,但是响应仍然不是 json: HTTP/1.1 404 Not Found
    • 这意味着您请求的页面/资源在 Nginx 中不存在。你的情况是什么网址?您是否仔细检查过 Nginx 是否包含该内容?
    • 我确定我需要修改 nginx.conf 以返回 json 而不是 HTML,我不知道如何,有链接吗?教程?你可以指导我吗?只需一个简单/基本的配置即可。我可能会弄清楚如何从那里自己返回特定的错误消息。
    【解决方案2】:

    有两件事:

    • 公开您的应用
    • 让您的应用返回 json

    ingess 仅与公开您的应用相关。这不是唯一的选择,您也可以在大多数云提供商上使用服务(例如负载均衡器类型)来实现这一目标。所以,在你解决第二个问题之前,我会保持简单,暂时不使用 ingress。

    正如已经解释的那样,您的 curl 存在语法问题,这就是它显示 curl: (6) Could not resolve host: application 的原因。

    另一件事是修复不会使您的应用返回 json 的问题。这是因为您只是说您接受带有该标头的 json。但是如果你想让你的应用程序返回 json,那么你需要在你的应用程序上编写它。 nginx 无法猜测您希望如何将 HTML 映射到 json。除了写它之外别无他法,至少我知道:-/

    【讨论】:

    • 谢谢我想那么多,我想有一种简单的方法可以修改 nginx.conf 文件以返回 json 否?你能引导我到一个链接或一些教程来帮助我这样做吗?我不知道如何修改 nginx 配置以返回 json。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-25
    • 1970-01-01
    • 1970-01-01
    • 2013-08-22
    • 2019-05-18
    相关资源
    最近更新 更多