基于角色访问控制模型(RBAC)
为了能在k8s上对operator和flink作业进行部署,社区定义了两类角色(roles)。
角色flink-operator职责是管理flinkdeployments、为flink作业创建并管理JobManager和其他资源(比如说services)。
角色flink职责是帮助flink作业的JobManager去创建并管理TaskManagers和ConfigMaps。
如图详细描述了两类角色的职责范围。
角色flink-operator在安装部署时默认是集群级别角色(clusterrole),所以在一个k8s集群上只需一个operator实例即可无视namespace进行flink作业部署。在一些特定限制更苛刻的环境下,比如说只允许namespace级别的角色时,还可通过使用配置watchNamespaces完成部署。
Flink K8s Operator收敛至namespace级的部署方案
由于默认配置给的是clusterrole权限,被k8s管理员要求收敛至namespace级别,为满足线上要求而给的整改方案。整体就两步,先通过helm本地部署收敛权限的values.yaml,然后创建flink k8s operator的RBAC权限账户和角色
1. namespace级的values.yaml
# 这个是要监听的namespaces列表,之后增加也要在这填
watchNamespaces: ["fuyiqi"]
image:
repository: fuyiqi/flink-kubernetes-operator
pullPolicy: IfNotPresent
tag: 1.5.0
# If image digest is set then it takes precedence and the image tag will be ignored
# digest: ""
imagePullSecrets: []
# Replicas must be 1 unless operator leader election is configured
replicas: 1
# Strategy type must be Recreate unless leader election is configured
strategy:
type: Recreate
rbac:
create: false
# kubernetes.rest-service.exposed.type: NodePort requires
# list permission for nodes at the cluster scope.
# Set create to true if you are using NodePort type.
nodesRule:
create: false # 默认不创建
operatorRole:
create: false
name: "fuyiqi-flink-operator-role"
operatorRoleBinding:
create: false # 默认不创建
name: "fuyiqi-flink-operator-role-binding"
jobRole:
create: false # 默认不创建
name: "fuyiqi-flink"
jobRoleBinding:
create: false # 默认不创建
name: "fuyiqi-flink-role-binding"
operatorPod:
priorityClassName: null
annotations: {}
labels: {}
env:
# - name: ""
# value: ""
# dnsPolicy: ""
# dnsConfig: {}
# Node labels for operator pod assignment
# https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/
nodeSelector: {}
# Node tolerations for operator pod assignment
# https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/
tolerations: []
# Topology spread constrains
# https://kubernetes.io/docs/concepts/scheduling-eviction/topology-spread-constraints/
topologySpreadConstraints: []
resources:
resources:
limits:
cpu: "1000m"
memory: "2048Mi"
requests:
cpu: "250m"
memory: "1024Mi"
webhook:
resources: {}
operatorServiceAccount:
create: false # 默认不创建
annotations: {}
name: "fuyiqi-flink-operator-sa"
jobServiceAccount:
create: false # 默认不创建
annotations:
"helm.sh/resource-policy": keep
name: "fuyiqi-flink-sa"
operatorVolumeMounts:
create: false
data:
- name: flink-artifacts
mountPath: /opt/flink/artifacts
operatorVolumes:
create: false
data:
- name: flink-artifacts
hostPath:
path: /tmp/flink/artifacts
type: DirectoryOrCreate
# - name: flink-artifacts
# persistentVolumeClaim:
# claimName: flink-artifacts
podSecurityContext:
runAsUser: 9999
runAsGroup: 9999
# fsGroup: 9999
operatorSecurityContext: {}
webhookSecurityContext: {}
webhook:
create: false
# validator:
# create: true
# mutator:
# create: true
keystore:
useDefaultPassword: false
# passwordSecretRef:
# name: jks-password-secret
# key: password-key
defaultConfiguration:
# If set to true, creates ConfigMaps/VolumeMounts. If set to false, no configuration will be created.
# All below fields will be ignored if create is set to false.
create: true
# If set to true,
# (1) loads the built-in default configuration
# (2) appends the below flink-conf and logging configuration overrides
# If set to false, loads just the overrides as in (2).
# This option has not effect, if create is equal to false.
append: true
flink-conf.yaml: |+
# Flink Config Overrides
kubernetes.operator.metrics.reporter.slf4j.factory.class: org.apache.flink.metrics.slf4j.Slf4jReporterFactory
kubernetes.operator.metrics.reporter.slf4j.interval: 5 MINUTE
kubernetes.operator.reconcile.interval: 15 s
kubernetes.operator.observer.progress-check.interval: 5 s
# 强烈建议在生产上开启此配置
kubernetes.operator.leader-election.enabled: true
kubernetes.operator.leader-election.lease-name: flink-operator-lease
log4j-operator.properties: |+
# Flink Operator Logging Overrides
# rootLogger.level = DEBUG
# logger.operator.name= org.apache.flink.kubernetes.operator
# logger.operator.level = DEBUG
log4j-console.properties: |+
# Flink Deployment Logging Overrides
# rootLogger.level = DEBUG
# (Optional) Exposes metrics port on the container if defined
metrics:
port:
nameOverride: ""
fullnameOverride: ""
# Set the jvm start up options for webhook and operator
jvmArgs:
webhook: ""
operator: ""
# 这个配置我没有用到
#operatorHealth:
# port: 8085
# livenessProbe:
# periodSeconds: 10
# initialDelaySeconds: 30
# startupProbe:
# failureThreshold: 1
# periodSeconds: 1
2. 创建flink k8s operator的RBAC权限账户和角色
命名规则是namespace-roleName/saName-component
---
#
apiVersion: v1
kind: ServiceAccount
metadata:
name: fuyiqi-flink-operator-sa
namespace: fuyiqi
labels:
app.kubernetes.io/name: flink-kubernetes-operator
app.kubernetes.io/version: "1.5.0"
app.kubernetes.io/managed-by: Helm
helm.sh/chart: flink-kubernetes-operator-1.5.0
---
#
apiVersion: v1
kind: ServiceAccount
metadata:
name: fuyiqi-flink-sa
namespace: fuyiqi
labels:
app.kubernetes.io/name: flink-kubernetes-operator
app.kubernetes.io/version: "1.5.0"
app.kubernetes.io/managed-by: Helm
helm.sh/chart: flink-kubernetes-operator-1.5.0
annotations:
helm.sh/resource-policy: keep
---
#
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: fuyiqi-flink-operator-role
namespace: fuyiqi
labels:
app.kubernetes.io/name: flink-kubernetes-operator
app.kubernetes.io/version: "1.5.0"
app.kubernetes.io/managed-by: Helm
helm.sh/chart: flink-kubernetes-operator-1.5.0
rules:
- apiGroups:
- ""
resources:
- pods
- services
- events
- configmaps
- secrets
verbs:
- "*"
- apiGroups:
- apps
resources:
- deployments
- deployments/finalizers
- replicasets
verbs:
- "*"
- apiGroups:
- extensions
resources:
- deployments
- ingresses
verbs:
- "*"
- apiGroups:
- flink.apache.org
resources:
- flinkdeployments
- flinkdeployments/status
- flinksessionjobs
- flinksessionjobs/status
verbs:
- "*"
- apiGroups:
- networking.k8s.io
resources:
- ingresses
verbs:
- "*"
- apiGroups:
- coordination.k8s.io
resources:
- leases
verbs:
- "*"
---
#
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: fuyiqi-flink-role
namespace: fuyiqi
labels:
app.kubernetes.io/name: flink-kubernetes-operator
app.kubernetes.io/version: "1.5.0"
app.kubernetes.io/managed-by: Helm
helm.sh/chart: flink-kubernetes-operator-1.5.0
annotations:
"helm.sh/resource-policy": keep
rules:
- apiGroups:
- ""
resources:
- pods
- configmaps
verbs:
- '*'
- apiGroups:
- apps
resources:
- deployments
- deployments/finalizers
verbs:
- '*'
---
#
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: fuyiqi-flink-operator-role-binding
namespace: fuyiqi
labels:
app.kubernetes.io/name: flink-kubernetes-operator
app.kubernetes.io/version: "1.5.0"
app.kubernetes.io/managed-by: Helm
helm.sh/chart: flink-kubernetes-operator-1.5.0
roleRef:
kind: Role
name: fuyiqi-flink-operator-role
apiGroup: rbac.authorization.k8s.io
subjects:
- kind: ServiceAccount
name: fuyiqi-flink-operator-sa
namespace: fuyiqi
---
#
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: fuyiqi-flink-role-binding
namespace: fuyiqi
labels:
app.kubernetes.io/name: flink-kubernetes-operator
app.kubernetes.io/version: "1.5.0"
app.kubernetes.io/managed-by: Helm
helm.sh/chart: flink-kubernetes-operator-1.5.0
annotations:
"helm.sh/resource-policy": keep
roleRef:
kind: Role
name: fuyiqi-flink-role
apiGroup: rbac.authorization.k8s.io
subjects:
- kind: ServiceAccount
name: fuyiqi-flink-sa
namespace: fuyiqi