Cách cấu hình một cụm Mesosphere sẵn sàng sản xuất trên Ubuntu 14.04
Mesosphere là một hệ thống kết hợp một số thành phần để quản lý hiệu quả việc phân cụm server và các triển khai có tính khả dụng cao trên lớp hệ điều hành hiện có. Không giống như các hệ thống như CoreOS, Mesosphere không phải là một hệ điều hành chuyên biệt và thay vào đó là một tập hợp các gói.Trong hướng dẫn này, ta sẽ xem xét cách cấu hình một cụm khả dụng cao trong Mesosphere. Cấu hình này sẽ cài đặt cho ta khả năng chuyển đổi dự phòng trong trường hợp bất kỳ nút chính nào của ta gặp sự cố cũng như một group các server slaver để xử lý các việc được lên lịch.
Ta sẽ sử dụng server Ubuntu 14.04 cho hướng dẫn này.
Yêu cầu và Mục tiêu
Trước khi hoàn thành hướng dẫn này, bạn nên xem lại phần giới thiệu của ta về Mesosphere . Đây là một cách tốt để làm quen với các thành phần mà hệ thống bao gồm và hỗ trợ bạn xác định những gì mỗi đơn vị chịu trách nhiệm.
Trong hướng dẫn này, ta sẽ sử dụng sáu server Ubuntu. Điều này đáp ứng khuyến nghị của Apache Mesos về việc có ít nhất ba bản root cho môi trường production . Nó cũng cung cấp một group ba server công nhân hoặc server slaver , sẽ được giao công việc khi các nhiệm vụ được gửi đến cụm.
 Sáu  server  mà  ta  sẽ sử dụng sẽ sử dụng zookeeper để theo dõi người đứng đầu hiện tại của các  server  chính. Lớp Mesos, được xây dựng trên lớp này, sẽ cung cấp đồng bộ hóa phân tán và xử lý tài nguyên. Nó chịu trách nhiệm quản lý cụm. Marathon, hệ thống init phân tán của cụm, được sử dụng để lên lịch tác vụ và chuyển giao công việc cho các  server   slaver .
Vì lợi ích của hướng dẫn này, ta sẽ giả định máy của ta có cấu hình sau:
| Tên server | Chức năng | Địa chỉ IP | 
|---|---|---|
| master1 | Bậc thầy của Mesos | 192.0.2.1 | 
| master2 | Bậc thầy của Mesos | 192.0.2.2 | 
| master3 | Bậc thầy Mesos | 192.0.2.3 | 
| slaver 1 | Slaver Mesos | 192.0.2.51 | 
| slaver 2 | Slaver Mesos | 192.0.2.52 | 
| slaver 3 | Slaver Mesos | 192.0.2.53 | 
Mỗi máy này phải được cài đặt Ubuntu 14.04. Bạn cần hoàn thành các mục cấu hình cơ bản được liệt kê trong hướng dẫn cài đặt server ban đầu Ubuntu 14.04 của ta .
Khi bạn hoàn tất các bước trên, hãy tiếp tục với hướng dẫn này.
Cài đặt Mesosphere trên Server
Bước đầu tiên để cài đặt và chạy cụm của bạn là cài đặt phần mềm. May mắn là dự án Mesosphere duy trì một repository Ubuntu với các gói cập nhật dễ cài đặt.
Thêm Kho lưu trữ Mesosphere vào Server của bạn
Trên tất cả các server (chủ và slaver ), hãy hoàn thành các bước sau.
Đầu tiên, thêm repository Mesosphere vào danh sách nguồn của bạn. Quá trình này liên quan đến việc download khóa của dự án Mesosphere từ server khóa Ubuntu và sau đó tạo URL chính xác cho bản phát hành Ubuntu của ta . Dự án cung cấp một cách thuận tiện để làm điều này:
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv E56151BF DISTRO=$(lsb_release -is | tr '[:upper:]' '[:lower:]') CODENAME=$(lsb_release -cs) echo "deb http://repos.mesosphere.io/${DISTRO} ${CODENAME} main" | sudo tee /etc/apt/sources.list.d/mesosphere.list Cài đặt các thành phần cần thiết
Sau khi bạn đã thêm repository Mesosphere vào hệ thống của bạn , bạn phải cập nhật cache ẩn gói local để có quyền truy cập vào thành phần mới:
sudo apt-get -y update Tiếp theo, bạn cần cài đặt các gói cần thiết. Các thành phần bạn cần sẽ phụ thuộc vào role của server .
 Đối với  server  tổng thể của bạn, bạn cần có mesosphere gói meta. Điều này bao gồm các ứng dụng quản lý sở zookeeper , mesos , marathon và chronos :
