【Flink on k8s】Flink on Kubernetes 部署模式

本文基于 Flink-1.13 介紹 Flink on Kubernetes 的部署模式,重點講述 SessionNative Session 模式。

1.Flink on Kubernetes 的背景

Kubernetes 簡介
Kubernetes 項目來源于 Google 內部 Borg 項目,于 2014 年發布到開源社區。Kubernetes 已經成長為容器管理領域的事實標準。在大數據相關領域,包括 Spark、Hive、Kafka 等項目正在遷移到 Kubernetes。

Flink 選擇 Kubernetes 的主要原因是結合 Flink 和 Kubernetes 的長穩性。
Flink 特性:提供的實時服務是需要長時間、穩定地運行,常應用于電信網絡質量監控、實時風控、實時推薦等穩定性要求較高的場景;
Kubernetes 優勢為應用提供了部署、管理能力,同時保證其穩定運行。Kubernetes 具有很好的生態,可以集成各種運維工具,例如 prometheus、主流日志采集工具等。Kubernetes 具有很好的擴縮容機制,可以大大提高資源利用率。

2.Flink Session 和 Application 模式

2.1 Session 模式

Session 模式簡介

預先構建 Flink 集群,且該集群長期處于運行狀態,但不能自動擴縮容。用戶通過 client 提交作業到運行中的 JobManager,而 JobManager 將任務分配到運行中的 TaskManager。

image.png
優點:

Flink 集群是預先啟動運行的。用戶提交作業的時候,作業可以立即分配到 TaskManager,即作業啟動速度快。

缺點:

資源利用率低,提前確定 TaskManager 數量,如果作業需要的資源少,則大量 TaskManager 處于閑置狀態。反正 TaskManager 資源不足。
作業隔離性差,多個作業的任務存在資源競爭,相互影響。如果一個作業異常導致 TaskManager 掛了,該 TaskManager 上的全部作業都會被重啟。

部署指導

參考:Flink on Standalone Kubernetes Reference
集群配置
集群配置通過 configmap 掛載到容器中
flink-configuration-configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: flink-config
  labels:
    app: flink
data:
  flink-conf.yaml: |+
    jobmanager.rpc.address: flink-jobmanager
    taskmanager.numberOfTaskSlots: 1
    blob.server.port: 6124
    jobmanager.rpc.port: 6123
    taskmanager.rpc.port: 6122
    jobmanager.heap.size: 1024m
    taskmanager.memory.process.size: 1024m
  log4j.properties: |+
    log4j.rootLogger=INFO, file
    log4j.logger.akka=INFO
    log4j.logger.org.apache.kafka=INFO
    log4j.logger.org.apache.hadoop=INFO
    log4j.logger.org.apache.zookeeper=INFO
    log4j.appender.file=org.apache.log4j.FileAppender
    log4j.appender.file.file=${log.file}
    log4j.appender.file.layout=org.apache.log4j.PatternLayout
    log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p %-60c %x - %m%n
    log4j.logger.org.apache.flink.shaded.akka.org.jboss.netty.channel.DefaultChannelPipeline=ERROR, file

Deployment 文件
Flink 鏡像上傳到私有鏡像倉。編輯 jobmanager-service.yaml、jobmanager-deployment.yaml、taskmanager-deployment.yaml

