Chia Sẽ Kinh Nghiệm Về IT



Tìm Kiếm Với Google
-


Gởi Ðề Tài Mới  Gửi trả lời
 
Công Cụ Xếp Bài
Tuổi 19-02-2016, 09:43 AM   #1
hoctinhoc
Guest
 
Trả Lời: n/a
Làm thế nào để cài đặt và cấu hình Kubernetes trên đầu trang của một cụm sao CoreOS
Làm thế nào để cài đặt và cấu hình Kubernetes trên đầu trang của một cụm sao CoreOS





Giới thiệu
Kubernetes là một hệ thống được thiết kế để quản lý các ứng dụng được xây dựng trong vòng Docker container trên nhóm môi trường. Nó xử lý toàn bộ vòng đời của một ứng dụng container bao gồm việc triển khai và mở rộng quy mô.
Trong hướng dẫn này, chúng tôi sẽ chứng minh làm thế nào để bắt đầu với Kubernetes trên một cụm CoreOS. Hệ thống này sẽ cho phép chúng tôi nhóm các dịch vụ liên quan với nhau cho việc triển khai như một đơn vị trên một máy chủ duy nhất bằng cách sử dụng Kubernetes những gì gọi là “vỏ”. Nó cũng cung cấp sức khỏe kiểm tra chức năng, tính sẵn sàng cao và hiệu quả sử dụng nguồn tài nguyên.
Điều kiện tiên quyết và mục tiêu
Chúng tôi sẽ bắt đầu với các cụm CoreOS cơ bản cùng chúng tôi đã sử dụng trong trước CoreOS hướng dẫn. Để có được này cụm ba thành viên và chạy, hãy làm theo hướng dẫn kết cụm CoreOS của chúng tôi.
Điều này sẽ cung cấp cho bạn ba máy chủ cấu hình. Trong khi mỗi nút là hoán đổi cho nhau về cơ bản ở mức CoreOS, trong Kubernetes, chúng tôi sẽ cần phải gán vai trò chuyên biệt hơn. Chúng ta cần một nút để hoạt động như các bậc thầy, điều này sẽ chạy một vài dịch vụ bổ sung, chẳng hạn như một DIAPI server và một người quản lý điều khiển.
Hướng dẫn này, chúng tôi sẽ sử dụng các chi tiết sau đây:
Tên máy chủ khu vực IPv4 riêng IPv4 vai trò
coreos-1 192.168.2.1 10.120.0.1 Thạc sĩ
coreos-2 192.168.2.2 10.120.0.2 Minion1
coreos-3 192.168.2.3 10.120.0.3 Minion2
Trong cấu hình chúng tôi sẽ có sau, thầy cũng sẽ là một máy chủ đầy đủ chức năng minion có khả năng hoàn thành công việc. Ý tưởng cho cấu hình này được lấy từ Brian Ketelson hướng dẫn về cách thiết lập Kubernetes trên CoreOS ở đây.
Nếu bạn theo hướng dẫn ở trên để tạo ra cụm, etcd và hạm đội nên được cấu hình để sử dụng mỗi máy chủ riêng IPv4 để giao tiếp. Địa chỉ IP công cộng có thể được sử dụng để kết nối từ máy tính địa phương của bạn.
Hướng dẫn này sẽ đưa cụm sao này CoreOS cơ bản và cài đặt một số các dịch vụ trên đầu trang của nó.
Trước tiên, chúng tôi sẽ đặt cấu hình flannel, một lớp vải mạng cung cấp mỗi máy với một mạng con cá nhân cho container giao tiếp. Đây là một dự án CoreOS tương đối mới được thực hiện trong một phần lớn để thích ứng với Kubernetes giả định về môi trường mạng.
Chúng tôi sẽ đặt cấu hình Docker sử dụng lớp mạng này cho các triển khai. Ngày đầu này, chúng tôi sẽ thiết lập Kubernetes. Điều này bao gồm một số miếng. Chúng ta cần phải cấu hình một dịch vụ proxying, một lớp API, và một hệ thống quản lý cấp nút “pod” được gọi là Kubelet.
Tạo lớp vải Flannel mạng
Lần đầu tiên chúng ta cần làm là cấu hình dịch vụ flannel. Đây là phần cung cấp cá nhân mạng con cho mỗi máy tính trong cụm sao. Docker sẽ được cấu hình để sử dụng này cho các triển khai. Do đây là một yêu cầu cơ bản, nó là một nơi tuyệt vời để bắt đầu.
Tại thời điểm này bằng văn bản, không có không có những chương trình được xây dựng trước của flannel cung cấp bởi dự án. Do thực tế này, chúng tôi sẽ cần phải xây dựng nhị phân và cài đặt nó bản thân. Để tiết kiệm thời gian xây dựng, chúng tôi sẽ được xây dựng này trên một máy tính duy nhất và sau đó sau đó chuyển tập tin thực thi để các nút khác của chúng tôi.
Giống như nhiều nơi CoreOS, Flannel được xây dựng trong ngôn ngữ lập trình đi. Chứ không phải là thiết lập một môi trường hoàn toàn đi để xây dựng các gói phần mềm, chúng tôi sẽ sử dụng một container pre-xây dựng cho mục đích này. Google duy trì một container đi đặc biệt cho các loại tình huống.
Tất cả các ứng dụng mà chúng tôi sẽ cài đặt sẽ được đặt trong thư mục /opt/bin, mà không được tạo ra tự động trong CoreOS. Tạo thư mục bây giờ:
sudo mkdir -p/opt/bin
Bây giờ chúng ta có thể xây dựng dự án sử dụng container đi. Chỉ cần chạy lệnh này Docker để kéo hình ảnh từ Docker Hub, chạy các thùng chứa, và tải về và xây dựng các gói phần mềm bên trong container:
docker chạy -i -t google/golang/bin/bash -c “Hãy lấy github.com/coreos/flannel”
Khi chiến dịch hoàn tất, chúng tôi có thể sao chép nhị phân biên soạn ra khỏi các thùng chứa. Trước tiên, chúng ta cần phải biết container ID:
docker ps -l – q
Kết quả sẽ là ID trông như thế này:
004e7a7e4b70
Chúng tôi có thể dùng ID này để chỉ định một hoạt động sao chép vào thư mục /opt/bin. Nhị phân đã được đặt tại /gopath/bin/flannel trong các thùng chứa. Kể từ khi thư mục /opt/bin không phải là có thể ghi bởi người sử dụng lõi của chúng tôi, chúng tôi sẽ cần phải sử dụng sudo:
sudo docker cp 004e7a7e4b70: / gopath/bin/flannel/opt/bin /
Chúng tôi bây giờ có flannel có sẵn trên máy đầu tiên của chúng tôi. Một chút sau đó, chúng tôi sẽ sao chép điều này với các máy khác của chúng tôi.
Xây dựng những chương trình Kubernetes
Kubernetes bao gồm khá một vài ứng dụng khác nhau và lớp công nghệ. Hiện nay, các dự án không chứa những chương trình trước được xây dựng cho các thành phần khác nhau, chúng tôi cần. Chúng tôi sẽ xây dựng chúng mình thay vào đó.
Chúng tôi chỉ sẽ hoàn tất quá trình này trên một trong các máy chủ. Kể từ khi máy chủ của chúng tôi được thống nhất trong tự nhiên, chúng tôi có thể tránh không cần thiết xây dựng lần bằng cách chỉ đơn giản là chuyển giao những chương trình mà chúng tôi sẽ sản xuất.
Bước đầu tiên là để sao chép dự án từ kho GitHub. Chúng tôi sẽ sao chép nó vào thư mục nhà của chúng tôi:
CD ~
git clone https://github.com/GoogleCloudPlatform/kubernetes.git
Tiếp theo, chúng tôi sẽ đi vào xây dựng thư mục trong kho. Từ đây, chúng tôi có thể xây dựng những chương trình bằng cách sử dụng một kịch bản bao gồm:
CD kubernetes/xây dựng
./Make-binaries.sh
Quá trình này sẽ mất khá nhiều thời gian. Nó sẽ khởi động một container Docker để xây dựng các gói nhị phân cần thiết.
Khi quá trình xây dựng được hoàn thành, bạn sẽ có thể tìm thấy các tập tin nhị phân trong thư mục ~/kubernetes/_output/build/linux/amd64:
CD ~/kubernetes/_output/build/linux/amd64
ls
apiserver quản lý điều khiển kubecfg kubelet proxy trình lập lịch biểu
Chúng tôi sẽ chuyển chúng vào thư mục /opt/bin chúng tôi tạo ra trước đó:
sudo cp * / opt/bin
Máy đầu tiên của chúng tôi bây giờ có tất cả những chương trình cần thiết cho dự án của chúng tôi. Chúng tôi bây giờ có thể tập trung vào nhận được các ứng dụng trên các máy chủ khác.
Thực thi sang máy chủ khác của bạn
Máy đầu tiên của chúng tôi có tất cả các thành phần cần thiết để khởi động một cụm Kubernetes. Chúng tôi cần phải sao chép các máy của chúng tôi khác mặc dù trước khi điều này sẽ làm việc.
Vì Kubernetes không phải là một cài đặt thống nhất (đó là một Thạc sĩ và nhiều tay sai), mỗi máy chủ không cần tất cả các tập tin nhị phân. Mỗi máy chủ minion chỉ cần proxy, kubelet và flannel thực thi.
Tuy nhiên, chuyển giao tất cả các file thực thi cho chúng ta linh hoạt hơn xuống đường. Nó cũng dễ dàng hơn. Chúng tôi sẽ chuyển tất cả mọi thứ trong hướng dẫn này.
Khi bạn kết nối với máy tính đầu tiên của bạn, bạn nên có chuyển tiếp thông tin đại lý SSH của bạn bằng cách kết nối với cờ – một (sau khi bắt đầu các đại lý và thêm khóa của bạn). Đây là một bước quan trọng. Ngắt kết nối và kết nối lại nếu bạn đã không vượt qua lá cờ này trước đó.
Bắt đầu bằng cách di chuyển vào thư mục nơi mà chúng tôi đã đặt những chương trình của chúng tôi:


CD/opt/bin
Bây giờ, chúng tôi có thể sao chép các tập tin trong thư mục này để chúng tôi máy chủ khác. Chúng tôi sẽ làm điều này bằng tarring thực thi trực tiếp để chúng tôi vỏ ra tiêu chuẩn. Chúng tôi sẽ sau đó ống này vào chúng tôi lệnh SSH nơi chúng tôi sẽ kết nối với một trong các máy chủ khác của chúng tôi.
Lệnh SSH, chúng tôi sẽ sử dụng sẽ tạo/opt/bin thư mục trên các máy chủ khác của chúng tôi, thay đổi vào thư mục, và tar thông tin nhận được qua đường hầm SSH. Quyền chỉ huy toàn bộ trông như thế này:
Tar – czf –. | SSH core@192.168.2.2 “sudo mkdir -p/opt/bin; CD/opt/bin; sudo tar xzvf-“
Điều này sẽ chuyển tất cả các file thực thi để địa chỉ IP bạn chỉ định. Chạy lệnh một lần nữa bằng cách sử dụng máy chủ lưu trữ thứ ba:
Tar – czf –. | SSH core@192.168.2.3 “sudo mkdir -p/opt/bin; CD/opt/bin; sudo tar xzvf-“
Bây giờ bạn có tất cả các file thực thi tại chỗ trên của bạn máy ba.
Thiết lập dịch vụ dành riêng cho Master
Bước tiếp theo là để thiết lập các tập tin đơn vị systemd một cách chính xác cấu hình và khởi chạy các ứng dụng mới. Chúng tôi sẽ bắt đầu bằng cách xử lý các ứng dụng sẽ chỉ chạy trên máy chủ tổng thể của chúng tôi.
Chúng tôi sẽ định vị những tập tin trong thư mục /etc/systemd/system. Di chuyển có bây giờ:
CD /etc/systemd/system
Bây giờ chúng tôi có thể bắt đầu xây dựng các tập tin dịch vụ.
Tạo tập tin đơn vị DIAPI Server
Tập đầu tiên chúng tôi sẽ đặt cấu hình là máy chủ API đơn vị tập tin. DIAPI server được sử dụng để phục vụ các thông tin về cụm, xử lý đăng bài yêu cầu để thay đổi thông tin, lịch trình công việc trên mỗi máy chủ, và đồng bộ hóa thông tin được chia sẻ.
Chúng tôi sẽ kêu gọi này đơn vị tập tin apiserver.service cho đơn giản. Tạo ra và mở tập tin đó bây giờ:
sudo vim apiserver.service
Trong tập tin này, chúng tôi sẽ bắt đầu với các siêu dữ liệu cơ bản về dịch vụ của chúng tôi. Chúng ta cần phải đảm bảo rằng đơn vị này không được khởi động cho đến etcd và dịch vụ Docker lập và hoạt động:
[Đơn vị]
Mô tả = Kubernetes DIAPI Server
After=etcd.Service
After=docker.Service
Wants=etcd.Service
Wants=docker.Service
Tiếp theo, chúng tôi sẽ hoàn thành phần [dịch vụ]. Điều này chủ yếu là sẽ được sử dụng để bắt đầu máy chủ API với một số thông số mô tả môi trường của chúng tôi. Chúng tôi cũng sẽ thiết lập điều kiện khởi động lại:
[Đơn vị]
Mô tả = Kubernetes DIAPI Server
After=etcd.Service
After=docker.Service
Wants=etcd.Service
Wants=docker.Service
[Dịch vụ]
ExecStart = / opt/bin/apiserver được viết bởi admin
-địa chỉ = 127.0.0.1 \
-cổng = 8080 \
-etcd_servers = http://127.0.0.1:4001 được viết bởi admin
-Máy = 10.120.0.1, 10.120.0.2, 10.120.0.3 được viết bởi admin
-logtostderr = true
ExecStartPost =- / bin/bash – c “cho đến khi /usr/bin/curl http://127.0.0.1:8080; echo \”waiting cho DIAPI server tới online…\”; ngủ 3; thực hiện”
Khởi động lại = ngày thất bại
RestartSec = 5
Phần trên thiết lập địa chỉ mạng và cổng nơi mà các máy chủ sẽ chạy, cũng như các vị trí nơi etcd đang lắng nghe. Chúng tôi cũng đã thông qua trong một danh sách các máy nơi Kubernetes có thể lịch trình công việc. Ở đây, chúng tôi đã thông qua tại mỗi địa chỉ IP riêng máy của chúng tôi, cách nhau bằng dấu phẩy. Sửa đổi các giá trị này để phản ánh cấu hình của riêng bạn.
Sau khi chúng tôi bắt đầu dịch vụ, chúng tôi kiểm tra rằng nó và chạy trong một vòng lặp. Điều này đảm bảo rằng các dịch vụ thực sự có thể chấp nhận kết nối trước khi các dịch vụ phụ thuộc được bắt đầu. Không có điều này có thể dẫn đến sai sót trong các dịch vụ phụ thuộc nào yêu cầu khởi động lại hướng dẫn sử dụng.
Cuối cùng, chúng tôi sẽ có để cài đặt các đơn vị này. Chúng tôi có thể làm điều đó với một phần [cài đặt] sẽ cho biết máy chủ của chúng tôi để bắt đầu dịch vụ này khi máy tính hoàn toàn khởi động:
[Đơn vị]
Mô tả = Kubernetes DIAPI Server
After=etcd.Service
After=docker.Service
Wants=etcd.Service
Wants=docker.Service
[Dịch vụ]
ExecStart = / opt/bin/apiserver được viết bởi admin
-địa chỉ = 127.0.0.1 \
-cổng = 8080 \
-etcd_servers = http://127.0.0.1:4001 được viết bởi admin
-Máy = 10.120.0.1, 10.120.0.2, 10.120.0.3 được viết bởi admin
-logtostderr = true
ExecStartPost =- / bin/bash – c “cho đến khi /usr/bin/curl http://127.0.0.1:8080; echo \”waiting cho DIAPI server tới online…\”; ngủ 3; thực hiện”
Khởi động lại = ngày thất bại
RestartSec = 5
[Cài đặt]
WantedBy = multi-user.target
Khi bạn hoàn tất, hãy đóng tệp.
Tạo tệp đơn vị điều khiển quản lý
Các mảnh tiếp theo yêu cầu của các Kubernetes là các máy chủ điều khiển quản lý. Thành phần này được sử dụng để thực hiện sao chép dữ liệu giữa các đơn vị cụm.
Mở ra một tập tin gọi là điều khiển-manager.service trong cùng thư mục:
sudo vim điều khiển-manager.service
Chúng tôi sẽ bắt đầu với các siêu dữ liệu cơ bản một lần nữa. Điều này sẽ làm theo định dạng tương tự như các tập tin qua. Ngoài các phụ thuộc khác, Dịch vụ này phải khởi động sau khi các đơn vị máy chủ API chúng tôi chỉ cần cấu hình:
[Đơn vị]
Mô tả = Kubernetes bộ điều khiển quản lý
After=etcd.Service
After=docker.Service
After=apiserver.Service
Wants=etcd.Service
Wants=docker.Service
Wants=apiserver.Service
Đối với phần [dịch vụ] của tập tin này, chúng tôi chỉ cần gửi một vài tham số cho tập tin thực thi. Chủ yếu là, chúng tôi chỉ các ứng dụng để vị trí của server API của chúng tôi. Bạn sẽ không cần phải sửa đổi bất kỳ các giá trị này. Một lần nữa, chúng tôi sẽ chắc chắn đơn vị này khởi động lại về thất bại vì nó là cần thiết cho chúng tôi Kubernetes cụm để hoạt động tốt:
[Đơn vị]
Mô tả = Kubernet
Các thành phần tiếp theo máy chủ tổng thể cần để chạy là trình lập lịch biểu. Trình lập lịch biểu quyết mà minion chạy khối lượng công việc trên và giao tiếp để đảm bảo rằng điều này xảy ra.
Tạo ra và mở tập tin một đơn vị này bây giờ:
sudo vim scheduler.service
Đơn vị này bắt đầu giảm giá trong phần lớn theo cùng một cách như là cuối cùng. Đô thị này có phụ thuộc vào tất cả các dịch vụ giống nhau:
[Đơn vị]
Mô tả = Kubernetes Scheduler
After=etcd.Service
After=docker.Service
After=apiserver.Service
Wants=etcd.Service
Wants=docker.Service
Wants=apiserver.Service
Phần dịch vụ chính nó là rất thẳng về phía trước. Chúng ta chỉ cần điểm tập tin thực thi tại địa chỉ mạng và cổng DIAPI server nằm trên. Một lần nữa, chúng tôi sẽ khởi động lại dịch vụ trong trường hợp thất bại.
Phần cài đặt gương những người khác chúng tôi đã thấy cho đến nay:
[Đơn vị]
Mô tả = Kubernetes Scheduler
After=etcd.Service
After=docker.Service
After=apiserver.Service
Wants=etcd.Service
Wants=docker.Service
Wants=apiserver.Service
[Dịch vụ]
ExecStart = / opt/bin/lập lịch-tổng thể = 127.0.0.1:8080
Khởi động lại = ngày thất bại
RestartSec = 5
[Cài đặt]
WantedBy = multi-user.target
Khi bạn hoàn tất, lưu và đóng tập tin.
Thiết lập dịch vụ cụm
Bây giờ mà chúng tôi có các dịch vụ dành riêng cho tổng thể cấu hình, chúng tôi có thể cấu hình các tập tin đơn vị cần phải có mặt trên tất cả các máy của chúng tôi. Điều này có nghĩa rằng bạn nên thêm các tệp vào bậc thầy và máy chủ thương yêu và cấu hình chúng cho phù hợp.
Tạo tập tin đơn vị Flannel
Các thành phần đầu tiên mà chúng tôi cần để có được và chạy là flannel, lớp vải mạng của chúng tôi. Điều này sẽ được sử dụng để cung cấp cho mỗi nút mạng con riêng của mình cho Docker container.
Một lần nữa, trên mỗi máy của bạn, thay đổi vào thư mục cấu hình systemd:
CD /etc/systemd/system
Tạo và mở các tập tin đơn vị flannel trong trình soạn thảo văn bản của bạn:
sudo vim flannel.service
Bên trong của tập tin này, chúng tôi sẽ bắt đầu với thông tin siêu dữ liệu. Kể từ khi dịch vụ này yêu cầu etcd để đăng ký thông tin mạng con, cần phải bắt đầu điều này sau khi etcd:
[Đơn vị]
Mô tả = Flannel mạng vải cho CoreOS
Requires=etcd.Service
After=etcd.Service
Cho phần [dịch vụ], trước tiên chúng ta sẽ để nguồn /etc/environment tập tin như vậy mà chúng tôi có thể có quyền truy cập vào địa chỉ IP riêng của máy chủ của chúng tôi.
Bước tiếp theo sẽ là để đặt một ExecStartPre = dòng mà cố gắng để đăng ký loạt các mạng con với etcd. Nó sẽ liên tục cố gắng để đăng ký với etcd cho đến khi nó thành công. Chúng tôi sẽ sử dụng dãy 10.100.0.0/16 cho hướng dẫn này.
Sau đó, chúng tôi sẽ bắt đầu flannel với địa chỉ IP riêng của chúng tôi đang tìm nguồn cung ứng từ các tập tin môi trường.
Sau đó, chúng tôi muốn kiểm tra cho dù flannel đã viết thông tin của nó vào tập tin (do đó Docker đó có thể đọc nó trong một thời điểm) và ngủ của nó nếu nó đã không. Điều này đảm bảo rằng dịch vụ Docker không cố gắng để đọc tập tin trước khi nó có sẵn (điều này có thể xảy ra trên máy chủ đầu tiên tới trực tuyến). Chúng tôi sẽ đặt cấu hình khởi động lại bằng cách sử dụng các tham số thông thường và cài đặt các đơn vị sử dụng đa-user.target một lần nữa:
[Đơn vị]
Mô tả = Flannel mạng vải cho CoreOS
Requires=etcd.Service
After=etcd.Service
[Dịch vụ]
EnvironmentFile = / etc/môi trường
ExecStartPre =- / bin/bash – c “cho đến khi /usr/bin/etcdctl đặt /coreos.com/network/config ‘ {\”Network\ “: \”10.100.0.0/16\ “}'; echo \”waiting cho etcd để trở thành available…\”; ngủ 5; thực hiện”
ExecStart = / opt/bin/flannel – iface = ${COREOS_PRIVATE_IPV4}
ExecStartPost =- / bin/bash – c “cho đến khi [-e /run/flannel/subnet.env]; echo \”waiting cho viết. \”; ngủ 3; thực hiện”
Khởi động lại = ngày thất bại
RestartSec = 5
[Cài đặt]
WantedBy = multi-user.target
Lưu và đóng tập tin khi bạn đã kết thúc. Tạo ra cùng một tập tin trên của bạn máy chủ khác.
Tạo tập tin đơn vị Docker
Các tập tin tiếp theo chúng tôi sẽ tạo ra không thực sự liên quan để thực thi trong thư mục /opt/bin của chúng tôi. Chúng tôi cần để tạo ra một tập tin dịch vụ Docker để dịch vụ sẽ được bắt đầu với kiến thức của lớp phủ mạng flannel chúng tôi chỉ cần đặt cấu hình.
Tạo tập tin đơn vị phù hợp với văn bản của bạn biên tập:
sudo vim docker.service
Bắt đầu với các siêu dữ liệu thông thường. Chúng tôi cần điều này để bắt đầu sau khi dịch vụ flannel đã được cấu hình và đưa trực tuyến:
[Đơn vị]
Mô tả = Docker thùng chứa động cơ cấu hình để chạy với flannel
Requires=flannel.Service
After=flannel.Service
Cho phần [dịch vụ], chúng tôi sẽ cần nguồn tập tin flannel sử dụng để lưu trữ các biến môi trường nó là tạo ra. Điều này sẽ có máy chủ hiện tại của mạng con thông tin.
Sau đó, chúng tôi lật đổ giao diện hiện tại cầu docker0 nếu nó đang chạy và xóa nó. Điều này cho phép chúng tôi để khởi động lại Docker với một slate sạch. Quá trình này sẽ đặt cấu hình giao diện docker0 bằng cách sử dụng thông tin mạng flannel.
Chúng tôi sử dụng cùng một khởi động lại và chi tiết [cài đặt] chúng tôi đã sử dụng với các đơn vị khác của chúng tôi:
[Đơn vị]
Mô tả = Docker thùng chứa động cơ cấu hình để chạy với flannel
Requires=flannel.Service
After=flannel.Service
[Dịch vụ]
EnvironmentFile=/run/flannel/subnet.env
ExecStartPre =- / usr/bin/ip liên kết đặt dev docker0 xuống
ExecStartPre =- / usr/sbin/brctl del






Theo: funvn

  Trả lời ngay kèm theo trích dẫn này
Gửi trả lời


Công Cụ
Xếp Bài

Quyền Hạn Của Bạn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Hình Cảm xúc đang Mở
[IMG] đang Mở
Mã HTML đang Tắt




Bây giờ là 05:25 AM. Giờ GMT +7



Diễn đàn tin học QuantriNet
quantrinet.com | quantrimang.co.cc
Founded by Trương Văn Phương | Developed by QuantriNet's members.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.