sudo apt-get install mesosphere Đối với các  server   slaver  của bạn, bạn chỉ cần gói mesos , gói này cũng kéo zookeeper coi zookeeper như một phụ thuộc:
sudo apt-get install mesos Cài đặt thông tin kết nối Zookeeper cho Mesos
 Điều đầu tiên  ta  sẽ làm là  cấu hình  thông tin kết nối zookeeper của  ta . Đây là lớp bên dưới cho phép tất cả các  server  của  ta  kết nối với đúng  server  chính, vì vậy, bắt đầu ở đây là hợp lý.
  Server  chính của  ta  sẽ là thành viên duy nhất trong cụm zookeeper của  ta , nhưng tất cả các  server  của  ta   cần  một số cấu hình để có thể giao tiếp bằng giao thức. Tệp xác định điều này là /etc/mesos/zk .
Trên tất cả các server của bạn, hãy hoàn thành bước sau. Mở file với quyền root:
sudo nano /etc/mesos/zk Bên trong, bạn sẽ thấy URL kết nối được đặt theo mặc định để truy cập một version local . Nó sẽ trông giống thế này:
zk://localhost:2181/mesos  Ta  cần sửa đổi điều này để trỏ đến ba  server  chính của  ta . Điều này được thực hiện bằng cách thay thế localhost bằng địa chỉ IP của  server  chính Mesos đầu tiên của  ta . Sau đó,  ta  có thể thêm dấu phẩy sau đặc điểm kỹ thuật cổng và sao chép định dạng để thêm bản chính thứ hai và thứ ba của  ta  vào danh sách.
 Đối với hướng dẫn của  ta , các bậc thầy của  ta  có địa chỉ IP là 192.0.2.1 , 192.168.2.2 và 192.168.2.3 . Sử dụng các giá trị này, file  của  ta  sẽ trông giống như sau:
zk://192.0.2.1:2181,192.0.2.2:2181,192.0.2.3:2181/mesos Dòng phải bắt đầu bằng zk:// và kết thúc bằng /mesos . Ở giữa, địa chỉ IP của  server  chính và cổng của zookeeper ( 2181 theo mặc định) được chỉ định.
Lưu file khi bạn hoàn tất.
Sử dụng mục nhập giống hệt này trong mỗi chủ nhân và slaver của bạn. Điều này sẽ giúp từng server riêng lẻ kết nối với đúng server chính để giao tiếp với cụm.
Cấu hình Zookeeper của Server Chính
 Trên  server  chính của bạn,  ta   cần  thực hiện thêm một số cấu hình zookeeper .
 Bước đầu tiên là xác định một số ID duy nhất, từ 1 đến 255, cho mỗi  server  chính của bạn. Điều này được lưu trong file  /etc/zookeeper/conf/myid . Mở nó bây giờ:
sudo nano /etc/zookeeper/conf/myid Xóa tất cả thông tin trong file này và thay thế bằng một số duy nhất, từ 1 đến 255. Mỗi server chính của bạn phải có một số duy nhất. Vì đơn giản, dễ nhất là bắt đầu từ số 1 và làm việc theo cách của bạn. Ta sẽ sử dụng 1, 2 và 3 cho hướng dẫn của ta .
Server đầu tiên của ta sẽ chỉ có cái này trong file :
1 Lưu file khi bạn hoàn tất. Thực hiện việc này trên từng server chính của bạn.
 Tiếp theo,  ta  cần sửa đổi file  cấu hình zookeeper  của bạn  để ánh xạ ID zookeeper của  ta  với các vật chủ thực tế. Điều này sẽ  đảm bảo  dịch vụ có thể phân giải chính xác từng  server  từ hệ thống ID mà nó sử dụng.
 Mở file  cấu hình zookeeper ngay bây giờ:
