flink On k8s - kubernetes Operator - ingress & Job 部署

Flink Operator 属于自定义部署到 k8s 的工具,很方便。他提供的 FlinkDeployment CRD 方式。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
wget https://github.com/jetstack/cert-manager/releases/download/v1.8.2/cert-manager.yaml
kubectl apply -f cert-manager.yaml
helm repo add flink-operator-repo https://downloads.apache.org/flink/flink-kubernetes-operator-1.8.0/
helm install flink-kubernetes-operator flink-operator-repo/flink-kubernetes-operator --namespace flink --create-namespace
helm install flink-kubernetes-operator flink-operator-repo/flink-kubernetes-operator --namespace flink --create-namespace

WARNING: Kubernetes configuration file is group-readable. This is insecure. Location: /home/xfhuang/.kube/config
WARNING: Kubernetes configuration file is world-readable. This is insecure. Location: /home/xfhuang/.kube/config
"flink-operator-repo" has been added to your repositories
WARNING: Kubernetes configuration file is group-readable. This is insecure. Location: /home/xfhuang/.kube/config
WARNING: Kubernetes configuration file is world-readable. This is insecure. Location: /home/xfhuang/.kube/config
NAME: flink-kubernetes-operator
LAST DEPLOYED: Wed Aug 28 14:41:01 2024
NAMESPACE: flink
STATUS: deployed
REVISION: 1
TEST SUITE: None

image.png ![[image-20240828144143176.png]]

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
 helm search repo  flink-operator-repo -l
WARNING: Kubernetes configuration file is group-readable. This is insecure. Location: /home/xfhuang/.kube/config
WARNING: Kubernetes configuration file is world-readable. This is insecure. Location: /home/xfhuang/.kube/config
NAME                                            CHART VERSION   APP VERSION     DESCRIPTION
flink-operator-repo/flink-kubernetes-operator   1.8.0           1.8.0           A Helm chart for the Apache Flink Kubernetes Op...

  xfhuang  …/workspace/tools/flink-k8s-op   14:47 
 helm pull flink-operator-repo/flink-kubernetes-oprator --version 1.8.0
WARNING: Kubernetes configuration file is group-readable. This is insecure. Location: /home/xfhuang/.kube/config
WARNING: Kubernetes configuration file is world-readable. This is insecure. Location: /home/xfhuang/.kube/config
Error: chart "flink-kubernetes-oprator" matching 1.8.0 not found in flink-operator-repo index. (try 'helm repo update'): no chart name found

  xfhuang  …/workspace/tools/flink-k8s-op   14:47 
 helm pull flink-operator-repo/flink-kubernetes-oprator --version 1.8.0
WARNING: Kubernetes configuration file is group-readable. This is insecure. Location: /home/xfhuang/.kube/config
WARNING: Kubernetes configuration file is world-readable. This is insecure. Location: /home/xfhuang/.kube/config
Error: chart "flink-kubernetes-oprator" matching 1.8.0 not found in flink-operator-repo index. (try 'helm repo update'): no chart name found

  xfhuang  …/workspace/tools/flink-k8s-op   14:48 
 ls
 basic-session-deployment-only.yaml
 cert-manager.yaml

  xfhuang  …/workspace/tools/flink-k8s-op   14:48 
 helm pull flink-operator-repo/flink-kubernetes-operator
WARNING: Kubernetes configuration file is group-readable. This is insecure. Location: /home/xfhuang/.kube/config
WARNING: Kubernetes configuration file is world-readable. This is insecure. Location: /home/xfhuang/.kube/config

  xfhuang  …/workspace/tools/flink-k8s-op   14:49 
 ls
 basic-session-deployment-only.yaml
 cert-manager.yaml
 flink-kubernetes-operator-1.8.0-helm.tgz

  xfhuang  …/workspace/tools/flink-k8s-op   14:49 
 tar -zxvf flink-kubernetes-operator-1.8.0-helm.tgz
## 这里修改了镜像地址为私服registry的。
helm install flink-kubernetes-operator --namespace flink --create-namespace -f values-test.yaml flink-kubernetes-operator/

编写 Session 集群

basic-session-deployment-only.yaml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
 cat basic-session-deployment-only.yaml
apiVersion: flink.apache.org/v1beta1
kind: FlinkDeployment
metadata:
  name: basic-session-deployment-only-example
spec:
  image: flink:1.17
  flinkVersion: v1_17
  flinkConfiguration:
    taskmanager.numberOfTaskSlots: "2"
  serviceAccount: flink
  jobManager:
    resource:
      memory: "2048m"
      cpu: 1
  taskManager:
    resource:
      memory: "2048m"
      cpu: 1

注意,此时 Seesion 集群会自动创建 2 个  Service资源:
basic-session-deployment-only-example:这个 Service 通常用于 Flink JobManager 和 TaskManager 之间的内部通信。它暴露了 6123 和 6124 端口,这些端口分别用于不同的通信目的,如数据传输和管理操作。ClusterIP 类型的服务意味着它只能在集群内部访问,None 作为 ClusterIP 指出这是一个 headless service,用于直接暴露 pod 的 IP 地址而不是通过单一的服务 IP 进行负载均衡。

