Add flink k8s mode
This commit is contained in:
		
							parent
							
								
									11fffa6039
								
							
						
					
					
						commit
						0b96a19526
					
				
							
								
								
									
										47
									
								
								demos/flink/Dockerfile
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										47
									
								
								demos/flink/Dockerfile
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,47 @@ | ||||
| FROM ubuntu:20.04 | ||||
| LABEL maintainer="Qi Zheng <huaiqing.zq@antgroup.com>" | ||||
| 
 | ||||
| # Install SGX DCAP and Occlum runtime | ||||
| ENV APT_KEY_DONT_WARN_ON_DANGEROUS_USAGE=1 | ||||
| ARG PSW_VERSION=2.20.100.4 | ||||
| ARG DCAP_VERSION=1.17.100.4 | ||||
| ARG OCCLUM_VERSION=0.30.1 | ||||
| RUN apt update && DEBIAN_FRONTEND="noninteractive" apt install -y --no-install-recommends gnupg wget ca-certificates jq && \ | ||||
|     echo 'deb [arch=amd64] https://download.01.org/intel-sgx/sgx_repo/ubuntu focal main' | tee /etc/apt/sources.list.d/intel-sgx.list && \ | ||||
|     wget -qO - https://download.01.org/intel-sgx/sgx_repo/ubuntu/intel-sgx-deb.key | apt-key add - && \ | ||||
|     echo 'deb [arch=amd64] https://occlum.io/occlum-package-repos/debian focal main' | tee /etc/apt/sources.list.d/occlum.list && \ | ||||
|     wget -qO - https://occlum.io/occlum-package-repos/debian/public.key | apt-key add - && \ | ||||
|     apt update && apt install -y --no-install-recommends \ | ||||
|         libsgx-launch=$PSW_VERSION-focal1 \ | ||||
|         libsgx-epid=$PSW_VERSION-focal1 \ | ||||
|         libsgx-quote-ex=$PSW_VERSION-focal1 \ | ||||
|         libsgx-urts=$PSW_VERSION-focal1 \ | ||||
|         libsgx-enclave-common=$PSW_VERSION-focal1 \ | ||||
|         libsgx-uae-service=$PSW_VERSION-focal1 \ | ||||
|         libsgx-ae-pce=$PSW_VERSION-focal1 \ | ||||
|         libsgx-ae-qe3=$DCAP_VERSION-focal1 \ | ||||
|         libsgx-ae-id-enclave=$DCAP_VERSION-focal1 \ | ||||
|         libsgx-ae-qve=$DCAP_VERSION-focal1 \ | ||||
|         libsgx-dcap-ql=$DCAP_VERSION-focal1 \ | ||||
|         libsgx-pce-logic=$DCAP_VERSION-focal1 \ | ||||
|         libsgx-qe3-logic=$DCAP_VERSION-focal1 \ | ||||
|         libsgx-dcap-default-qpl=$DCAP_VERSION-focal1 \ | ||||
|         libsgx-dcap-quote-verify=$DCAP_VERSION-focal1 \ | ||||
|         occlum-runtime=$OCCLUM_VERSION-1 \ | ||||
|         gettext openjdk-11-jdk \ | ||||
|         && \ | ||||
|     apt clean && \ | ||||
|     rm -rf /var/lib/apt/lists/* | ||||
| 
 | ||||
| COPY docker-entrypoint.sh / | ||||
| 
 | ||||
| RUN mkdir -p /opt/flink | ||||
| COPY flink-1.15.2 /opt/flink | ||||
| ADD occlum_instance_k8s/occlum_instance_k8s.tar.gz /opt/flink | ||||
| 
 | ||||
| ENV FLINK_HOME=/opt/flink | ||||
| ENV JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64 | ||||
| ENV PATH="/opt/occlum/build/bin:/usr/local/occlum/bin:/opt/flink/bin:$PATH" | ||||
| 
 | ||||
| WORKDIR /opt/flink | ||||
| ENTRYPOINT ["/docker-entrypoint.sh"] | ||||
| @ -1,5 +1,8 @@ | ||||
| # Run Flink on Occlum | ||||
| 
 | ||||
| This is for how to run Flink job manager and task manager in Occlum. | ||||
| For how to start Flink K8S cluster in Occlum, please refer to [kubernetes](./kubernetes/). | ||||
| 
 | ||||
| ### Preinstall dependencies | ||||
| Related dependencies: openjdk-11 | ||||
| ``` | ||||
|  | ||||
| @ -5,6 +5,7 @@ BLUE='\033[1;34m' | ||||
| NC='\033[0m' | ||||
| 
 | ||||
| RPC_BIND_PORT=8089 | ||||
| OCCLUM_USER_SPACE_SIZE=8GB | ||||
| 
 | ||||
| build_instance() { | ||||
|     postfix=$1 | ||||
| @ -12,7 +13,7 @@ build_instance() { | ||||
|     occlum new occlum_instance_$postfix | ||||
|     cd occlum_instance_$postfix | ||||
|     new_json="$(jq '.resource_limits.user_space_size = "1MB" | | ||||
|         .resource_limits.user_space_max_size = "8GB" | | ||||
|         .resource_limits.user_space_max_size = "OCCLUM_USER_SPACE_SIZE" | | ||||
|         .resource_limits.kernel_space_heap_size="1MB" | | ||||
|         .resource_limits.kernel_space_heap_max_size="256MB" | | ||||
|         .resource_limits.max_num_of_threads = 256 | | ||||
| @ -27,7 +28,32 @@ build_instance() { | ||||
|     # Copy JVM and class file into Occlum instance and build | ||||
|     rm -rf image | ||||
|     copy_bom -f ../flink.yaml --root image --include-dir /opt/occlum/etc/template | ||||
| 
 | ||||
|     # Use hostfs for flink conf in k8s mode | ||||
|     if [ "$postfix" == "k8s" ]; then | ||||
|         # Increase user space size for k8s mode | ||||
|         OCCLUM_USER_SPACE_SIZE=16GB | ||||
| 
 | ||||
|         rm -rf image/opt/flink*/conf/* | ||||
|         new_json="$(cat Occlum.json | jq '.mount+=[{"target": "/opt/flink/conf", "type": "hostfs","source": "/opt/flink/conf-copy"}]')" && \ | ||||
|         echo "${new_json}" > Occlum.json | ||||
| 
 | ||||
|         # use host secrets | ||||
|         mkdir -p image/var/run/secrets | ||||
|         new_json="$(cat Occlum.json | jq '.mount+=[{"target": "/var/run/secrets", "type": "hostfs","source": "/var/run/secrets-copy"}]')" && \ | ||||
|         echo "${new_json}" > Occlum.json | ||||
| 
 | ||||
|         # k8s pod template | ||||
|         mkdir -p image/opt/flink/pod-template | ||||
|         new_json="$(cat Occlum.json | jq '.mount+=[{"target": "/opt/flink/pod-template", "type": "hostfs","source": "/opt/flink/pod-template-copy"}]')" && \ | ||||
|         echo "${new_json}" > Occlum.json | ||||
|     fi | ||||
| 
 | ||||
|     # Update user size | ||||
|     sed -i "s/OCCLUM_USER_SPACE_SIZE/$OCCLUM_USER_SPACE_SIZE/g" Occlum.json | ||||
| 
 | ||||
|     occlum build | ||||
|     occlum package --debug | ||||
|     cd .. | ||||
| } | ||||
| 
 | ||||
| @ -35,7 +61,13 @@ update_flink_conf() { | ||||
|     echo "rest.port: $RPC_BIND_PORT" >> flink-1.15.2/conf/flink-conf.yaml | ||||
| } | ||||
| 
 | ||||
| update_flink_conf | ||||
| build_instance jobmanager | ||||
| # flink job manager and taks manager use the same occlum instance | ||||
| cp -rf occlum_instance_jobmanager occlum_instance_taskmanager | ||||
| 
 | ||||
| if [ "$1" == "k8s" ]; then | ||||
|     echo "do occlum instance build for k8s mode" | ||||
|     build_instance k8s | ||||
| else | ||||
|     update_flink_conf | ||||
|     build_instance jobmanager | ||||
|     # flink job manager and taks manager use the same occlum instance | ||||
|     cp -rf occlum_instance_jobmanager occlum_instance_taskmanager | ||||
| fi | ||||
|  | ||||
							
								
								
									
										154
									
								
								demos/flink/docker-entrypoint.sh
									
									
									
									
									
										Executable file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										154
									
								
								demos/flink/docker-entrypoint.sh
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,154 @@ | ||||
| #!/usr/bin/env bash | ||||
| 
 | ||||
| ############################################################################### | ||||
| #  Licensed to the Apache Software Foundation (ASF) under one | ||||
| #  or more contributor license agreements.  See the NOTICE file | ||||
| #  distributed with this work for additional information | ||||
| #  regarding copyright ownership.  The ASF licenses this file | ||||
| #  to you under the Apache License, Version 2.0 (the | ||||
| #  "License"); you may not use this file except in compliance | ||||
| #  with the License.  You may obtain a copy of the License at | ||||
| # | ||||
| #      http://www.apache.org/licenses/LICENSE-2.0 | ||||
| # | ||||
| #  Unless required by applicable law or agreed to in writing, software | ||||
| #  distributed under the License is distributed on an "AS IS" BASIS, | ||||
| #  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| #  See the License for the specific language governing permissions and | ||||
| # limitations under the License. | ||||
| ############################################################################### | ||||
| 
 | ||||
| COMMAND_STANDALONE="standalone-job" | ||||
| COMMAND_HISTORY_SERVER="history-server" | ||||
| 
 | ||||
| # If unspecified, the hostname of the container is taken as the JobManager address | ||||
| JOB_MANAGER_RPC_ADDRESS=${JOB_MANAGER_RPC_ADDRESS:-$(hostname -f)} | ||||
| CONF_FILE="${FLINK_HOME}/conf/flink-conf.yaml" | ||||
| 
 | ||||
| drop_privs_cmd() { | ||||
|     if [ $(id -u) != 0 ]; then | ||||
|         # Don't need to drop privs if EUID != 0 | ||||
|         return | ||||
|     elif [ -x /sbin/su-exec ]; then | ||||
|         # Alpine | ||||
|         echo su-exec flink | ||||
|     else | ||||
|         # Others | ||||
|         echo gosu flink | ||||
|     fi | ||||
| } | ||||
| 
 | ||||
| copy_plugins_if_required() { | ||||
|   if [ -z "$ENABLE_BUILT_IN_PLUGINS" ]; then | ||||
|     return 0 | ||||
|   fi | ||||
| 
 | ||||
|   echo "Enabling required built-in plugins" | ||||
|   for target_plugin in $(echo "$ENABLE_BUILT_IN_PLUGINS" | tr ';' ' '); do | ||||
|     echo "Linking ${target_plugin} to plugin directory" | ||||
|     plugin_name=${target_plugin%.jar} | ||||
| 
 | ||||
|     mkdir -p "${FLINK_HOME}/plugins/${plugin_name}" | ||||
|     if [ ! -e "${FLINK_HOME}/opt/${target_plugin}" ]; then | ||||
|       echo "Plugin ${target_plugin} does not exist. Exiting." | ||||
|       exit 1 | ||||
|     else | ||||
|       ln -fs "${FLINK_HOME}/opt/${target_plugin}" "${FLINK_HOME}/plugins/${plugin_name}" | ||||
|       echo "Successfully enabled ${target_plugin}" | ||||
|     fi | ||||
|   done | ||||
| } | ||||
| 
 | ||||
| set_config_option() { | ||||
|   local option=$1 | ||||
|   local value=$2 | ||||
| 
 | ||||
|   # escape periods for usage in regular expressions | ||||
|   local escaped_option=$(echo ${option} | sed -e "s/\./\\\./g") | ||||
| 
 | ||||
|   # either override an existing entry, or append a new one | ||||
|   if grep -E "^${escaped_option}:.*" "${CONF_FILE}" > /dev/null; then | ||||
|         sed -i -e "s/${escaped_option}:.*/$option: $value/g" "${CONF_FILE}" | ||||
|   else | ||||
|         echo "${option}: ${value}" >> "${CONF_FILE}" | ||||
|   fi | ||||
| } | ||||
| 
 | ||||
