confluentinc / cp-docker-images

[DEPRECATED] Docker images for Confluent Platform.
Apache License 2.0
1.14k stars 704 forks source link

Make URL's in Confluent Control-Center front-end UI relative iso absolute #405

Open boeboe opened 6 years ago

boeboe commented 6 years ago

Hi all,

I am using the docker images of confluent to deploy the confluent stack (kafka, zookeeper, schema-registry, rest-proxy and control-center) on Kubernetes. I am using an nginx ingress controller to expose the control center's dashboard (using path routing):

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-control-center
  annotations:
    ingress.kubernetes.io/rewrite-target: /
    ingress.kubernetes.io/add-base-url: "true"
spec:
  rules:
  - http:
      paths:
      - path: /control-center
        backend:
          serviceName: control-center-svc
          servicePort: 9021

The ingress.kubernetes.io/add-base-url ensures that in the HTML returned, a base-url header is injected in order for later scripts/urls to be correctly resolvable over the path based ingress controller. The result looks like this:

<!DOCTYPE html>
<html>
  <head><base href="https://kubernetes-ingress.mydomain.com/control-center/">
    <meta http-equiv="Content-type" content="text/html; charset=utf-8">
    <title>Control Center</title>
  <link rel="shortcut icon" href="/dist/favicon.ico"><link href="/dist/main-14ed7341cd326a596d21.css" rel="stylesheet"></head>
  <body>
    <div id="controlcenter" style="height: 100%"></div>
  <script type="text/javascript" src="/dist/manifest.js"></script><script type="text/javascript" src="/dist/vendor.js"></script><script type="text/javascript" src="/dist/main.js"></script></body>
</html>

As one can see, the links however all are using absolute URL's, which is why the page is not properly loading behind this nginx reverse proxy.

I was wondering if you would be willing to switch the URL's to be relative (I would try to change this myself using some linux sed magic, but it seems that the code is embedded in a jar).

REF: https://github.com/kubernetes/ingress-nginx/blob/master/docs/annotations.md

PS: not sure this is the right repo, but I could not find a control-center specific one. PPS: the result of the port-confluent-to-kubernetes exercise (I had to extend the docker images of Kafka and Zookeeper to make it work FYI):

# kubectl version
Client Version: version.Info{Major:"1", Minor:"9", GitVersion:"v1.9.1", GitCommit:"3a1c9449a956b6026f075fa3134ff92f7d55f812", GitTreeState:"clean", BuildDate:"2018-01-04T19:58:48Z", GoVersion:"go1.9.2", Compiler:"gc", Platform:"darwin/amd64"}
Server Version: version.Info{Major:"1", Minor:"8", GitVersion:"v1.8.6", GitCommit:"6260bb08c46c31eea6cb538b34a9ceb3e406689c", GitTreeState:"clean", BuildDate:"2017-12-21T06:23:29Z", GoVersion:"go1.8.3", Compiler:"gc", Platform:"linux/amd64"}

# kubectl get pods -o wide
NAME                              READY     STATUS              RESTARTS   AGE       IP              NODE
control-center-ff6995d6-l2pbd     1/1       Running             0          1h        172.24.38.205   node-172-16-24-36
kafka-0                           1/1       Running             0          1h        172.24.27.107   node-172-16-24-24
kafka-1                           1/1       Running             0          1h        172.24.28.23    node-172-16-24-28
kafka-2                           1/1       Running             0          1h        172.24.38.192   node-172-16-24-36
kafka-connect-6c7f78cf4f-lwjn5    1/1       Running             0          16m       172.24.39.107   node-172-16-24-36
rest-proxy-578494fd86-b4cmg       1/1       Running             0          11m       172.24.39.117   node-172-16-24-36
schema-registry-b8996c9b5-xj4qj   1/1       Running             0          1h        172.24.27.114   node-172-16-24-24
zookeeper-0                       1/1       Running             0          1h        172.24.38.180   node-172-16-24-36
zookeeper-1                       1/1       Running             0          1h        172.24.27.100   node-172-16-24-24
zookeeper-2                       1/1       Running             0          1h        172.24.21.14    node-172-16-24-20
Patafix commented 6 years ago

Do you mind share you're experience with kubernetes ? Stability etc...

boeboe commented 6 years ago

We didn't see stability issues so far. Partitioning/replication in combo with a flexible scalable kubernetes platform is an ideal combo.

Paul424 commented 4 years ago

We are running into the same issue; actually we run 2 CP releases on one k8s cluster and like to route both control-center UI's over one ingress-controller. We use the sub_filter to rewrite paths in the response but it doesn't work for .js packages being send back that initialize the frontend.

What is needed is support for proxy on a path by the app itself.

annotations:
  kubernetes.io/ingress.class: "nginx"
  nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
  nginx.ingress.kubernetes.io/rewrite-target: /$2
  nginx.ingress.kubernetes.io/use-regex: "true"
  nginx.ingress.kubernetes.io/auth-type: basic
  nginx.ingress.kubernetes.io/auth-secret: basic-auth-admin
  nginx.ingress.kubernetes.io/auth-realm: "Authentication Required"
  nginx.ingress.kubernetes.io/configuration-snippet: |
    proxy_set_header Accept-Encoding "";
    sub_filter_once off;
    sub_filter 'href="/dist/' 'href="/control-center/dist/';
    sub_filter 'src="/dist/' 'src="/control-center/dist/';

Alternatives would be to distinguish on host or port on the ingress and leave the control-center in the root (but both are not an option for us).

boeboe commented 4 years ago

It should be a simple change in the jar file, but that's up to Confluent team to take this issue serious.

Durairaj commented 4 years ago

Can we get this fixed quickly? Not good for an enterprise tool!!

thejml commented 4 years ago

Was looking for the setting to do this and found it doesn't yet exist! This feature is a must have for our deployment.

head1328 commented 3 years ago

Because of security it should be possible to access the control center through kubectl proxy instead of an ingress but this isn't possible because of the absolute urls.

sashati commented 3 years ago

Did anybody find a solution for this issue, so far? Any clue is highly appreciated!