basic-session-deployment-only-example-rest:这个 Service 是为了访问 Flink 的 REST API 而设置的,主要是用于提交作业、查询作业状态等操作。它暴露了 8081 端口,这是 Flink Dashboard 和 REST API 的默认端口。同样是 ClusterIP 类型,意味着这个服务也仅在集群内部可访问。不同于上一个服务,这个服务有一个分配的 ClusterIP(例如 10.96.185.175),它提供了一个稳定的内部 IP 地址来访问服务。

此 Seesion 与 Standalone Seesion 不同

在 Standalone Seesion 集群下,TaskManager 是一起部署好的, 而 Kubernetes Operator 的 Seesion Mode,仅仅只启动 JobManager,而 TaskManager 会随着申请资源大小而创建,并不受 JobManager 限制。

这里特别注意: Operator 的 Seesion 下 创建的 Job,它对应的资源是 sessionjob。

向 Seesion 集群添加作业

1
2
3
4
5
For an existing Flink Deployment another configuration could be used to create new jobs. This configuration should contain the following:

    The Flink Deployment to use
    The job to run
    Any job specific configurations

yaml 内容如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
apiVersion: flink.apache.org/v1beta1
kind: FlinkSessionJob
metadata:
  name: basic-session-job-only-example
spec:
  deploymentName: basic-session-deployment-only-example
  job:
    jarURI: https://repo1.maven.org/maven2/org/apache/flink/flink-examples-streaming_2.12/1.16.1/flink-examples-streaming_2.12-1.16.1-TopSpeedWindowing.jar
    parallelism: 4
    upgradeMode: stateless
1
kubeclt -n flink apply -f basic-session-job-only.yaml

output log:

1
2
basic-session-deployment-only-example-taskmanager-1-1    1/1     Running   0               2m47s
basic-session-deployment-only-example-taskmanager-1-2    1/1     Running   0               2m47s

下面是对  upgradeMode: stateless参数介绍

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
 Flink Kubernetes Operator 中,`upgradeMode` 配置项定义了如何处理 Flink 应用的升级过程。当设置为 `stateless` 时,这意味着在进行升级时,当前正在运行的 Flink 应用的状态不会被保留。换句话说,当应用升级发生时,任何现有的作业状态都不会被迁移到新的版本。这种升级模式通常用于那些不需要保存状态,或者可以接受从头开始处理的应用场景。

### `stateless` 升级模式的特点包括:

- **快速部署**:由于不需要迁移状态,`stateless` 模式允许快速部署新版本的 Flink 应用。
- **简化操作**:这种模式简化了升级过程,因为操作员不需要担心状态的保存和恢复。
- **潜在的数据丢失**:如果应用的状态对业务逻辑很重要,使用 `stateless` 升级可能导致状态信息丢失。因此,这种模式不适合那些需要精确状态管理的应用。

### 应用场景

- **无状态计算**:对于那些处理实时数据流但不需要保持长期状态的 Flink 应用,`stateless` 升级是合适的。例如,一个简单的实时监控系统可能适用于这种模式。
- **开发和测试**:在开发过程中,频繁地迭代和部署新版本可能更加看重部署速度而不是状态的保持。`stateless` 模式可以在这种情况下提供便利。
- **可接受数据处理重启的应用**:对于某些场景,即使在升级后从最近的检查点或保存点重新开始处理,也是可以接受的。这些场景可能会选择 `stateless` 升级模式,尽管这意味着不保留完整的状态。

在选择 `stateless` 升级模式时,重要的是要充分理解应用的需求和升级过程中可能面临的限制。对于需要保持状态连续性的重要生产应用,考虑使用其他升级模式,如 `stateful`,这种模式会尝试保留并迁移应用状态。

Seesion 集群 & Job 一起创建

将 Seesion 集群 和 Job 配置 一起提交到 Kubernetes。

1
kubectl apply -f basic-session-deployment-and-job.yaml

yaml 内容如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
apiVersion: flink.apache.org/v1beta1
kind: FlinkDeployment
metadata:
  name: basic-session-deployment-example
spec:
  image: flink:1.17
  flinkVersion: v1_17
  jobManager:
    resource:
      memory: '2048m'
      cpu: 1
  taskManager:
    resource:
      memory: '2048m'
      cpu: 1
  serviceAccount: flink
---
apiVersion: flink.apache.org/v1beta1
kind: FlinkSessionJob
metadata:
  name: basic-session-job-example
spec:
  deploymentName: basic-session-deployment-example
  job:
    jarURI: https://repo1.maven.org/maven2/org/apache/flink/flink-examples-streaming_2.12/1.16.1/flink-examples-streaming_2.12-1.16.1-TopSpeedWindowing.jar
    parallelism: 4
    upgradeMode: stateless

---
apiVersion: flink.apache.org/v1beta1
kind: FlinkSessionJob
metadata:
  name: basic-session-job-example2
spec:
  deploymentName: basic-session-deployment-example
  job:
    jarURI: https://repo1.maven.org/maven2/org/apache/flink/flink-examples-streaming_2.12/1.16.1/flink-examples-streaming_2.12-1.16.1.jar
    parallelism: 2
    upgradeMode: stateless
    entryClass: org.apache.flink.streaming.examples.statemachine.StateMachineExample

此时,我们已经完成以下内容:
1.Seesion 集群创建
2.Job 提交
3.Seesion 集群 和 Job 一起提交,按照先后顺序创建

注意:若需删除 Seesion 集群,请先将 kind 为 FlinkSessionJob 下的 job 删除 !!!

接下来需要暴露服务,让外部可以访问,如何操作了,这里使用 nginx-ingress 和 metallb

安装 MetalLB

本次安装 Metallb, 选择Layer 2 模式配置

必须注意: 非常建议使用 v0.10.2 版本

使用 yaml 安装

1.安装 metallb

1
2
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.10.2/manifests/namespace.yaml
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.10.2/manifests/metallb.yaml

2.使用 Layer2 模式, 配置 IP 池

需注意 addresses 参数,IP 段范围 与 搭建的 Kubernetes 集群节点的 IP 段范围保持一致,例如,Kubernetes 集群节点从 k8s01-k8s06,而 IP 是 192.168.0.140~192.168.0.145。
vim metallb.ip.yaml,注意下面的 address 与你外部 kind 所在的 docker 的 ip 有关。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: default
      protocol: layer2
      addresses:
      - 172.18.255.200-172.18.255.250    
1
kubectl apply -f metallb.ip.yaml

可以查看 Metallb 相关 pod 信息

1
2
3
4
5
6
7
8
9
[root@k8s01 metallb-v0.10.2]# kubectl get pod -n metallb-system
NAME                         READY   STATUS    RESTARTS   AGE
controller-f54fbc6f9-bwrn8   1/1     Running   0          52m
speaker-27nch                1/1     Running   0          52m
speaker-2tqbr                1/1     Running   0          52m
speaker-bwp96                1/1     Running   0          52m
speaker-z5xf4                1/1     Running   0          52m
speaker-z78nm                1/1     Running   0          52m
speaker-zwxqp                1/1     Running   0          52m

访问 https://metallb.universe.tf/installation/ 可自行了解更多的安装步骤。

3.验证 metallb 是否安装成功
vim metallb-test.yaml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-metallb-test
spec:
  selector:
    matchLabels:
      app: nginx-metallb-test
  template:
    metadata:
      labels:
        app: nginx-metallb-test
    spec:
      containers:
        - name: nginx
          image: nginx:1.8
          ports:
            - name: http
              containerPort: 80

---
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  ports:
    - name: http
      port: 80
      protocol: TCP
      targetPort: 80
  selector:
    app: nginx-metallb-test
  type: LoadBalancer

使用kubectl get svc nginx ,查看 svc 是否分配EXTERNAL-IP

1
2
3
4
5
[root@k8s01 metallb-v0.10.2]# kubectl get svc
NAME                 TYPE           CLUSTER-IP      EXTERNAL-IP      PORT(S)                                   AGE
fedora-dev-service   LoadBalancer   10.96.237.208   172.18.255.201   22:31466/TCP,80:32148/TCP,443:31073/TCP   2d22h
kubernetes           ClusterIP      10.96.0.1       <none>           443/TCP                                   4d5h
nginx-service        LoadBalancer   10.96.99.164    172.18.255.200   80:32068/TCP                              4d3h
  • 此时在虚机中,访问对应的 EXTERNAL-IP
1
2
3
4
5
6
7
8
9
[root@k8s01 k8s_yaml]# curl 192.168.165.7
curl 127.0.0.1
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx</center>
</body>
</html>
  • 可在宿主机的浏览器访问 192.168.0.141
    flinkingress01

表示,metallb 安装 OK。

1.查看 ingress-nginx-controller 分配的 EXTERNAL-IP
2.在宿主机中添加ip flink.k8s.io  域名映射
注意一定要带下划线,不然无法重定向。 3.访问  http://flink.k8s.io/flink/basic-application-deployment-only-ingress/  地址,查看 Flink Web UI。
image.png ![[image-20240819092010867.png]]

通过 Ingress,管控 Flink Job Web UI 的访问地址,是非常符合实际生产要素的。

refer
1.https://nightlies.apache.org/flink/flink-kubernetes-operator-docs-release-1.8/docs/operations/ingress/
2.https://metallb.universe.tf/installation/
3.https://blog.cnscud.com/k8s/2021/09/17/k8s-metalb.html

Licensed under CC BY-NC-SA 4.0
最后更新于 Jan 06, 2025 05:52 UTC
comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
Caret Up