| prepare_configuration() { | ||||
|     set_config_option jobmanager.rpc.address ${JOB_MANAGER_RPC_ADDRESS} | ||||
|     set_config_option blob.server.port 6124 | ||||
|     set_config_option query.server.port 6125 | ||||
| 
 | ||||
|     if [ -n "${TASK_MANAGER_NUMBER_OF_TASK_SLOTS}" ]; then | ||||
|         set_config_option taskmanager.numberOfTaskSlots ${TASK_MANAGER_NUMBER_OF_TASK_SLOTS} | ||||
|     fi | ||||
| 
 | ||||
|     if [ -n "${FLINK_PROPERTIES}" ]; then | ||||
|         echo "${FLINK_PROPERTIES}" >> "${CONF_FILE}" | ||||
|     fi | ||||
|     envsubst < "${CONF_FILE}" > "${CONF_FILE}.tmp" && mv "${CONF_FILE}.tmp" "${CONF_FILE}" | ||||
| } | ||||
| 
 | ||||
| maybe_enable_jemalloc() { | ||||
|     if [ "${DISABLE_JEMALLOC:-false}" == "false" ]; then | ||||
|         JEMALLOC_PATH="/usr/lib/$(uname -m)-linux-gnu/libjemalloc.so" | ||||
|         JEMALLOC_FALLBACK="/usr/lib/x86_64-linux-gnu/libjemalloc.so" | ||||
|         if [ -f "$JEMALLOC_PATH" ]; then | ||||
|             export LD_PRELOAD=$LD_PRELOAD:$JEMALLOC_PATH | ||||
|         elif [ -f "$JEMALLOC_FALLBACK" ]; then | ||||
|             export LD_PRELOAD=$LD_PRELOAD:$JEMALLOC_FALLBACK | ||||
|         else | ||||
|             if [ "$JEMALLOC_PATH" = "$JEMALLOC_FALLBACK" ]; then | ||||
|                 MSG_PATH=$JEMALLOC_PATH | ||||
|             else | ||||
|                 MSG_PATH="$JEMALLOC_PATH and $JEMALLOC_FALLBACK" | ||||
|             fi | ||||
|             echo "WARNING: attempted to load jemalloc from $MSG_PATH but the library couldn't be found. glibc will be used instead." | ||||
|         fi | ||||
|     fi | ||||
| } | ||||
| 
 | ||||
