

# Kubernetes 设置

本章介绍如何在 [Kubernetes](https://kubernetes.io)上部署Flink作业

## 安装 Kubernetes

按照 [Kubernetes’ setup guide](https://kubernetes.io/docs/setup/) 来部署kubernetes集群，如果需要在本地运行Kubernetes，建议使用 [MiniKube](https://kubernetes.io/docs/setup/minikube/).

**注意:** 如果使用MiniKube，请确保在部署前执行 `minikube ssh 'sudo ip link set docker0 promisc on'` 命令，窦泽，Flink组件无法通过Kubernetes服务来引用自己

## Kubernetes上的Flink集群

Flink会话群集作为长期运行的Kubernetes部署而执行， 所以可以在集群中运行多个Flink作业，集群部署后，需要把任务逐个提交到集群。

在Kubernetes上部署的Flink会话通常有三个组件:

*   部署/作业运行JobManager
*   部署TaskManagers池
*   提供 JobManager’的 REST的 UI服务和端口

### 在Kubernetes上部署Flink会话集群

使用 `kubectl` 命令来定义 [session cluster](#session-cluster-resource-definitions)的资源 :

```
kubectl create -f jobmanager-service.yaml
kubectl create -f jobmanager-deployment.yaml
kubectl create -f taskmanager-deployment.yaml 
```

可以通过 `kubectl proxy` 来访问Flink UI:

1.  在终端执行`kubectl proxy` 命令
2.  在浏览器中输入 [http://localhost:8001/api/v1/namespaces/default/services/flink-jobmanager:ui/proxy](http://localhost:8001/api/v1/namespaces/default/services/flink-jobmanager:ui/proxy) 即可访问

需要停止Flink集群，使用 `kubectl`:

```
kubectl delete -f jobmanager-deployment.yaml
kubectl delete -f taskmanager-deployment.yaml
kubectl delete -f jobmanager-service.yaml 
```

## Kubernetes上的Flink集群

Flink作业集群是运行单个作业的专用集群。是镜像的一部分，所以不需要额外的工作

### 创建专用作业的镜像

Flink作业集群映像需要包含启动集群的作业的用户代码jar，因此，需要为每个作业构建专用的镜像。按照 [说明](https://github.com/apache/flink/blob/release-1.7/flink-container/docker/README.md) 来构建Docker镜像

### 在Kubernetes上部署Flink作业集群

在Kubernetes上部署作业集群，请参阅 [instructions](https://github.com/apache/flink/blob/release-1.7/flink-container/kubernetes/README.md#deploy-flink-job-cluster).

## 集群的高级部署

GitHub 上提供了早期版本的[Flink Helm chart](https://github.com/docker-flink/examples) 。

## 附录

### 会话集群的资源文件

在 [on Docker Hub](https://hub.docker.com/r/_/flink/)上可以通过 `flink:latest`标签来找到已经构建好的镜像，镜像是从 [Github repository](https://github.com/docker-flink/docker-flink)这里构建的。

`jobmanager-deployment.yaml`



```
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: flink-jobmanager
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: flink
        component: jobmanager
    spec:
      containers:
      - name: jobmanager
        image: flink:latest
        args:
        - jobmanager
        ports:
        - containerPort: 6123
          name: rpc
        - containerPort: 6124
          name: blob
        - containerPort: 6125
          name: query
        - containerPort: 8081
          name: ui
        env:
        - name: JOB_MANAGER_RPC_ADDRESS
          value: flink-jobmanager
```



`taskmanager-deployment.yaml`



```
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: flink-taskmanager
spec:
  replicas: 2
  template:
    metadata:
      labels:
        app: flink
        component: taskmanager
    spec:
      containers:
      - name: taskmanager
        image: flink:latest
        args:
        - taskmanager
        ports:
        - containerPort: 6121
          name: data
        - containerPort: 6122
          name: rpc
        - containerPort: 6125
          name: query
        env:
        - name: JOB_MANAGER_RPC_ADDRESS
          value: flink-jobmanager
```



`jobmanager-service.yaml`



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



