
I början av den hĂ€r mĂ„naden, den 3 maj, tillkĂ€nnagavs en stor release av "hanteringssystemet för distribuerade datalagringslösningar i Kubernetes" â . För mer Ă€n ett Ă„r sedan publicerade vi praktiska anvĂ€ndning â och nu, precis i tid för denna betydelsefulla milstolpe i projektets historia, Ă€r vi glada att dela med oss av vĂ„ra insikter. Kort sagt, Rook Ă€r en uppsĂ€ttning
operatörer För nÀrvarande Àr den mest avancerade (och
enda pÄ lösningen rook-ceph-operator .
AnmÀrkningSÄ, i denna artikel kommer vi att:
svara pÄ frÄgan om vilka fördelar vi ser med att anvÀnda Rook för distribution av Ceph i ett Kubernetes-kluster;
- dela med oss av erfarenheterna och intrycken av att anvÀnda Rook i produktion;
- berÀtta varför vi sÀger "Ja!" till Rook, och om vÄra planer för det.
- Vi börjar med allmÀnna koncept och teori.
"Jag har en fördel pÄ en Torn!" (okÀnd schackspelare)
En av de stora fördelarna med Rook Àr att interaktionen med datalagringslösningarna sker genom Kubernetes-mekanismer. Detta innebÀr att du inte lÀngre behöver kopiera kommandon frÄn pappret till konsolen för att konfigurera Ceph.

â Vill du distribuera CephFS i klustret? Skriv bara en YAML-fil!
â Vad? Vill du Ă€ven distribuera en objektlagring med S3 API? Skriv bara en andra YAML-fil!
Rook Àr skapad enligt alla regler för en typisk operator. Interaktionen med den sker via
CRD (Custom Resource Definitions) (eftersom detta Ă€r den enda stabila implementeringen kommer artikeln automatiskt att handla om Ceph, om inget annat anges) . Enligt de angivna parametrarna kommer operatören automatiskt att utföra de kommandon som krĂ€vs för konfigurationen.LĂ„t oss konkreta det med ett exempel pĂ„ att skapa ett Object Store, mer specifikt â
CephObjectStoreUser 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 }}De angivna parametrarna i listan Àr ganska standard och behöver knappast kommentarer, men sÀrskild uppmÀrksamhet bör riktas mot de som Àr markerade som mallvariabler.
Den övergripande arbetsmodellen Àr att vi via en YAML-fil "bestÀller" resurser, som operatören utför nödvÀndiga kommandon för och returnerar oss ett "inte helt riktigt" hemligt vÀrde som vi sedan kan arbeta med. (se nedan). FrÄn de variabler som ovan anges, kommer ett kommando och namnet pÄ hemligheten att skapas.
Vad Àr dÄ detta kommando? Vid skapandet av en anvÀndare för objektlagring kommer Rook-operatören att inuti podden utföra följande:
radosgw-admin user create --uid="rook-user" --display-name="{{ .Values.s3.username }}"Resultatet av detta kommando kommer att vara en JSON-struktur:
{
"user_id": "rook-user",
"display_name": "{{ .Values.s3.username }}",
"keys": [
{
"user": "rook-user",
"access_key": "NRWGT19TWMYOB1YDBV1Y",
"secret_key": "gr1VEGIV7rxcP3xvXDFCo4UDwwl2YoNrmtRlIAty"
}
],
...
} Nycklar â det som framtida applikationer behöver för att fĂ„ Ă„tkomst till objektlagringen via S3 API. Rook-operatören vĂ€ljer vĂ€nligt dessa och lagrar dem i sitt namespace som en hemlighet med namnet rook-ceph-object-user-{{ $.Values.s3.crdName }}-{{ $.Values.s3.username }}.
För att anvÀnda uppgifterna frÄn denna hemlighet rÀcker det att lÀgga till dem i containern som miljövariabler. Som exempel ger jag en mall för en jobb dÀr vi automatiskt skapar bucketar för varje anvÀndarmiljö:
{{- 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 }}Alla ÄtgÀrder som anges i detta jobb har genomförts utan att gÄ utanför Kubernetes. Strukturerna som beskrivs i YAML-filerna har lagrats i ett Git-förrÄd och kan anvÀndas om och om igen. Detta Àr en stor fördel för DevOps-ingenjörer och CI/CD-processen som helhet.
Med Rook och Rados blir det enklare.
AnvÀndningen av kombinationen Ceph + RBD innebÀr vissa begrÀnsningar för att kunna montera volymer till poddar.
Specifikt mÄste det finnas en hemlighet i namnomrÄdet för att fÄ Ätkomst till Ceph, sÄ att stateful-applikationer kan fungera. Det Àr okej om du har 2-3 miljöer i dina namnomrÄden: du kan gÄ och kopiera hemligheten manuellt. Men vad gör man om för varje feature för utvecklarna skapas en egen miljö med sitt eget namnomrÄde?
Vi löste detta problem genom , som automatiskt kopierade hemligheter till nya namnomrÄden (ett exempel pÄ en sÄdan hook beskrivs i ).
#! /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 -
fiMen vid anvÀndning av Rook existerar inte detta problem lÀngre. Monteringsprocessen sker genom egna drivrutiner baserade pÄ eller (fortfarande i betastadiet) och krÀver dÀrför inte nÄgra hemligheter.
Rook löser automatiskt mÄnga problem, vilket driver oss att anvÀnda det i nya projekt.
BelÀgringen av Rook
Vi avslutar den praktiska delen med att installera Rook och Ceph för att möjliggöra egna experiment. För att lÀttare kunna erövra detta oförÀnderliga torn har utvecklarna förberett ett Helm-paket. LÄt oss ladda ner det:
$ helm fetch rook-master/rook-ceph --untar --version 1.0.0 I filen rook-ceph/values.yaml man kan hitta mÄnga olika instÀllningar. Det viktigaste Àr att ange tolerations för agenter och sökning. Vi har tidigare gÄtt igenom hur mekanismen taints/tolerations fungerar i .
Kort sagt, vi vill inte att pods med den klientapplikation som anvÀnds ska placeras pÄ de noder dÀr lagringsdiskarna finns. Anledningen Àr enkel: pÄ sÄ sÀtt pÄverkar Rook-agenterna inte sjÀlva applikationen.
SÄ, öppna filen rook-ceph/values.yaml i din favorittextredigerare och lÀgg till följande block i slutet:
discover:
toleration: NoExecute
tolerationKey: node-role/storage
agent:
toleration: NoExecute
tolerationKey: node-role/storage
mountSecurityMode: AnyTill varje nod som reserveras för datalagring lÀgger vi till motsvarande taint:
$ kubectl taint node ${NODE_NAME} node-role/storage="":NoExecuteDĂ€refter installerar vi Helm-diagrammet med kommandot:
$ helm install --namespace ${ROOK_NAMESPACE} ./rook-cephNu behöver vi skapa en kluster och ange platsen för :
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" Kontrollera statusen för Ceph â vi förvĂ€ntar oss att se 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 -sDÀrefter kontrollerar vi att pods med klientapplikationen inte hamnar pÄ noder reserverade för Ceph:
$ kubectl -n ${APPLICATION_NAMESPACE} get pods -o custom-columns=NAME:.metadata.name,NODE:.spec.nodeNameVidare kan man valfritt konfigurera ytterligare komponenter. Mer information om dem finns i . För administration rekommenderar vi starkt att installera dashboard och toolbox.
Rook-krokar: rÀcker Rook till för allt?
Som man kan se, Àr utvecklingen av Rook i full gÄng. Men det finns fortfarande problem som hindrar oss frÄn att helt överge manuell konfiguration av Ceph:
- Ingen Rook-drivrutin ex exportera mÀtvÀrden för anvÀndning av monterade block, vilket gör att vi saknar övervakning.
- Flexvolume och CSI kan inte Àndra storlek pÄ volymer (till skillnad frÄn samma RBD), vilket gör att Rook saknar ett anvÀndbart (och ibland kritiskt nödvÀndigt!) verktyg.
- Rook Àr fortfarande inte lika flexibel som vanlig Ceph. Om vi vill konfigurera sÄ att poolen för CephFS metadata lagras pÄ SSD och sjÀlva datan pÄ HDD, mÄste vi manuellt ange separata enhetsgrupper i CRUSH-kartor.
- Trots att rook-ceph-operator anses stabil, finns det för nÀrvarande vissa problem vid uppgradering av Ceph frÄn version 13 till 14.
Slutsatser
«Just nu Àr Ladya stÀngd frÄn omvÀrlden av bönder, men vi tror att den en dag kommer att spela en avgörande roll i partiet!» (citatet Àr uppdiktat sÀrskilt för denna artikel)
Projektet Rook har utan tvekan vunnit vĂ„ra hjĂ€rtan â vi anser att [med alla sina fördelar och nackdelar] förtjĂ€nar det verkligen ocksĂ„ din uppmĂ€rksamhet.
VÄra framtida planer handlar om att göra rook-ceph till en modul för , vilket gör att dess anvÀndning i vÄra mÄnga Kubernetes-kluster blir Ànnu enklare och bekvÀmare.
P.S.
LÀs Àven i vÄr blogg:
- «»;
- «»;
- «»;
- «»;
- «».
KĂ€lla: habr.com