| maybe_enable_jemalloc | ||||
| 
 | ||||
| copy_plugins_if_required | ||||
| 
 | ||||
| prepare_configuration | ||||
| 
 | ||||
| args=("$@") | ||||
| if [ "$1" = "help" ]; then | ||||
|     printf "Usage: $(basename "$0") (jobmanager|${COMMAND_STANDALONE}|taskmanager|${COMMAND_HISTORY_SERVER})\n" | ||||
|     printf "    Or $(basename "$0") help\n\n" | ||||
|     printf "By default, Flink image adopts jemalloc as default memory allocator. This behavior can be disabled by setting the 'DISABLE_JEMALLOC' environment variable to 'true'.\n" | ||||
|     exit 0 | ||||
| elif [ "$1" = "jobmanager" ]; then | ||||
|     args=("${args[@]:1}") | ||||
| 
 | ||||
|     echo "Starting Job Manager" | ||||
| 
 | ||||
|     exec $(drop_privs_cmd) "$FLINK_HOME/bin/jobmanager.sh" start-foreground "${args[@]}" | ||||
| elif [ "$1" = ${COMMAND_STANDALONE} ]; then | ||||
|     args=("${args[@]:1}") | ||||
| 
 | ||||
|     echo "Starting Job Manager" | ||||
| 
 | ||||
|     exec $(drop_privs_cmd) "$FLINK_HOME/bin/standalone-job.sh" start-foreground "${args[@]}" | ||||
| elif [ "$1" = ${COMMAND_HISTORY_SERVER} ]; then | ||||
|     args=("${args[@]:1}") | ||||
| 
 | ||||
