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ư:
- Docker : một công nghệ container ứng dụng.
- Etcd : kho dữ liệu khóa-giá trị phân tán quản lý thông tin toàn cụm và cung cấp khám phá dịch vụ.
- Flannel : cấu trúc mạng lớp phủ cho phép kết nối container trên nhiều máy chủ.
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:
- Tự động lập lịch trình tài nguyên hệ thống và tự động đặt các thùng chứa ứng dụng trên một cụm.
- Mở rộng các ứng dụng một cách nhanh chóng với một lệnh duy nhất.
- Cập nhật cán với thời gian chết bằng không.
- Tự phục hồi: tự động sắp xếp lại ứng dụng nếu máy chủ bị lỗi, tự động khởi động lại các container, kiểm tra sức khỏe.
Bỏ qua phần Cài đặt nếu bạn đã quen thuộc với Kubernetes.
Các khái niệm cơ bản
Kubernetes cung cấp các tóm tắt sau (đơn vị logic) cho nhà phát triển:
- Vỏ quả.
- Bộ điều khiển nhân rộng.
- Nhãn.
- Dịch vụ.
Pods
Đâ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.
Bộ điều khiển nhân rộng
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.
Nhãn
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, ...).
Dịch vụ
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.
Cụm Kubernetes
Ở dạng đơn giản nhất, cụm Kubernetes được tạo bởi hai loại nút:
- 1 bậc thầy Kubernetes.
- N nút Kubernetes.
Thầy Kubernetes
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à:
- Etcd: kho dữ liệu có sẵn trên toàn cầu lưu trữ thông tin về cụm và các dịch vụ và ứng dụng đang chạy trên cụm.
- Máy chủ API Kube: đây là trung tâm quản lý chính của cụm Kubernetes và nó hiển thị giao diện RESTful.
- Trình quản lý điều khiển: xử lý sao chép các ứng dụng được quản lý bởi các bộ điều khiển sao chép.
- Bộ lập lịch: theo dõi việc sử dụng tài nguyên trên toàn cụm và gán khối lượng công việc phù hợp.
Nút Kubernetes
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à:
- Docker: một daemon chạy các thùng chứa ứng dụng được xác định trong nhóm.
- Kubelet: một đơn vị điều khiển cho các nhóm trong một hệ thống cục bộ.
- Kube-proxy: proxy mạng đảm bảo định tuyến chính xác cho các dịch vụ Kubernetes.
Cài đặt
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:
- 1 bậc thầy Kubernetes (kube-master)
- 2 nút Kubernetes (kube-node1, kube-node2)
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.
Tất cả các nút
Đị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
Thầy Kubernetes
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ủ.
Nút Kubernetes
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ủ.
Kiểm tra máy chủ Kubernetes của bạn
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
Ví dụ: Triển khai lưới Selen bằng Kubernetes
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:
- 1 trung tâm Selenium trung tâm sẽ là điểm cuối từ xa mà các thử nghiệm của chúng tôi sẽ kết nối.
- 2 nút Selen chạy Firefox.
- 2 nút Selen chạy Chrome.
Chiến lược triển khai
Để 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.
Trung tâm Selen
Bộ điều khiển nhân rộng
# 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.
Dịch vụ
# 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ừ:
- Bất kỳ nút Kubernetes nào, thông qua IP ảo 10.254.124.73 và cổng 4444.
- Các mạng bên ngoài, thông qua bất kỳ IP công khai nào của các nút Kubernetes, trên cổng 30000.
(sử dụng IP công cộng của một nút Kubernetes khác)
Các nút Selen
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
Gói lại
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.
Tự chữa bệnh
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 Selen của bạn
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