Flink 使用介紹相關(guān)文檔目錄
背景
Flink Kerberos認證的配置位于YAML配置文件中懈费,帶來的便利是用戶不用反復(fù)去配置認證信息萌焰。但這樣使用有局限性。用戶如果需要頻繁切換不同的用戶提交任務(wù),是否可以像spark-submit
那樣通過--principal
和--keytab
參數(shù)來臨時指定用戶呢蚕礼?答案是可以的乎串。
使用方式
Flink 1.17版本支持使用-D 配置項
的方式在提交任務(wù)時指定認證配置历恐。例如:
./flink run-application -t yarn-application -D security.kerberos.login.keytab=/etc/security/keytabs/hdfs.headless.keytab -D security.kerberos.login.principal=hdfs@PAUL.COM ../examples/batch/WordCount.jar
其中-D 配置項
的內(nèi)容和YAML配置文件中的參數(shù)名相同荸恕。
需要注意的是,經(jīng)本人驗證Flink 1.13.2 和Flink 1.15.4版本存在問題菩混,無法使用此方式忿墅。
經(jīng)查詢社區(qū),和修復(fù)此問題相關(guān)聯(lián)的Issue為:
- [FLINK-29435][client] SecurityConfiguration supports dynamic configuration
- [FLINK-31321][Deployment/YARN] Yarn-session mode, securityConfiguration supports dynamic configuration
如果需要在1.13.x和1.15.x版本中修復(fù)沮峡,可以將這兩個commit cherrypick過去重新編譯解決疚脐。
除此之外還有一個備用方法:動態(tài)指定Kerberos Cache。該方法對于Flink 1.13.x和1.15.x可用邢疙。
kinit hdfs@PAUL.COM -kt /etc/security/keytabs/hdfs.headless.keytab -c /opt/paul/krb_cache
export KRB5CCNAME=/opt/paul/krb_cache && ./flink run -m yarn-cluster ../examples/batch/WordCount.jar
kinit
命令可以通過-c
參數(shù)指定自定義的cache文件路徑棍弄。在Flink使用的時候?qū)⑵渑渲玫?code>KRB5CCNAME環(huán)境變量對應(yīng)起來望薄。不同用戶使用不同的cache文件可避免相互影響。
KRB5CCNAME
環(huán)境變量僅在當前shell中生效照卦,不會干擾其他的shell提交作業(yè)式矫。
源代碼分析
security config動態(tài)參數(shù)解析部分
CliFrontend::mainInternal
方法try
塊內(nèi)容:
final CliFrontend cli = new CliFrontend(configuration, customCommandLines);
CommandLine commandLine =
cli.getCommandLine(
new Options(),
Arrays.copyOfRange(args, min(args.length, 1), args.length),
true);
Configuration securityConfig = new Configuration(cli.configuration);
// 獲取命令行中-D key=value形式的動態(tài)參數(shù)乡摹,將其合并入securityConfig(Configuration類型)中
DynamicPropertiesUtil.encodeDynamicProperties(commandLine, securityConfig);
// 生成安全相關(guān)配置(Hadoop認證還是JAAS)
SecurityUtils.install(new SecurityConfiguration(securityConfig));
// 執(zhí)行認證過程
retCode = SecurityUtils.getInstalledContext().runSecured(() -> cli.parseAndRun(args));
上面生成安全相關(guān)配置和執(zhí)行認證過程參見Flink 源碼之安全認證役耕。
動態(tài)指定Kerberos Cache
相關(guān)源代碼位于:KerberosUtils::static
方法。相關(guān)代碼片段為:
// 獲取系統(tǒng)環(huán)境變量KRB5CCNAME
String ticketCache = System.getenv("KRB5CCNAME");
if (ticketCache != null) {
if (IBM_JAVA) {
System.setProperty("KRB5CCNAME", ticketCache);
} else {
// 添加到kerberosCacheOptions中
kerberosCacheOptions.put("ticketCache", ticketCache);
}
}