sudo nano /etc/zookeeper/conf/zoo.cfg Trong file  này, bạn cần ánh xạ từng ID với một  server . Thông số kỹ thuật của  server  sẽ bao gồm hai cổng, cổng thứ nhất để giao tiếp với người lãnh đạo và cổng thứ hai để xử lý các cuộc bầu cử khi cần có người lãnh đạo mới. Các  server  của zookeeper được xác định bằng “ server ”, theo sau là dấu chấm và số ID của chúng.
Đối với hướng dẫn của ta , ta sẽ sử dụng các cổng mặc định cho từng chức năng và ID của ta là 1-3. Tệp của ta sẽ trông như thế này:
server.1=192.168.2.1:2888:3888 server.2=192.168.2.2:2888:3888 server.3=192.168.2.3:2888:3888 Thêm các ánh xạ tương tự này trong mỗi file cấu hình của server chính của bạn. Lưu và đóng từng file khi bạn hoàn tất.
  Như vậy,  cấu hình zookeeper của  ta  đã hoàn tất.  Ta  có thể bắt đầu tập trung vào Mesos và Marathon.
Cấu hình Mesos trên Server Chính
Tiếp theo, ta sẽ cấu hình Mesos trên ba server chính. Các bước này phải được thực hiện trên từng server chính của bạn.
Sửa đổi số đại biểu để phản ánh kích thước cụm của bạn
Đầu tiên, ta cần điều chỉnh túc số cần thiết để đưa ra quyết định. Điều này sẽ xác định số lượng server cần thiết để cụm ở trạng thái hoạt động.
Số đại biểu phải được cài đặt sao cho trên 50 phần trăm thành viên chính phải có mặt để đưa ra quyết định. Tuy nhiên, ta cũng muốn xây dựng trong một số khả năng chịu lỗi để nếu tất cả các master của ta không có mặt, cụm vẫn có thể hoạt động.
Ta có ba bậc thầy, vì vậy cài đặt duy nhất đáp ứng cả hai yêu cầu này là túc số hai. Vì cấu hình ban đầu giả định một cài đặt server duy nhất, số đại biểu hiện được đặt thành một.
Mở file cấu hình túc số:
sudo nano /etc/mesos-master/quorum Thay đổi giá trị thành “2”:
2 Lưu và đóng file . Lặp lại điều này trên mỗi server chính của bạn.
Cấu hình Tên server và Địa chỉ IP
Tiếp theo, ta sẽ chỉ định tên server và địa chỉ IP cho từng server chính của ta . Ta sẽ sử dụng địa chỉ IP cho tên server để các version của ta không gặp sự cố khi phân giải chính xác.
Đối với server chính của ta , địa chỉ IP cần được đặt trong các file sau:
- / etc / mesos-master / ip
- / etc / mesos-master / hostname
 Đầu tiên, thêm địa chỉ IP riêng của từng nút chính trong file  /etc/mesos-master/ip . Hãy nhớ thay đổi điều này cho từng  server  để  trùng với  giá trị thích hợp:
echo 192.168.2.1 | sudo tee /etc/mesos-master/ip Bây giờ, ta có thể sao chép giá trị này vào file tên server :
sudo cp /etc/mesos-master/ip /etc/mesos-master/hostname Thực hiện việc này trên từng server chính của bạn.
Cấu hình Marathon trên Server Chính
Bây giờ Mesos đã được cấu hình, ta có thể cấu hình Marathon, triển khai hệ thống init được phân cụm của Mesosphere.
Marathon sẽ chạy trên mỗi server chính của ta , nhưng chỉ server chính hàng đầu mới có thể thực sự lên lịch công việc. Các version Marathon khác sẽ yêu cầu proxy một cách minh bạch đến server chính.
Đầu tiên, ta cần đặt lại tên server cho từng version Marathon của server . , ta sẽ sử dụng địa chỉ IP mà ta đã có trong một file . Ta có thể sao chép nó vào vị trí file ta cần.
Tuy nhiên, cấu trúc folder cấu hình Marathon ta cần không được tạo tự động. Ta sẽ phải tạo folder và sau đó ta có thể sao chép file qua:
sudo mkdir -p /etc/marathon/conf sudo cp /etc/mesos-master/hostname /etc/marathon/conf Tiếp theo,  ta  cần xác định danh sách các chủ sở zookeeper mà Marathon sẽ kết nối để biết thông tin và lên lịch. Đây là cùng một chuỗi kết nối của zookeeper mà  ta  đã sử dụng cho Mesos, vì vậy  ta  có thể sao chép file .  Ta  cần đặt nó vào một file  có tên là master :
sudo cp /etc/mesos/zk /etc/marathon/conf/master Điều này sẽ cho phép dịch vụ Marathon của  ta  kết nối với cụm Mesos. Tuy nhiên,  ta  cũng muốn Marathon lưu trữ thông tin trạng thái của chính nó trong zookeeper . Đối với điều này,  ta  sẽ sử dụng file  kết nối zookeeper khác làm cơ sở và chỉ cần sửa đổi điểm cuối.
Đầu tiên, sao chép file vào vị trí của người giữ vườn thú Marathon:
sudo cp /etc/marathon/conf/master /etc/marathon/conf/zk Tiếp theo, mở file trong editor :
sudo nano /etc/marathon/conf/zk Phần duy nhất  ta  cần sửa đổi trong file  này là điểm cuối.  Ta  sẽ thay đổi nó từ /mesos thành /marathon :
zk://192.0.2.1:2181,192.0.2.2:2181,192.0.2.3:2181/marathon Đây là tất cả những gì ta cần làm cho cấu hình Marathon của bạn .
Cấu hình Luật Init Dịch vụ và Khởi động lại Dịch vụ
Tiếp theo, ta sẽ khởi động lại các dịch vụ của server chính để sử dụng các cài đặt mà ta đã cấu hình .
Trước tiên, ta cần đảm bảo các server chính của ta chỉ đang chạy quy trình chính của Mesos và không chạy quy trình slaver . Ta có thể dừng bất kỳ quy trình slaver hiện đang chạy nào (điều này có thể không thành công, nhưng không sao vì điều này chỉ đảm bảo quy trình được dừng lại). Ta cũng có thể đảm bảo server không bắt đầu quá trình slaver khi khởi động bằng cách tạo file overrides :
sudo stop mesos-slave echo manual | sudo tee /etc/init/mesos-slave.override Bây giờ, tất cả những gì  ta  cần làm là khởi động lại zookeeper , việc này sẽ  cài đặt  cuộc bầu cử tổng thể của  ta . Sau đó,  ta  có thể bắt đầu các quy trình Mesos master và Marathon:
sudo restart zookeeper sudo start mesos-master sudo start marathon Để đạt được đỉnh cao với những gì bạn vừa  cài đặt , hãy truy cập một trong các  server  chính của bạn trong  trình duyệt web  tại cổng 5050 :
http://192.168.2.1:5050 Bạn sẽ thấy giao diện Mesos chính. Bạn có thể được thông báo rằng bạn đang được chuyển hướng đến chủ hoạt động tùy thuộc vào việc bạn có kết nối với người lãnh đạo được bầu hay không. Dù bằng cách nào, màn hình sẽ trông giống như sau:
Đây là chế độ xem cụm của bạn hiện tại. Không có nhiều thứ để xem vì không có sẵn các node slaver và không có tác vụ nào được bắt đầu.
  Ta  cũng đã  cấu hình  Marathon, bộ điều khiển tác vụ hoạt động lâu dài của Mesosphere. Điều này sẽ có sẵn ở cổng 8080 trên bất kỳ trang chủ nào của bạn: 
Ta sẽ giới thiệu sơ qua về cách sử dụng các giao diện này sau khi ta cài đặt slaver của bạn .
Cấu hình server slaver
Bây giờ ta đã cấu hình các server chính, ta có thể bắt đầu cấu hình các server phụ của bạn .
  Ta  đã  cấu hình   slaver   của bạn  với thông tin kết nối zookeeper của  server  chính. Bản thân các  slaver  không điều hành các version  quản lý zookeeper của riêng họ.
  Ta  có thể dừng bất kỳ quy trình quản lý zookeeper nào hiện đang chạy trên  các node   slaver  của  ta  và tạo file  overrides  để nó không tự động khởi động khi  server  khởi động lại:
sudo stop zookeeper echo manual | sudo tee /etc/init/zookeeper.override Tiếp theo, ta muốn tạo một file overrides khác đảm bảo quy trình tổng thể Mesos không bắt đầu trên các server slaver của ta . Ta cũng sẽ đảm bảo nó hiện đang dừng (lệnh này có thể không thành công nếu quá trình đã dừng. Đây không phải là vấn đề):
echo manual | sudo tee /etc/init/mesos-master.override sudo stop mesos-master Tiếp theo,  ta  cần đặt địa chỉ IP và tên  server , giống như  ta  đã làm cho các  server  chính  của bạn . Điều này liên quan đến việc đưa địa chỉ IP của mỗi nút vào một file , lần này là trong folder  /etc/mesos-slave .  Ta  cũng sẽ sử dụng tên này làm tên  server  để dễ dàng truy cập vào các dịch vụ thông qua giao diện web:
echo 192.168.2.51 | sudo tee /etc/mesos-slave/ip sudo cp /etc/mesos-slave/ip /etc/mesos-slave/hostname , sử dụng địa chỉ IP riêng của từng server slaver cho lệnh đầu tiên. Điều này sẽ đảm bảo nó đang được liên kết với giao diện chính xác.
Bây giờ, ta có tất cả các phần để bắt đầu slaver Mesos của ta . Ta chỉ cần bật dịch vụ:
sudo start mesos-slave Làm điều này trên mỗi máy slaver của bạn.
 Để xem liệu các  slaver  của bạn có tự đăng ký thành công trong cụm của bạn hay không, hãy quay lại một trong các  server  chính của bạn tại cổng 5050 :
http://192.168.2.1:5050 Bạn sẽ thấy số lượng slaver đang hoạt động ở mức “3” ngay bây giờ trong giao diện:
Bạn cũng có thể thấy rằng các tài nguyên có sẵn trong giao diện đã được cập nhật để phản ánh tài nguyên tổng hợp của các máy phụ của bạn:
Để biết thêm thông tin về từng máy slaver của bạn, bạn có thể nhấp vào liên kết “Máy slaver ” ở đầu giao diện. Điều này sẽ cung cấp cho bạn cái nhìn tổng quan về đóng góp tài nguyên của từng máy, cũng như các liên kết đến một trang cho mỗi máy slaver :
Bắt đầu dịch vụ trên Mesos và Marathon
Marathon là tiện ích của Mesosphere để lên lịch cho các việc chạy dài. Có thể dễ dàng nghĩ Marathon là hệ thống init cho một cụm Mesosphere vì nó xử lý các dịch vụ bắt đầu và dừng, lên lịch tác vụ và đảm bảo các ứng dụng sẽ hoạt động trở lại nếu chúng gặp sự cố.
Bạn có thể thêm các dịch vụ và nhiệm vụ vào Marathon theo một vài cách khác nhau. Ta sẽ chỉ bao gồm các dịch vụ cơ bản. Vùng chứa Docker sẽ được xử lý trong một hướng dẫn trong tương lai.
Bắt đầu một Dịch vụ thông qua Giao diện Web
Cách dễ dàng nhất để dịch vụ chạy nhanh trên cụm là thêm ứng dụng thông qua giao diện web Marathon.
 Đầu tiên, hãy truy cập giao diện web Marathon trên một trong những  server  chính của bạn.  Lưu ý , giao diện Marathon có trên cổng 8080 :
http://192.168.2.1:8080 Từ đây, bạn có thể nhấp vào nút “Ứng dụng mới” ở góc trên bên phải. Thao tác này sẽ bật lên một lớp phủ nơi bạn có thể thêm thông tin về ứng dụng mới của bạn :
Điền vào các trường với các yêu cầu cho ứng dụng của bạn. Các trường duy nhất bắt buộc là:
- ID : Một ID duy nhất được user chọn để xác định một quy trình. Đây có thể là bạn muốn , nhưng phải là duy nhất.
- Lệnh : Đây là lệnh thực tế sẽ được chạy bởi Marathon. Đây là quá trình sẽ được theo dõi và khởi động lại nếu nó không thành công.
Sử dụng thông tin này, bạn có thể cài đặt một dịch vụ đơn giản chỉ in “xin chào” và ngủ trong 10 giây. Ta sẽ gọi điều này là “xin chào”:
Khi bạn quay lại giao diện, dịch vụ sẽ chuyển từ “Đang triển khai” sang “Đang chạy”:
 Cứ sau 10 giây hoặc lâu hơn, số đọc “Công việc / Sự việc” sẽ chuyển từ “1/1” thành “0/1” khi thời lượng ngủ trôi qua và dịch vụ dừng lại. Marathon sau đó sẽ tự động khởi động lại nhiệm vụ   .  Ta  có thể thấy quá trình này rõ ràng hơn trong giao diện web Mesos ở cổng 5050 :
