Օգտագործեք Kubernetes օպերատորների ուժը՝ ձեր RabbitMQ կլաստերը տեղակայելու համար

RabbitMQ-ն ամենալայն տարածված բաց կոդով հաղորդագրությունների բրոքերն է: Նախքան RabbitMQ-ի մասին խոսելը, եկեք սահմանենք, թե ինչ է հաղորդագրության բրոքերը: Պարզեցնելու համար այն թույլ է տալիս հավելվածներին և ծառայություններին շփվել միմյանց հետ և փոխանակել տվյալներ: Ստորև բերված դիագրամը ներկայացնում է իրադարձությունների ավտոբուսի օգտագործման դեպքը, օգտագործելով հաղորդագրության բրոքեր.

Հաղորդագրությունների բրոքերները շատ օգտակար են ձեր բաղադրիչների միջև հաղորդակցությունը անջատելու համար: Այն հնարավորություն է տալիս ստեղծել լիովին բաշխված և ժամանակակից ճարտարապետություններ: Հաղորդագրությունների բրոքերների ընտանիքում կարող եք գտնել այլ հայտնի անուններ, ինչպիսիք են Apache Kafka, Apache ActiveMQ:

RabbitMQ-ն թեթև է և հեշտ է տեղակայվել տեղում կամ ամպի մեջ: Այն առաջարկում է հետաքրքիր առանձնահատկություններ.

  • Այն աջակցում է բազմաթիվ հաղորդագրությունների արձանագրություններին, ինչպիսիք են AMQP, STOMP, MQTT և այլն…
  • Այն կարող է տեղակայվել բաշխված և դաշնային կոնֆիգուրացիաներում՝ բավարարելու բարձր մասշտաբային և բարձր հասանելիության պահանջները:
  • Այն ապահովում է UI կառավարման և HTTP API մոնիտորինգի համար:
  • Այն կարող է ընդլայնվել բազմաթիվ հասանելի հավելվածներով:
  • Կան ներդրված հաճախորդներ ծրագրավորման բազմաթիվ լեզուներով՝ Python, Javascript, Java, Go, Ruby և այլն:

Այս ձեռնարկում մենք կկենտրոնանանք այն վրա, թե ինչպես տեղակայել բարձր հասանելի RabbitMQ կլաստերը Kubernetes կլաստերում: Ընտրությունը կլինի Kubernetes օպերատորների օգտագործումը՝ այս նպատակին արդյունավետորեն հասնելու համար: Մենք կտեսնենք դրանց օգտագործման առավելությունները և ինչպես տեղակայել RabbitMQ ռեսուրսները քայլ առ քայլ:

Ինչու՞ օգտագործել Kubernetes օպերատորները:

Օպերատորները Kubernetes-ի ծրագրային ընդլայնումներ են, որոնք օգտագործում են «մաքսային ռեսուրսներ՝ հավելվածները և դրանց բաղադրիչները կառավարելու համար»: https://kubernetes.io/docs/concepts/extend-kubernetes/operator/

Kubernetes-ի օպերատորները թույլ են տալիս ընդլայնել կլաստերի վարքագիծը՝ առանց փոփոխելու հենց Kubernetes-ի կոդը: Մեր դեպքում RabbitMQ-ի վարքագիծը կփոխանցվի օպերատորներին: Սա մեզ շատ ժամանակ կխնայի մեր կողմից:

RabbitMQ թիմը մշակում և պահպանում է երկու Kubernetes օպերատորներ.

  • RabbitMQ կլաստերի Kubernetes օպերատոր՝ ավտոմատացնելու RabbitMQ կլաստերների տրամադրումը, կառավարումը և գործողությունները Kubernetes-ում:
  • RabbitMQ Messaging Topology Operator՝ կլաստերների տոպոլոգիան կառավարելու համար (Թույլտվություններ, օգտվողներ և այլն…)

Օպերատորները տեղադրվում են CRD-ների միջոցով (Պատվերով ռեսուրսների սահմանում) Kubernetes կլաստերում: Տեղադրվելուց հետո նոր ռեսուրսները հայտնի են կլաստերում, ինչպիսիք են դասական տեսակները (Pod, Deployment և այլն…): Դուք պարզապես պետք է ստեղծեք YAML մանիֆեստները՝ դրանք կանչելու համար:

RabbitMQ Cluster Kubernetes օպերատորի տեղակայում

CRD-ն հասանելի է պահեստի թողարկումներում: Տեղադրեք այն kubectl հրամանով.

