问题描述
我正在运行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相关的注释。
- https://hub.helm.sh/charts/ibm-charts/ibm-websphere-traditional
- https://github.com/IBM/charts/tree/master/stable/ibm-websphere-traditional
在以下代码示例中,我为管理控制台添加了虚拟主机配置,以与端口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将会消失。