티스토리 뷰

오래간만에 포스팅합니다.


오늘 주제는 오픈시프트에서 웹서버 컨테이너와 WAS컨테이너를 연동하는 방법입니다..

지난 몇 달(?)간 이 구조를 구현하기 위한 수많은 테스트가 진행되었는데,

결론적으로 아키텍처 상으로 지양해야 할 구조입니다(이미 알고있었고 권고도 했었고 다만 직접 해 보질 않아서..)


과거 일반적인 WEB-WAS 구조는 다음과 같은 이유에서 권고하는 구조였습니다.


  • 프리젠테이션 계층과 비즈니스 로직 분리
  • 정적 리소스 처리를 웹서버에 전담하여 WAS에 불필요한 부하를 제거
  • 정적 리소스가 애플리케이션에 포함되면 배포 크기 증가
  • Java스레드 기반의 WAS는 정적 리소스를 서비스 할 때 FileServlet을 사용하며 이 역시 비즈니스 로직을 처리하는 working thread가 담당하는데 정적 리소스 처리가 많을 경우 스레드 큐잉이 발생할 수 있음
  • 정적 리소스의 크기가 클 경우(예를 들어 2GB이상) WAS의 FileServlet은 이를 처리하지 못한다. 이는 Response Header에 들어갈 content-length가 Integer로 표현되는데 content-length가 2GB 이상일 경우 Java의 Integer.MAX_VALUE을 넘어서기 때문이다(정수형 오버플로우 발생). 즉 대용량 리소스는 WEB서버가 처리해야만 하는 경우가 발생한다.


즉, WEB-WAS 구조는 역할 분담을 중요한 비즈니스 로직을 처리하는 WAS에 부하를 덜어주고, 상대적으로 WEB서버의 리소스 처리 능력이 뛰어나다고 인식했기 때문입니다.


그러나 오픈시프트의 경우 아래와 같은 이유로 이러한 구조를 지양합니다.


  • 기존의 WEB서버 역할을 오픈시프트의 라우터가 대신한다
  • Scale-out의 제약이 있다
  • 마이크로서비스를 지향하는 오픈시프트 사상에서는 굳이 WEB-WAS를 분리할 필요가 없다
  • WAS자체만 봤을때 과거보다 정적 리소스 처리 능력이 WEB서버와 크게 차이나지 않는다(컴퓨팅 파워의 증가)
결정적으로.. 이런 형태로 사용하는 사례가 없다(현재까지는)



아키텍처


일반적인 WEB-WAS 연계


WEB-WAS 연계시 웹서버에서 Request를 WAS로 Forwarding 하기 위해 여러가지 다양한 플러그인 모듈이 사용되는데 웹서버에서 제공되는 모듈을 사용할 수도 있으며 WAS 벤더가 제공하는 별도의 플러그인을 사용하기도 합니다. 예를 들어 WAS가 Oracle WebLogic 인 경우는 Oracle 에서 제공하는 플러그인을 웹서버에 설치하여 연계하는 방식을 사용하며 WAS가 JBoss 또는 tomcat인 경우 웹서버가 기본 제공하는 mod_proxy 또는 별도 프로젝트인 mod_jk 등을 사용하기도 합니다.


WEB/WAS 연동. 사용하는 연계 모듈이 Oracle PlugIn이든, mod_proxy, mod_jk 등 오픈소스든 구조는 거의 동일합니다(물론 설정하는 방법은 다 제각각).





WEBpod-WASpod 연계 


이번 포스팅에서는 Oracle WebLogic Server Pod 연계는 제외합니다. 기존 구조 대비 고려해야 하는 사항은 WAS pod 의 확장(scale-out/in)에 대응할 수 있도록 동적으로 연계가 되어야 한다는 점인데, 오픈시프트는 아직 내부 Pod간 UDP 통신에 제약이 있어 동적으로 연계하는 것은 어려움이 있습니다. 따라서 오픈시프트 내의 service 또는 Router를 통한 연계 방식을 선택해야 합니다. 여기서, 플러그인 모듈, 예를 들어 mod_jk를 사용할 경우 ajp:// 프로토콜을 사용하는데 이는 TCP를 사용하고 따라서 반드시 service와 연계되어야 합니다. 이 때 backend WAS에서 세션 유지가 안되는 현상이 있었으며 이에 http:// 프로토콜을 사용하는 mod_proxy 사용하여 오픈시프트의 Router를 연계하는 형태로 합니다.




