ΒΑΣΙΚΕΣ ΕΝΝΟΙΕΣ
Το σύμπλεγμα Kubernetes
Εγκατάσταση
Δοκιμάστε τον διακομιστή Kubernetes
Παράδειγμα: Ανάπτυξη πλέγματος σεληνίου χρησιμοποιώντας Kubernetes
Αυτοίαση
Κλιμάκωση του πλέγματος σεληνίου σας
Το Kubernetes είναι μια πλατφόρμα ανοιχτού κώδικα που αναπτύχθηκε από την Google για τη διαχείριση εφαρμογών με κοντέινερ σε ένα σύμπλεγμα διακομιστών. Βασίζεται σε μιάμιση δεκαετία εμπειρίας που έχει η Google με τη λειτουργία συμπλεγμάτων κοντέινερ σε κλίμακα , και παρέχει στους προγραμματιστές υποδομή στυλ Google, αξιοποιώντας έργα ανοιχτού κώδικα με τα καλύτερα έργα, όπως:
- Docker : μια τεχνολογία κοντέινερ εφαρμογής.
- Etcd : ένας κατανεμημένος χώρος αποθήκευσης κλειδιού-τιμής που διαχειρίζεται πληροφορίες σε όλο το σύμπλεγμα και παρέχει ανακάλυψη υπηρεσιών.
- Flannel : ένα ύφασμα δικτύου επικάλυψης που επιτρέπει τη συνδεσιμότητα κοντέινερ σε πολλούς διακομιστές.
Το Kubernetes επιτρέπει στους προγραμματιστές να ορίζουν την υποδομή εφαρμογών τους δηλωτικά μέσω αρχείων YAML και αφαιρέσεων όπως Pods, RC και Services (περισσότερα γι' αυτό αργότερα) και διασφαλίζει ότι το υποκείμενο σύμπλεγμα ταιριάζει με την κατάσταση που ορίζεται από τον χρήστη ανά πάσα στιγμή.
Μερικά από τα χαρακτηριστικά του περιλαμβάνουν:
- Αυτόματος προγραμματισμός πόρων συστήματος και αυτόματη τοποθέτηση κοντέινερ εφαρμογών σε ένα σύμπλεγμα.
- Κλιμάκωση εφαρμογών εν κινήσει με μία μόνο εντολή.
- Κυλιόμενες ενημερώσεις με μηδενικό χρόνο διακοπής λειτουργίας.
- Self-healing: αυτόματος επαναπρογραμματισμός μιας εφαρμογής σε περίπτωση βλάβης ενός διακομιστή, αυτόματη επανεκκίνηση των κοντέινερ, έλεγχοι υγείας.
Μεταβείτε στην Εγκατάσταση εάν είστε ήδη εξοικειωμένοι με το Kubernetes.
ΒΑΣΙΚΕΣ ΕΝΝΟΙΕΣ
Το Kubernetes προσφέρει τις ακόλουθες αφαιρέσεις (λογικές μονάδες) στους προγραμματιστές:
- Pods.
- Ελεγκτές αναπαραγωγής.
- Ετικέτες.
- Υπηρεσίες.
Pods
Είναι η βασική μονάδα φόρτου εργασίας Kubernetes. Ένα pod μοντελοποιεί έναν "λογικό κεντρικό υπολογιστή" για συγκεκριμένη εφαρμογή σε ένα κοντέινερ περιβάλλον. Με απλούς όρους, μοντελοποιεί μια ομάδα εφαρμογών ή υπηρεσιών που συνήθιζαν να λειτουργούν στον ίδιο διακομιστή στον κόσμο πριν από το κοντέινερ. Τα κοντέινερ μέσα σε ένα pod μοιράζονται τον ίδιο χώρο ονομάτων δικτύου και μπορούν επίσης να μοιράζονται όγκους δεδομένων.
Ελεγκτές αναπαραγωγής
Τα Pods είναι εξαιρετικά για την ομαδοποίηση πολλών κοντέινερ σε λογικές μονάδες εφαρμογής, αλλά δεν προσφέρουν αναπαραγωγή ή επαναπρογραμματισμό σε περίπτωση αποτυχίας διακομιστή.
Εδώ είναι χρήσιμος ένας ελεγκτής αναπαραγωγής ή RC. Ένα RC διασφαλίζει ότι ένας αριθμός ομάδων ομάδων μιας δεδομένης υπηρεσίας εκτελείται πάντα σε όλο το σύμπλεγμα.
Ετικέτες
Είναι μεταδεδομένα κλειδιού-τιμής που μπορούν να προσαρτηθούν σε οποιονδήποτε πόρο του Kubernetes (pods, RC, υπηρεσίες, κόμβοι, ...).
Υπηρεσίες
Τα pod και οι ελεγκτές αναπαραγωγής είναι ιδανικά για την ανάπτυξη και τη διανομή εφαρμογών σε ένα σύμπλεγμα, αλλά τα pods έχουν εφήμερες διευθύνσεις IP που αλλάζουν κατά τον επαναπρογραμματισμό ή την επανεκκίνηση του κοντέινερ.
Μια υπηρεσία Kubernetes παρέχει ένα σταθερό τελικό σημείο (σταθερή εικονική IP + θύρα σύνδεσης με τους κεντρικούς διακομιστές) για μια ομάδα ομάδων που διαχειρίζεται ένας ελεγκτής αναπαραγωγής.
Το σύμπλεγμα Kubernetes
Στην απλούστερη μορφή του, ένα σύμπλεγμα Kubernetes αποτελείται από δύο τύπους κόμβων:
- 1 Master Kubernetes.
- N Κόμβοι Kubernetes.
Δάσκαλος του Kubernetes
Το κύριο Kubernetes είναι η μονάδα ελέγχου ολόκληρου του συμπλέγματος.
Τα κύρια συστατικά του πλοιάρχου είναι:
- Etcd: ένα παγκοσμίως διαθέσιμο χώρο αποθήκευσης δεδομένων που αποθηκεύει πληροφορίες σχετικά με το σύμπλεγμα και τις υπηρεσίες και τις εφαρμογές που εκτελούνται στο σύμπλεγμα.
- Διακομιστής Kube API: αυτός είναι ο κύριος κόμβος διαχείρισης του συμπλέγματος Kubernetes και εκθέτει μια διεπαφή RESTful.
- Διαχείριση ελεγκτών: χειρίζεται την αναπαραγωγή εφαρμογών που διαχειρίζονται οι ελεγκτές αναπαραγωγής.
- Προγραμματιστής: παρακολουθεί τη χρήση πόρων σε όλο το σύμπλεγμα και εκχωρεί ανάλογα φόρτους εργασίας.
Κόμβος Kubernetes
Ο κόμβος Kubernetes είναι διακομιστές εργασίας που είναι υπεύθυνοι για την εκτέλεση των pods.
Τα κύρια συστατικά ενός κόμβου είναι:
- Docker: ένας δαίμονας που εκτελεί κοντέινερ εφαρμογών που ορίζονται σε pods.
- Kubelet: μονάδα ελέγχου για pods σε τοπικό σύστημα.
- Kube-proxy: ένας διακομιστής μεσολάβησης δικτύου που διασφαλίζει τη σωστή δρομολόγηση για τις υπηρεσίες Kubernetes.
Εγκατάσταση
Σε αυτόν τον οδηγό, θα δημιουργήσουμε ένα σύμπλεγμα 3 κόμβων χρησιμοποιώντας διακομιστές CentOS 7:
- 1 Master Kubernetes (kube-master)
- 2 κόμβοι Kubernetes (kube-node1, kube-node2)
Μπορείτε να προσθέσετε όσους επιπλέον κόμβους θέλετε αργότερα ακολουθώντας την ίδια διαδικασία εγκατάστασης για τους κόμβους Kubernetes.
Όλοι οι κόμβοι
Διαμόρφωση ονομάτων κεντρικών υπολογιστών και /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
Απενεργοποίηση τείχους προστασίας:
systemctl disable firewalld
systemctl stop firewalld
Δάσκαλος του Kubernetes
Εγκαταστήστε τα κύρια πακέτα Kubernetes:
yum install etcd kubernetes-master
Διαμόρφωση:
# /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"
Έναρξη κτλ:
systemctl start etcd
Εγκαταστήστε και διαμορφώστε το ύφασμα δικτύου επικάλυψης Flannel (αυτό είναι απαραίτητο ώστε τα κοντέινερ που εκτελούνται σε διαφορετικούς διακομιστές να μπορούν να βλέπουν το ένα το άλλο):
yum install flannel
Δημιουργήστε ένα αρχείο διαμόρφωσης Flannel ( flannel-config.json):
{
"Network": "10.20.0.0/16",
"SubnetLen": 24,
"Backend": {
"Type": "vxlan",
"VNI": 1
}
}
Ορίστε τη διαμόρφωση Flannel στον διακομιστή Etcd:
etcdctl set coreos.com/network/config < flannel-config.json
Τοποθετήστε Flannel στον διακομιστή Etcd:
# /etc/sysconfig/flanneld
FLANNEL_ETCD="http://kube-master:2379"
Ενεργοποιήστε τις υπηρεσίες έτσι ώστε να ξεκινούν κατά την εκκίνηση:
systemctl enable etcd
systemctl enable kube-apiserver
systemctl enable kube-controller-manager
systemctl enable kube-scheduler
systemctl enable flanneld
Επανεκκίνηση διακομιστή.
Κόμβος Kubernetes
Εγκαταστήστε τα πακέτα κόμβων Kubernetes:
yum install docker kubernetes-node
Τα επόμενα δύο βήματα θα διαμορφώσουν το Docker ώστε να χρησιμοποιεί επικαλύψεις για καλύτερη απόδοση. Για περισσότερες πληροφορίες επισκεφθείτε αυτήν την ανάρτηση ιστολογίου :
Διαγράψτε τον τρέχοντα κατάλογο αποθήκευσης docker:
systemctl stop docker
rm -rf /var/lib/docker
Αλλαγή αρχείων διαμόρφωσης:
# /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
Ρυθμίστε το kube-node1 για να χρησιμοποιήσει τον προηγουμένως διαμορφωμένο κύριο:
# /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"
Εγκαταστήστε και διαμορφώστε το ύφασμα δικτύου επικάλυψης Flannel (και πάλι - αυτό είναι απαραίτητο ώστε τα κοντέινερ που εκτελούνται σε διαφορετικούς διακομιστές να μπορούν να βλέπουν το ένα το άλλο):
yum install flannel
Τοποθετήστε Flannel στον διακομιστή Etcd:
# /etc/sysconfig/flanneld
FLANNEL_ETCD="http://kube-master:2379"
Ενεργοποίηση υπηρεσιών:
systemctl enable docker
systemctl enable flanneld
systemctl enable kubelet
systemctl enable kube-proxy
Κάντε επανεκκίνηση του διακομιστή.
Δοκιμάστε τον διακομιστή Kubernetes
Μετά την επανεκκίνηση όλων των διακομιστών, ελέγξτε εάν το σύμπλεγμα Kubernetes είναι λειτουργικό:
[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
Παράδειγμα: Ανάπτυξη πλέγματος σεληνίου χρησιμοποιώντας Kubernetes
Το Selenium είναι ένα πλαίσιο για την αυτοματοποίηση των προγραμμάτων περιήγησης για δοκιμαστικούς σκοπούς. Είναι ένα ισχυρό εργαλείο του οπλοστασίου οποιουδήποτε προγραμματιστή ιστού.
Το πλέγμα σεληνίου επιτρέπει την κλιμακούμενη και παράλληλη εξ αποστάσεως εκτέλεση δοκιμών σε ένα σύμπλεγμα κόμβων σεληνίου που συνδέονται με έναν κεντρικό κόμβο σεληνίου.
Since Selenium nodes are stateless themselves and the amount of nodes we run is flexible, depending on our testing workloads, this is a perfect candidate application to be deployed on a Kubernetes cluster.
In the next section, we'll deploy a grid consisting of 5 application containers:
- 1 central Selenium hub that will be the remote endpoint to which our tests will connect.
- 2 Selenium nodes running Firefox.
- 2 Selenium nodes running Chrome.
Deployment strategy
To automatically manage replication and self-healing, we'll create a Kubernetes replication controller for each type of application container we listed above.
To provide developers who are running tests with a stable Selenium hub endpoint, we'll create a Kubernetes service connected to the hub replication controller.
Selenium hub
Replication controller
# 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
Deployment:
[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
Εδώ μπορούμε να δούμε ότι η Kubernetes έχει τοποθετήσει το δοχείο μου με σελήνιο στο 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
Ανάπτυξη:
[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
Μετά την ανάπτυξη της υπηρεσίας, θα είναι προσβάσιμη από:
- Οποιοσδήποτε κόμβος Kubernetes, μέσω της εικονικής IP 10.254.124.73 και της θύρας 4444.
- Εξωτερικά δίκτυα, μέσω των δημόσιων IP οποιωνδήποτε κόμβων Kubernetes, στη θύρα 30000.

(χρησιμοποιώντας τη δημόσια IP ενός άλλου κόμβου Kubernetes)
Κόμβοι σεληνίου
Ελεγκτής αναπαραγωγής κόμβου 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"
Ανάπτυξη:
Αντικαταστήστε replace_with_service_ipτο selenium-node-firefox-rc.yamlμε την πραγματική IP υπηρεσίας διανομέα Selenium, σε αυτήν την περίπτωση 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
Όπως μπορούμε να δούμε, η Kubernetes έχει δημιουργήσει 2 αντίγραφα selenium-firefox-nodeκαι τα έχει διανείμει σε όλο το σύμπλεγμα. Το Pod selenium-node-firefox-lc6qtβρίσκεται στο kube-node2, ενώ το pod selenium-node-firefox-y9qjpείναι στο kube-node1.
Επαναλαμβάνουμε την ίδια διαδικασία για τους κόμβους Selenium Chrome.
Ελεγκτής αναπαραγωγής κόμβου 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"
Ανάπτυξη:
[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
Τυλίγοντας
Σε αυτόν τον οδηγό, έχουμε δημιουργήσει ένα μικρό σύμπλεγμα Kubernetes με 3 διακομιστές (1 κύριος ελεγκτής + 2 εργαζόμενοι).
Χρησιμοποιώντας pods, RC και μια υπηρεσία, αναπτύξαμε με επιτυχία ένα Selenium Grid που αποτελείται από έναν κεντρικό διανομέα και 4 κόμβους, επιτρέποντας στους προγραμματιστές να εκτελούν 4 ταυτόχρονες δοκιμές Selenium τη φορά στο σύμπλεγμα.
Η Kubernetes προγραμμάτισε αυτόματα τα κοντέινερ σε ολόκληρο το σύμπλεγμα.
![Ξεκινώντας με το Kubernetes στο CentOS 7 Ξεκινώντας με το Kubernetes στο CentOS 7]()
Αυτοίαση
Η Kubernetes επαναπρογραμματίζει αυτόματα τα pods σε υγιείς διακομιστές, εάν ένας ή περισσότεροι από τους διακομιστές μας διακοπούν. Στο παράδειγμά μου, το kube-node2 τρέχει αυτήν τη στιγμή το Selenium hub pod και 1 Selenium Firefox node pod.
[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
Θα προσομοιώσουμε την αποτυχία διακομιστή κλείνοντας το kube-node2. Μετά από μερικά λεπτά, θα πρέπει να δείτε ότι τα κοντέινερ που λειτουργούσαν στο kube-node2 έχουν επαναπρογραμματιστεί σε kube-node1, διασφαλίζοντας ελάχιστη διακοπή της υπηρεσίας.
[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
Κλιμάκωση του πλέγματος σεληνίου σας
Η κλιμάκωση του πλέγματος Selenium είναι εξαιρετικά εύκολη με το Kubernetes. Φανταστείτε ότι αντί για 2 κόμβους Firefox, θα ήθελα να εκτελέσω 4. Η αναβάθμιση μπορεί να γίνει με μία μόνο εντολή:
[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
![Ξεκινώντας με το Kubernetes στο CentOS 7 Ξεκινώντας με το Kubernetes στο CentOS 7]()