http://192.168.2.1:5050 Tại đây, bạn có thể thấy quá trình kết thúc và được khởi động lại:
Nếu bạn nhấp vào “Sandbox” và sau đó “stdout” trên bất kỳ tác vụ nào, bạn có thể thấy kết quả “hello” đang được tạo:
Bắt đầu một Dịch vụ thông qua API
Ta cũng có thể gửi các dịch vụ thông qua API của Marathon. Điều này liên quan đến việc truyền một đối tượng JSON chứa tất cả các trường mà lớp phủ chứa.
 Đây là một quá trình tương đối đơn giản.   , các trường bắt buộc duy nhất là id cho mã định danh quy trình và cmd chứa lệnh thực để chạy.
 Vì vậy,  ta  có thể tạo một file  JSON có tên hello.json với thông tin sau:
nano hello.json Bên trong, thông số kỹ thuật tối thiểu trần sẽ trông như thế này:
{     "id": "hello2",     "cmd": "echo hello; sleep 10" } Dịch vụ này sẽ hoạt động tốt. Tuy nhiên, nếu ta thực sự muốn mô phỏng dịch vụ mà ta đã tạo trong giao diện user web, ta phải thêm một số trường bổ sung. Chúng đã được mặc định trong giao diện user web và ta có thể sao chép chúng tại đây:
{     "id": "hello2",     "cmd": "echo hello; sleep 10",     "mem": 16,     "cpus": 0.1,     "instances": 1,     "disk": 0.0,     "ports": [0] } Lưu file JSON khi bạn hoàn tất.
 Tiếp theo,  ta  có thể gửi nó bằng cách sử dụng API Marathon. Mục tiêu là một trong những dịch vụ Marathon bậc thầy của  ta  ở cổng 8080 và điểm cuối là /v2/apps . Tải trọng dữ liệu là file  JSON của  ta ,  ta  có thể đọc thành curl bằng cách sử dụng cờ -d với cờ @ để chỉ ra file .
Lệnh để gửi sẽ giống như sau:
curl -i -H 'Content-Type: application/json' -d@hello2.json 192.168.2.1:8080/v2/apps Nếu nhìn vào giao diện Marathon, ta có thể thấy rằng nó đã được thêm thành công. Nó dường như có các thuộc tính giống hệt như dịch vụ đầu tiên của ta :
Dịch vụ mới có thể được giám sát và truy cập theo cách giống hệt như dịch vụ đầu tiên.
Kết luận
Đến đây, bạn sẽ có một cụm Mesosphere sẵn sàng production và đang chạy. Ta mới chỉ đề cập đến cấu hình cơ bản tại thời điểm này, nhưng bạn có thể thấy các khả năng tận dụng hệ thống Mesosphere.
Trong các hướng dẫn trong tương lai, ta sẽ trình bày cách triển khai containers Docker trên cụm của bạn và cách sử dụng một số công cụ chuyên sâu hơn.
Các tin liên quan
Cách thiết lập DNSSEC trên server tên NSD trên Ubuntu 14.042014-09-25
Cách triển khai ứng dụng Meteor.js trên Ubuntu 14.04 với Nginx
2014-09-22
Cách cài đặt Drupal trên server Ubuntu 14.04 với Apache
2014-09-19
Cách cài đặt Discourse trên Ubuntu 14.04
2014-09-10
Cách sử dụng Reprepro cho Kho lưu trữ Gói Bảo mật trên Ubuntu 14.04
2014-09-10
Cách sử dụng Foreman để quản lý các node puppet trên Ubuntu 14.04
2014-09-08
Cách sử dụng phân phối giám sát mở với Check_MK trên Ubuntu 14.04
2014-09-08
Cách cài đặt và cấu hình một Daemon và Ứng dụng khách SNMP trên Ubuntu 14.04
2014-08-18
Cách bảo mật lãnh sự bằng mã hóa TLS trên Ubuntu 14.04
2014-08-15
Cách cấu hình Lãnh sự trong Môi trường Sản xuất trên Ubuntu 14.04
2014-08-15
 

