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

其他参考

关于临时容器与 Pod 调试

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