如何配置入口到 jelastic 上托管的 kubernetes 中的服务?

How to configure ingress to a service in kubernetes hosted on jelastic?

事情是这样的。我像这样在我的 jelastic 帐户上安装了一个 kubernetes 集群:

然后,我想在集群外部暴露一个服务。 HelloWorld 在集群上运行 out-of-the-box,因此我认为我可以轻松地将其转换为我的需要。安装集群后,浏览

my-helloworld-test.my-jelastic-provider.com

工作得很好,即我看到了带有样式的 hello world html 页面。

现在,在我的未来use-cases,我想通过

访问我的服务
my-helloworld-test.my-jelastic-provider.com/hello

hello.my-helloworld-test.my-jelastic-provider.com

即我想为我的服务或子域设置路径。我收集到我需要定义一个 Ingress 来实现它。我已将 hello-kubernetes 服务配置更改为:

kind: Service
apiVersion: v1
metadata:
  name: hello-kubernetes
  namespace: default
spec:
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
  selector:
    app: hello-kubernetes
  type: ClusterIP
  sessionAffinity: None
  externalTrafficPolicy: Cluster

服务路径

我尝试按照入口配置来定义我的服务的路径:

kind: Ingress
apiVersion: extensions/v1beta1
metadata:
  name: helloworld
  namespace: default
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/rewrite-target: /
    nginx.ingress.kubernetes.io/ssl-redirect: 'false'
spec:
  rules:
    - http:
        paths:
          - path: /hello
            backend:
              serviceName: hello-kubernetes
              servicePort: 80

目标是浏览

my-helloworld-test.my-jelastic-provider.com/hello

显示 pre-deployed helloworld 应用程序,而不是

my-helloworld-test.my-jelastic-provider.com

我可以编写 helloworld 应用程序,使其基础 url 成为 /hello,但我从几个博客中了解到,可以通过 kubernetes 注释实现这种情况。特别是,注释 nginx.ingress.kubernetes.io/rewrite-target 似乎会有所帮助,但我无法完全实现它。确实,当我浏览 /hello 路径时,上面的配置向我展示了 helloworld 应用程序,但未设置样式:

如何实现造型?

要服务的子域

该服务的另一个性感的可能性是在浏览时显示

hello.my-helloworld-test.my-jelastic-provider.com

即作为我的 jelastic 环境的子域。我试过这个配置但没有成功:

kind: Ingress
apiVersion: extensions/v1beta1
metadata:
  name: jenkins
  namespace: default
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/ssl-redirect: 'false'
spec:
  rules:
    - http:
        paths:
          - host: hello.my-helloworld-test.my-jelastic-provider.com
            path: /
            backend:
              serviceName: hello-kubernetes
              servicePort: 80

我需要对我的 jelastic 环境做些什么才能使上述主机可浏览并展示 helloworld 应用程序?

Kubernetes 配置

Client Version: version.Info{Major:"1", Minor:"15", GitVersion:"v1.15.6", GitCommit:"7015f71e75f670eb9e7ebd4b5749639d42e20079", GitTreeState:"archive", BuildDate:"2019-11-19T09:00:01Z", GoVersion:"go1.12.12", Co
mpiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"15", GitVersion:"v1.15.6", GitCommit:"7015f71e75f670eb9e7ebd4b5749639d42e20079", GitTreeState:"archive", BuildDate:"2019-11-19T08:45:41Z", GoVersion:"go1.12.12", Co
mpiler:"gc", Platform:"linux/amd64"}

关于 jelastic v.5.7.

atm 似乎有 2 个不同的问题

  1. 您确定该域 hello.my-helloworld-test.my-jelastic-provider.com 正在关注一个 正确的IP?可以将自定义子域添加到 环境,然后将它们用于入口规则,但该选项 (自定义子域)现在仅可通过 API
  2. nginx.ingress.kubernetes.io/rewrite-target 的注释参数不正确,如果你使用 nginx 入口控制器试试这个

kind: Ingress
apiVersion: extensions/v1beta1
metadata:
  name: helloworld
  namespace: default
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/rewrite-target: /
    nginx.ingress.kubernetes.io/ssl-redirect: 'false'
spec:
  rules:
    - http:
        paths:
          - path: /hello(/|$)(.*)
            backend:
              serviceName: hello-kubernetes
              servicePort: 80

更新: 我们还与 Laurent Michel 一起检查了该问题,发现问题是由应用程序中的绝对 URI 引起的,因此重写未应用于 CSS/images。最简单的解决方案 - 应用两个具有不同注释的入口规则(一个有重写,一个没有)。更高级和正确的方法 - 将此类应用程序转移到单独的子域,以便 URI 可以保持不变。