diff --git a/examples/status-page/nginx/README.md b/examples/status-page/nginx/README.md new file mode 100644 index 000000000..286627696 --- /dev/null +++ b/examples/status-page/nginx/README.md @@ -0,0 +1,103 @@ +Example configuration for configuring enabling Status Page on the NGINX Ingress Controller +========= + +# Create replica set and service definition for the default http backend +``` +kubectl create -f default-backend-rc.yaml -f default-backend-svc.yaml +``` + +# Create NGINX Ingress controller with the desired vts status page enabled option +``` +kubectl create -f status-page-configmap.yaml -f status-page-rc.yaml +``` + +# Expose ports externally +The following example service configuration can be used to make services addressable outside of the Kubernetes cluster + +* http endpoint: http://${NODE_IP}:32080 +* https endpoint: https://${NODE_IP}:32443 +* status endpoint: http://${NODE_IP}:32081 + +``` +kubectl create -f status-page-svc.yaml +``` + +# Testing + +IP 172.17.4.99 used here as an example + +## Default endpoint +### Browser + +* http://172.17.4.99:32080/ will give 404 with "default backend - 404" content +* http:///172.17.4.99:32080/healthz will give 200 with "ok" content + +### CLI + +``` +curl -v http://172.17.4.99:32080 +* Rebuilt URL to: http://172.17.4.99:32080/ +* Trying 172.17.4.99... +* Connected to 172.17.4.99 (172.17.4.99) port 32080 (#0) +> GET / HTTP/1.1 +> Host: 172.17.4.99:32080 +> User-Agent: curl/7.43.0 +> Accept: */* +> +< HTTP/1.1 404 Not Found +< Server: nginx/1.11.3 +< Date: Thu, 22 Dec 2016 10:32:23 GMT +< Content-Type: text/plain; charset=utf-8 +< Content-Length: 21 +< Connection: keep-alive +< Strict-Transport-Security: max-age=15724800; includeSubDomains; preload +< +* Connection #0 to host 172.17.4.99 left intact + +curl -v http://172.17.4.99:32080/healthz +* Trying 172.17.4.99... +* Connected to 172.17.4.99 (172.17.4.99) port 32080 (#0) +> GET /healthz HTTP/1.1 +> Host: 172.17.4.99:32080 +> User-Agent: curl/7.43.0 +> Accept: */* +> +< HTTP/1.1 200 OK +< Server: nginx/1.11.3 +< Date: Thu, 22 Dec 2016 10:31:36 GMT +< Content-Type: text/plain; charset=utf-8 +< Content-Length: 2 +< Connection: keep-alive +< Strict-Transport-Security: max-age=15724800; includeSubDomains; preload +< +* Connection #0 to host 172.17.4.99 left intact +``` + +## Status page +### Browser + +http://172.17.4.99:32081/nginx_status/ + +### CLI + +``` +curl -v http://172.17.4.99:32081/nginx_status/format/json +* Trying 172.17.4.99... +* Connected to 172.17.4.99 (172.17.4.99) port 32081 (#0) +> GET /nginx_status/format/json HTTP/1.1 +> Host: 172.17.4.99:32081 +> User-Agent: curl/7.43.0 +> Accept: */* +> +< HTTP/1.1 200 OK +< Server: nginx/1.11.3 +< Date: Thu, 22 Dec 2016 10:32:57 GMT +< Content-Type: application/json +< Content-Length: 2303 +< Connection: keep-alive +< +* Connection #0 to host 172.17.4.99 left intact +{"nginxVersion":"1.11.3","loadMsec":1482401683372,"nowMsec":1482402243310,"connections":{"active":4,"reading":0,"writing":1,"waiting":3,"accepted":19,"handled":19,"requests":629},"serverZones":{"_":{"requestCounter":621,"inBytes":486167,"outBytes":597318,"responses":{"1xx":0,"2xx":620,"3xx":0,"4xx":1,"5xx":0,"miss":0,"bypass":0,"expired":0,"stale":0,"updating":0,"revalidated":0,"hit":0,"scarce":0},"overCounts":{"maxIntegerSize":18446744073709551615,"requestCounter":0,"inBytes":0,"outBytes":0,"1xx":0,"2xx":0,"3xx":0,"4xx":0,"5xx":0,"miss":0,"bypass":0,"expired":0,"stale":0,"updating":0,"revalidated":0,"hit":0,"scarce":0}},"testurl":{"requestCounter":7,"inBytes":3558,"outBytes":426201,"responses":{"1xx":0,"2xx":7,"3xx":0,"4xx":0,"5xx":0,"miss":0,"bypass":0,"expired":0,"stale":0,"updating":0,"revalidated":0,"hit":0,"scarce":0},"overCounts":{"maxIntegerSize":18446744073709551615,"requestCounter":0,"inBytes":0,"outBytes":0,"1xx":0,"2xx":0,"3xx":0,"4xx":0,"5xx":0,"miss":0,"bypass":0,"expired":0,"stale":0,"updating":0,"revalidated":0,"hit":0,"scarce":0}},"*":{"requestCounter":628,"inBytes":489725,"outBytes":1023519,"responses":{"1xx":0,"2xx":627,"3xx":0,"4xx":1,"5xx":0,"miss":0,"bypass":0,"expired":0,"stale":0,"updating":0,"revalidated":0,"hit":0,"scarce":0},"overCounts":{"maxIntegerSize":18446744073709551615,"requestCounter":0,"inBytes":0,"outBytes":0,"1xx":0,"2xx":0,"3xx":0,"4xx":0,"5xx":0,"miss":0,"bypass":0,"expired":0,"stale":0,"updating":0,"revalidated":0,"hit":0,"scarce":0}}},"upstreamZones":{"default-test-ui-8443":[{"server":"10.2.97.6:8443","requestCounter":7,"inBytes":3558,"outBytes":426201,"responses":{"1xx":0,"2xx":7,"3xx":0,"4xx":0,"5xx":0},"responseMsec":297,"weight":1,"maxFails":0,"failTimeout":0,"backup":false,"down":false,"overCounts":{"maxIntegerSize":18446744073709551615,"requestCounter":0,"inBytes":0,"outBytes":0,"1xx":0,"2xx":0,"3xx":0,"4xx":0,"5xx":0}}],"upstream-default-backend":[{"server":"10.2.90.238:8080","requestCounter":0,"inBytes":0,"outBytes":0,"responses":{"1xx":0,"2xx":0,"3xx":0,"4xx":0,"5xx":0},"responseMsec":0,"weight":1,"maxFails":0,"failTimeout":0,"backup":false,"down":false,"overCounts":{"maxIntegerSize":18446744073709551615,"requestCounter":0,"inBytes":0,"outBytes":0,"1xx":0,"2xx":0,"3xx":0,"4xx":0,"5xx":0}}]}} + +``` + diff --git a/examples/status-page/nginx/default-backend-rc.yaml b/examples/status-page/nginx/default-backend-rc.yaml new file mode 100644 index 000000000..5efdcd021 --- /dev/null +++ b/examples/status-page/nginx/default-backend-rc.yaml @@ -0,0 +1,36 @@ +apiVersion: v1 +kind: ReplicationController +metadata: + name: default-http-backend +spec: + replicas: 1 + selector: + k8s-app: default-http-backend + template: + metadata: + labels: + k8s-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.0 + livenessProbe: + httpGet: + path: /healthz + port: 8080 + scheme: HTTP + initialDelaySeconds: 30 + timeoutSeconds: 5 + ports: + - containerPort: 8080 + resources: + limits: + cpu: 10m + memory: 20Mi + requests: + cpu: 10m + memory: 20Mi diff --git a/examples/status-page/nginx/default-backend-svc.yaml b/examples/status-page/nginx/default-backend-svc.yaml new file mode 100644 index 000000000..ae3a0749d --- /dev/null +++ b/examples/status-page/nginx/default-backend-svc.yaml @@ -0,0 +1,14 @@ +apiVersion: v1 +kind: Service +metadata: + name: default-http-backend + labels: + k8s-app: default-http-backend +spec: + ports: + - port: 80 + targetPort: 8080 + protocol: TCP + name: http + selector: + k8s-app: default-http-backend \ No newline at end of file diff --git a/examples/status-page/nginx/status-page-configmap.yaml b/examples/status-page/nginx/status-page-configmap.yaml new file mode 100644 index 000000000..7fc8d1d80 --- /dev/null +++ b/examples/status-page/nginx/status-page-configmap.yaml @@ -0,0 +1,6 @@ +apiVersion: v1 +data: + enable-vts-status: "true" +kind: ConfigMap +metadata: + name: nginx-conf-vts-enable diff --git a/examples/status-page/nginx/status-page-rc.yaml b/examples/status-page/nginx/status-page-rc.yaml new file mode 100644 index 000000000..b0da0df90 --- /dev/null +++ b/examples/status-page/nginx/status-page-rc.yaml @@ -0,0 +1,57 @@ +apiVersion: v1 +kind: ReplicationController +metadata: + name: nginx-ingress-controller + labels: + k8s-app: nginx-ingress-lb +spec: + replicas: 1 + selector: + k8s-app: nginx-ingress-lb + template: + metadata: + labels: + k8s-app: nginx-ingress-lb + name: nginx-ingress-lb + spec: + terminationGracePeriodSeconds: 60 + containers: + - image: gcr.io/google_containers/nginx-ingress-controller:0.8.3 + 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: + - name: http-traffic + containerPort: 80 + hostPort: 80 + - name: https-traffic + containerPort: 443 + hostPort: 443 + - name: status-port + containerPort: 18080 + hostPort: 18080 + args: + - /nginx-ingress-controller + - --default-backend-service=$(POD_NAMESPACE)/default-http-backend + - --nginx-configmap=$(POD_NAMESPACE)/nginx-conf-vts-enable diff --git a/examples/status-page/nginx/status-page-svc.yaml b/examples/status-page/nginx/status-page-svc.yaml new file mode 100644 index 000000000..edbafcf1d --- /dev/null +++ b/examples/status-page/nginx/status-page-svc.yaml @@ -0,0 +1,24 @@ +apiVersion: v1 +kind: Service +metadata: + name: nginx-ingress-controller +spec: + type: NodePort + ports: + - port: 80 + targetPort: http-traffic + nodePort: 32080 + protocol: TCP + name: http + - port: 443 + targetPort: https-traffic + nodePort: 32443 + protocol: TCP + name: https + - port: 18080 + targetPort: status-port + nodePort: 32081 + protocol: TCP + name: status + selector: + k8s-app: nginx-ingress-lb