아키텍처 상의 차이


확연한 차이 중 하나는 기존 WEB-WAS 연계 대비해서 오픈시프트상의 연계는 불필요한 단계를 많이 거친다는 점입니다. 오픈시프트의 Router는 아주 간단한 소프트웨어 로드밸런서로 굳이 웹서버가 없어도 됩니다. 즉 로드밸런서 역할만 본다면 Router 앞단에 웹서버가 존재하는 의미가 없다. 또한 어차피 pod로 기동되는 웹서버 앞에 service와 Router가 동일하게 존재합니다. 



그래도 해보기로 했으니 합니다....



구현


도커 이미지 준비


웹서버 

 Apache 2.4 

 registry.access.redhat.com/rhscl/httpd-24-rhel7:latest

 WAS

 JBoss EAP 6.4

 registry.access.redhat.com/jboss-eap-6/eap64-openshift:latest



Git Repository


Source to Image 빌드를 위해 웹 정적 리소스와 Java 애플리케이션 소스를 제공할 Git 저장소가 필요합니다. public Github인 https://gitlab.com 을 사용합니다. Git에 계정을 생성하고 웹용, WAS용 프로젝트를 각각 생성하고 리소스를 올립니다.


웹 리소스 

 https://ora01000@gitlab.com/ora01000/html.git

 WAS 애플리케이션

 https://ora01000@gitlab.com/ora01000/j2ee.git


Git 프로젝트를 구성할 때 웹 정적 리소스는 아래와 같이 구성합니다. 아래 구성은 사용할 웹서버 도커 이미지가 S2I 빌드를 하는데 apache configuration를 함께 반영하기 때문이며  httpd-cfg 디렉토리에 *conf 파일을 모두 Include하도록 되어 있습니다.


<웹 리소스를 관리하는 Git 저장소. 사용하는 이미지 특성상, httpd-cfg 라는 디렉토리 내 추가할 아파치 설정을 저장한다>




<httpd-cfg 디렉토리 내부. conf 확장자를 가진 파일은 모두 아파치 configuration으로 인식된다>




test.conf 파일 내용


Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED

<Proxy "balancer://cluster">

    BalancerMember "http://was-tg.app.ora01000.com" route=1

    ProxySet stickysession=ROUTEID

</Proxy>

ProxyPass "/testweb" "balancer://cluster/testweb"



Java는 exploded WAR 형태로 구성하였습니다.


자세한 내용은 git 저장소에 접속해서 확인 가능합니다.







이미지스트림


웹서버 이미지 스트림

{

    "kind": "List",

    "apiVersion": "v1",

    "metadata": {

        "name": "rhscl-httpd-image-streams",

        "annotations": {

            "description": "ImageStream definitions for RedHat Apache WebServer S2I."

        }

    },

    "items": [

        {

            "kind": "ImageStream",

            "apiVersion": "v1",

            "metadata": {

                "name": "rhscl-httpd"

            },

            "spec": {

                "dockerImageRepository": "10.0.1.125:5000/rhscl/httpd-24-rhel7",

                "tags": [

                    {

                        "name": "1.0",

                        "annotations": {

                            "description": "Apache2.4 WebServer S2I images.",

                            "iconClass": "icon-jboss",

                            "tags": "builder,apache,web",

                            "supports":"xpaas:1.4",

                            "sampleRepo": "https://ora01000@gitlab.com/ora01000/html.git",

                            "sampleContextDir": "/",

                            "sampleRef": "master",

                            "version": "latest"

                        }

                    }

                ]

            }

        }

    ]

}



 WAS 이미지 스트림은 오픈시프트에서 제공하는 기본 EAP64 이미지 스트림을 사용하시면 됩니다.





템플릿


