Air-Gapped Installation of Apache Spark on Kubernetes
Below is a step‐by‐step guide to installing ইলুম in an offline (air‐gapped) environment. This guide is written to be agnostic to your Kubernetes distribution and covers both approaches for managing container images—using কন্টেইনার (সঙ্গে সিটিআর টুল) বা ডকার . নির্দেশাবলী অনুমান করে যে আপনার আছে:
- প্রয়োজনীয় হেলম চার্ট এবং ধারক চিত্রগুলি ডাউনলোড করতে একটি ইন্টারনেট-সংযুক্ত ওয়ার্কস্টেশন।
- অনলাইন ওয়ার্কস্টেশন থেকে আপনার অফলাইন পরিবেশে ফাইল স্থানান্তর করার জন্য একটি পদ্ধতি (যেমন একটি USB ড্রাইভ বা অভ্যন্তরীণ ফাইল সার্ভার)।
- আপনার অফলাইন পরিবেশে একটি ওয়ার্কিং কুবারনেটস ক্লাস্টার (যে কোনও বিতরণ)।
- আপনার অফলাইন ক্লাস্টারের সাথে সংযোগ করতে হেলম ইনস্টল এবং কনফিগার করা হয়েছে।
- Sufficient Disk Space: At least 60GB free on both the download and offline machines (for handling large image tarballs).
- Recommended Resources: 12 CPU and 18GB RAM (or more depending on workload).
Architecture Overview: Spark on Kubernetes in Air-Gapped Environments
When deploying Apache Spark on Kubernetes in an air-gapped environment, the driver and executor processes run as containerized processes 100% managed within infrastructure devoid of public connectivity. All container images and dependencies, along with configuration files, are hosted internally and do not need external network access.
In this environment, we deploy Spark components as containerized applications on Kubernetes. Spark driver and executors operate as pods. Scheduling, resource allocation, and scaling are handled by Kubernetes. The setup uses native Kubernetes features like resource limits, Horizontal Pod Autoscaling, and node selectors for smooth and reliable functioning. For general details on how Ilum manages these resources, see the Architecture Overview.
একটি local image registry is a key part of this architecture. Instead of manually loading images on every node, you push them into a registry within your infrastructure. Whether using a basic deployment with নিবন্ধন:2 or a robust solution like Harbor, the registry must be backed by persistent storage to retain images after restarts. Once images are in the registry, individual nodes can pull them on demand.
Networking and security are critical. Air-gapped environments use network policies to control pod communication. These policies limit interactions to necessary components using Kubernetes' security controls (RBAC, service accounts), ensuring compliance with strict no-ingress rules.
This structure supports complex jobs including Spark Core, Spark SQL, Spark Streaming, and MLlib applications. Integrated with tools like কুবেক্টল , Helm, Prometheus, and Grafana, this setup makes deployment, monitoring, and debugging efficient even without internet access. You can run jobs via REST API বা Spark Submit once the cluster is operational.
1. Preparation and Downloads
প্রক্রিয়াটি এই পদক্ষেপগুলিতে বিভক্ত:
1.1. Download Ilum Helm Chart for Offline Use
ইলাম চার্ট একটি পাবলিক হেলম সংগ্রহস্থলের মাধ্যমে সরবরাহ করা হয়, চালান:
রেপো যোগ করুন https://charts.ilum.cloud
হেলম রেপো আপডেট
হেলম পুল ইলুম / ইলুম # (আপনি <desired_version> একটি ইলুম সংস্করণ নির্দিষ্ট করতে --সংস্করণ যুক্ত করতে পারেন)
এটি একটি ফাইল তৈরি করবে ilum-<version>.tgz .
টিপ: You can extract and modify the chart’s
মূল্যবোধ.ইয়ামলপরে যদি আপনি ইমেজ রিপোজিটরি রেফারেন্স পরিবর্তন করতে চান।
1.2. Identify and Download Required Docker Images
Below is the list of images(version 6.6.1 of ilum):
Click to view required images list
alpine/kubectl:1.34.1apache/airflow:3.0.2apache/nifi:2.5.0অ্যাপাচি / সুপারসেট: ডকারাইজbitnamilegacy/postgresql:16bitnami/git:latestকার্লচিত্র / কার্ল: 8.5.0docker.io/bitnamilegacy/minio:2025.3.12-debian-12-r0docker.io/bitnamilegacy/os-shell:11-debian-11-r72docker.io/bitnamilegacy/postgresql:16.1.0-debian-11-r25docker.io/bitnamilegacy/redis:7.0.10-debian-11-r4docker.io/ilum/mongodb:6.0.5ghcr.io/projectnessie/nessie:0.105.1গিটিইএ/গিটিইএ:১.২২.৩ilum/airflow:3.1.1ilum/core:6.6.1ইলাম / মৌচাক: 3.1.3ইলুম / কিউবি: 1.10.0-স্পার্কilum/mageai:0.9.76ইলুম/মঙ্গোডব:৬.০.৫ilum/spark:3.5.7-deltaইলাম / স্পার্ক-লঞ্চার: স্পার্ক -3.5.3ilum/sparkmagic:0.23.3ilum/streamlit-example:1.0.0ilum/superset:4.1.0.1ilum/ui:6.6.1jpgouin/openldap:2.6.9-fixminio/mc:RELEASE.2025-04-16T18-13-26Zregistry.k8s.io/git-sync/git-sync:v4.3.0trinodb/trino:477
1.3. প্রতিটি চিত্র টারবল হিসাবে সংরক্ষণ করুন
আপনি এই প্রক্রিয়াটি স্ক্রিপ্ট করতে পারেন। উদাহরণস্বরূপ, নামের একটি ফাইল তৈরি করুন pull_and_save.sh :
#!/বিন/বাশ
চিত্র=(
"alpine/kubectl:1.34.1"
"apache/airflow:3.0.2"
"apache/nifi:2.5.0"
"অ্যাপাচি / সুপারসেট: ডকারাইজ"
"bitnamilegacy/postgresql:16"
"bitnami/git:latest"
"কার্লমেজস / কার্ল: 8.5.0"
"docker.io/bitnamilegacy/minio:2025.3.12-debian-12-r0"
"docker.io/bitnamilegacy/os-shell:11-debian-11-r72"
"docker.io/bitnamilegacy/postgresql:16.1.0-debian-11-r25"
"docker.io/bitnamilegacy/redis:7.0.10-debian-11-r4"
"docker.io/ilum/mongodb:6.0.5"
"ghcr.io/projectnessie/nessie:0.105.1"
"গীতা/গীতা: ১.২২.৩"
"ilum/airflow:3.1.1"
"ilum/core:6.6.1"
"ইলাম / হাইভ: 3.1.3"
"ইলুম / কিউবি: 1.10.0-স্পার্ক"
"ilum/mageai:0.9.76"
"ইলুম / মঙ্গোডব: 6.0.5"
"ilum/spark:3.5.7-delta"
"আইএলইউএম / স্পার্ক-লঞ্চার: স্পার্ক -3.5.3"
"ilum/sparkmagic:0.23.3"
"ilum/streamlit-example:1.0.0"
"ilum/superset:4.1.0.1"
"ilum/ui:6.6.1"
"jpgouin/openldap:2.6.9-fix"
"minio/mc:RELEASE.2025-04-16T18-13-26Z"
"registry.k8s.io/git-sync/git-sync:v4.3.0"
"trinodb/trino:477"
)
"${IMAGES[@]}" এ চিত্রের জন্য; কি
প্রতিধ্বনি "$image টানা..."
ডকার টানুন "$image"
filename=$(প্রতিধ্বনি "$image" | tr '/:' '__')
প্রতিধ্বনি "$image থেকে ${filename}.tar সংরক্ষণ করা হচ্ছে ..."
ডকার "$image" সংরক্ষণ করুন -ও "${filename}.tar"
করা হয়েছে
স্ক্রিপ্ট চালান:
chmod +x pull_and_save.sh
./pull_and_save.sh
এটি একটি সেট তৈরি করে .tar আপনার চিত্রগুলি ধারণকারী ফাইলগুলি।
2. অফলাইন পরিবেশে নিদর্শনগুলি স্থানান্তর করুন
আপনার অনলাইন মেশিন থেকে অফলাইন পরিবেশে নিম্নলিখিতগুলি অনুলিপি করতে আপনার পছন্দসই পদ্ধতি (ইউএসবি ড্রাইভ, অভ্যন্তরীণ ফাইল সার্ভার, এসসিপি ইত্যাদি) ব্যবহার করুন:
- হেলম চার্ট প্যাকেজ (উদাঃ,
ilum-<version>.tgz) - সমস্ত চিত্র টারবল (উদাঃ,
apache_superset_dockerize.tar,ilum_hive_3.1.3.tar, ইত্যাদি)
3. Import Container Images (Docker & Containerd)
স্থানীয় রেজিস্ট্রি ব্যবহার করার সময়, আপনি don’t needপ্রতিটি নোডে ম্যানুয়ালি চিত্রগুলি লোড করতে। পরিবর্তে, আপনি এগুলি আপনার স্থানীয় রেজিস্ট্রিতে ধাক্কা দিতে পারেন এবং তারপরে সমস্ত নোড প্রয়োজন অনুসারে রেজিস্ট্রি থেকে চিত্রগুলি টানবে। নীচে চিত্রগুলি আপনার রেজিস্ট্রিতে ধাক্কা দেওয়ার আগে প্রস্তুত করার জন্য নির্দেশাবলী রয়েছে।
Managing Disk Space: If you are short on disk space, consider processing images sequentially (load one, push it, then delete the tarball) instead of copying all tarballs at once.
- Option A: containerd (ctr)
- Option B: Docker
3A.1. ইমেজ টারবল আমদানি করুন (এক মেশিনে)
আপনার স্থানীয় রেজিস্ট্রি অ্যাক্সেস করতে পারে এমন একটি মেশিনে টারবল (গুলি) আমদানি করুন:
Sudo CTR -n k8s.io ইমেজ import/path/to/<image_tarball>.tar
উদাহরণস্বরূপ:
sudo CTR -n k8s.io চিত্র আমদানি /opt/offline-images/ilum_hive_3.1.3.tar
3A.2. স্থানীয় রেজিস্ট্রির জন্য চিত্রটি ট্যাগ করুন
Tag the image with your local registry’s endpoint (for example, if your registry is accessible at লোকালহোস্ট:5000 ):
সুডো সিটিআর -এন k8s.io চিত্র ট্যাগ আইএলইউএম / হাইভ: 3.1.3 লোকালহোস্ট: 5000 / আইএলইউএম / হাইভ: 3.1.3
3A.3. স্থানীয় রেজিস্ট্রিতে ছবিটি পুশ করুন
ট্যাগ করা চিত্রটি পুশ করুন:
সুডো সিটিআর -এন k8s.io চিত্রগুলি ধাক্কা --প্লেইন-এইচটিটিপি লোকালহোস্ট: 5000 / আইএলইউএম / হাইভ: 3.1.3
(ব্যবহার করুন --প্লেইন-এইচটিটিপি যদি আপনার রেজিস্ট্রি টিএলএস ছাড়াই কনফিগার করা থাকে))
3B.1. ইমেজ টারবল লোড করুন (যদি প্রয়োজন হয়)
আপনি যদি ধাক্কা দেওয়ার আগে স্থানীয়ভাবে যাচাই করতে চান (ঐচ্ছিক), আপনি আপনার অ্যাডমিন মেশিনে একটি চিত্র লোড করতে পারেন:
ডকার লোড -আই / পাথ / টু / <image_tarball>.tar
উদাহরণস্বরূপ:
ডকার লোড -i / ওপিটি / অফলাইন-চিত্র / ilum_hive_3.1.3.tar
3B.2. আপনার স্থানীয় রেজিস্ট্রির জন্য চিত্রটি ট্যাগ করুন
ডকার ট্যাগ ilum/Hive:3.1.3 localhost:5000/ilum/Hive:3.1.3
3B.3. ছবিটি স্থানীয় রেজিস্ট্রিতে পুশ করুন
ডকার পুশ লোকালহোস্ট: 5000 / আইএলএম / হাইভ: 3.1.3
নোট: চিত্রগুলি একবার আপনার স্থানীয় রেজিস্ট্রিতে এলে আপনার ক্লাস্টারের প্রতিটি নোড প্রয়োজনের সময় সেগুলি স্বয়ংক্রিয়ভাবে টানতে পারে। প্রতিটি নোডে চিত্রগুলি প্রাক-লোড করার প্রয়োজন নেই।
4. Setup Local Image Registry (Preferred)
স্থানীয় রেজিস্ট্রি ব্যবহার করা অত্যন্ত সুপারিশ করা হয় কারণ এটি চিত্র পরিচালনাকে সহজ করে তোলে এবং বৃহত্তর বা গতিশীল ক্লাস্টারগুলির জন্য ভালভাবে স্কেল করে। যদিও আপনি ব্যবহার করে একটি বেসিক রেজিস্ট্রি চালাতে পারবেন নিবন্ধন:2 , যেমন শক্তিশালী বিকল্প বিবেচনা করুন বন্দর , নেক্সাস রিপোজিটরি ম্যানেজার, বা কোয়ে। উদাহরণস্বরূপ বন্দর offers role‑based access control, vulnerability scanning, image replication, and a user-friendly web UI.
গুরুত্বপূর্ণ: নিশ্চিত করুন যে আপনি যে কোনও রেজিস্ট্রি চয়ন করেছেন তা একটি সংযুক্ত স্থায়ী ভলিউম (বা স্থায়ী স্টোরেজ) দিয়ে কনফিগার করা হয়েছে। এটি গ্যারান্টি দেয় যে রেজিস্ট্রি ধারকটি পুনরায় চালু বা আপডেট করা হলেও আপনার চিত্রগুলি উপলব্ধ থাকবে।
উদাহরণ: স্থায়ী স্টোরেজ (ডকার) সহ একটি বেসিক রেজিস্ট্রি সেট আপ করা
-
রেজিস্ট্রি ডেটার জন্য একটি ডিরেক্টরি তৈরি করুন:
Create Directoryএমকেডিআইআর -পি / ওপিটি / রেজিস্ট্রি-ডেটা -
একটি ভলিউম সঙ্গে রেজিস্ট্রি ধারক চালান:
Start Registryডকার রান -ডি \
-পি 5000:5000 \
--নাম রেজিস্ট্রি \
-ভি / ওপিটি / রেজিস্ট্রি-ডেটা: / ভার / লিব / রেজিস্ট্রি \
নিবন্ধন:2
উদাহরণ: হারবার ব্যবহার করে
For a more robust solution, download Harbor’s offline installer from the হারবার গিটহাব রিলিজ পৃষ্ঠা এবং প্রদত্ত ডকুমেন্টেশন অনুসরণ করুন। হারবার আপনাকে তার ইনস্টলেশনের অংশ হিসাবে স্থায়ী স্টোরেজ (ভলিউম ব্যবহার করে) কনফিগার করতে হবে।
5. Configure Helm for Local Registry
সেটা নিশ্চিত করার জন্য ইলুম পাবলিক সংগ্রহস্থলগুলির পরিবর্তে আপনার স্থানীয় রেজিস্ট্রি থেকে চিত্রগুলি টানুন, হেলম চার্টে চিত্র সংগ্রহস্থলের রেফারেন্সগুলি আপডেট করুন। উদাহরণস্বরূপ, যদি ডিফল্ট মানগুলি থাকে:
ইলুম-কোর :
প্রতিচ্ছবি : "ilum/core:6.6.1"
এটি এতে পরিবর্তন করুন:
ইলুম-কোর :
প্রতিচ্ছবি : "localhost:5000/ilum/core:6.6.1"
You can either edit the chart’s default মূল্যবোধ.ইয়ামল অথবা একটি ওভাররাইড ফাইল সরবরাহ করুন। উদাহরণস্বরূপ, তৈরি করুন local-registry-values.yaml :
ইলুম-কোর :
প্রতিচ্ছবি : "localhost:5000/ilum/core:6.6.1"
ইলুম-ইউআই :
প্রতিচ্ছবি : "localhost:5000/ilum/ui:6.6.1"
# অন্যান্য উপাদানগুলির জন্য অনুরূপ ওভাররাইড যুক্ত করুন (উদাঃ, আইলাম / এয়ারফ্লো, আইলাম / মৌচাক ইত্যাদি)
তারপরে ব্যবহার করে ইনস্টল (বা আপগ্রেড) করুন:
Helm install ilum /path/to/ilum-<version>.tgz --namespace ilum --create-namespace -f local-registry-values.yaml
6. হেলম ব্যবহার করে ইলাম ইনস্টল করুন
নিশ্চিত করুন আপনার Kubeconfig আপনার অফলাইন ক্লাস্টারের জন্য কনফিগার করা হয়েছে, তারপরে হেলম চার্ট ইনস্টল করুন:
হেলম ইনস্টল ইলুম / পাথ / টু / আইলুম-<version>.টিজিজেড --নামস্থান ইলুম --ক্রিয়েট-নেমস্পেস
(আপনি যদি একটি ব্যবহার করেন তবে ওভাররাইড ফাইলটি অন্তর্ভুক্ত করুন))
7. যাচাই করুন এবং সমস্যা সমাধান করুন
7.1. স্থাপনা যাচাই করুন
-
হেলম রিলিজের স্থিতি পরীক্ষা করুন:
Helm Statusহেলম স্ট্যাটাস ইলুম --নামস্পেস ইলুম -
পডের তালিকা করুন:
Get PodsKubectl get pods -n ilum -
পড ইমেজ রেফারেন্সগুলি পরিদর্শন করুন:
উদাহরণস্বরূপ:
Describe PodKubectl বর্ণনা pod <pod_name> -n ilum | grep চিত্র:নিশ্চিত করুন যে চিত্রের পথগুলি আপনার স্থানীয় রেজিস্ট্রিকে উল্লেখ করে (উদাঃ,
লোকালহোস্ট:5000/ইলুম/হাইভ: 3.1.3).
7.2. সমস্যা সমাধান
Click to view troubleshooting steps
- ImagePullBackOff ত্রুটি:
যাচাই করুন যে চিত্রগুলি স্থানীয় রেজিস্ট্রিতে উপলব্ধ এবং সমস্ত নোড রেজিস্ট্রি অ্যাক্সেস করতে পারে। - রেজিস্ট্রি অ্যাক্সেস:
আপনার নোডগুলিতে কোনও প্রয়োজনীয় অনিরাপদ রেজিস্ট্রি সেটিংস (যদি এইচটিটিপি ব্যবহার করে) কনফিগার করা থাকে তা নিশ্চিত করুন। - স্থায়ী স্টোরেজ:
Confirm that the local registry’s data directory is correctly mounted so that images persist across container restarts.
Frequently Asked Questions (FAQ)
Can I run Apache Spark on Kubernetes without internet access?
Yes. By using an air-gapped installation method, all necessary dependencies (Docker images, Helm charts) are downloaded on an online machine, transferred to the offline environment, and hosted in a local registry.
Do I need a local image registry for air-gapped installation?
While you can technically load images manually onto every node using docker loadবা ctr image import, setting up a local registry (like Harbor or the basic Docker Registry) is strongly recommended. It simplifies scaling, image management, and ensures all nodes can pull images reliably.
How do I handle Spark dependencies in an offline cluster?
For Spark jobs that require external libraries (Maven/PyPI), you must pre-download these artifacts. You can either build custom Docker images containing these libraries or host a local Maven/PyPI mirror (e.g., using Sonatype Nexus or JFrog Artifactory) inside your air-gapped network.
What is the advantage of using Ilum in an air-gapped setup?
Ilum simplifies the management of Spark on Kubernetes by providing a unified control plane. In air-gapped environments, its ability to manage interactive sessions and jobs without reaching out to external cloud services makes it an ideal orchestrator for secure, on-prem data platforms.