ابدأ مع Kubernetes على CentOS 7

Kubernetes هو نظام أساسي مفتوح المصدر تم تطويره بواسطة Google لإدارة التطبيقات في حاويات عبر مجموعة من الخوادم. وهي تعتمد على عقد ونصف من الخبرة التي تتمتع بها Google مع تشغيل مجموعات من الحاويات على نطاق واسع ، وتوفر للمطورين بنية تحتية على غرار Google ، والاستفادة من أفضل المشاريع مفتوحة المصدر ، مثل:

  • Docker : تقنية حاويات التطبيقات.
  • Etcd : مخزن بيانات رئيسي ذو قيمة رئيسية يدير معلومات على مستوى المجموعة ويوفر اكتشاف الخدمة.
  • Flannel : نسيج شبكة تراكب يتيح اتصال الحاويات عبر خوادم متعددة.

يتيح Kubernetes للمطورين تحديد البنية التحتية للتطبيق بشكل معلن من خلال ملفات YAML وملخصات مثل Pods و RCs والخدمات (المزيد عن هذا لاحقًا) ويضمن أن المجموعة الأساسية تتطابق مع الحالة المعرفة من قبل المستخدم في جميع الأوقات.

تشمل بعض ميزاته ما يلي:

  • الجدولة التلقائية لموارد النظام والتنسيب التلقائي لحاويات التطبيقات عبر مجموعة.
  • تحجيم التطبيقات بسرعة كبيرة باستخدام أمر واحد.
  • تحديثات متجددة بدون توقف.
  • الشفاء الذاتي: إعادة الجدولة التلقائية للتطبيق في حالة فشل الخادم ، إعادة التشغيل التلقائي للحاويات ، الفحوصات الصحية.

انتقل إلى التثبيت إذا كنت بالفعل على دراية بـ Kubernetes.

مفاهيم أساسية

تقدم Kubernetes الملخصات (الوحدات المنطقية) التالية للمطورين:

  • القرون.
  • وحدات تحكم النسخ المتماثل.
  • تسميات.
  • خدمات.

القرون

إنها الوحدة الأساسية لأحمال عمل Kubernetes. نموذج جراب "المضيف المنطقي" الخاصة بالتطبيق في بيئة الحاوية. بعبارات الأشخاص العاديين ، فإنه يصمم مجموعة من التطبيقات أو الخدمات التي كانت تعمل على نفس الخادم في عالم ما قبل الحاوية. تشارك الحاويات داخل جراب نفس مساحة اسم الشبكة ويمكنها مشاركة أحجام البيانات أيضًا.

وحدات تحكم النسخ المتماثل

تعتبر الحافظات رائعة لتجميع حاويات متعددة في وحدات التطبيق المنطقية ، لكنها لا تقدم النسخ المتماثل أو إعادة الجدولة في حالة فشل الخادم.

هذا هو المكان الذي يكون فيه جهاز تحكم النسخ المتماثل أو RC مفيدًا. يضمن RC أن عددًا من القرون لخدمة معينة تعمل دائمًا عبر الكتلة.

تسميات

وهي بيانات وصفية ذات قيمة رئيسية يمكن إرفاقها بأي مورد Kubernetes (القرون ، المنسقون المقيمون ، الخدمات ، العقد ، ...).

خدمات

تعتبر وحدات التحكم في وحدات التحكم في النسخ المتماثل رائعة لنشر التطبيقات وتوزيعها عبر مجموعة ، إلا أن لوحات التحكم لديها عناوين IP سريعة الزوال تتغير عند إعادة الجدولة أو إعادة تشغيل الحاوية.

توفر خدمة Kubernetes نقطة نهاية ثابتة (ربط منفذ IP + ظاهري ثابت للخوادم المضيفة) لمجموعة من الأقراص التي تتم إدارتها بواسطة وحدة تحكم النسخ المتماثل.

مجموعة Kubernetes

في أبسط أشكالها ، تتكون مجموعة Kubernetes من نوعين من العقد:

  • 1 سيد Kubernetes.
  • عقد N Kubernetes.

سيد Kubernetes

سيد Kubernetes هو وحدة التحكم في المجموعة بأكملها.