{

    "kind": "Template",

    "apiVersion": "v1",

    "metadata": {

        "annotations": {

            "description": "Application template for Apache WebServer 2.4 and JBoss EAP64 built using S2I.",

            "iconClass": "icon-jboss",

            "tags": "web,httpd,apache,java,j2ee,eap,eap64,s2i",

            "version": "1"

        },

        "name": "apache24-eap64-s2i"

    },

    "labels": {

        "template": "apache24-eap64-s2i",

        "xpaas": "1.4"

    },

    "parameters": [

        {

            "description": "The name for the application.",

            "name": "APPLICATION_NAME",

            "value": "www",

            "required": true

        },

        {

            "description": "Custom hostname for http service route.  Leave blank for default hostname, e.g.: <application-name>-<project>.<default-domain-suffix>",

            "name": "HOSTNAME_HTTP",

            "value": "",

            "required": false

        },

        {

            "description": "WAS hostname for WebServer proxy, carefully make it, e.g.: <application-name>-<project>.<default-domain-suffix>",

            "name": "HOSTNAME_WAS",

            "value": "was-proxy.app.ora01000.com",

            "required": true

        },

        {

            "description": "Git source URI for application",

            "name": "WEB_SOURCE_REPOSITORY_URL",

            "value": "https://ora01000@gitlab.com/ora01000/html.git",

            "required": true

        },

        {

            "description": "Git branch/tag reference",

            "name": "WEB_SOURCE_REPOSITORY_REF",

            "value": "master",

            "required": false

        },

        {

            "description": "Path within Git project to build; empty for root project directory.",

            "name": "WEB_CONTEXT_DIR",

            "value": "/",

            "required": false

        },

        {

            "description": "GitHub trigger secret",

            "name": "WEB_GITHUB_WEBHOOK_SECRET",

            "from": "[a-zA-Z0-9]{8}",

            "generate": "expression",

            "required": true

        },

        {

            "description": "Generic build trigger secret",

            "name": "WEB_GENERIC_WEBHOOK_SECRET",

            "from": "[a-zA-Z0-9]{8}",

            "generate": "expression",

            "required": true

        },

        {

            "description": "Namespace in which the ImageStreams for Red Hat Middleware images are installed. These ImageStreams are normally installed in the openshift namespace. You should only need to modify this if you've installed the ImageStreams in a different namespace/project.",

            "name": "IMAGE_STREAM_NAMESPACE",

            "value": "openshift",

            "required": true

        },

        {

            "description": "By default, httpd logs into standard output, so the logs are accessible by using the docker logs command. When HTTPD_LOG_TO_VOLUME is set, httpd logs into /var/log/httpd24, which can be mounted to host system using the Docker volumes.",

            "name": "HTTPD_LOG_TO_VOLUME",

            "value": "",

            "required": false

        },

        {

            "description": "Git source URI for application",

            "name": "WAS_SOURCE_REPOSITORY_URL",

            "value": "https://ora01000@gitlab.com/ora01000/j2ee.git",

            "required": true

        },

        {

            "description": "Git branch/tag reference",

            "name": "WAS_SOURCE_REPOSITORY_REF",

            "value": "master",

            "required": false

        },

        {

            "description": "Path within Git project to build; empty for root project directory.",

            "name": "WAS_CONTEXT_DIR",

            "value": "/",

            "required": false

        },

        {

            "description": "The name of the service account to use for the deployment.  The service account should be configured to allow useage of the secret(s) specified by HTTPS_SECRET and JGROUPS_ENCRYPT_SECRET.",

            "name": "SERVICE_ACCOUNT_NAME",

            "value": "eap-service-account",

            "required": true

        },

        {

            "description": "GitHub trigger secret",

            "name": "WAS_GITHUB_WEBHOOK_SECRET",

            "from": "[a-zA-Z0-9]{8}",

            "generate": "expression",

            "required": true

        },

        {

            "description": "Generic build trigger secret",

            "name": "WAS_GENERIC_WEBHOOK_SECRET",

            "from": "[a-zA-Z0-9]{8}",

            "generate": "expression",

            "required": true

        },        

        {

            "description": "The name of the secret containing the keystore file",

            "name": "JGROUPS_ENCRYPT_SECRET",

            "value": "eap-app-secret",

            "required": false

        },

        {

            "description": "The name of the keystore file within the secret",

            "name": "JGROUPS_ENCRYPT_KEYSTORE",

            "value": "jgroups.jceks",

            "required": false

        },

        {

            "description": "The name associated with the server certificate",

            "name": "JGROUPS_ENCRYPT_NAME",

            "value": "",

            "required": false

        },

        {

            "description": "The password for the keystore and certificate",

            "name": "JGROUPS_ENCRYPT_PASSWORD",

            "value": "",

            "required": false

        },

        {

            "description": "JGroups cluster password",

            "name": "JGROUPS_CLUSTER_PASSWORD",

            "from": "[a-zA-Z0-9]{8}",

            "generate": "expression",

            "required": true

        },

        {

            "description": "Controls whether exploded deployment content should be automatically deployed",

            "name": "AUTO_DEPLOY_EXPLODED",

            "value": "true",

            "required": false

        }        

    ],

    "objects": [

        {

            "kind": "Service",

            "apiVersion": "v1",

            "spec": {

                "ports": [

                    {

                        "port": 8080,

                        "targetPort": 8080

                    }

                ],

                "selector": {

                    "deploymentConfig": "${APPLICATION_NAME}-was"

                }

            },

            "metadata": {

                "name": "${APPLICATION_NAME}-was",

                "labels": {

                    "application": "${APPLICATION_NAME}"

                },

                "annotations": {

                    "description": "The WAS server's http port."

                }

            }

        },

        {

            "kind": "Service",

            "apiVersion": "v1",

            "spec": {

                "ports": [

                    {

                        "port": 8080,

                        "targetPort": 8080

                    }

                ],

                "selector": {

                    "deploymentConfig": "${APPLICATION_NAME}-web"

                }

            },

            "metadata": {

                "name": "${APPLICATION_NAME}-web",

                "labels": {

                    "application": "${APPLICATION_NAME}"

                },

                "annotations": {

                    "description": "The web server's http port."

                }

            }

        },

        {

            "kind": "Route",

            "apiVersion": "v1",

            "id": "${APPLICATION_NAME}-web",

            "metadata": {

                "name": "${APPLICATION_NAME}-web",

                "labels": {

                    "application": "${APPLICATION_NAME}"

                },

                "annotations": {

                    "description": "Route for application's http service."

                }

            },

            "spec": {

                "host": "${HOSTNAME_HTTP}",

                "to": {

                    "name": "${APPLICATION_NAME}-web"

                }

            }

        },

        {

            "kind": "Route",

            "apiVersion": "v1",

            "id": "${APPLICATION_NAME}-was",

            "metadata": {

                "name": "${APPLICATION_NAME}-was",

                "labels": {

                    "application": "${APPLICATION_NAME}"

                },

                "annotations": {

                    "description": "Route for application's http service."

                }

            },

            "spec": {

                "host": "${HOSTNAME_WAS}",

                "to": {

                    "name": "${APPLICATION_NAME}-was"

                }

            }

        },

        {

            "kind": "ImageStream",

            "apiVersion": "v1",

            "metadata": {

                "name": "${APPLICATION_NAME}-web",

                "labels": {

                    "application": "${APPLICATION_NAME}"

                }

            }

        },

        {

            "kind": "BuildConfig",

            "apiVersion": "v1",

            "metadata": {

                "name": "${APPLICATION_NAME}-web",

                "labels": {

                    "application": "${APPLICATION_NAME}"

                }

            },

            "spec": {

                "source": {

                    "type": "Git",

                    "git": {

                        "uri": "${WEB_SOURCE_REPOSITORY_URL}",

                        "ref": "${WEB_SOURCE_REPOSITORY_REF}"

                    },

                    "contextDir": "${WEB_CONTEXT_DIR}"

                },

                "strategy": {

                    "type": "Source",

                    "sourceStrategy": {

                        "forcePull": true,

                        "from": {

                            "kind": "ImageStreamTag",

                            "namespace": "${IMAGE_STREAM_NAMESPACE}",

                            "name": "rhscl-httpd:latest"

                        }

                    }

                },

                "output": {

                    "to": {

                        "kind": "ImageStreamTag",

                        "name": "${APPLICATION_NAME}-web:latest"

                    }

                },

                "triggers": [

                    {

                        "type": "GitHub",

                        "github": {

                            "secret": "${WEB_GITHUB_WEBHOOK_SECRET}"

                        }

                    },

                    {

                        "type": "Generic",

                        "generic": {

                            "secret": "${WEB_GENERIC_WEBHOOK_SECRET}"

                        }

                    },

                    {

                        "type": "ImageChange",

                        "imageChange": {}

                    },

                    {

                        "type": "ConfigChange"

                    }

                ]

            }

        },

        {

            "kind": "ImageStream",

            "apiVersion": "v1",

            "metadata": {

                "name": "${APPLICATION_NAME}-was",

                "labels": {

                    "application": "${APPLICATION_NAME}"

                }

            }

        },

        {

            "kind": "BuildConfig",

            "apiVersion": "v1",

            "metadata": {

                "name": "${APPLICATION_NAME}-was",

                "labels": {

                    "application": "${APPLICATION_NAME}"

                }

            },

            "spec": {

                "source": {

                    "type": "Git",

                    "git": {

                        "uri": "${WAS_SOURCE_REPOSITORY_URL}",

                        "ref": "${WAS_SOURCE_REPOSITORY_REF}"

                    },

                    "contextDir": "${WAS_CONTEXT_DIR}"

                },

                "strategy": {

                    "type": "Source",

                    "sourceStrategy": {

                        "forcePull": true,

                        "from": {

                            "kind": "ImageStreamTag",

                            "namespace": "${IMAGE_STREAM_NAMESPACE}",

                            "name": "jboss-eap64-openshift:latest"

                        }

                    }

                },

                "output": {

                    "to": {

                        "kind": "ImageStreamTag",

                        "name": "${APPLICATION_NAME}-was:latest"

                    }

                },

                "triggers": [

                    {

                        "type": "GitHub",

                        "github": {

                            "secret": "${WAS_GITHUB_WEBHOOK_SECRET}"

                        }

                    },

                    {

                        "type": "Generic",

                        "generic": {

                            "secret": "${WAS_GENERIC_WEBHOOK_SECRET}"

                        }

                    },

                    {

                        "type": "ImageChange",

                        "imageChange": {}

                    },

                    {

                        "type": "ConfigChange"

                    }

                ]

            }

        },

        {

            "kind": "DeploymentConfig",

            "apiVersion": "v1",

            "metadata": {

                "name": "${APPLICATION_NAME}-web",

                "labels": {

                    "application": "${APPLICATION_NAME}"

                }

            },

            "spec": {

                "strategy": {

                    "type": "Rolling"

                },

                "triggers": [

                    {

                        "type": "ImageChange",

                        "imageChangeParams": {

                            "automatic": true,

                            "containerNames": [

                                "${APPLICATION_NAME}-web"

                            ],

                            "from": {

                                "kind": "ImageStreamTag",

                                "name": "${APPLICATION_NAME}-web:latest"

                            }

                        }

                    },

                    {

                        "type": "ConfigChange"

                    }

                ],

                "replicas": 1,

                "selector": {

                    "deploymentConfig": "${APPLICATION_NAME}-web"

                },

                "template": {

                    "metadata": {

                        "name": "${APPLICATION_NAME}-web",

                        "labels": {

                            "deploymentConfig": "${APPLICATION_NAME}-web",

                            "application": "${APPLICATION_NAME}"

                        }

                    },

                    "spec": {

                        "terminationGracePeriodSeconds": 60,

                        "containers": [

                            {

                                "name": "${APPLICATION_NAME}-web",

                                "image": "${APPLICATION_NAME}-web",

                                "imagePullPolicy": "Always",

                                "ports": [

                                    {

                                        "name": "http",

                                        "containerPort": 8080,

                                        "protocol": "TCP"

                                    }

                                ],

                                "env": [

                                    {

                                        "name": "HTTPD_LOG_TO_VOLUME",

                                        "value": "${HTTPD_LOG_TO_VOLUME}"

                                    }

                                ]

                            }

                        ]

                    }

                }

            }

        },

        {

            "kind": "DeploymentConfig",

            "apiVersion": "v1",

            "metadata": {

                "name": "${APPLICATION_NAME}-was",

                "labels": {

                    "application": "${APPLICATION_NAME}"

                }

            },

            "spec": {

                "strategy": {

                    "type": "Rolling"

                },

                "triggers": [

                    {

                        "type": "ImageChange",

                        "imageChangeParams": {

                            "automatic": true,

                            "containerNames": [

                                "${APPLICATION_NAME}-was"

                            ],

                            "from": {

                                "kind": "ImageStreamTag",

                                "name": "${APPLICATION_NAME}-was:latest"

                            }

                        }

                    },

                    {

                        "type": "ConfigChange"

                    }

                ],

                "replicas": 1,

                "selector": {

                    "deploymentConfig": "${APPLICATION_NAME}-was"

                },

                "template": {

                    "metadata": {

                        "name": "${APPLICATION_NAME}-was",

                        "labels": {

                            "deploymentConfig": "${APPLICATION_NAME}-was",

                            "application": "${APPLICATION_NAME}"

                        }

                    },

                    "spec": {

                        "serviceAccountName": "${SERVICE_ACCOUNT_NAME}",

                        "terminationGracePeriodSeconds": 60,

                        "containers": [

                            {

                                "name": "${APPLICATION_NAME}-was",

                                "image": "${APPLICATION_NAME}-was",

                                "imagePullPolicy": "Always",

                                "volumeMounts": [

                                    {

                                        "name": "eap-jgroups-keystore-volume",

                                        "mountPath": "/etc/jgroups-encrypt-secret-volume",

                                        "readOnly": true

                                    }

                                ],

                                "readinessProbe": {

                                    "exec": {

                                        "command": [

                                            "/bin/bash",

                                            "-c",

                                            "/opt/eap/bin/readinessProbe.sh"

                                        ]

                                    }

                                },

                                "ports": [

                                    {

                                        "name": "jolokia",

                                        "containerPort": 8778,

                                        "protocol": "TCP"

                                    },

                                    {

                                        "name": "http",

                                        "containerPort": 8080,

                                        "protocol": "TCP"

                                    },

                                    {

                                        "name": "https",

                                        "containerPort": 8443,

                                        "protocol": "TCP"

                                    },

                                    {

                                        "name": "ping",

                                        "containerPort": 8888,

                                        "protocol": "TCP"

                                    }

                                ],

                                "env": [

                                    {

                                        "name": "OPENSHIFT_KUBE_PING_LABELS",

                                        "value": "application=${APPLICATION_NAME}"

                                    },

                                    {

                                        "name": "OPENSHIFT_KUBE_PING_NAMESPACE",

                                        "valueFrom": {

                                            "fieldRef": {

                                                "fieldPath": "metadata.namespace"

                                            }

                                        }

                                    },

                                    {

                                        "name": "JGROUPS_ENCRYPT_SECRET",

                                        "value": "${JGROUPS_ENCRYPT_SECRET}"

                                    },

                                    {

                                        "name": "JGROUPS_ENCRYPT_KEYSTORE_DIR",

                                        "value": "/etc/jgroups-encrypt-secret-volume"

                                    },

                                    {

                                        "name": "JGROUPS_ENCRYPT_KEYSTORE",

                                        "value": "${JGROUPS_ENCRYPT_KEYSTORE}"

                                    },

                                    {

                                        "name": "JGROUPS_ENCRYPT_NAME",

                                        "value": "${JGROUPS_ENCRYPT_NAME}"

                                    },

                                    {

                                        "name": "JGROUPS_ENCRYPT_PASSWORD",

                                        "value": "${JGROUPS_ENCRYPT_PASSWORD}"

                                    },

                                    {

                                        "name": "JGROUPS_CLUSTER_PASSWORD",

                                        "value": "${JGROUPS_CLUSTER_PASSWORD}"

                                    },

                                    {

                                        "name": "AUTO_DEPLOY_EXPLODED",

                                        "value": "${AUTO_DEPLOY_EXPLODED}"

                                    }

                                ]

                            }

                        ],

                        "volumes": [

                            {

                                "name": "eap-jgroups-keystore-volume",

                                "secret": {

                                    "secretName": "${JGROUPS_ENCRYPT_SECRET}"

                                }

                            }

                        ]

                    }

                }

            }

        }

    ]

}








참고사항


오픈시프트 내 pod는 노드의 DNS 서버 정보를 그대로 사용합니다. 따라서 pod 내에서 dig, nslookup을 통해 route의 hostname 주소를 찾을 수 있습니다. 그러나 버그로 예상되는 부분인데, 간혹 pod 내에서 route에 등록된 hostname(즉 FQDN명)을 못찾는 경우가 있습니다. 


예를 들어, 이 포스팅에서 웹서버 pod는 WAS의 route로 연계를 하도록 되어 있습니다. 이때 FQDN 으로 찾아가는데 테스트해 보니 간혹, 해당 FQDN만 찾지 못하는 경우가 있었습니다(다른건 다 찾음). 이는 버그로 예상되는 부분입니다. 이 현상이 발생하면 WAS의 route를 새로 생성하고 웹서버 Pod를 재기동 해보시기 바랍니다.








공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함