$ kubectl apply -f "https://github.com/rabbitmq/cluster-operator/releases/latest/download/cluster-operator.yml"

Նոր ռեսուրսները գտնվում են rabbitmq-system անվանումների տարածքում.

$ kubectl get all -n rabbitmq-system
NAME                                             READY   STATUS    RESTARTS   AGE
pod/rabbitmq-cluster-operator-7cbf865f89-9pq6n   1/1     Running   4          2d21h

NAME                                        READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/rabbitmq-cluster-operator   1/1     1            1           2d21h

NAME                                                   DESIRED   CURRENT   READY   AGE
replicaset.apps/rabbitmq-cluster-operator-7cbf865f89   1         1         1       2d21h

Համոզվեք, որ բոլոր ռեսուրսները պատրաստ են հաջորդ քայլին:

Ստեղծեք RabbitMQ կլաստերը

RabbitMQ կլաստերի օպերատորը տրամադրում է RabbitmqCluster տեսակ: Այժմ դուք կարող եք ստեղծել այնքան RabbitMQ կլաստերներ, որքան ցանկանում եք ձեր Kubernetes կլաստերում: Դուք պարզապես պետք է դրանք սահմանեք YAML մանիֆեստում այսպես.

apiVersion: rabbitmq.com/v1beta1
kind: RabbitmqCluster
metadata:
  labels:
    app: rabbitmq
  name: rabbitmq
spec:
  replicas: 3
  image: rabbitmq:3.9.11
  service:
    type: ClusterIP
  persistence:
    storageClassName: hostpath
    storage: 10
  resources:
    requests:
      cpu: 256m
      memory: 1Gi
    limits:
      cpu: 256m
      memory: 1Gi
  rabbitmq:
    additionalPlugins:
      - rabbitmq_management
      - rabbitmq_peer_discovery_k8s
    additionalConfig: |
      cluster_formation.peer_discovery_backend = rabbit_peer_discovery_k8s
      cluster_formation.k8s.host = kubernetes.default.svc.cluster.local
      cluster_formation.k8s.address_type = hostname
      vm_memory_high_watermark_paging_ratio = 0.85
      cluster_formation.node_cleanup.interval = 10
      cluster_partition_handling = autoheal
      queue_master_locator = min-masters
      loopback_users.guest = false
      default_user = guest
      default_pass = guest
    advancedConfig: ""

Եկեք ամփոփենք վերը նշված մանիֆեստի բովանդակությունը.

  • Մենք ստեղծում ենք մի տեսակ Rabbitmqcluster ռեսուրս: Այն սահմանվում է նախորդ մասում մեր տեղադրած CRD-ով:
  • Կլաստերն ունի 3 կրկնօրինակ՝ բարձր հասանելիության և սխալների հանդուրժողականության համար:
  • Յուրաքանչյուր պատիճ ունի հստակ սահմանված ռեսուրսներ:
  • Ավելացված հավելումներ՝ rabbitmq_management կառավարման միջերեսի համար և rabbitmq_peer_discovery_k8s՝ կլաստերների ձևավորման համար: Այլ հավելումներ կարող եք գտնել այստեղ՝ https://www.rabbitmq.com/plugins.html:
  • Կլաստերի կոնֆիգուրացիան կատարվում է additionalConfig դաշտում՝ https://www.rabbitmq.com/configure.html#config-file:
  • Օգտագործված ծառայության տեսակն է ClusterIP: Դուք կարող եք կարգավորել LoadBalancer տեսակը, եթե ձեր հավելվածը դուրս է կլաստերից:
  • Համառությունը կազմաձևված է: Տրված օրինակն աշխատում է տեղական Kubernetes կլաստերի վրա, ուստի պահեստավորման դասը hostpath է: Դուք կարող եք դիտել Kubernetes-ում հասանելի դասերը, որոնք կհամապատասխանեն ձեր կարիքներին՝ https://kubernetes.io/docs/concepts/storage/storage-classes/
$ kubectl create -f rabbitmq.yaml
$ kubectl get pods -l app.kubernetes.io/name=rabbitmq
NAME                READY   STATUS    RESTARTS   AGE
rabbitmq-server-0   1/1     Running   0          4m41s
rabbitmq-server-1   1/1     Running   0          4m41s
rabbitmq-server-2   1/1     Running   0          4m41s

RabbitMQ տոպոլոգիայի օպերատորի տեղակայում