jobmanager-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: flink-jobmanager
spec:
  replicas: 1
  selector:
    matchLabels:
      app: flink
      component: jobmanager
  template:
    metadata:
      labels:
        app: flink
        component: jobmanager
    spec:
      containers:
      - name: jobmanager
        image: flink:latest
        workingDir: /opt/flink
        command: ["/bin/bash", "-c", "$FLINK_HOME/bin/jobmanager.sh start;\
          while :;
          do
            if [[ -f $(find log -name '*jobmanager*.log' -print -quit) ]];
              then tail -f -n +1 log/*jobmanager*.log;
            fi;
          done"]
        ports:
        - containerPort: 6123
          name: rpc
        - containerPort: 6124
          name: blob
        - containerPort: 8081
          name: ui
        livenessProbe:
          tcpSocket:
            port: 6123
          initialDelaySeconds: 30
          periodSeconds: 60
        volumeMounts:
        - name: flink-config-volume
          mountPath: /opt/flink/conf
        securityContext:
          runAsUser: 9999  # refers to user _flink_ from official flink image, change if necessary
      volumes:
      - name: flink-config-volume
        configMap:
          name: flink-config
          items:
          - key: flink-conf.yaml
            path: flink-conf.yaml
          - key: log4j.properties
            path: log4j.properties

taskmanager-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: flink-taskmanager
spec:
  replicas: 2
  selector:
    matchLabels:
      app: flink
      component: taskmanager
  template:
    metadata:
      labels:
        app: flink
        component: taskmanager
    spec:
      containers:
      - name: taskmanager
        image: flink:latest
        workingDir: /opt/flink
        command: ["/bin/bash", "-c", "$FLINK_HOME/bin/taskmanager.sh start; \
          while :;
          do
            if [[ -f $(find log -name '*taskmanager*.log' -print -quit) ]];
              then tail -f -n +1 log/*taskmanager*.log;
            fi;
          done"]
        ports:
        - containerPort: 6122
          name: rpc
        livenessProbe:
          tcpSocket:
            port: 6122
          initialDelaySeconds: 30
          periodSeconds: 60
        volumeMounts:
        - name: flink-config-volume
          mountPath: /opt/flink/conf/
        securityContext:
          runAsUser: 9999  # refers to user _flink_ from official flink image, change if necessary
      volumes:
      - name: flink-config-volume
        configMap:
          name: flink-config
          items:
          - key: flink-conf.yaml
            path: flink-conf.yaml
          - key: log4j.properties
            path: log4j.properties

jobmanager-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: flink-jobmanager
spec:
  type: ClusterIP
  ports:
  - name: rpc
    port: 6123
  - name: blob
    port: 6124
  - name: ui
    port: 8081
  selector:
    app: flink
    component: jobmanager

執行 yaml
通過 kubectl create -f 命令創建 Flink 集群

kubectl create -f flink-configuration-configmap.yaml
kubectl create -f jobmanager-service.yaml
kubectl create -f jobmanager-deployment.yaml
kubectl create -f taskmanager-deployment.yaml

2.2 Application 模式

Application 模式簡介

每個作業獨占一個 Flink 集群,當作業完成后,集群也會被回收。

注意
① Flink 鏡像需要包含作業即Application 依賴的 Class
② 啟動作業的時候需要指定 Main 函數入口類

image.png
優點:

一個作業獨占一個集群,作業的隔離性好。

缺點:

資源利用率低,提前確定 TaskManager 數量,如果作業需要的資源少,則大量 TaskManager 處于閑置狀態。反之 TaskManager 資源不足。同時,JobManager 不能復用。

3.Flink Native Session 模式

參考官方文檔 《Native Kubernetes Session Mode》

3.1 Native Session 模式簡介

類似 Session 模式,需要預先構建 JobManager。不同點是用戶通過 Flink Client 向 JobManager 提交作業后,根據作業需要的 Slot 數量,JobManager 直接向 Kubernetes 申請 TaskManager 資源,最后把作業提交到 TaskManager 上。

image.png

3.2 優缺點分析

優點:

TaskManager 的資源是實時的、按需進行的創建,對資源的利用率更高

缺點:

作業真正運行起來的時間較長,因為需要等待 TaskManager 創建。

3.3 部署指導

集群配置
集群配置通過 configmap 掛載到容器中,如上 2.1 所示。
新增如下配置:
flink-configuration-configmap.yaml

kubernetes.cluster-id: my-first-flink-cluster
execution.attached: true

② 配置 jobmanager-deployment.yaml
如上 2.1 所示,需要把啟動腳本修改為 ./bin/kubernetes-session.sh

jobmanager-deployment.yaml

// 忽略...

    spec:
      containers:
      - name: jobmanager
        image: flink:latest
        workingDir: /opt/flink
        command: ["/bin/bash", "-c", "$FLINK_HOME/bin/kubernetes-session.sh;\
          while :;
          do
            if [[ -f $(find log -name '*jobmanager*.log' -print -quit) ]];
              then tail -f -n +1 log/*jobmanager*.log;
            fi;
          done"]

// 忽略...

執行 yaml
通過 kubectl create -f 命令創建 Flink 集群

kubectl create -f flink-configuration-configmap.yaml
kubectl create -f jobmanager-service.yaml
kubectl create -f jobmanager-deployment.yaml

4.Flink Native Application 模式

參考官方文檔 《Native Kubernetes Application Mode》

4.1 Native Application 模式簡介

類似 Application 模式,每個作業獨占一個 Flink 集群,當作業完成后,集群也會被回收。不同點是 Native 特性,即 Flink 直接與 Kubernetes 進行通信并按需申請資源,無需用戶指定 TaskManager 資源的數量。

image.png

4.2 優缺點分析

優點:

① 一個作業獨占一個集群,作業的隔離性好。
資源利用率相對較高,按需申請 JobManager 和 TaskManager。

缺點:

① 一個作業獨占一個集群,JobManager 不能復用。
作業啟動較慢,在作業提交后,才開始創建 JobManager 和 TaskManager。

5.Flink 運行模式總結

模式 隔離性 作業啟動時間 資源利用率 資源按需創建
Session 弱,作業共享集群 較短,立即啟動 較低,集群長期存在
Application 強,作業獨享集群 最長,等待集群創建完成 一般,作業結束后釋放資源
Native Session 弱,作業共享集群 一般,等待 TaskManager 創建 較低,TaskManager 按需申請
Native Application 強,作業獨占集群 一般, 等待集群創建完成 最好,集群按需創建
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,739評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,634評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,653評論 0 377
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,063評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,835評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,235評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,315評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,459評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,000評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,819評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,004評論 1 370
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,560評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,257評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,676評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,937評論 1 288
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,717評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,003評論 2 374

推薦閱讀更多精彩內容