Pendahuluan
MongoDB adalah program database NoSQL berbasis dokumen untuk tujuan umum. Seperti halnya sistem manajemen basis data non-relasional lainnya, MongoDB berfokus pada skalabilitas dan kecepatan kueri.
Kubernetes bersinergi dengan MongoDB untuk membuat penerapan basis data yang sangat skalabel dan portabel. Penerapan ini berguna untuk bekerja dengan sejumlah besar data dan beban tinggi.
Tutorial ini akan mengajari Anda cara men-deploy MongoDB di Kubernetes. Panduan ini mencakup langkah-langkah untuk menjalankan instance MongoDB mandiri dan set replika.
Persyaratan
- Kluster Kubernetes dengan kubectl.
- Akses administratif ke sistem Anda.
Menerapkan Instans MongoDB Mandiri
MongoDB dapat di-deploy di Kubernetes sebagai instance mandiri. Penerapan ini tidak memadai untuk penggunaan produksi, tetapi cocok untuk pengujian dan beberapa aspek pengembangan.
Ikuti langkah-langkah di bawah ini untuk menerapkan instans MongoDB mandiri.
Langkah 1:Labeli Node
Beri label node yang akan digunakan untuk penyebaran MongoDB. Label tersebut digunakan kemudian untuk menetapkan pod ke node tertentu.
Untuk melakukannya:
1. Buat daftar node di cluster Anda:
kubectl get nodes
2. Pilih node penerapan dari daftar di output perintah.
3. Gunakan kubectl untuk memberi label pada node dengan pasangan nilai kunci.
kubectl label nodes <node> <key>=<value>
Keluaran mengonfirmasi bahwa label berhasil ditambahkan.
Langkah 2:Buat Kelas Penyimpanan
StorageClass membantu pod menyediakan klaim volume persisten pada node. Untuk membuat StorageClass:
1. Gunakan editor teks untuk membuat file YAML untuk menyimpan konfigurasi kelas penyimpanan.
nano StorageClass.yaml
2. Tentukan konfigurasi kelas penyimpanan Anda dalam file. Contoh di bawah mendefinisikan mongodb-storageclass
:
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: mongodb-storageclass
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true
3. Simpan perubahan dan keluar dari editor.
Langkah 3:Buat Penyimpanan Persisten
Menyediakan penyimpanan untuk penerapan MongoDB dengan membuat volume persisten dan klaim volume persisten:
1. Buat file YAML untuk konfigurasi volume persisten.
nano PersistentVolume.yaml
2. Dalam file, alokasikan penyimpanan yang termasuk dalam kelas penyimpanan yang ditentukan pada langkah sebelumnya. Tentukan node yang akan digunakan dalam penerapan pod di nodeAffinity
bagian. Node diidentifikasi menggunakan label yang dibuat di Langkah 1 .
apiVersion: v1
kind: PersistentVolume
metadata:
name: mongodb-pv
spec:
capacity:
storage: 2Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: mongodb-storageclass
local:
path: /mnt/data
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: size
operator: In
values:
- large
3. Buat YAML lain untuk konfigurasi klaim volume persisten:
nano PersistentVolumeClaim.yaml
4. Tentukan klaim bernama mongodb-pvc
dan menginstruksikan Kubernetes untuk mengklaim volume milik mongodb-storageclass
.
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: mongodb-pvc
spec:
storageClassName: mongodb-storageclass
accessModes:
- ReadWriteOnce
volumeMode: Filesystem
resources:
requests:
storage: 1Gi
Langkah 4:Buat ConfigMap
File ConfigMap menyimpan informasi konfigurasi yang tidak terenkripsi yang digunakan oleh pod.
1. Buat file YAML untuk menyimpan konfigurasi penerapan:
nano ConfigMap.yaml
2. Gunakan file untuk menyimpan informasi tentang jalur sistem, pengguna, dan peran. Berikut ini adalah contoh file ConfigMap:
apiVersion: v1
kind: ConfigMap
metadata:
name: mongodb-configmap
data:
mongo.conf: |
storage:
dbPath: /data/db
ensure-users.js: |
const targetDbStr = 'test';
const rootUser = cat('/etc/k8-test/admin/MONGO_ROOT_USERNAME');
const rootPass = cat('/etc/k8-test/admin/MONGO_ROOT_PASSWORD');
const usersStr = cat('/etc/k8-test/MONGO_USERS_LIST');
const adminDb = db.getSiblingDB('admin');
adminDb.auth(rootUser, rootPass);
print('Successfully authenticated admin user');
const targetDb = db.getSiblingDB(targetDbStr);
const customRoles = adminDb
.getRoles({rolesInfo: 1, showBuiltinRoles: false})
.map(role => role.role)
.filter(Boolean);
usersStr
.trim()
.split(';')
.map(s => s.split(':'))
.forEach(user => {
const username = user[0];
const rolesStr = user[1];
const password = user[2];
if (!rolesStr || !password) {
return;
}
const roles = rolesStr.split(',');
const userDoc = {
user: username,
pwd: password,
};
userDoc.roles = roles.map(role => {
if (!~customRoles.indexOf(role)) {
return role;
}
return {role: role, db: 'admin'};
});
try {
targetDb.createUser(userDoc);
} catch (err) {
if (!~err.message.toLowerCase().indexOf('duplicate')) {
throw err;
}
}
});
Langkah 5:Buat StatefulSet
StatefulSet adalah pengontrol Kubernetes yang digunakan untuk men-deploy aplikasi stateful. Pod aplikasi stateful memerlukan identitas unik karena mereka berkomunikasi dengan pod lain.
Untuk Membuat StatefulSet :
1. Gunakan editor teks untuk membuat file YAML:
nano StatefulSet.yaml
2. Masukkan informasi penerapan dalam file, termasuk gambar Docker MongoDB yang akan digunakan. File juga merujuk ke ConfigMap
yang dibuat sebelumnya dan PersistentVolumeClaim
:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mongodb-test
spec:
serviceName: mongodb-test
replicas: 1
selector:
matchLabels:
app: database
template:
metadata:
labels:
app: database
selector: mongodb-test
spec:
containers:
- name: mongodb-test
image: mongo:4.0.8
env:
- name: MONGO_INITDB_ROOT_USERNAME_FILE
value: /etc/k8-test/admin/MONGO_ROOT_USERNAME
- name: MONGO_INITDB_ROOT_PASSWORD_FILE
value: /etc/k8-test/admin/MONGO_ROOT_PASSWORD
volumeMounts:
- name: k8-test
mountPath: /etc/k8-test
readOnly: true
- name: mongodb-scripts
mountPath: /docker-entrypoint-initdb.d
readOnly: true
- name: mongodb-configmap
mountPath: /config
readOnly: true
- name: mongodb-data
mountPath: /data/db
nodeSelector:
size: large
volumes:
- name: k8-test
secret:
secretName: mongodb-secret
items:
- key: MONGO_ROOT_USERNAME
path: admin/MONGO_ROOT_USERNAME
mode: 0444
- key: MONGO_ROOT_PASSWORD
path: admin/MONGO_ROOT_PASSWORD
mode: 0444
- key: MONGO_USERNAME
path: MONGO_USERNAME
mode: 0444
- key: MONGO_PASSWORD
path: MONGO_PASSWORD
mode: 0444
- key: MONGO_USERS_LIST
path: MONGO_USERS_LIST
mode: 0444
- name: mongodb-scripts
configMap:
name: mongodb-configmap
items:
- key: ensure-users.js
path: ensure-users.js
- name: mongodb-configmap
configMap:
name: mongodb-configmap
items:
- key: mongo.conf
path: mongo.conf
- name: mongodb-data
persistentVolumeClaim:
claimName: mongodb-pvc
Langkah 6:Buat Rahasia
Objek Rahasia digunakan untuk menyimpan informasi sensitif tentang penerapan.
1. Buat YAML Rahasia dengan editor teks Anda.
nano Secret.yaml
2. Memberikan informasi untuk mengakses database MongoDB.
apiVersion: v1
kind: Secret
metadata:
name: mongodb-secret
type: Opaque
data:
MONGO_ROOT_USERNAME: YWRtaW4K
MONGO_ROOT_PASSWORD: cGFzc3dvcmQK
MONGO_USERNAME: dGVzdAo=
MONGO_PASSWORD: cGFzc3dvcmQK
MONGO_USERS_LIST: dGVzdDpkYkFkbWluLHJlYWRXcml0ZTpwYXNzd29yZAo=
3. Simpan perubahan dan keluar.
Langkah 7:Buat Layanan MongoDB
Untuk membuat Layanan MongoDB:
1. Buat objek layanan tanpa kepala.
nano Service.yaml
Layanan tanpa kepala memungkinkan pengguna terhubung ke pod secara langsung.
2. Tambahkan nama dan definisi layanan di file YAML.
apiVersion: v1
kind: Service
metadata:
name: mongodb-test
labels:
app: database
spec:
clusterIP: None
selector:
app: database
3. Simpan perubahan dan keluar dari file.
Langkah 8:Terapkan Konfigurasi MongoDB dengan Kustomize
Gunakan Kustomize untuk menerapkan file konfigurasi MongoDB dengan mudah:
1. Buat kustomization.yaml
berkas:
nano kustomization.yaml
2. Di resources
bagian, daftar semua file YAML yang dibuat pada langkah sebelumnya:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ConfigMap.yaml
- PersistentVolumeClaim.yaml
- PersistentVolume.yaml
- Secret.yaml
- Service.yaml
- StatefulSet.yaml
- StorageClass.yaml
Simpan file di direktori yang sama dengan file lainnya.
3. Deploy MongoDB dengan perintah berikut:
kubectl apply -k .
4. Gunakan kubectl untuk memeriksa apakah pod sudah siap.
kubectl get pod
Saat pod menunjukkan 1/1
di READY
kolom, lanjutkan ke langkah berikutnya.
Langkah 9:Hubungkan ke Instans Mandiri MongoDB
1. Hubungkan ke pod MongoDB dengan menggunakan perintah kubectl berikut:
kubectl exec -it mongodb-test-0 -- sh
2. Saat #
muncul prompt, ketik:
mongo
Shell MongoDB dimuat.
3. Beralih ke database pengujian:
use test
4. Otentikasi dengan perintah berikut:
db.auth('[username]','[password]')
Nomor 1
di output mengonfirmasi otentikasi yang berhasil.
Menerapkan ReplicaSet
Menyebarkan MongoDB sebagai ReplicaSet memastikan bahwa jumlah pod yang ditentukan berjalan pada waktu tertentu. Penerapan ReplicaSet direkomendasikan untuk lingkungan produksi.
Langkah 1:Siapkan Kontrol Akses Berbasis Peran (RBAC)
Mengaktifkan kontrol akses berbasis peran adalah salah satu praktik terbaik keamanan Kubernetes. RBAC memastikan bahwa tidak ada pengguna yang memiliki izin lebih dari yang dibutuhkan.
Untuk menyiapkan RBAC:
1. Buat file YAML dengan editor teks.
nano rbac.yaml
2. Berikan aturan akses untuk penerapan MongoDB Anda. Contoh di bawah ini menunjukkan file RBAC YAML:
apiVersion: v1
kind: ServiceAccount
metadata:
name: mongo-account
namespace: default
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: mongo-role
rules:
- apiGroups: [""]
resources: ["configmaps"]
verbs: ["*"]
- apiGroups: [""]
resources: ["deployments"]
verbs: ["list", "watch"]
- apiGroups: [""]
resources: ["services"]
verbs: ["*"]
- apiGroups: [""]
resources: ["pods"]
verbs: ["get","list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: mongo_role_binding
subjects:
- kind: ServiceAccount
name: mongo-account
namespace: default
roleRef:
kind: ClusterRole
name: mongo-role
apiGroup: rbac.authorization.k8s.io
3. Simpan file dan terapkan dengan kubectl:
kubectl apply -f rbac.yaml
Langkah 2:Buat Penerapan StatefulSet
1. Buat YAML penerapan StatefulSet:
nano StatefulSet.yaml
2. Tentukan jumlah replika dalam file, gambar Docker MongoDB yang akan digunakan, dan sediakan template klaim volume untuk penyediaan volume dinamis:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mongodb-replica
namespace: default
spec:
serviceName: mongo
replicas: 2
selector:
matchLabels:
app: mongo
template:
metadata:
labels:
app: mongo
selector: mongo
spec:
terminationGracePeriodSeconds: 30
serviceAccount: mongo-account
containers:
- name: mongodb
image: docker.io/mongo:4.2
env:
command: ["/bin/sh"]
args: ["-c", "mongod --replSet=rs0 --bind_ip_all"]
resources:
limits:
cpu: 1
memory: 1500Mi
requests:
cpu: 1
memory: 1000Mi
ports:
- name: mongo-port
containerPort: 27017
volumeMounts:
- name: mongo-data
mountPath: /data/db
volumeClaimTemplates:
- metadata:
name: mongo-data
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
3. Simpan file dan gunakan kubectl apply untuk membuat penerapan:
kubectl apply -f StatefulSet.yaml
Langkah 3:Buat Layanan Tanpa Kepala
Untuk membuat layanan tanpa kepala:
1. Buat file YAML layanan:
nano Service.yaml
2. Tentukan layanan yang memungkinkan komunikasi langsung dengan pod:
apiVersion: v1
kind: Service
metadata:
name: mongo
namespace: default
labels:
name: mongo
spec:
ports:
- port: 27017
targetPort: 27017
clusterIP: None
selector:
app: mongo
3. Terapkan YAML dengan kubectl.
kubectl apply -f Service.yaml
Langkah 4:Siapkan Host Replikasi
Untuk menyiapkan replikasi pod:
1. Masukkan pod menggunakan kubectl exec
:
kubectl exec -it mongodb-replica-0 -n default -- mongo
Pesan sambutan shell MongoDB muncul.
2. Mulai replikasi dengan mengetikkan perintah berikut pada prompt shell MongoDB:
rs.initiate()
"ok" : 1
baris menunjukkan bahwa inisiasi berhasil.
3. Tentukan variabel yang disebut cfg
. Variabel mengeksekusi rs.conf()
.
var cfg = rs.conf()
4. Gunakan variabel untuk menambahkan server utama ke konfigurasi:
cfg.members[0].host="mongodb-replica-0.mongo:27017"
Keluaran menunjukkan nama server utama.
5. Konfirmasikan konfigurasi dengan menjalankan perintah berikut:
rs.reconfig(cfg)
"ok" : 1
baris mengkonfirmasi konfigurasi berhasil.
6. Gunakan rs.add()
perintah untuk menambahkan pod lain ke konfigurasi.
rs.add("mongodb-replica-1.mongo:27017")
Keluaran menunjukkan replika telah ditambahkan.
7. Periksa status sistem dengan mengetik:
rs.status()
"members"
bagian harus menunjukkan dua replika. Replika utama tercantum di bagian atas output.
Replika sekunder berada di bawah replika utama.
Penerapan ReplicaSet dari MongoDB telah disiapkan dan siap untuk dioperasikan.