Եկեք հիմա անցնենք RabbitMQ տոպոլոգիայի օպերատորին: Այն թույլ է տալիս կառավարել RabbitMQ հատուկ ռեսուրսները, ինչպիսիք են օգտվողները և թույլտվությունները, օրինակ՝ https://www.rabbitmq.com/kubernetes/operator/using-topology-operator.html:

Այս Օպերատորին անհրաժեշտ է սերտիֆիկացված մենեջեր աշխատելու համար: Տեղադրեք այն և համոզվեք, որ բոլոր պատյանները առողջ են.

$ kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/v1.3.1/cert-manager.yaml
$ kubectl get pods -n cert-manager
NAME                                       READY   STATUS    RESTARTS   AGE
cert-manager-7dd5854bb4-vt5jn              1/1     Running   0          47s
cert-manager-cainjector-64c949654c-j2npq   1/1     Running   0          47s
cert-manager-webhook-6b57b9b886-f6gwt      1/1     Running   0          47s

Տեղադրեք CRD.

$ kubectl apply -f https://github.com/rabbitmq/messaging-topology-operator/releases/latest/download/messaging-topology-operator-with-certmanager.yaml

Ահա մանիֆեստի օրինակ՝ հյուր օգտատիրոջ համար նույնականացման հետ փորձարկումներ կատարելու թույլտվությունները կարգավորելու համար.

apiVersion: rabbitmq.com/v1beta1
kind: Permission
metadata:
  name: rabbitmq-guest-permission
spec:
  vhost: /
  user: guest
  permissions:
    write: ".*"
    configure: ".*"
    read: ".*"
  rabbitmqClusterReference:
    name: rabbitmq

Տեղադրեք The RabbitMQ Cluster Operator Kubectl Plugin-ը

RabbitMQ թիմը տրամադրում է նաև kubectl հավելված՝ RabbitMQ կլաստերի օպերատորից օգտվելու համար: Այս փլագինը կավտոմատացնի բազմաթիվ փոխազդեցություններ Kubernetes API-ի և RabbitMQ կլաստերի օպերատորի հետ:

Փլագինին անհրաժեշտ է տեղադրել krew plugin մենեջեր (տեղադրումն այստեղ MacOSX-ի համար է, ստուգեք փաստաթղթավորումը և հարմարեցրեք ձեր ՕՀ-ին)

(
  set -x; cd "$(mktemp -d)" &&
  OS="$(uname | tr '[:upper:]' '[:lower:]')" &&
  ARCH="$(uname -m | sed -e 's/x86_64/amd64/' -e 's/\(arm\)\(64\)\?.*/\1\2/' -e 's/aarch64$/arm64/')" &&
  KREW="krew-${OS}_${ARCH}" &&
  curl -fsSLO "https://github.com/kubernetes-sigs/krew/releases/latest/download/${KREW}.tar.gz" &&
  tar zxvf "${KREW}.tar.gz" &&
  ./"${KREW}" install krew
)

Թարմացրեք ձեր PATH միջավայրի փոփոխականը՝ krew-ի գտնվելու վայրով.

$ export PATH="${KREW_ROOT:-$HOME/.krew}/bin:$PATH"

Ստուգեք, որ տեղադրումը կարգին է.

$ kubectl krew

Տեղադրեք RabbitMQ հավելվածը.

$ kubectl krew install rabbitmq

Ստուգեք RabbitMQ հավելվածը.

$ kubectl rabbitmq help

Դուք կարող եք վերբերել ձեր կլաստերը ցանկում.

$ kubectl rabbitmq list                          
NAME       ALLREPLICASREADY   RECONCILESUCCESS   AGE
rabbitmq   True               True               4d20h

Կարող եք նաև ուղղակիորեն բացել կառավարման միջերեսը.

$ kubectl rabbitmq manage rabbitmq

Եզրակացություն

Այս ձեռնարկի միջոցով մենք տեսանք օպերատորների օգտագործման առավելությունը՝ Kubernetes-ը տեղակայելու համար:

Նրանք թույլ են տալիս հեշտությամբ ապահովել RabbitMQ կլաստերների թափանցիկությունը և տրամադրումը: Այն ավտոմատացնում է կառավարման մեծ մասը և թույլ է տալիս սահմանել RabbitMQ տոպոլոգիան YAML մանիֆեստների միջոցով: Վերջապես, մենք տեսանք, թե ինչպես կարգավորել kubectl plugin-ը օպերատորի հետ փոխազդելու համար: