【k8s部署flink在x86架构和arm架构服务器上的踩坑】
k8s部署flink在x86架构和arm架构服务器上的踩坑
·
k8s部署flink在x86架构和arm架构服务器上的踩坑
在x86架构上使用k8s部署flink的yaml都已经没什么问题,教程如下
flink部署【使用k8s部署】
但是在arn架构下使用上述yaml部署文件部署时,出现了jobmanager能够部署成功,可是taskmanager报错如下的情况
flink-taskmanager-xx: Temporary failure in name resolution
flink Could not resolve local hostname to an IP address: flink-taskmanager-68d7ccbd4d-lzwb6: fli
于是百度查询和同事请教,认为是taskmanager对其pod内部的/etc/hosts文件的读写权限存在权限不足问题(本质原因):
参考资料
k8s中pod目录访问权限不足
k8s 容器内操作报Permission defined,以root运行容器,定义Pod的特权和访问控制权限
有多种解决办法,提供两种,推荐第二种
1、hostaliases的使用(暂未尝试)
yaml里设置好host,使得taskmanager能找到jobmanager的地址,可以搜索下k8s hostaliases如何使用
2、pod运行前的初始化
加入如下权限修改
# 初始化容器
# 初始化容器的作用是在应用容器启动之前做准备工作,每个init容器都必须在下一个启动之前成功完成
initContainers:
- name: fix-permissions
image: busybox:1.34.1
command: ["sh", "-c", "chmod 640 /opt/flink/conf; chmod 640 /etc"]
securityContext:
privileged: true
完整的taskmanager.yaml如下
apiVersion: apps/v1
kind: Deployment
metadata:
name: flink-taskmanager
namespace: ai-poc
annotations:
flink-mode: "sesssion 模式"
spec:
replicas: 2
selector:
matchLabels:
app: flink
component: taskmanager
template:
metadata:
labels:
app: flink
component: taskmanager
spec:
nodeSelector:
role: master
# 初始化容器
# 初始化容器的作用是在应用容器启动之前做准备工作,每个init容器都必须在下一个启动之前成功完成
initContainers:
- name: fix-permissions
image: busybox:1.34.1
command: ["sh", "-c", "chmod 640 /opt/flink/conf; chmod 640 /etc"]
securityContext:
privileged: true
containers:
- name: taskmanager
image: flink:1.16
resources:
limits:
cpu: 1
memory: 4Gi
requests:
cpu: 500m
memory: 2Gi
args: ["taskmanager"]
ports:
- containerPort: 6122
name: rpc
- containerPort: 6125
name: query-state
volumeMounts:
- name: flink-config-volume
mountPath: /opt/flink/conf/
securityContext:
runAsUser: 9999 # 参考官方 flink 镜像中的 _flink_ 用户,如有必要可以修改
volumes:
- name: flink-config-volume
configMap:
name: flink-config
items:
- key: flink-conf.yaml
path: flink-conf.yaml
- key: log4j-console.properties
path: log4j-console.properties
其他参考
更多推荐
已为社区贡献1条内容
所有评论(0)