Flink-1.10.0 Native Kubernetes 部署方式实践

最新发布的 Flink 中支持了 native Kubernetes 的部署方式,可以根据需要动态的增加、减少pod,非常值得测试,目前还处于beta阶段,且目前支持 Flink-Session 的部署方式


前提

1、1.9版本或者以上的K8s集群,且启用了DNS
2、能够操作pod、service的 KubeConfig
3、有RBAC权限的service Account,用于创建,删除pod


部署

解压flink tar包后,执行如下命令:

./bin/kubernetes-session.sh

启动成功后可根据日志输出打印的 URL 访问 flink 的页面,也可以根据 flink 启动的ClsuterIP/LoadBalancer service 里的 CLUSTER-IP:8081 来访问。

默认flink native k8s 启动的 job master pod 日志是打印到 pod 里 /opt/flink/log 目录下的,如果想通过 kubectl log 查看日志,可以在 conf/log4j.properties 添加相关配置:

log4j.rootLogger=INFO, file, console

# Log all infos to the console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{
     yyyy-MM-dd HH:mm:ss,SSS} %-5p %-60c %x - %m%n

然后启动时添加 -Dkubernetes.container-start-command-template 的参数就可以通过kubectl logs 查看日志了:

./bin/kubernetes-session.sh -Dkubernetes.container-start-command-template="%java% %classpath% %jvmmem% %jvmopts% %logging% %class% %args%"

然后就可以提交相关job了:

./bin/flink run -d -e kubernetes-session -Dkubernetes.cluster-id=<ClusterId> examples/streaming/WindowJoin.jar

通过不断提交 job,然后 cancel 掉 job,发现 native k8s 的部署方式可以根据需要动态增加/删除 pod,相比于之前要事先设定好taskmanager的数量来得方便,也可以更有效的利用资源


采坑

在测试过程中,原先配置的jobmanager.heap.size: 600m,发现pod一直没启动成功,describe pod 和查看 pod 日志后发现 jvm 的启动内存设置的都是0

Start command : /bin/bash -c $JAVA_HOME/bin/java -classpath $FLINK_CLASSPATH -Xms0m -Xmx0m -Dlog.file=/opt/flink/log/jobmanager.log -Dlogback.configurationFile=file:/opt/flink/conf/logback.xml -Dlog4j.cint.KubernetesSessionClusterEntrypoint
Invalid maximum heap size: -Xmx0m
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.

查看相关源码后发现对于 Yarn、Mesos、K8s 模式启动的 container 中除了 Flink 的相关进程外还会预留其他 jvm内存,默认最小预留600m,所以上面配置的jobmanager.heap.size: 600m时,经过下面的计算逻辑后剩余的 jobmanager 的 jvm 的值就为0了,所以启动失败。

	/**
	 * Calculate heap size after cut-off. The heap size after cut-off will be used to set -Xms and -Xmx for jobmanager
	 * start command.
	 * 
	 * 代码在:org.apache.flink.runtime.clusterframework.BootstrapTools#calculateHeapSize
	 */
	public static int calculateHeapSize(int memory, Configuration conf) {
     

		final float memoryCutoffRatio = conf.getFloat(ResourceManagerOptions.CONTAINERIZED_HEAP_CUTOFF_RATIO);
		final int minCutoff = conf.getInteger(ResourceManagerOptions.CONTAINERIZED_HEAP_CUTOFF_MIN);

		if (memoryCutoffRatio > 1 || memoryCutoffRatio < 0) {
     
			throw new IllegalArgumentException("The configuration value '"
				+ ResourceManagerOptions.CONTAINERIZED_HEAP_CUTOFF_RATIO.key()
				+ "' must be between 0 and 1. Value given=" + memoryCutoffRatio);
		}
		if (minCutoff > memory) {
     
			throw new IllegalArgumentException("The configuration value '"
				+ ResourceManagerOptions.CONTAINERIZED_HEAP_CUTOFF_MIN.key()
				+ "' is higher (" + minCutoff + ") than the requested amount of memory " + memory);
		}

		int heapLimit = (int) ((float) memory * memoryCutoffRatio);
		if (heapLimit < minCutoff) {
     
			heapLimit = minCutoff;
		}
		return memory - heapLimit;
	}

上面的计算逻辑代码中涉及到两个配置参数:

  • containerized.heap-cutoff-ratio:为安全起见,Job Master容器中要删减的内存
  • containerized.heap-cutoff-min:要从Job Master容器(YARN / Mesos / Kubernetes)中删除用于其他JVM内存使用的堆空间百分比。

过程参考:
官网-Flink native k8s 部署模式
官网-Flink相关参数配置
《Flink 1.10 Native Kubernetes 原理与实践》

你可能感兴趣的:(Flink,flink,kubernetes)