මෙම මස මුලදී, මැයි 3 වන දින, "Kubernetes හි බෙදා හරින ලද දත්ත ගබඩා කිරීම සඳහා කළමනාකරණ පද්ධතියක්" පිළිබඳ ප්රධාන නිකුතුවක් නිවේදනය කරන ලදී -
කොටින්ම Rook කියන්නේ සෙට් එකක්
මේ මොහොතේ වඩාත්ම සංවර්ධිත (සහ
අදහස් දැක්වීම්: Ceph සම්බන්ධ Rook 1.0.0 නිකුතුවේ සැලකිය යුතු වෙනස්කම් අතර, Ceph Nautilus සඳහා සහය දැක්වීම සහ CephFS හෝ RGW බාල්දි සඳහා NFS භාවිතා කිරීමේ හැකියාව අපට සටහන් කළ හැක. අනෙක් අය අතර කැපී පෙනෙන දෙය නම් බීටා මට්ටමට EdgeFS සහාය පරිණත වීමයි.
එබැවින්, මෙම ලිපියෙන් අපි:
- Kubernetes පොකුරක් තුළ Ceph යෙදවීමට Rook භාවිතා කිරීමේදී අප දකින වාසි මොනවාද යන ප්රශ්නයට පිළිතුරු දෙමු;
- නිෂ්පාදනයේදී රූක් භාවිතා කිරීම පිළිබඳ අපගේ අත්දැකීම් සහ හැඟීම් අපි බෙදා ගන්නෙමු;
- අපි රූක්ට “ඔව්!” කියන්න හේතුව සහ ඔහු සඳහා අපගේ සැලසුම් ගැන අපි ඔබට කියමු.
අපි සාමාන්ය සංකල්ප සහ න්යායෙන් පටන් ගනිමු.
"මට එක Rook එකක වාසියක් තියෙනවා!" (නොදන්නා චෙස් ක්රීඩකයා)
Rook හි එක් ප්රධාන වාසියක් වන්නේ දත්ත ගබඩා සමඟ අන්තර්ක්රියා සිදු කරනු ලබන්නේ Kubernetes යාන්ත්රණයන් මගිනි. මෙයින් අදහස් කරන්නේ ඔබට තවදුරටත් Ceph පත්රයේ සිට කොන්සෝලය වෙත වින්යාස කිරීමට විධාන පිටපත් කිරීමට අවශ්ය නොවන බවයි.
— ඔබට CephFS පොකුරක් තුළ යෙදවීමට අවශ්යද? YAML ගොනුවක් ලියන්න!
- කුමක් ද? ඔබට S3 API සමඟ වස්තු ගබඩාවක් යෙදවීමටද අවශ්යද? දෙවන YAML ගොනුවක් ලියන්න!
සාමාන්ය ක්රියාකරුවෙකුගේ සියලුම නීතිවලට අනුව Rook නිර්මාණය කර ඇත. භාවිතා කරමින් ඔහු සමඟ අන්තර්ක්රියා සිදු වේ
වස්තු ගබඩාවක් නිර්මාණය කිරීමේ උදාහරණය භාවිතා කරමින් විශේෂතා දෙස බලමු, නැතහොත් - CephObjectStoreUser
.
apiVersion: ceph.rook.io/v1
kind: CephObjectStore
metadata:
name: {{ .Values.s3.crdName }}
namespace: kube-rook
spec:
metadataPool:
failureDomain: host
replicated:
size: 3
dataPool:
failureDomain: host
erasureCoded:
dataChunks: 2
codingChunks: 1
gateway:
type: s3
sslCertificateRef:
port: 80
securePort:
instances: 1
allNodes: false
---
apiVersion: ceph.rook.io/v1
kind: CephObjectStoreUser
metadata:
name: {{ .Values.s3.crdName }}
namespace: kube-rook
spec:
store: {{ .Values.s3.crdName }}
displayName: {{ .Values.s3.username }}
ලැයිස්තුගත කිරීමේදී දක්වා ඇති පරාමිතීන් තරමක් සම්මත වන අතර අදහස් දැක්වීම් අවශ්ය නොවේ, නමුත් අච්චු විචල්යයන් සඳහා වෙන් කර ඇති ඒවා කෙරෙහි විශේෂ අවධානයක් යොමු කිරීම වටී.
සාමාන්ය වැඩ යෝජනා ක්රමය පැමිණෙන්නේ අපි YAML ගොනුවක් හරහා සම්පත් “ඇණවුම්” කරන අතර, ඒ සඳහා ක්රියාකරු අවශ්ය විධාන ක්රියාත්මක කරන අතර අපට තවදුරටත් වැඩ කළ හැකි “එතරම් සැබෑ නොවන” රහසක් අපට ලබා දෙයි. (පහත බලන්න). ඉහත ලැයිස්තුගත කර ඇති විචල්ය වලින්, විධානය සහ රහස් නම සම්පාදනය කෙරේ.
මේ මොන වගේ කණ්ඩායමක්ද? වස්තු ගබඩා කිරීම සඳහා පරිශීලකයෙකු නිර්මාණය කරන විට, පොඩ් එක තුළ ඇති Rook ක්රියාකරු පහත සඳහන් දේ කරනු ඇත:
radosgw-admin user create --uid="rook-user" --display-name="{{ .Values.s3.username }}"
මෙම විධානය ක්රියාත්මක කිරීමේ ප්රතිඵලය JSON ව්යුහයක් වනු ඇත:
{
"user_id": "rook-user",
"display_name": "{{ .Values.s3.username }}",
"keys": [
{
"user": "rook-user",
"access_key": "NRWGT19TWMYOB1YDBV1Y",
"secret_key": "gr1VEGIV7rxcP3xvXDFCo4UDwwl2YoNrmtRlIAty"
}
],
...
}
Keys
- S3 API හරහා වස්තු ගබඩාවට ප්රවේශ වීමට අනාගත යෙදුම් මොනවාද? රූක් ක්රියාකරු කාරුණිකව ඒවා තෝරාගෙන නම සමඟ රහසක් ආකාරයෙන් ඔහුගේ නාම අවකාශයේ තබයි. rook-ceph-object-user-{{ $.Values.s3.crdName }}-{{ $.Values.s3.username }}
.
මෙම රහසේ දත්ත භාවිතා කිරීමට, එය පරිසර විචල්යයන් ලෙස කන්ටේනරයට එක් කරන්න. උදාහරණයක් ලෙස, මම Job සඳහා අච්චුවක් දෙන්නෙමි, එහි අපි එක් එක් පරිශීලක පරිසරය සඳහා ස්වයංක්රීයව බාල්දි සාදනු ඇත:
{{- range $bucket := $.Values.s3.bucketNames }}
apiVersion: batch/v1
kind: Job
metadata:
name: create-{{ $bucket }}-bucket-job
annotations:
"helm.sh/hook": post-install
"helm.sh/hook-weight": "2"
spec:
template:
metadata:
name: create-{{ $bucket }}-bucket-job
spec:
restartPolicy: Never
initContainers:
- name: waitdns
image: alpine:3.6
command: ["/bin/sh", "-c", "while ! getent ahostsv4 rook-ceph-rgw-{{ $.Values.s3.crdName }}; do sleep 1; done" ]
- name: config
image: rook/ceph:v1.0.0
command: ["/bin/sh", "-c"]
args: ["s3cmd --configure --access_key=$(ACCESS-KEY) --secret_key=$(SECRET-KEY) -s --no-ssl --dump-config | tee /config/.s3cfg"]
volumeMounts:
- name: config
mountPath: /config
env:
- name: ACCESS-KEY
valueFrom:
secretKeyRef:
name: rook-ceph-object-user-{{ $.Values.s3.crdName }}-{{ $.Values.s3.username }}
key: AccessKey
- name: SECRET-KEY
valueFrom:
secretKeyRef:
name: rook-ceph-object-user-{{ $.Values.s3.crdName }}-{{ $.Values.s3.username }}
key: SecretKey
containers:
- name: create-bucket
image: rook/ceph:v1.0.0
command:
- "s3cmd"
- "mb"
- "--host=rook-ceph-rgw-{{ $.Values.s3.crdName }}"
- "--host-bucket= "
- "s3://{{ $bucket }}"
ports:
- name: s3-no-sll
containerPort: 80
volumeMounts:
- name: config
mountPath: /root
volumes:
- name: config
emptyDir: {}
---
{{- end }}
මෙම කාර්යයේ ලැයිස්තුගත කර ඇති සියලුම ක්රියා Kubernetes රාමුව තුළ සිදු කරන ලදී. YAML ගොනු වල විස්තර කර ඇති ව්යුහයන් Git ගබඩාවක ගබඩා කර බොහෝ වාරයක් නැවත භාවිතා කරයි. DevOps ඉංජිනේරුවන්ට සහ සමස්තයක් ලෙස CI/CD ක්රියාවලිය සඳහා මෙය විශාල ප්ලස් එකක් ලෙස අපි දකිමු.
Rook සහ Rados ගැන සතුටුයි
Ceph + RBD සංයෝජනය භාවිතා කිරීමෙන් කරල් වලට පරිමාවන් සවි කිරීම සඳහා යම් සීමාවන් පනවා ඇත.
විශේෂයෙන්ම, ප්රකාශිත යෙදුම් ක්රියාත්මක වීමට නම්, Ceph වෙත පිවිසීමේ රහසක් නාම අවකාශයේ අඩංගු විය යුතුය. ඔබට ඔවුන්ගේ නාම අවකාශයේ පරිසරයන් 2-3ක් තිබේ නම් කමක් නැත: ඔබට ගොස් රහස අතින් පිටපත් කළ හැක. නමුත් එක් එක් විශේෂාංගය සඳහා සංවර්ධකයින් සඳහා තමන්ගේම නාම අවකාශයක් සහිත වෙනම පරිසරයක් නිර්මාණය කරන්නේ නම් කුමක් කළ යුතුද?
අපි මෙම ගැටළුව අප විසින්ම භාවිතා කර විසඳා ගත්තෙමු
#! /bin/bash
if [[ $1 == “--config” ]]; then
cat <<EOF
{"onKubernetesEvent":[
{"name": "OnNewNamespace",
"kind": "namespace",
"event": ["add"]
}
]}
EOF
else
NAMESPACE=$(kubectl get namespace -o json | jq '.items | max_by( .metadata.creationTimestamp ) | .metadata.name')
kubectl -n ${CEPH_SECRET_NAMESPACE} get secret ${CEPH_SECRET_NAME} -o json | jq ".metadata.namespace="${NAMESPACE}"" | kubectl apply -f -
fi
කෙසේ වෙතත්, Rook භාවිතා කරන විට මෙම ගැටළුව සරලව නොපවතී. සවිකිරීමේ ක්රියාවලිය සිදුවන්නේ එහි ධාවක මත පදනම්වය
Rook ස්වයංක්රීයව බොහෝ ගැටලු විසඳයි, එය නව ව්යාපෘති සඳහා එය භාවිතා කිරීමට අපව දිරිමත් කරයි.
රූක් වටලෑම
රූක් සහ සීෆ් යොදවා ප්රායෝගික කොටස සම්පූර්ණ කරමු එවිට අපට අපගේම අත්හදා බැලීම් කළ හැකිය. මෙම අපරාජිත කුළුණට පහර දීම පහසු කිරීම සඳහා, සංවර්ධකයින් හෙල්ම් පැකේජයක් සකස් කර ඇත. අපි එය බාගත කරමු:
$ helm fetch rook-master/rook-ceph --untar --version 1.0.0
ගොනුවේ rook-ceph/values.yaml
ඔබට විවිධ සැකසුම් සොයා ගත හැක. වැදගත්ම දෙය නම් නියෝජිතයින් සහ සෙවීම සඳහා ඉවසීම නියම කිරීමයි. අපවිත්ර/ඉවසීමේ යාන්ත්රණය භාවිතා කළ හැක්කේ කුමක් සඳහාද යන්න අපි විස්තරාත්මකව විස්තර කළෙමු
කෙටියෙන් කිවහොත්, අපට සේවාදායක යෙදුම් පොඩ් දත්ත ගබඩා තැටි මෙන් එකම නෝඩ් මත පිහිටා තිබීම අවශ්ය නොවේ. හේතුව සරලයි: මේ ආකාරයෙන් Rook නියෝජිතයින්ගේ කාර්යය යෙදුමට බලපාන්නේ නැත.
ඉතින්, ගොනුව විවෘත කරන්න rook-ceph/values.yaml
ඔබගේ ප්රියතම සංස්කාරකය සමඟ අවසානයේ පහත කොටස එක් කරන්න:
discover:
toleration: NoExecute
tolerationKey: node-role/storage
agent:
toleration: NoExecute
tolerationKey: node-role/storage
mountSecurityMode: Any
දත්ත ගබඩා කිරීම සඳහා වෙන් කර ඇති සෑම නෝඩයක් සඳහාම, අනුරූප ටේන්ට් එකතු කරන්න:
$ kubectl taint node ${NODE_NAME} node-role/storage="":NoExecute
ඉන්පසු විධානය සමඟ හෙල්ම් ප්රස්ථාරය ස්ථාපනය කරන්න:
$ helm install --namespace ${ROOK_NAMESPACE} ./rook-ceph
දැන් ඔබට පොකුරක් සෑදිය යුතු අතර ස්ථානය සඳහන් කරන්න
apiVersion: ceph.rook.io/v1
kind: CephCluster
metadata:
clusterName: "ceph"
finalizers:
- cephcluster.ceph.rook.io
generation: 1
name: rook-ceph
spec:
cephVersion:
image: ceph/ceph:v13
dashboard:
enabled: true
dataDirHostPath: /var/lib/rook/osd
mon:
allowMultiplePerNode: false
count: 3
network:
hostNetwork: true
rbdMirroring:
workers: 1
placement:
all:
tolerations:
- key: node-role/storage
operator: Exists
storage:
useAllNodes: false
useAllDevices: false
config:
osdsPerDevice: "1"
storeType: filestore
resources:
limits:
memory: "1024Mi"
requests:
memory: "1024Mi"
nodes:
- name: host-1
directories:
- path: "/mnt/osd"
- name: host-2
directories:
- path: "/mnt/osd"
- name: host-3
directories:
- path: "/mnt/osd"
Ceph තත්ත්වය පරීක්ෂා කිරීම - බැලීමට බලාපොරොත්තු වන්න HEALTH_OK
:
$ kubectl -n ${ROOK_NAMESPACE} exec $(kubectl -n ${ROOK_NAMESPACE} get pod -l app=rook-ceph-operator -o name -o jsonpath='{.items[0].metadata.name}') -- ceph -s
ඒ අතරම, සේවාදායක යෙදුම සමඟ ඇති කරල් Ceph සඳහා වෙන් කර ඇති නෝඩ් මත අවසන් නොවන බව පරීක්ෂා කර බලමු:
$ kubectl -n ${APPLICATION_NAMESPACE} get pods -o custom-columns=NAME:.metadata.name,NODE:.spec.nodeName
තවද, අතිරේක සංරචක අවශ්ය පරිදි වින්යාසගත කළ හැක. ඔවුන් පිළිබඳ වැඩි විස්තර එහි දක්වා ඇත
Rook සහ කොකු: Rook සියල්ල සඳහා ප්රමාණවත්ද?
ඔබට පෙනෙන පරිදි, රූක්ගේ සංවර්ධනය වේගවත් වෙමින් පවතී. නමුත් Ceph හි අතින් වින්යාසය සම්පූර්ණයෙන්ම අත්හැරීමට අපට ඉඩ නොදෙන ගැටළු තවමත් පවතී:
- Rook Driver නැත
බැහැ සවිකර ඇති කුට්ටි භාවිතය පිළිබඳ ප්රමිතික අපනයනය කිරීම, එය අපට අධීක්ෂණය අහිමි කරයි. - Flexvolume සහ CSI
කොහොමද දන්නේ නැහැ වෙළුම්වල ප්රමාණය වෙනස් කරන්න (එකම RBD වලට ප්රතිවිරුද්ධව), එබැවින් Rook හට ප්රයෝජනවත් (සහ සමහර විට විවේචනාත්මකව අවශ්ය වේ!) මෙවලමක් අහිමි වේ. - Rook තවමත් සාමාන්ය Ceph තරම් නම්යශීලී නොවේ. අපට CephFS පාර-දත්ත SSD මත ගබඩා කිරීම සඳහා සංචිතය වින්යාස කිරීමට අවශ්ය නම් සහ දත්තම HDD මත ගබඩා කිරීමට නම්, අපට CRUSH සිතියම් තුළ වෙනම උපාංග කණ්ඩායම් ලියාපදිංචි කිරීමට අවශ්ය වනු ඇත.
- Rook-ceph-operator ස්ථායී ලෙස සලකනු ලැබුවද, Ceph 13 සිට 14 දක්වා යාවත්කාලීන කිරීමේදී ගැටළු කිහිපයක් තිබේ.
සොයා ගැනීම්
“මේ වන විට රූක් උකස් විසින් බාහිර ලෝකයෙන් වසා දමා ඇත, නමුත් යම් දිනෙක ඇය ක්රීඩාවේ තීරණාත්මක කාර්යභාරයක් ඉටු කරනු ඇතැයි අපි විශ්වාස කරමු!” (මෙම ලිපිය සඳහා විශේෂයෙන් නිර්මාණය කරන ලද උපුටා දැක්වීම)
රූක් ව්යාපෘතිය නිසැකවම අපගේ හදවත් දිනා ඇත - [එහි සියලු වාසි සහ අවාසි සමඟ] එය අනිවාර්යයෙන්ම ඔබේ අවධානයට ලක්විය යුතු බව අපි විශ්වාස කරමු.
අපගේ අනාගත සැලසුම් rook-ceph සඳහා මොඩියුලයක් බවට පත් කරයි
ප්රාදේශීය සභා
අපගේ බ්ලොග් අඩවියේ ද කියවන්න:
- «
Rook - Kubernetes සඳහා "ස්වයං සේවා" දත්ත ගබඩාව »; - «
Ceph මත පදනම්ව Kubernetes හි ප්රතිපාදන සමඟ ස්ථීර ගබඩාවක් නිර්මාණය කිරීම »; - «
දත්ත සමුදායන් සහ Kubernetes (සමාලෝචන සහ වීඩියෝ වාර්තාව) »; - «
shell-operator හඳුන්වාදීම: Kubernetes සඳහා ක්රියාකරුවන් නිර්මාණය කිරීම දැන් පහසු වී ඇත »; - «
Kubernetes සඳහා ක්රියාකරුවන්: ප්රකාශිත යෙදුම් ධාවනය කරන්නේ කෙසේද ".
මූලාශ්රය: www.habr.com