|     echo "Starting History Server" | ||||
| 
 | ||||
|     exec $(drop_privs_cmd) "$FLINK_HOME/bin/historyserver.sh" start-foreground "${args[@]}" | ||||
| elif [ "$1" = "taskmanager" ]; then | ||||
|     args=("${args[@]:1}") | ||||
| 
 | ||||
|     echo "Starting Task Manager" | ||||
| 
 | ||||
|     exec $(drop_privs_cmd) "$FLINK_HOME/bin/taskmanager.sh" start-foreground "${args[@]}" | ||||
| fi | ||||
| 
 | ||||
| args=("${args[@]}") | ||||
| 
 | ||||
| # Running command in pass-through mode | ||||
| # exec $(drop_privs_cmd) "${args[@]}" | ||||
| # Do not run with flink user to avoid permission issue in Occlum hostfs mount | ||||
| exec "${args[@]}" | ||||
							
								
								
									
										103
									
								
								demos/flink/kubernetes/README.md
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										103
									
								
								demos/flink/kubernetes/README.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,103 @@ | ||||
| # Deploy Flink in K8S | ||||
| 
 | ||||
| There are several ways to deploy Flink on Kubernetes, such as [native kubernetes deployment](https://nightlies.apache.org/flink/flink-docs-release-1.19/zh/docs/deployment/resource-providers/native_kubernetes/) and [Flink Kubernetes Operator](https://nightlies.apache.org/flink/flink-kubernetes-operator-docs-release-1.8/). This tutorial shows how to use the kubernetes operator deployment. | ||||
| 
 | ||||
| ## Prerequisites | ||||
| 
 | ||||
| * A Kubernetes cluster with at least one node. | ||||
| * The `kubectl` command line tool is installed and configured to connect to your Kubernetes cluster. | ||||
| * The `helm` command line tool is also installed and configured to connect to your Kubernetes cluster. | ||||
| 
 | ||||
| ### Install the Flink Kubernetes Operator | ||||
| 
 | ||||
| Just follow the [quick start](https://nightlies.apache.org/flink/flink-kubernetes-operator-docs-release-1.8/docs/try-flink-kubernetes-operator/quick-start/) to install the Flink Kubernetes Operator. | ||||
| 
 | ||||
| ## Build Flink K8S docker image | ||||
| 
 | ||||
| First, please make sure `docker` is installed successfully in your host. Then start the Occlum container (use version `latest-ubuntu20.04` for example) as below. | ||||
| ``` | ||||
| $ sudo docker run --rm -itd --network host \ | ||||
|         -v $(which docker):/usr/bin/docker -v /var/run/docker.sock:/var/run/docker.sock \ | ||||
|         occlum/occlum:latest-ubuntu20.04 | ||||
| ``` | ||||
| 
 | ||||
| All the following are running in the above container. | ||||
| 
 | ||||
| ### Build | ||||
| 
 | ||||
| Just run the script [build.sh](./build.sh). It builds a docker image for Flink K8S. | ||||
| ```bash | ||||
| Build Occlum Flink container images for k8s deployment. | ||||
| usage: build.sh [OPTION]... | ||||
|     -r <container image registry> the container image registry | ||||
|     -g <tag> container image tag | ||||
|     -h <usage> usage help | ||||
| ``` | ||||
| For example, if you want to build the image named `demo/occlum-flink:0.1`, just run | ||||
| ```bash | ||||
| $ ./build.sh -r demo -g 0.1 | ||||
| ``` | ||||
| 
 | ||||
| Notice, during the build process, a customized [flink-console.sh](./flink-console.sh) is used to replace the original one. Users could refer to the script for details. | ||||
| 
 | ||||
| Once the build is done, you can push the image for next steps -- [Deploy](#deploy). | ||||
| 
 | ||||
| ## Deploy | ||||
| 
 | ||||
| Based on the original yaml files in the [github](https://github.com/apache/flink-kubernetes-operator/tree/release-1.8/examples), below customized example yaml files are provided. | ||||
| 
 | ||||
| * [basic.yaml](./basic.yaml) | ||||
| * [basic-session-deployment-and-job.yaml](./basic-session-deployment-and-job.yaml) | ||||
| * [basic-session-deployment-only. yaml](./basic-session-deployment-only.yaml) | ||||
| * [basic-session-job-only.yaml](./basic-session-job-only.yaml) | ||||
| 
 | ||||
| They have the same meaning just like their original counterparts besides some SGX/Occlum related customization settings. | ||||
| You can deploy each of them. | ||||
| Just notice the **image** in the yaml file should be the one you built before. | ||||
| 
 | ||||
| ### Examples | ||||
| 
 | ||||
| #### Basic Application Deployment example | ||||
| 
 | ||||
| This is a simple deployment defined by a minimal deployment file. | ||||
| The configuration contains the following: | ||||
| - Defines the job to run | ||||
| - Assigns the resources available for the job | ||||
| - Defines the parallelism used | ||||
| 
 | ||||
| To run the job submit the yaml file using kubectl: | ||||
| ```bash | ||||
| kubectl apply -f basic.yaml | ||||
| ``` | ||||
| 
 | ||||
| #### Basic Session Deployment example | ||||
| 
 | ||||
| This example shows how to create a basic Session Cluster and then how to submit specific jobs to this cluster if needed. | ||||
| 
 | ||||
| ##### Without jobs  | ||||
| 
 | ||||
| The Flink Deployment could be created without any jobs. | ||||
| In this case the Flink jobs could be created later by submitting the jobs | ||||
| separately. | ||||
| 
 | ||||
| To create a Flink Deployment with the specific resources without any jobs run the following command: | ||||
| ```bash | ||||
| kubectl apply -f basic-session-deployment-only.yaml | ||||
| ``` | ||||
| 
 | ||||
| ##### Adding jobs | ||||
| 
 | ||||
| If the Flink Deployment is created by `basic-session-deployment-only.yaml` new job could be added | ||||
| by the following command: | ||||
| ```bash | ||||
| kubectl apply -f basic-session-job-only.yaml | ||||
| ``` | ||||
| 
 | ||||
| ##### Creating Deployment and Jobs together | ||||
| 
 | ||||
| Alternatively the Flink Deployment and the Flink Session Job configurations can be submitted together. | ||||
| 
 | ||||
| To try out this run the following command: | ||||
| ```bash | ||||
| kubectl apply -f basic-session-deployment-and-job.yaml | ||||
| ``` | ||||
							
								
								
									
										83
									
								
								demos/flink/kubernetes/basic-session-deployment-and-job.yaml
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										83
									
								
								demos/flink/kubernetes/basic-session-deployment-and-job.yaml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,83 @@ | ||||
| ################################################################################ | ||||
| #  Licensed to the Apache Software Foundation (ASF) under one | ||||
| #  or more contributor license agreements.  See the NOTICE file | ||||
| #  distributed with this work for additional information | ||||
| #  regarding copyright ownership.  The ASF licenses this file | ||||
| #  to you under the Apache License, Version 2.0 (the | ||||
| #  "License"); you may not use this file except in compliance | ||||
| #  with the License.  You may obtain a copy of the License at | ||||
| # | ||||
| #      http://www.apache.org/licenses/LICENSE-2.0 | ||||
| # | ||||
| #  Unless required by applicable law or agreed to in writing, software | ||||
| #  distributed under the License is distributed on an "AS IS" BASIS, | ||||
| #  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| #  See the License for the specific language governing permissions and | ||||
| # limitations under the License. | ||||
| ################################################################################ | ||||
| 
 | ||||
| apiVersion: flink.apache.org/v1beta1 | ||||
| kind: FlinkDeployment | ||||
| metadata: | ||||
|   name: basic-session-deployment-example | ||||
| spec: | ||||
|   image: occlum_flink:0.1 | ||||
|   flinkVersion: v1_15 | ||||
|   jobManager: | ||||
|     resource: | ||||
|       memory: "2048m" | ||||
|       cpu: 1 | ||||
|   taskManager: | ||||
|     resource: | ||||
|       memory: "2048m" | ||||
|       cpu: 1 | ||||
|   serviceAccount: flink | ||||
|   podTemplate: | ||||
|     spec: | ||||
|       containers: | ||||
|         - name: flink-main-container | ||||
|           volumeMounts: | ||||
|           - name: device-plugin | ||||
|             mountPath: /var/lib/kubelet/device-plugins | ||||
|           resources: | ||||
|             requests: | ||||
|               sgx.intel.com/epc: 21474836480 | ||||
|               sgx.intel.com/enclave: 1 | ||||
|               sgx.intel.com/provision: 1 | ||||
|             limits: | ||||
|               sgx.intel.com/epc: 21474836480 | ||||
|               sgx.intel.com/enclave: 1 | ||||
|               sgx.intel.com/provision: 1 | ||||
|           # env: | ||||
|           # - name: OCCLUM_LOG_LEVEL | ||||
|           #   value: "off" | ||||
|       volumes: | ||||
|         - name: device-plugin | ||||
|           hostPath: | ||||
|             path: /var/lib/kubelet/device-plugins | ||||
| 
 | ||||
| 
 | ||||
| --- | ||||
| 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: 2 | ||||
|     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 | ||||
							
								
								
									
										59
									
								
								demos/flink/kubernetes/basic-session-deployment-only.yaml
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										59
									
								
								demos/flink/kubernetes/basic-session-deployment-only.yaml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,59 @@ | ||||
| ################################################################################ | ||||
| #  Licensed to the Apache Software Foundation (ASF) under one | ||||
| #  or more contributor license agreements.  See the NOTICE file | ||||
| #  distributed with this work for additional information | ||||
| #  regarding copyright ownership.  The ASF licenses this file | ||||
| #  to you under the Apache License, Version 2.0 (the | ||||
| #  "License"); you may not use this file except in compliance | ||||
| #  with the License.  You may obtain a copy of the License at | ||||
| # | ||||
| #      http://www.apache.org/licenses/LICENSE-2.0 | ||||
| # | ||||
| #  Unless required by applicable law or agreed to in writing, software | ||||
| #  distributed under the License is distributed on an "AS IS" BASIS, | ||||
| #  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| #  See the License for the specific language governing permissions and | ||||
| # limitations under the License. | ||||
| ################################################################################ | ||||
| 
 | ||||
| apiVersion: flink.apache.org/v1beta1 | ||||
| kind: FlinkDeployment | ||||
| metadata: | ||||
|   name: basic-session-deployment-only-example | ||||
| spec: | ||||
|   image: occlum_flink:0.1 | ||||
|   flinkVersion: v1_15 | ||||
|   flinkConfiguration: | ||||
|     taskmanager.numberOfTaskSlots: "2" | ||||
|   serviceAccount: flink | ||||
|   jobManager: | ||||
|     resource: | ||||
|       memory: "2048m" | ||||
|       cpu: 1 | ||||
|   taskManager: | ||||
|     resource: | ||||
|       memory: "2048m" | ||||
|       cpu: 1 | ||||
|   podTemplate: | ||||
|     spec: | ||||
|       containers: | ||||
|         - name: flink-main-container | ||||
|           volumeMounts: | ||||
|           - name: device-plugin | ||||
|             mountPath: /var/lib/kubelet/device-plugins | ||||
|           resources: | ||||
|             requests: | ||||
|               sgx.intel.com/epc: 21474836480 | ||||
|               sgx.intel.com/enclave: 1 | ||||
|               sgx.intel.com/provision: 1 | ||||
|             limits: | ||||
|               sgx.intel.com/epc: 21474836480 | ||||
|               sgx.intel.com/enclave: 1 | ||||
|               sgx.intel.com/provision: 1 | ||||
|           # env: | ||||
|           # - name: OCCLUM_LOG_LEVEL | ||||
|           #   value: "off" | ||||
|       volumes: | ||||
|         - name: device-plugin | ||||
|           hostPath: | ||||
|             path: /var/lib/kubelet/device-plugins | ||||
							
								
								
									
										28
									
								
								demos/flink/kubernetes/basic-session-job-only.yaml
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										28
									
								
								demos/flink/kubernetes/basic-session-job-only.yaml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,28 @@ | ||||
| ################################################################################ | ||||
| #  Licensed to the Apache Software Foundation (ASF) under one | ||||
| #  or more contributor license agreements.  See the NOTICE file | ||||
| #  distributed with this work for additional information | ||||
| #  regarding copyright ownership.  The ASF licenses this file | ||||
| #  to you under the Apache License, Version 2.0 (the | ||||
| #  "License"); you may not use this file except in compliance | ||||
| #  with the License.  You may obtain a copy of the License at | ||||
| # | ||||
| #      http://www.apache.org/licenses/LICENSE-2.0 | ||||
| # | ||||
| #  Unless required by applicable law or agreed to in writing, software | ||||
| #  distributed under the License is distributed on an "AS IS" BASIS, | ||||
| #  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| #  See the License for the specific language governing permissions and | ||||
| # limitations under the License. | ||||
| ################################################################################ | ||||
| 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 | ||||
| 
 | ||||
							
								
								
									
										79
									
								
								demos/flink/kubernetes/basic.yaml
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										79
									
								
								demos/flink/kubernetes/basic.yaml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,79 @@ | ||||
| ################################################################################ | ||||
| #  Licensed to the Apache Software Foundation (ASF) under one | ||||
| #  or more contributor license agreements.  See the NOTICE file | ||||
| #  distributed with this work for additional information | ||||
| #  regarding copyright ownership.  The ASF licenses this file | ||||
| #  to you under the Apache License, Version 2.0 (the | ||||
| #  "License"); you may not use this file except in compliance | ||||
| #  with the License.  You may obtain a copy of the License at | ||||
| # | ||||
| #      http://www.apache.org/licenses/LICENSE-2.0 | ||||
| # | ||||
| #  Unless required by applicable law or agreed to in writing, software | ||||
| #  distributed under the License is distributed on an "AS IS" BASIS, | ||||
| #  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| #  See the License for the specific language governing permissions and | ||||
| # limitations under the License. | ||||
| ################################################################################ | ||||
| 
 | ||||
| apiVersion: flink.apache.org/v1beta1 | ||||
| kind: FlinkDeployment | ||||
| metadata: | ||||
|   name: basic-example | ||||
| spec: | ||||
|   image: occlum_flink:0.1 | ||||
|   flinkVersion: v1_15 | ||||
|   flinkConfiguration: | ||||
|     taskmanager.numberOfTaskSlots: "2" | ||||
|   serviceAccount: flink | ||||
|   jobManager: | ||||
|     resource: | ||||
|       memory: "2048m" | ||||
|       cpu: 1 | ||||
|     # podTemplate: | ||||
|     #   spec: | ||||
|     #     containers: | ||||
|     #       # Do not change the main container name | ||||
|     #       - name: flink-main-container | ||||
|     #         args: | ||||
|     #         - bash | ||||
|     #         - -c | ||||
|     #         - 'kubernetes-jobmanager.sh kubernetes-application ' | ||||
|   taskManager: | ||||
|     resource: | ||||
|       memory: "2048m" | ||||
|       cpu: 2 | ||||
|     podTemplate: | ||||
|       spec: | ||||
|         containers: | ||||
|           - name: flink-main-container | ||||
|             env: | ||||
|             - name: OCCLUM_LOG_LEVEL | ||||
|               value: "off" | ||||
|   job: | ||||
|     jarURI: local:///opt/flink/examples/streaming/StateMachineExample.jar | ||||
|     parallelism: 2 | ||||
|     upgradeMode: stateless | ||||
|   podTemplate: | ||||
|     spec: | ||||
|       containers: | ||||
|         - name: flink-main-container | ||||
|           volumeMounts: | ||||
|           - name: device-plugin | ||||
|             mountPath: /var/lib/kubelet/device-plugins | ||||
|           resources: | ||||
|             requests: | ||||
|               sgx.intel.com/epc: 21474836480 | ||||
|               sgx.intel.com/enclave: 1 | ||||
|               sgx.intel.com/provision: 1 | ||||
|             limits: | ||||
|               sgx.intel.com/epc: 21474836480 | ||||
|               sgx.intel.com/enclave: 1 | ||||
|               sgx.intel.com/provision: 1 | ||||
|           # env: | ||||
|           # - name: OCCLUM_LOG_LEVEL | ||||
|           #   value: "off" | ||||
|       volumes: | ||||
|         - name: device-plugin | ||||
|           hostPath: | ||||
|             path: /var/lib/kubelet/device-plugins | ||||
							
								
								
									
										60
									
								
								demos/flink/kubernetes/build.sh
									
									
									
									
									
										Executable file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										60
									
								
								demos/flink/kubernetes/build.sh
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,60 @@ | ||||
| #!/bin/bash | ||||
| set -e | ||||
| 
 | ||||
| script_dir="$( cd "$( dirname "${BASH_SOURCE[0]}"  )" >/dev/null 2>&1 && pwd )" | ||||
| top_dir=$(dirname "${script_dir}") | ||||
| 
 | ||||
| registry="demo" | ||||
| tag="latest" | ||||
| 
 | ||||
| function usage { | ||||
|     cat << EOM | ||||
| Build Occlum Flink container images for k8s deployment. | ||||
| usage: $(basename "$0") [OPTION]... | ||||
|     -r <container image registry> the container image registry | ||||
|     -g <tag> container image tag | ||||
|     -h <usage> usage help | ||||
| EOM | ||||
|     exit 0 | ||||
| } | ||||
| 
 | ||||
| function process_args { | ||||
|     while getopts ":r:g:h" option; do | ||||
|         case "${option}" in | ||||
|             r) registry=${OPTARG};; | ||||
|             g) tag=${OPTARG};; | ||||
|             h) usage;; | ||||
|         esac | ||||
|     done | ||||
| } | ||||
| 
 | ||||
| process_args "$@" | ||||
| 
 | ||||
| echo "" | ||||
| echo "############################" | ||||
| echo "Build Occlum Flink container image for k8s deployment" | ||||
| echo "  Container images registry: ${registry}" | ||||
| echo "  Container images tag: ${tag}" | ||||
| echo "" | ||||
| 
 | ||||
| pushd ${top_dir} | ||||
| echo "Install openjdk 11 first ..." | ||||
| ./preinstall_deps.sh | ||||
| 
 | ||||
| echo "Download Flink ..." | ||||
| ./download_flink.sh | ||||
| cp ./kubernetes/flink-console.sh ./flink-1.15.2/bin/ | ||||
| 
 | ||||
| echo "Build Occlum instance ..." | ||||
| ./build_occlum_instance.sh k8s | ||||
| 
 | ||||
| echo "" | ||||
| echo "Build Occlum container image ..." | ||||
| 
 | ||||
| docker build \ | ||||
|     -f Dockerfile \ | ||||
|     -t ${registry}/occlum_flink:${tag} . | ||||
| 
 | ||||
| echo "Build is done" | ||||
| 
 | ||||
| popd | ||||
							
								
								
									
										126
									
								
								demos/flink/kubernetes/flink-console.sh
									
									
									
									
									
										Executable file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										126
									
								
								demos/flink/kubernetes/flink-console.sh
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,126 @@ | ||||
| #!/usr/bin/env bash | ||||
| ################################################################################ | ||||
| #  Licensed to the Apache Software Foundation (ASF) under one | ||||
| #  or more contributor license agreements.  See the NOTICE file | ||||
| #  distributed with this work for additional information | ||||
| #  regarding copyright ownership.  The ASF licenses this file | ||||
| #  to you under the Apache License, Version 2.0 (the | ||||
| #  "License"); you may not use this file except in compliance | ||||
| #  with the License.  You may obtain a copy of the License at | ||||
| # | ||||
| #      http://www.apache.org/licenses/LICENSE-2.0 | ||||
| # | ||||
| #  Unless required by applicable law or agreed to in writing, software | ||||
| #  distributed under the License is distributed on an "AS IS" BASIS, | ||||
| #  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| #  See the License for the specific language governing permissions and | ||||
| # limitations under the License. | ||||
| ################################################################################ | ||||
| 
 | ||||
| # Start a Flink service as a console application. Must be stopped with Ctrl-C | ||||
| # or with SIGTERM by kill or the controlling process. | ||||
| USAGE="Usage: flink-console.sh (taskexecutor|zookeeper|historyserver|standalonesession|standalonejob|kubernetes-session|kubernetes-application|kubernetes-taskmanager) [args]" | ||||
| 
 | ||||
| SERVICE=$1 | ||||
| ARGS=("${@:2}") # get remaining arguments as array | ||||
| 
 | ||||
| bin=`dirname "$0"` | ||||
| bin=`cd "$bin"; pwd` | ||||
| 
 | ||||
| . "$bin"/config.sh | ||||
| 
 | ||||
| case $SERVICE in | ||||
|     (taskexecutor) | ||||
|         CLASS_TO_RUN=org.apache.flink.runtime.taskexecutor.TaskManagerRunner | ||||
|     ;; | ||||
| 
 | ||||
|     (historyserver) | ||||
|         CLASS_TO_RUN=org.apache.flink.runtime.webmonitor.history.HistoryServer | ||||
|     ;; | ||||
| 
 | ||||
|     (zookeeper) | ||||
|         CLASS_TO_RUN=org.apache.flink.runtime.zookeeper.FlinkZooKeeperQuorumPeer | ||||
|     ;; | ||||
| 
 | ||||
|     (standalonesession) | ||||
|         CLASS_TO_RUN=org.apache.flink.runtime.entrypoint.StandaloneSessionClusterEntrypoint | ||||
|     ;; | ||||
| 
 | ||||
|     (standalonejob) | ||||
|         CLASS_TO_RUN=org.apache.flink.container.entrypoint.StandaloneApplicationClusterEntryPoint | ||||
|     ;; | ||||
| 
 | ||||
|     (kubernetes-session) | ||||
|         CLASS_TO_RUN=org.apache.flink.kubernetes.entrypoint.KubernetesSessionClusterEntrypoint | ||||
|     ;; | ||||
| 
 | ||||
|     (kubernetes-application) | ||||
|         CLASS_TO_RUN=org.apache.flink.kubernetes.entrypoint.KubernetesApplicationClusterEntrypoint | ||||
|     ;; | ||||
| 
 | ||||
|     (kubernetes-taskmanager) | ||||
|         CLASS_TO_RUN=org.apache.flink.kubernetes.taskmanager.KubernetesTaskExecutorRunner | ||||
|     ;; | ||||
| 
 | ||||
|     (*) | ||||
|         echo "Unknown service '${SERVICE}'. $USAGE." | ||||
|         exit 1 | ||||
|     ;; | ||||
| esac | ||||
| 
 | ||||
| FLINK_TM_CLASSPATH=`constructFlinkClassPath` | ||||
| 
 | ||||
| if [ "$FLINK_IDENT_STRING" = "" ]; then | ||||
|     FLINK_IDENT_STRING="$USER" | ||||
| fi | ||||
| 
 | ||||
| pid=$FLINK_PID_DIR/flink-$FLINK_IDENT_STRING-$SERVICE.pid | ||||
| mkdir -p "$FLINK_PID_DIR" | ||||
| # The lock needs to be released after use because this script is started foreground | ||||
| command -v flock >/dev/null 2>&1 | ||||
| flock_exist=$? | ||||
| if [[ ${flock_exist} -eq 0 ]]; then | ||||
|     exec 200<"$FLINK_PID_DIR" | ||||
|     flock 200 | ||||
| fi | ||||
| # Remove the pid file when all the processes are dead | ||||
| if [ -f "$pid" ]; then | ||||
|     all_dead=0 | ||||
|     while read each_pid; do | ||||
|         # Check whether the process is still running | ||||
|         kill -0 $each_pid > /dev/null 2>&1 | ||||
|         [[ $? -eq 0 ]] && all_dead=1 | ||||
|     done < "$pid" | ||||
|     [ ${all_dead} -eq 0 ] && rm $pid | ||||
| fi | ||||
| id=$([ -f "$pid" ] && echo $(wc -l < "$pid") || echo "0") | ||||
| 
 | ||||
| FLINK_LOG_PREFIX="${FLINK_LOG_DIR}/flink-${FLINK_IDENT_STRING}-${SERVICE}-${id}-${HOSTNAME}" | ||||
| log="${FLINK_LOG_PREFIX}.log" | ||||
| 
 | ||||
| log_setting=("-Dlog.file=${log}" "-Dlog4j.configuration=file:${FLINK_CONF_DIR}/log4j-console.properties" "-Dlog4j.configurationFile=file:${FLINK_CONF_DIR}/log4j-console.properties" "-Dlogback.configurationFile=file:${FLINK_CONF_DIR}/logback-console.xml") | ||||
| 
 | ||||
| echo "Starting $SERVICE as a console application on host $HOSTNAME." | ||||
| 
 | ||||
| # Add the current process id to pid file | ||||
| echo $$ >> "$pid" 2>/dev/null | ||||
| 
 | ||||
| # Release the lock because the java process runs in the foreground and would block other processes from modifying the pid file | ||||
| [[ ${flock_exist} -eq 0 ]] &&  flock -u 200 | ||||
| 
 | ||||
| # Evaluate user options for local variable expansion | ||||
| FLINK_ENV_JAVA_OPTS=$(eval echo ${FLINK_ENV_JAVA_OPTS}) | ||||
| 
 | ||||
| echo "################" | ||||
| set -x | ||||
| cp -rf /var/run/secrets /var/run/secrets-copy | ||||
| cp -rf conf conf-copy | ||||
| if [ -d pod-template ]; then | ||||
|     cp -rf pod-template pod-template-copy | ||||
| else | ||||
|     # create dir anyway to avoid hostfs mount error | ||||
|     mkdir -p pod-template-copy | ||||
| fi | ||||
| cd occlum_instance_k8s | ||||
| # exec "$JAVA_RUN" $JVM_ARGS ${FLINK_ENV_JAVA_OPTS} "${log_setting[@]}" -classpath "`manglePathList "$FLINK_TM_CLASSPATH:$INTERNAL_HADOOP_CLASSPATHS"`" ${CLASS_TO_RUN} "${ARGS[@]}" | ||||
| exec occlum run /usr/lib/jvm/java-11-openjdk-amd64/bin/java -Dos.name=Linux $JVM_ARGS ${FLINK_ENV_JAVA_OPTS} "${log_setting[@]}" -classpath "`manglePathList "$FLINK_TM_CLASSPATH:$INTERNAL_HADOOP_CLASSPATHS"`" ${CLASS_TO_RUN} "${ARGS[@]}" | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user