在入口后面配置Websphere Application Server时出现问题

问题描述

我正在运行Websphere应用程序服务器部署和服务(类型为LoadBalancer)。 Websphere管理控制台可以在URL https://svcloadbalancerip:9043/ibm/console/logon.jsp

下正常运行
NAME         TYPE           CLUSTER-IP    EXTERNAL-IP      PORT(S)                                                                                                                    AGE
was-svc      LoadBalancer   x.x.x.x   x.x.x.x   9080:30810/TCP,9443:30095/TCP,9043:31902/TCP,7777:32123/TCP,31199:30225/TCP,8880:31027/TCP,9100:30936/TCP,9403:32371/TCP   2d5h

但是,如果我使用以下入口文件配置入口后面的Websphere服务:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: nginx-ingress-check
  annotations:
      kubernetes.io/ingress.class: "nginx"
spec:
  rules:
  - http:
      paths:
      - path: /ibm/console/logon.jsp
        backend:
          serviceName: was-svc
          servicePort: 9043
      - path: /v1
        backend:
          serviceName: web
          servicePort: 8080

URL https://ingressip//ibm/console/logon.jsp不起作用。 我也尝试过重写注释。

任何人都可以使用部署和服务来帮助将ibmcom / websphere-traditional docker映像部署在kubernetes中。服务已映射到入口后面,并且应该以某种方式从入口打开Websphere管理控制台

解决方法

IBM团队提供了一个舵图,该舵图也具有入口资源。在代码段中,您也缺少与SSL相关的注释。

在以下代码示例中,我为管理控制台添加了虚拟主机配置,以与端口443一起使用。

请注意:在入口处暴露管理控制台不是一个好习惯。配置应通过wsadmin或通过扩展基本Dockerfile来完成。重新启动容器后,通过控制台进行的所有更改都将丢失。

apiVersion: v1
kind: Service
metadata:
  creationTimestamp: null
  name: websphere
spec:
  type: NodePort
  ports:
   - name: admin
     port: 9043
     protocol: TCP
     targetPort: 9043
     nodePort: 30510
   - name: app
     port: 9443
     protocol: TCP
     targetPort: 9443
     nodePort: 30511
  selector:
    run: websphere
status:
  loadBalancer: {}
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: websphere-admin-vh
  namespace: default
data:
  ingress_vh.props: |+
    #
    # Header
    #
    ResourceType=VirtualHost
    ImplementingResourceType=VirtualHost
    ResourceId=Cell=!{cellName}:VirtualHost=admin_host
    AttributeInfo=aliases(port,hostname)
    #

    #   
    #Properties
    #
    443=*

    EnvironmentVariablesSection
    #
    #
    #Environment Variables
    cellName=DefaultCell01
---
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: websphere
  name: websphere
spec:
  containers:
  - image: ibmcom/websphere-traditional
    name: websphere
    volumeMounts:
    - name: admin-vh
      mountPath: /etc/websphere/
    ports:
    - name: app
      containerPort: 9443
    - name: admin
      containerPort: 9043
  volumes:
  - name: admin-vh
    configMap:
      name: websphere-admin-vh
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: nginx-ingress-check
  annotations:
      kubernetes.io/ingress.class: "nginx"
      nginx.ingress.kubernetes.io/secure-backends: "true" 
      nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
spec:
  rules:
  - http:
      paths:
      - path: /ibm/console
        backend:
          serviceName: websphere
          servicePort: 9043
,

无法通过入口公开adminhost和defaulthost,或者至少我从来没有想过如何实现它。问题的症结在于,入口侦听端口80或端口443,并将您的请求转发到容器上的相应端口。因此,您请求的Host标头包含该端口。我对WAS通道/虚拟主机不了解足够多,无法确切了解它是如何工作的,但是为了通过WAS配置中为该端点列出的端口以外的任何端口访问WAS端点,必须设置Websphere传统映像一个属性,用于提取端口,用于检查虚拟主机hostalias条目以及从Host标头(com.ibm.ws.webcontainer.extractHostHeaderPort发出重定向)。

问题变成了,当它使用该端口时,该端口需要被列为虚拟主机的主机别名,以便将流量传递给应用程序。而且,由于通配符主机和特定端口的组合一次只能是一个虚拟主机上的主机别名,因此将它们设置为defaulthost上的主机别名,以便Web应用程序可以通过入口工作,但是这使得也无法访问管理控制台,因为它是通过一个单独的虚拟主机提供服务的,该虚拟主机没有(就我所知不能)设置了主机别名条目,以允许通过其主机头中端口443的流量通过。我不必弄清楚该如何工作,因为在我需要咨询某些东西的时候,kubectl port-forward足以进入管理控制台,而且您也无法进行任何更改,因为它们当pod重新启动并从相同(未更改)的映像开始新的pod时,ll将会消失。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...