本文介绍如何固定ECS应用变更过程中的JDK版本,以保证应用在发生ECS实例扩容时,新扩容的实例和应用中的实例的JDK版本一致。

背景信息

ECS集群默认对导入EDAS的ECS实例自动安装最新版本的OpenJDK。但是当应用发生扩容ECS实例时,新扩容的ECS实例与应用里已存在的ECS实例上的OpenJDK版本不一致,在业务代码运行时引入一些异常问题。

您可以固定ECS应用变更过程中的JDK版本从而避免这些异常问题。您可以在挂载脚本的启动前脚本中设置要执行的代码段,代码段中可以设置指定版本的JDK的下载地址信息,这样就可以实现在ECS应用的变更过中(应用扩容、重置ECS实例等)都使用固定版本的JDK。

操作步骤

  1. 获取指定版本JDK的下载地址信息。
    1. 下载指定版本的JDK压缩包(如oracle-jdk-8u202-linux-x64.tar.gz)到本地。
    2. 上传JDK压缩包到与ECS应用中的实例相同地域的OSS Bucket中。具体操作,请参见上传文件
    3. 获取压缩包的下载地址,并在下载地址中添加-internal字段。获取地址的操作,请参见分享文件
      例如oracle-jdk-8u202-linux-x64.tar.gz的下载地址为http://doctest.oss-cn-hangzhou-internal.aliyuncs.com/tmp/oracle-jdk-8u202-linux-x64.tar.gz
  2. 将JDK压缩包的下载地址添加到以下代码片段。
    将以下代码段中的JDK_DOWNLOAD_URL变量设置为JDK压缩包的下载地址。
    JDK_DOWNLOAD_URL="http://doctest.oss-cn-hangzhou-internal.aliyuncs.com/tmp/oracle-jdk-8u202-linux-x64.tar.gz"
    JDK_DOWNLOAD_TMP_FILE="/tmp/oracle-jdk-8u202.tar.gz"
    JDK_HOME="/opt/edas/jdk"
    JAVA_HOME="${JDK_HOME}/java"
    
    if [ ! -f "${JAVA_HOME}/bin/java" ]; then
       rm -rf ${JAVA_HOME} && mkdir -p ${JDK_HOME}
       wget -q --dns-timeout=2 --connect-timeout=3 --read-timeout=30 ${JDK_DOWNLOAD_URL} -O ${JDK_DOWNLOAD_TMP_FILE}
       [ -f "${JDK_DOWNLOAD_TMP_FILE}" ] && tar zxf ${JDK_DOWNLOAD_TMP_FILE} -C ${JDK_HOME} && rm -f ${JDK_DOWNLOAD_TMP_FILE}
       [ -n "$(ls -ld ${JDK_HOME}/jdk* 2>/dev/null)" ] && mv ${JDK_HOME}/jdk* ${JAVA_HOME}
    fi
    
    chmod -R 755 ${JAVA_HOME}
  3. 将以上代码添加到ECS应用的启动前脚本。
    1. 登录EDAS控制台
    2. 在左侧导航栏中单击应用列表,在顶部菜单栏选择地域并在页面上方选择微服务空间,然后在应用列表页面单击具体的应用名称。
    3. 在应用基本信息页签的应用设置区域,单击挂载脚本
    4. 挂载脚本对话框的启动前脚本区域,关闭忽略失败开关,添加2中的代码段,然后单击修改
      设置启动前脚本
  4. 重启应用,查看应用的JDK版本是否与设置的版本一致。
    控制台查看JDK版本
    说明 应用重启完成后,您也可以登录ECS实例,查看JDK版本是否与设置的版本一致。登录ECS实例查看JDK版本

更多说明

  • 如果您要使用指定的OpenJDK,则修改添加到启动脚本中的代码段,增加安装fontconfig操作系统类库(yum install -y fontconfig)的内容。
  • 如果ECS集群应用想使用JDK 11或其他Vendor、Version的JDK,也可以使用挂载脚本的方式,将要指定的JDK安装到/opt/edas/jdk/java或者/opt/ali/alijdk目录下,即可达到固定JDK版本的目的。