Cách cài đặt SuiteCRM trên Ubuntu 16.04
Hướng dẫn cài đặt SuiteCRM, một giải pháp CRM mã nguồn mở, trên Ubuntu 16.04 với các bước chi tiết và dễ hiểu.
Kubernetes là một nền tảng nguồn mở được phát triển bởi Google để quản lý các ứng dụng được đóng gói trên một cụm máy chủ. Nó xây dựng dựa trên một thập kỷ rưỡi kinh nghiệm mà Google có với việc vận hành các cụm container theo quy mô và cung cấp cho các nhà phát triển cơ sở hạ tầng kiểu Google, tận dụng các dự án nguồn mở tốt nhất, như:
Kubernetes cho phép các nhà phát triển xác định cơ sở hạ tầng ứng dụng của họ một cách khai báo thông qua các tệp YAML và trừu tượng hóa như Pods, RC và Dịch vụ (nhiều hơn về điều này sau) và đảm bảo rằng cụm bên dưới luôn khớp với trạng thái do người dùng xác định.
Một số tính năng của nó bao gồm:
Bỏ qua phần Cài đặt nếu bạn đã quen thuộc với Kubernetes.
Kubernetes cung cấp các tóm tắt sau (đơn vị logic) cho nhà phát triển:
Đây là đơn vị cơ bản của khối lượng công việc Kubernetes. Một nhóm mô hình một "máy chủ logic" dành riêng cho ứng dụng trong môi trường được đóng gói. Theo thuật ngữ cư sĩ, nó mô hình hóa một nhóm các ứng dụng hoặc dịch vụ được sử dụng để chạy trên cùng một máy chủ trong thế giới tiền container. Các container bên trong một nhóm chia sẻ cùng một không gian tên mạng và cũng có thể chia sẻ khối lượng dữ liệu.
Pods là tuyệt vời để nhóm nhiều container vào các đơn vị ứng dụng logic, nhưng chúng không cung cấp sao chép hoặc sắp xếp lại trong trường hợp máy chủ bị lỗi.
Đây là nơi một bộ điều khiển sao chép hoặc RC có ích. Một RC đảm bảo rằng một số nhóm của một dịch vụ nhất định luôn chạy trên cụm.
Chúng là siêu dữ liệu khóa-giá trị có thể được gắn vào bất kỳ tài nguyên Kubernetes nào (nhóm, RC, dịch vụ, nút, ...).
Các pod và bộ điều khiển sao chép rất tốt cho việc triển khai và phân phối các ứng dụng trên một cụm, nhưng các pod có IP tạm thời thay đổi khi sắp xếp lại hoặc khởi động lại container.
Dịch vụ Kubernetes cung cấp điểm cuối ổn định (cổng IP + ảo cố định liên kết với máy chủ lưu trữ) cho một nhóm nhóm được quản lý bởi bộ điều khiển sao chép.
Ở dạng đơn giản nhất, cụm Kubernetes được tạo bởi hai loại nút:
Kubernetes master là đơn vị điều khiển của toàn bộ cụm.
Các thành phần chính của tổng thể là:
Nút Kubernetes là các máy chủ worker chịu trách nhiệm chạy các pod.
Các thành phần chính của một nút là:
Trong hướng dẫn này, chúng tôi sẽ tạo một cụm 3 nút bằng máy chủ CentOS 7:
Bạn có thể thêm nhiều nút như bạn muốn sau này theo cùng một quy trình cài đặt cho các nút Kubernetes.
Định cấu hình tên máy chủ và /etc/hosts
:
# /etc/hostname
kube-master
# or kube-node1, kube-node2
# append to /etc/hosts
replace-with-master-server-ip kube-master
replace-with-node1-ip kube-node1
replace-with-node2-ip kube-node2
Vô hiệu hóa tường lửa:
systemctl disable firewalld
systemctl stop firewalld
Cài đặt gói chính Kubernetes:
yum install etcd kubernetes-master
Cấu hình:
# /etc/etcd/etcd.conf
# leave rest of the lines unchanged
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"
ETCD_LISTEN_PEER_URLS="http://localhost:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://0.0.0.0:2379"
# /etc/kubernetes/config
# leave rest of the lines unchanged
KUBE_MASTER="--master=http://kube-master:8080"
# /etc/kubernetes/apiserver
# leave rest of the lines unchanged
KUBE_API_ADDRESS="--address=0.0.0.0"
KUBE_ETCD_SERVERS="--etcd_servers=http://kube-master:2379"
Bắt đầu Etcd:
systemctl start etcd
Cài đặt và cấu hình cấu trúc mạng lớp phủ Flannel (điều này là cần thiết để các container chạy trên các máy chủ khác nhau có thể nhìn thấy nhau):
yum install flannel
Tạo tệp cấu hình Flannel ( flannel-config.json
):
{
"Network": "10.20.0.0/16",
"SubnetLen": 24,
"Backend": {
"Type": "vxlan",
"VNI": 1
}
}
Đặt cấu hình Flannel trong máy chủ Etcd:
etcdctl set coreos.com/network/config < flannel-config.json
Điểm Flannel đến máy chủ Etcd:
# /etc/sysconfig/flanneld
FLANNEL_ETCD="http://kube-master:2379"
Cho phép các dịch vụ để chúng bắt đầu khởi động:
systemctl enable etcd
systemctl enable kube-apiserver
systemctl enable kube-controller-manager
systemctl enable kube-scheduler
systemctl enable flanneld
Khởi động lại máy chủ.
Cài đặt gói nút Kubernetes:
yum install docker kubernetes-node
Hai bước tiếp theo sẽ cấu hình Docker để sử dụng lớp phủ để có hiệu suất tốt hơn. Để biết thêm thông tin truy cập bài viết blog này :
Xóa thư mục lưu trữ docker hiện tại:
systemctl stop docker
rm -rf /var/lib/docker
Thay đổi tập tin cấu hình:
# /etc/sysconfig/docker
# leave rest of lines unchanged
OPTIONS='--selinux-enabled=false'
# /etc/sysconfig/docker
# leave rest of lines unchanged
DOCKER_STORAGE_OPTIONS=-s overlay
Cấu hình kube-node1 để sử dụng tổng thể được cấu hình trước đó của chúng tôi:
# /etc/kubernetes/config
# leave rest of lines unchanged
KUBE_MASTER="--master=http://kube-master:8080"
# /etc/kubernetes/kubelet
# leave rest of the lines unchanged
KUBELET_ADDRESS="--address=0.0.0.0"
# comment this line, so that the actual hostname is used to register the node
# KUBELET_HOSTNAME="--hostname_override=127.0.0.1"
KUBELET_API_SERVER="--api_servers=http://kube-master:8080"
Cài đặt và cấu hình cấu trúc mạng lớp phủ Flannel (một lần nữa - điều này là cần thiết để các container chạy trên các máy chủ khác nhau có thể nhìn thấy nhau):
yum install flannel
Điểm Flannel đến máy chủ Etcd:
# /etc/sysconfig/flanneld
FLANNEL_ETCD="http://kube-master:2379"
Cho phép dịch vụ:
systemctl enable docker
systemctl enable flanneld
systemctl enable kubelet
systemctl enable kube-proxy
Khởi động lại máy chủ.
Sau khi tất cả các máy chủ đã khởi động lại, hãy kiểm tra xem cụm Kubernetes của bạn có hoạt động không:
[root@kube-master ~]# kubectl get nodes
NAME LABELS STATUS
kube-node1 kubernetes.io/hostname=kube-node1 Ready
kube-node2 kubernetes.io/hostname=kube-node2 Ready
Selenium là một khung để tự động hóa các trình duyệt cho mục đích thử nghiệm. Đây là một công cụ mạnh mẽ trong kho vũ khí của bất kỳ nhà phát triển web nào.
Lưới Selen cho phép thực hiện các thử nghiệm từ xa có thể mở rộng và song song trên một cụm các nút Selen được kết nối với một trung tâm Selenium trung tâm.
Vì các nút Selen là không trạng thái và số lượng nút chúng tôi chạy rất linh hoạt, tùy thuộc vào khối lượng công việc thử nghiệm của chúng tôi, đây là một ứng dụng ứng cử viên hoàn hảo sẽ được triển khai trên cụm Kubernetes.
Trong phần tiếp theo, chúng tôi sẽ triển khai một lưới bao gồm 5 thùng chứa ứng dụng:
Để tự động quản lý sao chép và tự phục hồi, chúng tôi sẽ tạo bộ điều khiển sao chép Kubernetes cho từng loại vùng chứa ứng dụng mà chúng tôi đã liệt kê ở trên.
Để cung cấp cho các nhà phát triển đang chạy thử nghiệm với điểm cuối trung tâm Selenium ổn định, chúng tôi sẽ tạo dịch vụ Kubernetes được kết nối với bộ điều khiển sao chép trung tâm.
# selenium-hub-rc.yaml
apiVersion: v1
kind: ReplicationController
metadata:
name: selenium-hub
spec:
replicas: 1
selector:
name: selenium-hub
template:
metadata:
labels:
name: selenium-hub
spec:
containers:
- name: selenium-hub
image: selenium/hub
ports:
- containerPort: 4444
Triển khai:
[root@kube-master ~]# kubectl create -f selenium-hub-rc.yaml
replicationcontrollers/selenium-hub
[root@kube-master ~]# kubectl get rc
CONTROLLER CONTAINER(S) IMAGE(S) SELECTOR REPLICAS
selenium-hub selenium-hub selenium/hub name=selenium-hub 1
[root@kube-master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
selenium-hub-pilc8 1/1 Running 0 50s
[root@kube-master ~]# kubectl describe pod selenium-hub-pilc8
Name: selenium-hub-pilc8
Namespace: default
Image(s): selenium/hub
Node: kube-node2/45.63.16.92
Labels: name=selenium-hub
Status: Running
Reason:
Message:
IP: 10.20.101.2
Replication Controllers: selenium-hub (1/1 replicas created)
Containers:
selenium-hub:
Image: selenium/hub
State: Running
Started: Sat, 24 Oct 2015 16:01:39 +0000
Ready: True
Restart Count: 0
Conditions:
Type Status
Ready True
Events:
FirstSeen LastSeen Count From SubobjectPath Reason Message
Sat, 24 Oct 2015 16:01:02 +0000 Sat, 24 Oct 2015 16:01:02 +0000 1 {scheduler } scheduled Successfully assigned selenium-hub-pilc8 to kube-node2
Sat, 24 Oct 2015 16:01:05 +0000 Sat, 24 Oct 2015 16:01:05 +0000 1 {kubelet kube-node2} implicitly required container POD pulled Successfully pulled Pod container image "gcr.io/google_containers/pause:0.8.0"
Sat, 24 Oct 2015 16:01:05 +0000 Sat, 24 Oct 2015 16:01:05 +0000 1 {kubelet kube-node2} implicitly required container POD created Created with docker id 6de00106b19c
Sat, 24 Oct 2015 16:01:05 +0000 Sat, 24 Oct 2015 16:01:05 +0000 1 {kubelet kube-node2} implicitly required container POD started Started with docker id 6de00106b19c
Sat, 24 Oct 2015 16:01:39 +0000 Sat, 24 Oct 2015 16:01:39 +0000 1 {kubelet kube-node2} spec.containers pulled Successfully pulled image "selenium/hub"
Sat, 24 Oct 2015 16:01:39 +0000 Sat, 24 Oct 2015 16:01:39 +0000 1 {kubelet kube-node2} spec.containers created Created with docker id 7583cc09268c
Sat, 24 Oct 2015 16:01:39 +0000 Sat, 24 Oct 2015 16:01:39 +0000 1 {kubelet kube-node2} spec.containers started Started with docker id 7583cc09268c
Ở đây chúng ta có thể thấy Kubernetes đã đặt thùng chứa selenium-hub của tôi trên kube-node2.
# selenium-hub-service.yaml
apiVersion: v1
kind: Service
metadata:
name: selenium-hub
spec:
type: NodePort
ports:
- port: 4444
protocol: TCP
nodePort: 30000
selector:
name: selenium-hub
Triển khai:
[root@kube-master ~]# kubectl create -f selenium-hub-service.yaml
You have exposed your service on an external port on all nodes in your
cluster. If you want to expose this service to the external internet, you may
need to set up firewall rules for the service port(s) (tcp:30000) to serve traffic.
See http://releases.k8s.io/HEAD/docs/user-guide/services-firewalls.md for more details.
services/selenium-hub
[root@kube-master ~]# kubectl get services
NAME LABELS SELECTOR IP(S) PORT(S)
kubernetes component=apiserver,provider=kubernetes <none> 10.254.0.1 443/TCP
selenium-hub <none> name=selenium-hub 10.254.124.73 4444/TCP
Sau khi triển khai dịch vụ, bạn có thể truy cập từ:
(sử dụng IP công cộng của một nút Kubernetes khác)
Trình điều khiển sao chép nút Firefox:
# selenium-node-firefox-rc.yaml
apiVersion: v1
kind: ReplicationController
metadata:
name: selenium-node-firefox
spec:
replicas: 2
selector:
name: selenium-node-firefox
template:
metadata:
labels:
name: selenium-node-firefox
spec:
containers:
- name: selenium-node-firefox
image: selenium/node-firefox
ports:
- containerPort: 5900
env:
- name: HUB_PORT_4444_TCP_ADDR
value: "replace_with_service_ip"
- name: HUB_PORT_4444_TCP_PORT
value: "4444"
Triển khai:
Thay thế replace_with_service_ip
vào selenium-node-firefox-rc.yaml
với IP dịch vụ trung tâm Selenium thực tế, trong trường hợp này 10.254.124.73.
[root@kube-master ~]# kubectl create -f selenium-node-firefox-rc.yaml
replicationcontrollers/selenium-node-firefox
[root@kube-master ~]# kubectl get rc
CONTROLLER CONTAINER(S) IMAGE(S) SELECTOR REPLICAS
selenium-hub selenium-hub selenium/hub name=selenium-hub 1
selenium-node-firefox selenium-node-firefox selenium/node-firefox name=selenium-node-firefox 2
[root@kube-master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
selenium-hub-pilc8 1/1 Running 1 1h
selenium-node-firefox-lc6qt 1/1 Running 0 2m
selenium-node-firefox-y9qjp 1/1 Running 0 2m
[root@kube-master ~]# kubectl describe pod selenium-node-firefox-lc6qt
Name: selenium-node-firefox-lc6qt
Namespace: default
Image(s): selenium/node-firefox
Node: kube-node2/45.63.16.92
Labels: name=selenium-node-firefox
Status: Running
Reason:
Message:
IP: 10.20.101.3
Replication Controllers: selenium-node-firefox (2/2 replicas created)
Containers:
selenium-node-firefox:
Image: selenium/node-firefox
State: Running
Started: Sat, 24 Oct 2015 17:08:37 +0000
Ready: True
Restart Count: 0
Conditions:
Type Status
Ready True
Events:
FirstSeen LastSeen Count From SubobjectPath Reason Message
Sat, 24 Oct 2015 17:08:13 +0000 Sat, 24 Oct 2015 17:08:13 +0000 1 {scheduler } scheduled Successfully assigned selenium-node-firefox-lc6qt to kube-node2
Sat, 24 Oct 2015 17:08:13 +0000 Sat, 24 Oct 2015 17:08:13 +0000 1 {kubelet kube-node2} implicitly required container POD pulled Pod container image "gcr.io/google_containers/pause:0.8.0" already present on machine
Sat, 24 Oct 2015 17:08:13 +0000 Sat, 24 Oct 2015 17:08:13 +0000 1 {kubelet kube-node2} implicitly required container POD created Created with docker id cdcb027c6548
Sat, 24 Oct 2015 17:08:13 +0000 Sat, 24 Oct 2015 17:08:13 +0000 1 {kubelet kube-node2} implicitly required container POD started Started with docker id cdcb027c6548
Sat, 24 Oct 2015 17:08:36 +0000 Sat, 24 Oct 2015 17:08:36 +0000 1 {kubelet kube-node2} spec.containers pulled Successfully pulled image "selenium/node-firefox"
Sat, 24 Oct 2015 17:08:36 +0000 Sat, 24 Oct 2015 17:08:36 +0000 1 {kubelet kube-node2} spec.containers created Created with docker id 8931b7f7a818
Sat, 24 Oct 2015 17:08:37 +0000 Sat, 24 Oct 2015 17:08:37 +0000 1 {kubelet kube-node2} spec.containers started Started with docker id 8931b7f7a818
[root@kube-master ~]# kubectl describe pod selenium-node-firefox-y9qjp
Name: selenium-node-firefox-y9qjp
Namespace: default
Image(s): selenium/node-firefox
Node: kube-node1/185.92.221.67
Labels: name=selenium-node-firefox
Status: Running
Reason:
Message:
IP: 10.20.92.3
Replication Controllers: selenium-node-firefox (2/2 replicas created)
Containers:
selenium-node-firefox:
Image: selenium/node-firefox
State: Running
Started: Sat, 24 Oct 2015 17:08:13 +0000
Ready: True
Restart Count: 0
Conditions:
Type Status
Ready True
Events:
FirstSeen LastSeen Count From SubobjectPath Reason Message
Sat, 24 Oct 2015 17:08:13 +0000 Sat, 24 Oct 2015 17:08:13 +0000 1 {scheduler } scheduled Successfully assigned selenium-node-firefox-y9qjp to kube-node1
Sat, 24 Oct 2015 17:08:13 +0000 Sat, 24 Oct 2015 17:08:13 +0000 1 {kubelet kube-node1} implicitly required container POD pulled Pod container image "gcr.io/google_containers/pause:0.8.0" already present on machine
Sat, 24 Oct 2015 17:08:13 +0000 Sat, 24 Oct 2015 17:08:13 +0000 1 {kubelet kube-node1} implicitly required container POD created Created with docker id ea272dd36bd5
Sat, 24 Oct 2015 17:08:13 +0000 Sat, 24 Oct 2015 17:08:13 +0000 1 {kubelet kube-node1} implicitly required container POD started Started with docker id ea272dd36bd5
Sat, 24 Oct 2015 17:08:13 +0000 Sat, 24 Oct 2015 17:08:13 +0000 1 {kubelet kube-node1} spec.containers created Created with docker id 6edbd6b9861d
Sat, 24 Oct 2015 17:08:13 +0000 Sat, 24 Oct 2015 17:08:13 +0000 1 {kubelet kube-node1} spec.containers started Started with docker id 6edbd6b9861d
Như chúng ta có thể thấy, Kubernetes đã tạo ra 2 bản sao selenium-firefox-node
và nó đã phân phối chúng trên toàn cụm. Pod selenium-node-firefox-lc6qt
nằm trên kube-node2, trong khi pod selenium-node-firefox-y9qjp
nằm trên kube-node1.
Chúng tôi lặp lại quy trình tương tự cho các nút Selenium Chrome của chúng tôi.
Bộ điều khiển sao chép nút Chrome:
# selenium-node-chrome-rc.yaml
apiVersion: v1
kind: ReplicationController
metadata:
name: selenium-node-chrome
labels:
app: selenium-node-chrome
spec:
replicas: 2
selector:
app: selenium-node-chrome
template:
metadata:
labels:
app: selenium-node-chrome
spec:
containers:
- name: selenium-node-chrome
image: selenium/node-chrome
ports:
- containerPort: 5900
env:
- name: HUB_PORT_4444_TCP_ADDR
value: "replace_with_service_ip"
- name: HUB_PORT_4444_TCP_PORT
value: "4444"
Triển khai:
[root@kube-master ~]# kubectl create -f selenium-node-chrome-rc.yaml
replicationcontrollers/selenium-node-chrome
[root@kube-master ~]# kubectl get rc
CONTROLLER CONTAINER(S) IMAGE(S) SELECTOR REPLICAS
selenium-hub selenium-hub selenium/hub name=selenium-hub 1
selenium-node-chrome selenium-node-chrome selenium/node-chrome app=selenium-node-chrome 2
selenium-node-firefox selenium-node-firefox selenium/node-firefox name=selenium-node-firefox 2
[root@kube-master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
selenium-hub-pilc8 1/1 Running 1 1h
selenium-node-chrome-9u1ld 1/1 Running 0 1m
selenium-node-chrome-mgi52 1/1 Running 0 1m
selenium-node-firefox-lc6qt 1/1 Running 0 11m
selenium-node-firefox-y9qjp 1/1 Running 0 11m
Trong hướng dẫn này, chúng tôi đã thiết lập một cụm Kubernetes nhỏ gồm 3 máy chủ (1 bộ điều khiển chính + 2 công nhân).
Sử dụng các nhóm, RC và dịch vụ, chúng tôi đã triển khai thành công Lưới Selen bao gồm một trung tâm trung tâm và 4 nút, cho phép các nhà phát triển chạy 4 thử nghiệm Selen đồng thời tại một cụm trên một cụm.
Kubernetes tự động lên lịch các container trên toàn bộ cụm.
Kubernetes tự động sắp xếp lại các nhóm đến các máy chủ khỏe mạnh nếu một hoặc nhiều máy chủ của chúng tôi gặp sự cố. Trong ví dụ của tôi, kube-node2 hiện đang chạy pod trung tâm Selenium và 1 pod nút Selenium Firefox.
[root@kube-node2 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5617399f146c selenium/node-firefox "/opt/bin/entry_poin 5 minutes ago Up 5 minutes k8s_selenium-node-firefox.46e635d8_selenium-node-firefox-zmj1r_default_31c89517-7a75-11e5-8648-5600001611e0_baae8e00
185230a3b431 gcr.io/google_containers/pause:0.8.0 "/pause" 5 minutes ago Up 5 minutes k8s_POD.3805e8b7_selenium-node-firefox-zmj1r_default_31c89517-7a75-11e5-8648-5600001611e0_40f809df
fdd5834c249d selenium/hub "/opt/bin/entry_poin About an hour ago Up About an hour k8s_selenium-hub.cb8bf0ed_selenium-hub-pilc8_default_6c98c1ff-7a68-11e5-8648-5600001611e0_5765e2c9
00e4ccb0bda8 gcr.io/google_containers/pause:0.8.0 "/pause" About an hour ago Up About an hour k8s_POD.3b3ee8b9_selenium-hub-pilc8_default_6c98c1ff-7a68-11e5-8648-5600001611e0_8398ac33
Chúng tôi sẽ mô phỏng lỗi máy chủ bằng cách tắt kube-node2. Sau một vài phút, bạn sẽ thấy rằng các container đang chạy trên kube-node2 đã được lên lịch lại thành kube-node1, đảm bảo gián đoạn dịch vụ tối thiểu.
[root@kube-node1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5bad5f582698 selenium/hub "/opt/bin/entry_poin 19 minutes ago Up 19 minutes k8s_selenium-hub.cb8bf0ed_selenium-hub-hycf2_default_fe9057cf-7a76-11e5-8648-5600001611e0_ccaad50a
dd1565a94919 selenium/node-firefox "/opt/bin/entry_poin 20 minutes ago Up 20 minutes k8s_selenium-node-firefox.46e635d8_selenium-node-firefox-g28z5_default_fe932673-7a76-11e5-8648-5600001611e0_fc79f977
2be1a316aa47 gcr.io/google_containers/pause:0.8.0 "/pause" 20 minutes ago Up 20 minutes k8s_POD.3805e8b7_selenium-node-firefox-g28z5_default_fe932673-7a76-11e5-8648-5600001611e0_dc204ad2
da75a0242a9e gcr.io/google_containers/pause:0.8.0 "/pause" 20 minutes ago Up 20 minutes k8s_POD.3b3ee8b9_selenium-hub-hycf2_default_fe9057cf-7a76-11e5-8648-5600001611e0_1b10c0e7
c611b68330de selenium/node-firefox "/opt/bin/entry_poin 33 minutes ago Up 33 minutes k8s_selenium-node-firefox.46e635d8_selenium-node-firefox-8ylo2_default_31c8a8f3-7a75-11e5-8648-5600001611e0_922af821
828031da6b3c gcr.io/google_containers/pause:0.8.0 "/pause" 33 minutes ago Up 33 minutes k8s_POD.3805e8b7_selenium-node-firefox-8ylo2_default_31c8a8f3-7a75-11e5-8648-5600001611e0_289cd555
caf4e725512e selenium/node-chrome "/opt/bin/entry_poin 46 minutes ago Up 46 minutes k8s_selenium-node-chrome.362a34ee_selenium-node-chrome-mgi52_default_392a2647-7a73-11e5-8648-5600001611e0_3c6e855a
409a20770787 selenium/node-chrome "/opt/bin/entry_poin 46 minutes ago Up 46 minutes k8s_selenium-node-chrome.362a34ee_selenium-node-chrome-9u1ld_default_392a15a4-7a73-11e5-8648-5600001611e0_ac3f0191
7e2d942422a5 gcr.io/google_containers/pause:0.8.0 "/pause" 47 minutes ago Up 47 minutes k8s_POD.3805e8b7_selenium-node-chrome-9u1ld_default_392a15a4-7a73-11e5-8648-5600001611e0_f5858b73
a3a65ea99a99 gcr.io/google_containers/pause:0.8.0 "/pause" 47 minutes ago Up 47 minutes k8s_POD.3805e8b7_selenium-node-chrome-mgi52_default_392a2647-7a73-11e5-8648-5600001611e0_20a70ab6
Thu nhỏ lưới Selenium của bạn cực dễ với Kubernetes. Hãy tưởng tượng rằng thay vì 2 nút Firefox, tôi muốn chạy 4. Việc nâng cấp có thể được thực hiện bằng một lệnh duy nhất:
[root@kube-master ~]# kubectl scale rc selenium-node-firefox --replicas=4
scaled
[root@kube-master ~]# kubectl get rc
CONTROLLER CONTAINER(S) IMAGE(S) SELECTOR REPLICAS
selenium-hub selenium-hub selenium/hub name=selenium-hub 1
selenium-node-chrome selenium-node-chrome selenium/node-chrome app=selenium-node-chrome 2
selenium-node-firefox selenium-node-firefox selenium/node-firefox name=selenium-node-firefox 4
[root@kube-master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
selenium-hub-pilc8 1/1 Running 1 1h
selenium-node-chrome-9u1ld 1/1 Running 0 14m
selenium-node-chrome-mgi52 1/1 Running 0 14m
selenium-node-firefox-8ylo2 1/1 Running 0 40s
selenium-node-firefox-lc6qt 1/1 Running 0 24m
selenium-node-firefox-y9qjp 1/1 Running 0 24m
selenium-node-firefox-zmj1r 1/1 Running 0 40s
Hướng dẫn cài đặt SuiteCRM, một giải pháp CRM mã nguồn mở, trên Ubuntu 16.04 với các bước chi tiết và dễ hiểu.
ReactOS, một hệ điều hành mã nguồn mở và miễn phí đã có phiên bản mới nhất. Liệu nó có thể đáp ứng đủ nhu cầu của người dùng Windows hiện đại và hạ gục Microsoft? Hãy cùng tìm hiểu thêm về trải nghiệm hệ điều hành kiểu cũ nhưng mới hơn này.
Các cuộc tấn công ransomware đang gia tăng, nhưng liệu AI có thể giúp đối phó với loại virus máy tính mới nhất? AI có phải là câu trả lời? Đọc ở đây biết là AI boone hay cấm
Whatsapp cuối cùng đã ra mắt ứng dụng Máy tính để bàn cho người dùng Mac và Windows. Giờ đây, bạn có thể truy cập Whatsapp từ Windows hoặc Mac một cách dễ dàng. Có sẵn cho Windows 8+ và Mac OS 10.9+
Hãy đọc phần này để biết Trí tuệ nhân tạo đang trở nên phổ biến như thế nào đối với các công ty quy mô nhỏ và làm thế nào nó đang tăng khả năng khiến họ phát triển và giúp đối thủ cạnh tranh của họ có thể cạnh tranh.
Gần đây Apple đã phát hành macOS Catalina 10.15.4 một bản cập nhật bổ sung để khắc phục các sự cố nhưng có vẻ như bản cập nhật đang gây ra nhiều vấn đề hơn dẫn đến việc máy mac bị chai. Đọc bài viết này để tìm hiểu thêm
13 Công cụ trích xuất dữ liệu thương mại của Dữ liệu lớn
Máy tính của chúng tôi lưu trữ tất cả dữ liệu một cách có tổ chức được gọi là hệ thống tệp Ghi nhật ký. Đây là một phương pháp hiệu quả cho phép máy tính tìm kiếm và hiển thị các tệp ngay khi bạn nhấn tìm kiếm. Https://wethegeek.com/? P = 94116 & preview = true
Khi Khoa học phát triển với tốc độ nhanh chóng, chiếm rất nhiều nỗ lực của chúng ta, những rủi ro của việc phục tùng bản thân trước một Điểm kỳ dị không thể giải thích cũng tăng lên. Hãy đọc, điểm kỳ dị có thể có ý nghĩa gì đối với chúng ta.
Hiểu rõ hơn về 26 kỹ thuật phân tích dữ liệu lớn: Phần 1