2016-11-21 33 views
12

Elasticsearch được thiết kế để chạy trong chế độ cụm, tất cả những gì tôi phải làm là xác định IP nút liên quan trong cụm thông qua biến môi trường và miễn là kết nối mạng khả dụng, nó sẽ kết nối và tham gia các nút khác cho cụm.Chạy các thùng chứa Elasticsearch ở chế độ swarm

Tôi có 3 nút, 1 nút đóng vai trò là người quản lý bệ đỡ docker và hai nút còn lại là công nhân. Tôi đã khởi tạo trình quản lý và tham gia các nút của nhân viên và mọi thứ có vẻ ổn định từ quan điểm đó.

Bây giờ tôi đang cố gắng chạy container elasticsearch theo cách cho phép tôi nối tất cả các nút vào cùng một cụm elasticsearch, tuy nhiên, tôi muốn các nút tham gia bằng giao diện mạng lớp phủ của chúng và điều đó có nghĩa là tôi cần để biết địa chỉ IP nội bộ của vùng chứa tại thời điểm chạy lệnh docker service create, làm cách nào tôi có thể thực hiện việc này? Tôi có phải sử dụng một cái gì đó như lãnh sự để đạt được điều này?

Một số làm rõ:

Tôi cần phải biết, tại thời điểm tạo ra dịch vụ địa chỉ IP (hoặc tên DNS) cho tất cả những người tham gia Elasticsearch vì vậy tôi có thể bắt đầu các cụm một cách chính xác. Điều này đã được tại thời điểm sáng tạo và không phải sau đó. Ngoài ra, như tôi hiểu, tôi có thể trưng ra cổng 9200/9300 cho tất cả các dịch vụ và làm việc với các IP máy bên ngoài và làm cho nó hoạt động, nhưng tôi muốn sử dụng mạng lớp phủ để thực hiện tất cả các liên lạc này. chế độ dành cho).

+0

Bên cạnh Lãnh sự có cũng là Zookeeper và Etcd. –

+0

@MattSchuchard Tôi không thể sử dụng cốt lõi của đàn để làm điều này? sao tôi * có * để sử dụng khám phá dịch vụ bên ngoài? –

+0

Không biết; do đó nhận xét và không trả lời. Đừng quan tâm đến Swarm; thích Mesosphere (Zookeeper) hoặc Kubernetes (Consul/Etcd?). Swarm có vẻ quá bị tấn công với nhau. –

Trả lời

2

Chỉ có một giải pháp từng phần ở đây. Vì vậy, khi đính kèm dịch vụ của bạn vào mạng lưới lớp phủ tùy chỉnh, bạn thực sự có quyền truy cập vào tính năng Khám phá dịch vụ tùy chỉnh của Docker. Tôi sẽ trình bày chi tiết tính năng kết nối mạng của chế độ Docker Swarm, trước khi cố gắng kết nối nó với vấn đề của bạn.

Tôi sẽ sử dụng thuật ngữ khác nhau của dịch vụnhiệm vụ, trong đó một dịch vụ có thể là elasticsearch, trong khi một nhiệm vụ là một đơn dụ của dịch vụ elasticsearch.

Docker mạng

Ý tưởng là cho mỗi dịch vụ bạn tạo, Docker gán một IP ảo (VIP), và một bí danh tùy chỉnh dns. Bạn có thể truy xuất VIP này bằng cách sử dụng lệnh docker service inspect myservice.

Nhưng, có hai chế độ để đính kèm dịch vụ vào mạng lớp phủ dnsrrVIP. Bạn có thể chọn các tùy chọn này bằng cách sử dụng các tùy chọn --endpoint-mode của docker service create.

Chế độ VIP (Tôi tin rằng đây là chế độ mặc định, hoặc ít nhất được sử dụng nhiều nhất), ảnh hưởng đến ip ảo đến bí danh dns của dịch vụ. Điều này có nghĩa rằng việc thực hiện nslookup servicename sẽ trả lại cho bạn một vip duy nhất, đằng sau hậu trường, sẽ được liên kết với một trong các vùng chứa của bạn theo kiểu vòng tròn. Tuy nhiên, cũng có một bí danh dns đặc biệt cho phép bạn truy cập tất cả các cá thể của bạn ips (tất cả các nhiệm vụ của bạn ips): tasks.myservice.

Vì vậy, ở chế độ VIP, bạn có thể truy xuất tất cả các tác vụ của mình bằng cách sử dụng một đơn giản nslookup tasks.myservice, trong đó myservice là tên dịch vụ.

Chế độ khác là dnsrr.Chế độ này chỉ đơn giản là loại bỏ VIP, và kết nối bí danh dns với các nhiệm vụ khác nhau (= trường hợp dịch vụ), theo cách vòng tròn. Bằng cách này, bạn chỉ cần thực hiện một số nslookup myservice để truy xuất các phiên bản dịch vụ khác nhau ip.

Cụm cụm tìm kiếm

Ok vì vậy trước hết tôi không thực sự quen thuộc với cách elasticsearch cho phép bạn nhóm. Từ những gì tôi hiểu từ câu hỏi của bạn, bạn cần khi chạy nhị phân elasticsearch, tặng nó như một tham số, địa chỉ của tất cả của các nút khác nó cần phải cụm với. Vì vậy, những gì tôi sẽ làm, là tạo ra một hình ảnh Elasticsearch tùy chỉnh, có lẽ dựa trên một thư viện mặc định, mà tôi sẽ thêm một tùy chỉnh Entrypoint mà trước hết sẽ chạy một kịch bản để lấy các nhiệm vụ khác ip.

Tôi muốn tin rằng ở trong chế độ VIP là thích hợp cho bạn, vì đó là bí danh tasks.myservice dns. Sau đó, bạn sẽ cần phải phân tích đầu ra để truy xuất các tác vụ ip (và có thể xóa của bạn). Sau đó, bạn sẽ có thể lưu chúng trong một biến môi trường tập tin cấu hình, hoặc sử dụng chúng như là một tùy chọn thời gian chạy cho nhị phân elasticsearch của bạn.

Sửa: Để tạo một mạng overlay tùy chỉnh, bạn sẽ cần phải sử dụng lệnh docker network create, và sử dụng --network tùy chọn docker service create

Đây là câu trả lời chủ yếu dựa trên Swarm mode networking documentation

+1

Điều này nghe có vẻ giống như một giải pháp hợp lệ, cảm ơn cho bài viết này, tôi sẽ thử nó sớm và cho bạn biết làm thế nào nó đi. –

+0

Bây giờ chạy một dịch vụ có tên là 'đàn hồi' với 3 bản sao, một trên mỗi máy sử dụng '--endpoint-mode vip', để kiểm tra điều này, tôi đang chạy bash theo một trong các container đàn hồi nhưng không thể có được bất cứ điều gì để giải quyết . Nếu tôi làm 'ping elastic' hoặc 'ping ' hoặc 'ping node02.elastic' (node02 là một trong những tên máy), tôi nhận được 'không thể giải quyết máy chủ' cho tất cả các lệnh này. –

+0

@OrWeinberger Bạn cũng có thể phải tạo mạng của riêng mình bằng cách sử dụng 'mạng docker tạo mynet' và kết nối các dịch vụ của bạn với mạng này bằng cách sử dụng tùy chọn '--network' của dịch vụ docker create' – MagicMicky

Các vấn đề liên quan