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-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
|
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
表示,metallb 安装 OK。
宿主机访问 Flink Web UI
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-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