如何强制ARTIFACTORY只在双栈kubernete集群上使用ipv4运行

保罗•潘
2023-01-22 11:06

这个问题

Artifactory 7。xsupports ipv6 and in an environment with ipv6 enabled, it will automatically bind to both ipv4 and ipv6 addresses.

在这种情况下,tomcat将使用ipv6 dns查找方法Java_java_net_Inet6AddressImpl_lookupAllHostAddr代替Java_java_net_Inet4AddressImpl_lookupAllHostAddr

我们已经发现在一些kubernete环境中,这种方法可能会导致DNS查询失败并导致JVM崩溃,这将在你的artifactory pod上创建随机重启。

找出问题所在

为了识别问题,我们首先需要查看在JVM崩溃期间自动生成的核心转储。
堆栈:[0x00007f81746e1111,0x00007f81747e2111], sp=0x00007c82747dc075,空闲空间=2000k
本机帧:(J=编译的Java代码,A=aot编译的Java代码,J=解释的,Vv=VM代码,C=本机代码)
C [libc.so。6 + 0 xe5281] gaih_inet.constprop.7 x311 + 0
C [libc.so。6 + 0 xe6d1b] getaddrinfo x12b + 0
C [libnet。所以+ 0 x5e56] Java_java_net_Inet6AddressImpl_lookupAllHostAddr + 0 x96
j java.net.Inet6AddressImpl.lookupAllHostAddr(Ljava/lang/String;)[Ljava/net/InetAddress;+0 java.base@11.0.13 . jjava.net . inet6addressimpl.lookupallhostaddr (Ljava/lang/String;

接下来,我们可以运行以下命令来进一步确定kubernete集群是否确实启用了ipv6,以及artifactory是否启用了ipv6:
Bash-4.4 $ cat /etc/hosts
# kubernetes托管的主机文件(主机网络)。
127.0.0.1 localhost
对于支持IPv6的主机,下面几行是可取的
::1 ip6-localhost ip6-loopback
ip6-localnet fe00:: 0
ip6-mcastprefix ff00:: 0
ip6-allnodes ff02:: 1
ip6-allrouters ff02:: 2
ip6-allhosts ff02:: 3

Netstat命令显示artifactory java在tcp6上
bash-4.4$ netstat -tulpn | grep监听
tcp 0 0 127.0.0.1:8046 0.0.0.0:* LISTEN 4130/jf-router
tcp 0 0 127.0.0.1:8047 0.0.0.0:* LISTEN 4130/jf-router
tcp 0 0 127.0.0.1:8049 0.0.0.0:* LISTEN 4130/jf-router
tcp 0 0 127.0.0.1:8086 0.0.0.0:* LISTEN 4350/jf-元数据
tcp 0 0 127.0.0.1:8061 0.0.0.0:* LISTEN 4521/jf-event
tcp 0 0 127.0.0.1:8062 0.0.0.0:* LISTEN 4521/jf-event
tcp 0 0 127.0.0.1:8036 0.0.0.0:* LISTEN 4864/jf-observabili
tcp 0 0 127.0.0.1:8070 0.0.0.0:* LISTEN 4883/node
tcp 0 0 127.0.0.1:8071 0.0.0.0:* LISTEN 5039/jf-integration
tcp 0 0 127.0.0.1:8072 0.0.0.0:* LISTEN 5039/jf-integration
tcp6 0 0:::8045:::* LISTEN 5286/java
tcp6 0 0 127.0.0.1:8015:::* LISTEN 5286/java
tcp6 0 0:::8081:::* LISTEN 5286/java
tcp6 0 0:::8082:::* LISTEN 4130/jf-router
tcp6 0 0 127.0.0.1:8091:::* LISTEN 5286/java
tcp6 0 0 127.0.0.1:8040:::* LISTEN 5286/java

解决方案

解决这个问题的方法是通过javaoption强制tomcat使用ipv4而不是ipv6
-Djava.net.preferIPv4Stack = true

我们可以把它传递给人工系统。yaml下

共享:
extraJavaOpts:“-Djava.net.preferIPv4Stack = true”


你可以改变系统。Yaml设置直接在秘密作为临时解决办法:

1.获取systemYaml秘密:
Kubectl get secret d-artifactory-systemyaml -o jsonpath="{.data}"
2.Base64解码该值以获得systemYaml内容。编辑extraJavaOpts键以添加以下值(如果extraJavaOpts不存在,可以添加一个):

共享:
extraJavaOpts:“-Djava.net.preferIPv4Stack = true”

3.Base64再次编码修改后的systemYaml内容并运行
Kubectl编辑秘密d-artifactory-systemyaml

替换system.yaml下的编码值

如果这有助于解决问题,您可能需要在值中更新“javaOpts”。Yaml和更新你的版本。

运行netstat确认上述设置是否正常。你应该看到:
tcp 0 0 127.0.0.1:8091 0.0.0.0:* LISTEN 5082/java
tcp 0 0 127.0.0.1:8061 0.0.0.0:* LISTEN 4225/jf-event
tcp 0 0 127.0.0.1:8030 0.0.0.0:* LISTEN 4886/jf-connect
tcp 0 0 127.0.0.1:8062 0.0.0.0:* LISTEN 4225/jf-event
tcp 0 0 127.0.0.1:8035 0.0.0.0:* LISTEN 4886/jf-connect
tcp 0 0 127.0.0.1:8036 0.0.0.0:* LISTEN 4547/jf-observabili
tcp 0 0 127.0.0.1:8070 0.0.0.0:* LISTEN 4381/node
tcp 0 0 127.0.0.1:8071 0.0.0.0:* LISTEN 4711/jf-integration
tcp 0 0 127.0.0.1:8072 0.0.0.0:* LISTEN 4711/jf-integration
tcp 0 0 127.0.0.1:8040 0.0.0.0:* LISTEN 5082/java
tcp 0 0 0.0.0.0:8045 0.0.0.0:* LISTEN 5082/java
tcp 0 0 127.0.0.1:8046 0.0.0.0:* LISTEN 3864/jf-router . xml
tcp 0 0 127.0.0.1:8047 0.0.0.0:* LISTEN 3864/jf-router . xml
tcp 0 0 127.0.0.1:8015 0.0.0.0:* LISTEN 5082/java
tcp 0 0 127.0.0.1:8049 0.0.0.0:* LISTEN 3864/jf-router . xml
tcp 0 0 0.0.0.0:8081 0.0.0.0:* LISTEN 5082/java
tcp 0 0 127.0.0.1:8086 0.0.0.0:* LISTEN 4069/jf-元数据
tcp6 0 0:::8082:::* LISTEN 3864/jf-router