المكونات الرئيسية للماجستير هي:

  • Etcd: مخزن بيانات متوفر عالميًا يخزن معلومات حول المجموعة والخدمات والتطبيقات التي تعمل على الكتلة.
  • خادم Kube API: هذا هو مركز الإدارة الرئيسي لمجموعة Kubernetes ويكشف عن واجهة RESTful.
  • مدير التحكم: يعالج النسخ المتماثل للتطبيقات التي تديرها وحدات تحكم النسخ المتماثل.
  • المجدول: يتتبع استخدام الموارد عبر المجموعة ويعين أعباء العمل وفقًا لذلك.

عقدة Kubernetes

عقدة Kubernetes هي خوادم عاملة مسؤولة عن تشغيل القرون.

المكونات الرئيسية للعقدة هي:

  • Docker: برنامج يقوم بتشغيل حاويات التطبيقات المحددة في القرون.
  • Kubelet: وحدة تحكم للقرون في النظام المحلي.
  • وكيل Kube: وكيل شبكة يضمن التوجيه الصحيح لخدمات Kubernetes.

التركيب

في هذا الدليل ، سننشئ مجموعة من 3 عقد باستخدام خوادم CentOS 7:

  • 1 Kubernetes master (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"

بدء Etcd:

systemctl start etcd

قم بتثبيت وتكوين نسيج شبكة Flannel overlay (هذا مطلوب حتى تتمكن الحاويات التي تعمل على خوادم مختلفة من رؤية بعضها البعض):

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 لاستخدام تراكبات لأداء أفضل. لمزيد من المعلومات ، قم بزيارة منشور المدونة هذا :

حذف دليل تخزين عامل الميناء الحالي:

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

السيلينيوم هو إطار لأتمتة المتصفحات لأغراض الاختبار. إنها أداة قوية لترسانة أي مطور ويب.

تتيح شبكة السيلينيوم تنفيذ اختبارات قابلة للتوسع ومتوازية عن بُعد عبر مجموعة من عقد السيلينيوم المتصلة بمحور سيلينيوم مركزي.

نظرًا لأن عُقد السيلينيوم عديمة الجنسية في حد ذاتها وأن كمية العقد التي نقوم بتشغيلها مرنة ، اعتمادًا على أعباء عمل الاختبار لدينا ، فهذا تطبيق مرشح مثالي ليتم نشره على مجموعة Kubernetes.

في القسم التالي ، سننشر شبكة تتكون من 5 حاويات للتطبيقات:

  • 1 محور سيلينيوم مركزي سيكون نقطة النهاية البعيدة التي ستتصل بها اختباراتنا.
  • 2 عقد سيلينيوم يشغل فايرفوكس.
  • عقدتان من السيلينيوم تشغلان Chrome.

استراتيجية النشر

لإدارة النسخ المتماثل والشفاء الذاتي تلقائيًا ، سننشئ وحدة تحكم النسخ المتماثل Kubernetes لكل نوع من حاويات التطبيق التي ذكرناها أعلاه.

لتزويد المطورين الذين يجرون الاختبارات بنقطة نهاية لوحة وصل سيلينيوم مستقرة ، سننشئ خدمة Kubernetes متصلة بجهاز تحكم النسخ المتماثل للوحة الوصل.

محور السيلينيوم

تحكم النسخ المتماثل
# 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

تعيين:

[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 قد وضعت حاوية selenium-hub على 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.

ابدأ مع Kubernetes على CentOS 7ابدأ مع Kubernetes على CentOS 7 (باستخدام IP العام لعقدة Kubernetes أخرى)

عقد السيلينيوم

تحكم العقدة فايرفوكس تحكم:

# 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 خدمة مركز السيلينيوم الفعلي، في هذه الحالة 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 نسختين متماثلتين ووزعتهما selenium-firefox-nodeعبر المجموعة. جراب selenium-node-firefox-lc6qtعلى kube-node2 ، بينما جراب selenium-node-firefox-y9qjpعلى kube-node1.

نكرر نفس العملية لعقد سيلينيوم كروم.

وحدة تحكم النسخ المتماثل لعقدة 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 خوادم (وحدة تحكم رئيسية + عاملين).

باستخدام القرون ، RCs والخدمة ، قمنا بنجاح بنشر شبكة Selenium تتكون من محور مركزي و 4 عقد ، مما يتيح للمطورين تشغيل 4 اختبارات Selenium متزامنة في وقت واحد على الكتلة.

قامت Kubernetes بجدولة الحاويات تلقائيًا عبر المجموعة بأكملها.

ابدأ مع Kubernetes على CentOS 7

الشفاء الذاتي

تقوم Kubernetes تلقائيًا بإعادة جدولة البودات إلى خوادم سليمة في حالة تعطل واحد أو أكثر من خوادمنا. في المثال الخاص بي ، يقوم kube-node2 حاليًا بتشغيل جراب محور السيلينيوم وجراب عقدة سيلينيوم فايرفوكس.

[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

تحجيم شبكة السيلينيوم الخاصة بك

يعد توسيع نطاق شبكة السيلينيوم الخاص بك أمرًا سهلاً للغاية مع Kubernetes. تخيل أنه بدلاً من عقدتي 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



Leave a Comment

كيفية تثبيت وتكوين CyberPanel على خادم CentOS 7 الخاص بك

كيفية تثبيت وتكوين CyberPanel على خادم CentOS 7 الخاص بك

استخدام نظام مختلف؟ مقدمة تعد CyberPanel واحدة من أولى لوحات التحكم في السوق مفتوحة المصدر وتستخدم OpenLiteSpeed. ما هذا

كيفية تثبيت CMS أكتوبر على CentOS 7

كيفية تثبيت CMS أكتوبر على CentOS 7

أكتوبر هو نظام إدارة محتوى مفتوح المصدر يعتمد على Laravel PHP Framework. مع واجهة أنيقة وبنية وحدات موجزة

قم بتثبيت RockMongo على CentOS 7

قم بتثبيت RockMongo على CentOS 7

RockMongo هي أداة إدارة MongoDB على الويب تشبه أداة إدارة MySQL: phpMyAdmin. سيغطي هذا البرنامج التعليمي عملية التثبيت

كيفية نشر Lets Chat Server على CentOS 7

كيفية نشر Lets Chat Server على CentOS 7

Lets Chat هو تطبيق دردشة مفتوح المصدر مصمم لتوفير خدمة الرسائل ذاتية الاستضافة للفرق الصغيرة. يعتمد Lets Chat على NodeJS و MongoDB

كيفية تثبيت أداة إدارة مشروع Taiga على CentOS 7

كيفية تثبيت أداة إدارة مشروع Taiga على CentOS 7

استخدام نظام مختلف؟ Taiga هو تطبيق مجاني ومفتوح المصدر لإدارة المشاريع. على عكس أدوات إدارة المشاريع الأخرى ، يستخدم Taiga زيادة

كيفية تثبيت المجدول المحجوز على CentOS 7

كيفية تثبيت المجدول المحجوز على CentOS 7

استخدام نظام مختلف؟ المتطلبات الأساسية مثيل خادم Vultr CentOS 7. مستخدم sudo. الخطوة 1: تحديث النظام أولاً ، قم بتحديث خادم النظام الخاص بك إلى th

تثبيت Netdata على CentOS 7

تثبيت Netdata على CentOS 7

استخدام نظام مختلف؟ Netdata هي نجمة صاعدة في مجال مراقبة مقاييس النظام في الوقت الفعلي. مقارنة بالأدوات الأخرى من نفس النوع ، Netdata:

كيفية تثبيت DreamFactory Open Source على CentOS 7

كيفية تثبيت DreamFactory Open Source على CentOS 7

DreamFactory هو برنامج مفتوح المصدر يمكنه تحويل أي قاعدة بيانات إلى منصة RESTful API. يمكن نشر DreamFactory على منصات مختلفة. في ثي

كيفية تثبيت خادم Starbound على CentOS 7

كيفية تثبيت خادم Starbound على CentOS 7

استخدام نظام مختلف؟ في هذا البرنامج التعليمي ، سأشرح لك كيفية إعداد خادم Starbound على CentOS 7. المتطلبات الأساسية يجب أن تمتلك هذه اللعبة عليك

كيفية تثبيت Golang 1.13 على CentOS 8 و Ubuntu 18.04 و Debian 10 و Fedora 31

كيفية تثبيت Golang 1.13 على CentOS 8 و Ubuntu 18.04 و Debian 10 و Fedora 31

Go (تُعرف أيضًا باسم Golang) هي لغة برمجة مكتوبة بشكل ثابت ومجمعة على شكل حرف C تم تطويرها بواسطة Google. جعلت البساطة وتعدد الاستخدامات ب

كيفية تثبيت Django على CentOS 7

كيفية تثبيت Django على CentOS 7

Django هو إطار Python شائع لكتابة تطبيقات الويب. مع Django ، يمكنك بناء التطبيقات بشكل أسرع ، دون إعادة اختراع العجلة. إذا كنت تريد

قم بإعداد خادم SA-MP San Andreas متعدد اللاعبين على CentOS 6

قم بإعداد خادم SA-MP San Andreas متعدد اللاعبين على CentOS 6

مرحبًا بك في برنامج تعليمي Vultr آخر. هنا ، ستتعلم كيفية تثبيت خادم SAMP وتشغيله. تمت كتابة هذا الدليل الخاص بـ CentOS 6. المتطلبات الأساسية التي ستحتاج إليها

تثبيت Revive Adserver على CentOS 7

تثبيت Revive Adserver على CentOS 7

Revive Adserver هو نظام عرض إعلانات مجاني ومفتوح المصدر يمكن استخدامه لإدارة الإعلانات على مواقع الويب و / أو التطبيقات و / أو مشغلات الفيديو. في هذه المقالة ،

قم بتثبيت Elgg على CentOS 7

قم بتثبيت Elgg على CentOS 7

استخدام نظام مختلف؟ Elgg هو محرك تواصل اجتماعي مفتوح المصدر يسمح بإنشاء بيئات اجتماعية مثل الشبكات الاجتماعية في الحرم الجامعي

قم ببناء شبكتك الاجتماعية مع الشتات على CentOS 7

قم ببناء شبكتك الاجتماعية مع الشتات على CentOS 7

استخدام نظام مختلف؟ الشتات هو شبكة اجتماعية مفتوحة المصدر تدرك الخصوصية. في هذا البرنامج التعليمي ، ستتعلم كيفية إعداد وتكوين po Diaspora po

نشر Kubernetes مع Kubeadm على CentOS 7

نشر Kubernetes مع Kubeadm على CentOS 7

نظرة عامة تهدف هذه المقالة إلى مساعدتك في إنشاء مجموعة Kubernetes وتشغيلها باستخدام kubeadm في لمح البصر. سيقوم هذا الدليل بنشر خادمين في

قم بإعداد Sails.js للتطوير على CentOS 7

قم بإعداد Sails.js للتطوير على CentOS 7

استخدام نظام مختلف؟ مقدمة Sails.js هو إطار عمل MVC لـ Node.js ، مشابه لـ Ruby on Rails. يجعل لتطوير التطبيقات الحديثة ver

كيفية تجميع Nginx من المصدر على CentOS 7

كيفية تجميع Nginx من المصدر على CentOS 7

استخدام نظام مختلف؟ يمكن استخدام NGINX كخادم HTTP / HTTPS أو خادم وكيل عكسي أو خادم وكيل بريد أو موازن تحميل أو فاصل TLS أو ذاكرة تخزين مؤقت

كيفية تثبيت dotCMS على CentOS 7

كيفية تثبيت dotCMS على CentOS 7

استخدام نظام مختلف؟ dotCMS هو نظام إدارة محتوى من فئة مفتوحة المصدر مفتوح بلغة جافا. أنه يحتوي تقريبا على كل ميزة مطلوبة ر

كيفية تثبيت PufferPanel (لوحة تحكم Minecraft المجانية) على CentOS 7

كيفية تثبيت PufferPanel (لوحة تحكم Minecraft المجانية) على CentOS 7

مقدمة في هذا البرنامج التعليمي ، سيتم تثبيت PufferPanel على Vultr VPS. PufferPanel هي لوحة تحكم مفتوحة المصدر مجانية للاستخدام لإدارتك

نظرة ثاقبة على 26 أسلوبًا لتحليل البيانات الضخمة: الجزء الأول

نظرة ثاقبة على 26 أسلوبًا لتحليل البيانات الضخمة: الجزء الأول

نظرة ثاقبة على 26 أسلوبًا لتحليل البيانات الضخمة: الجزء الأول

6 أشياء شديدة الجنون حول نينتندو سويتش

6 أشياء شديدة الجنون حول نينتندو سويتش

يعرف الكثير منكم أن Switch سيصدر في مارس 2017 وميزاته الجديدة. بالنسبة لأولئك الذين لا يعرفون ، قمنا بإعداد قائمة بالميزات التي تجعل "التبديل" "أداة لا غنى عنها".

وعود التكنولوجيا التي لم يتم الوفاء بها بعد

وعود التكنولوجيا التي لم يتم الوفاء بها بعد

هل تنتظر عمالقة التكنولوجيا للوفاء بوعودهم؟ تحقق من ما تبقى دون تسليم.

وظائف طبقات معمارية مرجعية للبيانات الضخمة

وظائف طبقات معمارية مرجعية للبيانات الضخمة

اقرأ المدونة لمعرفة الطبقات المختلفة في بنية البيانات الضخمة ووظائفها بأبسط طريقة.

كيف يمكن للذكاء الاصطناعي نقل أتمتة العمليات إلى المستوى التالي؟

كيف يمكن للذكاء الاصطناعي نقل أتمتة العمليات إلى المستوى التالي؟

اقرأ هذا لمعرفة مدى انتشار الذكاء الاصطناعي بين الشركات الصغيرة وكيف أنه يزيد من احتمالات نموها ومنح منافسيها القدرة على التفوق.

CAPTCHA: ما هي المدة التي يمكن أن تظل تقنية قابلة للتطبيق للتميز بين الإنسان والذكاء الاصطناعي؟

CAPTCHA: ما هي المدة التي يمكن أن تظل تقنية قابلة للتطبيق للتميز بين الإنسان والذكاء الاصطناعي؟

لقد أصبح حل CAPTCHA صعبًا جدًا على المستخدمين في السنوات القليلة الماضية. هل ستكون قادرة على أن تظل فعالة في اكتشاف البريد العشوائي والروبوتات في المستقبل القريب؟

التفرد التكنولوجي: مستقبل بعيد للحضارة الإنسانية؟

التفرد التكنولوجي: مستقبل بعيد للحضارة الإنسانية؟

مع تطور العلم بمعدل سريع ، واستلام الكثير من جهودنا ، تزداد أيضًا مخاطر تعريض أنفسنا إلى تفرد غير قابل للتفسير. اقرأ ، ماذا يمكن أن يعني التفرد بالنسبة لنا.

التطبيب عن بعد والرعاية الصحية عن بعد: المستقبل هنا

التطبيب عن بعد والرعاية الصحية عن بعد: المستقبل هنا

ما هو التطبيب عن بعد والرعاية الصحية عن بعد وأثره على الأجيال القادمة؟ هل هو مكان جيد أم لا في حالة الوباء؟ اقرأ المدونة لتجد طريقة عرض!

هل تساءلت يومًا كيف يربح المتسللون الأموال؟

هل تساءلت يومًا كيف يربح المتسللون الأموال؟

ربما سمعت أن المتسللين يكسبون الكثير من المال ، لكن هل تساءلت يومًا كيف يجنون هذا النوع من المال؟ دعنا نناقش.

يتسبب التحديث الإضافي لنظام macOS Catalina 10.15.4 في حدوث مشكلات أكثر من حلها

يتسبب التحديث الإضافي لنظام macOS Catalina 10.15.4 في حدوث مشكلات أكثر من حلها

أصدرت Apple مؤخرًا macOS Catalina 10.15.4 تحديثًا تكميليًا لإصلاح المشكلات ولكن يبدو أن التحديث يتسبب في المزيد من المشكلات التي تؤدي إلى إنشاء أجهزة macOS. قراءة هذه المادة لمعرفة المزيد