Cách sử dụng mẫu Ambassador để cấu hình động các dịch vụ trên CoreOS
Tính năng Docker Links cho phép một phương pháp cấu hình động các kết nối mạng giữa các containers , được gọi là mẫu đại sứ . Mô hình đại sứ thúc đẩy tính khả chuyển của dịch vụ giữa nhà cung cấp và người tiêu dùng . Trong CoreOS,etcd
có thể được tận dụng để triển khai mô hình đại sứ được phân phối trên nhiều máy trong một cụm. Trong hướng dẫn này, ta sẽ chứng minh việc triển khai một containers Apache HTTP đã được đăng ký với etcd
. Vùng chứa Apache sẽ đại diện cho containers nhà cung cấp của ta và ta sẽ sử dụng HAProxy làm containers dành cho người tiêu dùng của bạn . Ta sẽ sử dụng Docker image từ bản demo đại sứ CoreOS này cho các containers đại sứ của ta và ta sẽ tạo hình ảnh Apache và HAProxy Docker của riêng mình từ đầu.
Yêu cầu
Bạn phải có một cụm CoreOS trên DigitalOcean bao gồm ít nhất ba máy. Đây là hướng dẫn về cách cài đặt điều đó: Cách tạo và chạy dịch vụ trên cụm CoreOS
Bạn phải có kiến thức cơ bản về sử dụng CoreOS, etcdctl, flectl, cài đặt dịch vụ và chạy containers Docker. Các chủ đề này được đề cập trong loạt bài hướng dẫn Bắt đầu với CoreOS .
Bạn phải có account Docker Hub hoặc register Docker riêng. Điều này được đề cập trong phần Tạo containers Docker của hướng dẫn Cách tạo và chạy dịch vụ trên CoreOS Cluster .
Để biết chi tiết đầy đủ về cách hoạt động của mẫu đại sứ, hãy xem Liên kết qua bài viết Vùng chứa đại sứ từ Docker. Ngoài ra, hãy xem bài viết này được đăng trên blog CoreOS: Liên kết Dynamic Docker với một đại sứ được cung cấp bởi etcd .
Mục tiêu của ta
Ở phần cuối của hướng dẫn này, ta sẽ có sáu container chạy trên hai máy. Phần này sẽ cung cấp mô tả ngắn gọn về từng loại và cách chúng được group lại với nhau. Cài đặt chính xác này không hữu ích cho hầu hết mọi người, nhưng nó có thể được điều chỉnh để cho phép khám phá dịch vụ động cho các dịch vụ của bạn .
Máy A
Máy A sẽ chạy containers của nhà cung cấp, tức là web server Apache và một vài containers khác sẽ hỗ trợ nó.
- Server Web Apache : Một containers Apache cơ bản mà ta sẽ tạo từ đầu, tương tự như containers được mô tả trong hướng dẫn Cách tạo và Chạy Dịch vụ trên CoreOS Cluster . Đây là nhà production của ta
- polvi / docker-register : Một vùng chứa đăng ký sẽ đọc địa chỉ IP và cổng của Apache thông qua API Docker và ghi nó vào
etcd
- polvi / simple-amb : Một container đại sứ đơn giản sẽ chuyển tiếp lưu lượng truy cập đến một vị trí cụ thể. Trong trường hợp này, ta sẽ chuyển tiếp lưu lượng truy cập tới
etcd
và liên kết nó với containersetcd
docker-register
để cung cấp quyền truy cập containers đó vàoetcd
. Trong CoreOS, vì vị trí củaetcd
là tĩnh, điều này có thể bị xóa nếudocker-register
etcd
được sửa đổi để truy cập trực tiếp vàoetcd
Máy B
Máy B là máy CoreOS sẽ chạy containers người tiêu dùng, tức là HAProxy và containers đại sứ chính.
- HAProxy Reverse Proxy : Một containers HAProxy cơ bản mà ta sẽ tạo từ đầu, sẽ đại diện cho người tiêu dùng của ta . Điều này sẽ được sử dụng để chứng minh rằng cài đặt đại sứ hoạt động
- polvi / dynamic-etcd-amb : Hộp chứa đại sứ chính.Một proxy động xem một khóa
etcd
được chỉ định cho địa chỉ IP và cổng của containers nhà cung cấp và định tuyến tất cả lưu lượng truy cập đến containers của nhà cung cấp. Giá trị của khóa có thể được cập nhật và proxy sẽ tự cập nhật - polvi / simple-amb : Cùng một containers được sử dụng trên máy khác, nhưng được sử dụng để liên kết
dynamic-etcd-amb
vớietcd
Tạo hình ảnh Apache Docker
SSH tới một trong các máy CoreOS của bạn và chuyển đại lý SSH của bạn (thay thế trong địa chỉ IP công cộng):
ssh -A core@coreos-1_public_IP
Sau đó đăng nhập vào Docker:
docker login
Nhập user_name , password và địa chỉ email của bạn khi được yêu cầu .
Tiếp theo, tạo một folder mới để ghi Apache Docker file vào:
mkdir -p ambassador/apache
Bây giờ thay đổi folder và mở Dockerfile
để chỉnh sửa:
cd ambassador/apache vi Dockerfile
Dựa trên cài đặt containers Apache từ Cách tạo và chạy dịch vụ trên cụm CoreOS , ta có thể tạo Dockerfile sau (thay thế user_name
bằng tên user Docker của bạn ):
FROM ubuntu:14.04 MAINTAINER user_name RUN apt-get update && \ DEBIAN_FRONTEND=noninteractive apt-get -y install apache2 && \ echo "<h1>Running from Docker on CoreOS</h1>" > /var/www/html/index.html EXPOSE 80 ENTRYPOINT ["/usr/sbin/apache2ctl"] CMD ["-D", "FOREGROUND"]
Lưu và thoát.
Bây giờ ta có một file Dockerfile cài đặt Apache và thay thế index.html bằng một thông báo cơ bản, hãy xây dựng Docker image của bạn và đặt tên cho nó là “apache” bằng lệnh sau (thay thế tên user của bạn ):
docker build --tag="user_name/apache" .
Bây giờ, để cung cấp hình ảnh cho các máy CoreOS khác của bạn, hãy push
nó vào register Docker của bạn bằng lệnh sau:
docker push user_name/apache
Bây giờ hình ảnh Apache của bạn đã sẵn sàng để sử dụng. Hãy chuyển sang tạo một hình ảnh HAProxy.
Tạo hình ảnh HAProxy Docker
Ta sẽ tạo một hình ảnh HAProxy Docker, dựa trên HAproxy Dockerfile cho các bản dựng Docker tự động tin cậy . Ta sẽ sửa đổi một chút các haproxy.cfg
và start.bash
được cung cấp.
Trong folder ambassador
, sử dụng git
để sao chép repository HAProxy:
cd ~/ambassador git clone https://github.com/dockerfile/haproxy.git
Thao tác này sẽ tạo một folder haproxy
, với các Dockerfile
, haproxy.cfg
và start.bash
.
Dockerfile về cơ bản cài đặt HAProxy và để lộ các cổng 80 và 443, vì vậy ta có thể để nguyên như vậy.
Ta sẽ sửa đổi file haproxy.cfg
để thêm frontend
và backend
. Mở haproxy.cfg
để chỉnh sửa:
cd haproxy vi haproxy.cfg
Bây giờ, hãy tìm và xóa các dòng sau:
listen stats :80 stats enable stats uri /
Sau đó, thêm các dòng sau vào cuối file :
frontend www-http bind :80 default_backend www-backend backend www-backend server apache private_ipv4:80 check
Điều này cấu hình HAProxy để lắng nghe trên cổng 80 và chuyển tiếp lưu lượng đến tới www-backend
, bao gồm một server duy nhất. Ta sẽ sử dụng tập lệnh start.bash
để thay thế private_ipv4
bằng địa chỉ IP riêng của máy CoreOS mà containers này sẽ chạy trên đó, khi containers HAProxy khởi động. Vùng chứa đại sứ động của ta , mà HAProxy sẽ chuyển tiếp lưu lượng truy cập qua containers Apache, sẽ chạy trên cùng một máy.
Mở file start.bash
để chỉnh sửa:
vi start.bash
Ở cuối file , bạn sẽ tìm thấy một dòng sẽ bắt đầu quá trình HAProxy trong containers này. Nó trông như thế này:
haproxy -f /etc/haproxy/haproxy.cfg -p "$PIDFILE"
Ngay phía trên dòng này, hãy chèn các dòng sau:
# Set backend IP address to machine's private IP address PRIVATE_IPV4=$(curl -sw "\n" http://169.254.169.254/metadata/v1/interfaces/private/0/ipv4/address) sed -i -e "s/server apache private_ipv4:80 check/server apache ${PRIVATE_IPV4}:80 check/g" $HAPROXY/$CONFIG
Lưu và thoát. Lệnh curl
sẽ truy xuất địa chỉ IP riêng của máy mà containers sẽ chạy qua dịch vụ Siêu dữ liệu DigitalOcean. Lệnh sed
thay thế chuỗi private_ipv4
trong haproxy.cfg
bằng địa chỉ IP thực được truy xuất từ Siêu dữ liệu. Tập lệnh này chạy từ bên trong containers HAProxy, vì vậy địa chỉ IP riêng sẽ được cấu hình trong thời gian chạy.
Bây giờ ta đã sẵn sàng để xây dựng docker image HAProxy. Tạo Docker image của bạn và đặt tên nó là “haproxy” bằng lệnh sau (thay thế tên user của bạn ):
docker build --tag="user_name/haproxy" .
Bây giờ, để cung cấp hình ảnh cho các máy CoreOS khác của bạn, hãy push
nó vào register Docker của bạn bằng lệnh sau:
docker push user_name/haproxy
Hình ảnh HAProxy của bạn đã sẵn sàng để sử dụng. Ta đã sẵn sàng để viết các file đơn vị dịch vụ hạm đội của ta !
Tệp đơn vị dịch vụ của hạm đội
Bây giờ tất cả các Docker image bắt buộc đều có sẵn cho cụm CoreOS của ta , hãy bắt đầu làm việc trên các file cần thiết để triển khai containers của ta . Bởi vì ta đang sử dụng một cụm CoreOS, ta có thể tạo và lập lịch tất cả các file đơn vị dịch vụ group của ta từ một máy CoreOS duy nhất.
Ta sẽ tạo tất cả các file dịch vụ trong folder ~/ambassador
mà ta đã tạo trước đó, vì vậy hãy thay đổi folder đó ngay bây giờ:
cd ~/ambassador
apache.service
Đơn vị apache.service
sẽ chạy trên Server A.
Tệp dịch vụ đầu tiên ta sẽ tạo dành cho containers web server Apache, user_name/apache
. Mở một file có tên apache.service
để chỉnh sửa ngay bây giờ:
vi apache.service
Thêm các dòng sau (thay thế tên user Docker của bạn ở cả hai nơi):
[Unit] Description=Apache web server service [Service] EnvironmentFile=/etc/environment ExecStartPre=-/usr/bin/docker kill %n ExecStartPre=-/usr/bin/docker rm %n ExecStartPre=/usr/bin/docker pull user_name/apache ExecStart=/usr/bin/docker run --rm --name %n -p ${COREOS_PRIVATE_IPV4}::80 user_name/apache ExecStop=/usr/bin/docker stop -t 3 %n
Lưu và thoát. Đây là một file dịch vụ khá đơn giản khởi động Apache ở chế độ nền trước. Đặc biệt lưu ý là ta đang liên kết cổng 80 bên trong containers với một cổng động trên network interface riêng ( -p ${COREOS_PRIVATE_IPV4}::80
).
etcd-amb-apache.service
Đơn vị etcd-amb-apache.service
sẽ chạy trên Server A.
Tiếp theo, ta sẽ muốn tạo một file dịch vụ cho containers đại sứ đơn giản của ta ( simple-amb
) để cho phép containers đăng ký Apache truy cập vào etcd
. Mở một file có tên là etcd-amb-apache.service
ngay bây giờ:
vi etcd-amb-apache.service
Thêm các dòng sau:
[Unit] Description=Simple Apache ambassador After=apache.service BindsTo=apache.service [Service] ExecStartPre=-/usr/bin/docker kill %n ExecStartPre=-/usr/bin/docker rm %n ExecStart=/usr/bin/docker run --rm --name %n polvi/simple-amb 172.17.42.1:4001 ExecStop=/usr/bin/docker stop -t 3 %n [X-Fleet] X-ConditionMachineOf=apache.service
Lưu và thoát.
Các simple-amb
chứa chuyển tiếp tất cả lưu lượng mà nó nhận được trên cổng 10000 cho lập luận được cung cấp khi nó được bắt đầu, tức là 172.17.42.1:4001
, đó là etcd
's vị trí tiêu chuẩn trong CoreOS.
X-ConditionMachineOf=apache.service
cho hạm đội lên lịch điều này trên cùng một máy với Apache container, điều này rất quan trọng vì nó được sử dụng bởi docker-register
container để đăng ký địa chỉ IP và cổng mà Apache đang sử dụng để etcd
.
apache-docker-reg.service
Đơn vị apache-docker-reg.service
sẽ chạy trên Server A.
Hãy tạo file dịch vụ cho containers của ta để đăng ký địa chỉ IP và cổng của Apache trong etcd
, etcd
docker-register
. Mở file có tên apache-docker-reg.service
ngay bây giờ:
vi apache-docker-reg.service
Chèn các dòng sau:
[Unit] Description=Register Apache After=etcd-amb-apache.service BindsTo=etcd-amb-apache.service [Service] ExecStartPre=-/usr/bin/docker kill %n ExecStartPre=-/usr/bin/docker rm %n ExecStart=/usr/bin/docker run --link etcd-amb-apache.service:etcd -v /var/run/docker.sock:/var/run/docker.sock --rm polvi/docker-register apache.service 80 apache-A [X-Fleet] X-ConditionMachineOf=etcd-amb-apache.service
Lưu và thoát. Dưới đây là bảng phân tích các phần đáng chú ý của lệnh docker run
:
-
--link etcd-amb-apache.service:etcd
liên kết containers này với đại sứ đơn giản, sẽ được sử dụng để chuyển thông tin kết nối của Apache tớietcd
-
-v /var/run/docker.sock:/var/run/docker.sock
cho phép containers này xác định cổng động mà Apache đang ràng buộc thông qua API Docker của máy mà nó sẽ chạy. -
apache.service 80 apache-A
chuyển các đối số này vào containers . Hai đối số đầu tiên chỉ định tên và cổng của containers docker để tra cứu và đối số thứ ba chỉ định tên của khóaetcd
để ghi vào. Sau khi containers này khởi động, nó sẽ ghi cổng động và địa chỉ IP củaapache.service
vào khóa/services/apache-A/apache.service
.
X-ConditionMachineOf=etcd-amb-apache.service
yêu cầu hạm đội lên lịch điều này trên cùng một máy như containers đại sứ đơn giản, điều này rất quan trọng vì chúng được liên kết với liên kết Docker, để cung cấp cho containers đăng ký một cách tìm thấy etcd
.
etcd-amb-apache2.service
Đơn vị etcd-amb-apache2.service
sẽ chạy trên Server B.
Tạo file dịch vụ cho containers đại sứ đơn giản thứ hai của ta ( simple-amb
) sẽ cho phép containers đại sứ động truy cập vào etcd
. Mở một file có tên là etcd-amb-apache2.service
ngay bây giờ:
vi etcd-amb-apache2.service
Thêm các dòng sau:
[Unit] Description=Simple Apache ambassador 2 [Service] ExecStartPre=-/usr/bin/docker kill %n ExecStartPre=-/usr/bin/docker rm %n ExecStart=/usr/bin/docker run --rm --name %n polvi/simple-amb 172.17.42.1:4001 ExecStop=/usr/bin/docker stop -t 3 %n [X-Fleet] X-Conflicts=apache.service
Lưu và thoát.
Đây là file dịch vụ khá giống với etcd-amb-apache.service
ngoại trừ X-Conflicts=apache.service
yêu cầu hạm đội lên lịch trên một máy khác với containers Apache và nó sẽ được sử dụng để liên kết đại sứ động với etcd
.
apache-dyn-amb.service
Đơn vị apache-dyn-amb.service
sẽ chạy trên Server B.
Tạo file dịch vụ cho containers đại sứ động của ta ( dynamic-etd-amb
) sẽ cho phép containers đại sứ động truy cập vào etcd
. Mở file có tên apache-dyn-amb.service
ngay bây giờ:
vi apache-dyn-amb.service
Thêm các dòng sau:
[Unit] Description=Dynamic ambassador for Apache After=etcd-amb-apache2.service BindsTo=etcd-amb-apache2.service [Service] EnvironmentFile=/etc/environment ExecStartPre=-/usr/bin/docker kill %n ExecStartPre=-/usr/bin/docker rm %n ExecStartPre=/usr/bin/docker pull polvi/dynamic-etcd-amb ExecStart=/usr/bin/docker run --link etcd-amb-apache2.service:etcd --rm --name %n -p ${COREOS_PRIVATE_IPV4}:80:80 polvi/dynamic-etcd-amb apache-A 80 ExecStop=/usr/bin/docker stop -t 3 %n [X-Fleet] X-ConditionMachineOf=etcd-amb-apache2.service
Lưu và thoát. Dưới đây là bảng phân tích các phần đáng chú ý của lệnh docker run
:
-
--link etcd-amb-apache2.service:etcd
liên kết containers này với đại sứ đơn giản thứ hai, sẽ được sử dụng để truy xuất thông tin kết nối của Apache từetcd
-
-p ${COREOS_PRIVATE_IPV4}:80:80
hiển thị cổng 80 trên containers và network interface riêng của máy -
apache-A 80
là hai đối số chỉ định rằng lưu lượng cổng 80 (tức là cổng 80 trên network interface riêng) nên được ủy quyền cho dịch vụ được đăng ký làapache-A
trongetcd
X-ConditionMachineOf=etcd-amb-apache2.service
cho hạm đội lập lịch trình này trên cùng một máy như containers đại sứ đơn giản thứ hai, điều này rất quan trọng vì chúng được liên kết với liên kết Docker, để cung cấp cho containers đại sứ động một cách tìm thấy etcd
.
haproxy.service
Đơn vị haproxy.service
sẽ chạy trên Server B.
Tạo file dịch vụ cho containers HAProxy ( haproxy
) của ta sẽ được sử dụng để kết nối với containers Apache, thông qua containers đại sứ động. Mở file có tên haproxy.service
ngay bây giờ:
vi haproxy.service
Thêm các dòng sau (thay thế tên user Docker của bạn ở cả hai nơi):
[Unit] Description=HAProxy consumer [Service] EnvironmentFile=/etc/environment ExecStartPre=-/usr/bin/docker kill %n ExecStartPre=-/usr/bin/docker rm %n ExecStartPre=/usr/bin/docker pull user_name/haproxy ExecStart=/usr/bin/docker run --name %n -p ${COREOS_PUBLIC_IPV4}:80:80 user_name/haproxy ExecStop=/usr/bin/docker stop -t 3 %n [X-Fleet] X-ConditionMachineOf=apache-dyn-amb.service
Lưu và thoát. Đây là một file dịch vụ đơn giản, khởi động HAProxy và hiển thị cổng 80 trên địa chỉ IP công cộng của server của nó. Lưu ý server backend sẽ được cấu hình thành địa chỉ IP riêng của server trên cổng 80, đây sẽ là nơi mà đại sứ động đang lắng nghe lưu lượng truy cập tới proxy đến dịch vụ Apache.
X-ConditionMachineOf=apache-dyn-amb.service
yêu cầu đội xe lên lịch cho việc này trên cùng một máy với containers đại sứ động, điều này rất quan trọng vì đại sứ động cung cấp cho containers HAProxy một tuyến đường để đến containers Apache.
Triển khai với hạm đội
Bây giờ ta có tất cả các file dịch vụ hạm đội cần thiết, cuối cùng ta có thể triển khai cài đặt đại sứ của bạn . Trong folder chứa tất cả các file dịch vụ của bạn, hãy chạy các lệnh sau:
fleetctl start apache.service fleetctl start etcd-amb-apache.service fleetctl start apache-docker-reg.service fleetctl start etcd-amb-apache2.service fleetctl start apache-dyn-amb.service fleetctl start haproxy.service
Bạn sẽ thấy các thông báo nói rằng mỗi dịch vụ đã được tải. Để kiểm tra trạng thái của các đơn vị hạm đội của bạn, hãy chạy lệnh sau:
fleetctl list-units
Bạn sẽ thấy kết quả tương tự như sau:
UNIT MACHINE ACTIVE SUB apache-docker-reg.service ceb3ead2.../10.132.233.107 active running apache-dyn-amb.service 3ce87ca7.../10.132.233.106 active running apache.service ceb3ead2.../10.132.233.107 active running etcd-amb-apache.service ceb3ead2.../10.132.233.107 active running etcd-amb-apache2.service 3ce87ca7.../10.132.233.106 active running haproxy.service 3ce87ca7.../10.132.233.106 active running
Tất cả các trạng thái phải active
và running
. Một điều nữa cần lưu ý là các đơn vị “Máy A” phải nằm trên cùng một máy và các đơn vị “Máy B” phải nằm trên một máy khác – chỉ cần xem địa chỉ IP của từng máy để xác nhận điều này.
Kiểm tra cài đặt của bạn
Đảm bảo HAProxy có thể tiếp cận Apache
Vì ta không chỉ định rằng containers HAProxy sẽ chạy trên một máy cụ thể, ta cần tìm nơi nó đang chạy. Một cách dễ dàng để làm điều này là sử dụng lệnh fleetctl ssh
:
fleetctl ssh haproxy.service
Thao tác này sẽ kết nối bạn với máy đang chạy containers haproxy.service
. Đến đây bạn có thể nguồn file /etc/environment
để lấy địa chỉ IP công cộng của máy CoreOS đang chạy HAProxy:
. /etc/environment echo $COREOS_PUBLIC_IPV4
Lấy địa chỉ IP kết quả và truy cập địa chỉ đó bằng trình duyệt web. Bạn sẽ thấy hình ảnh sau:
Lưu ý bạn đang truy cập HAProxy và HAProxy đang truy cập Apache thông qua proxy đại sứ động.
Đến đây bạn có thể thoát phiên SSH hiện tại để quay lại phiên SSH ban đầu của bạn :
exit
Kiểm tra dự phòng
Đến đây bạn đã xác nhận cài đặt apache.service
hoạt động, hãy xem điều gì sẽ xảy ra khi dịch vụ nhà cung cấp ( apache.service
) thay đổi địa chỉ IP và cổng của nó.
Sử dụng fleetctl
để kết nối với máy đang chạy apache.service
:
fleetctl ssh apache.service
Bây giờ khởi động lại máy Apache đang chạy:
sudo reboot
Lưu ý: Nếu apache.service
đang chạy trên máy mà bạn đã kết nối ban đầu qua SSH, bạn sẽ bị ngắt kết nối. Nếu đúng như vậy, chỉ cần SSH cho một máy khác của bạn trong cùng một cụm CoreOS.
Bây giờ, hãy đợi một phút và kiểm tra xem đơn vị nào đang chạy:
fleetctl list-units
Tùy thuộc vào thời gian bạn đã đợi, bạn có thể thấy ba đơn vị liên quan đến “ Server A” ( apache.service
, etcd-amb-apache.service
và apache-docker-reg.service
) đang khởi động lại hoặc hoạt động. Cuối cùng, tất cả chúng sẽ trở lại trạng thái hoạt động . Sau khi chúng hoạt động, hãy lưu ý chúng hiện đang chạy trên một máy khác với trước đây.
Bây giờ quay lại trình duyệt web đang kết nối với HAProxy và nhấn refresh. Bạn sẽ thấy trang kiểm tra tương tự như trước đây, cho biết HAProxy vẫn có thể kết nối với Apache thông qua đại sứ động!
Kết luận
Đến đây bạn đã cài đặt mẫu đại sứ của riêng mình, bạn có thể điều chỉnh các khái niệm được trình bày trong hướng dẫn này cho các dịch vụ của bạn . Đó là một cách độc đáo để cấu hình các dịch vụ tiêu dùng của bạn trong thời gian chạy, cho phép bạn di chuyển các dịch vụ của nhà cung cấp backend giữa các máy một cách dễ dàng. Trong một cài đặt thực tế hơn, bạn có thể sẽ thay thế dịch vụ Apache bằng một hoặc nhiều containers ứng dụng và bạn có thể cấu hình HAProxy với nhiều server backend (hoặc sử dụng một dịch vụ tiêu dùng hoàn toàn khác).
Các tin liên quan