آموزش نصب سریع کلاسترینگ کوبرنیتیس Kubernetes 1.10 با Kubeadm در اوبونتو ۱۶٫۰۴

How To Create a Kubernetes 1.10 Cluster Using Kubeadm on Ubuntu 16.04

 

مقدمه 

در این آموزش به صورت خلاصه و کاربردی به نصب ، راه اندازی و تنظیمات Kubernetes بوسیله Kubeadm و برنامه مدیریت تنظیمات Ansible بر روی سیستم عامل Ubuntu 16.04 می پردازیم. شرح این آموزش را به صورت کامل در صفحه آموزش نصب کلاسترینگ Kubernetes می توانید مطالعه کنید. 

در این آموزش برای نصب کلاسترینگ Kubernetes از سه عدد سرور Ubuntu 16.04 استفاده می کنیم که یک سرور به عنوان Master و نقش مدیریت و تنظیم کننده وظایف دو سرور دیگر می باشد که به عنوان سرور Worker در کلاسترینگ استفاده می شوند. 

همچنین لازم است که در این آموزش با مفاهیم Ansible و نقش Playbook ها در Ansible و همچنین مفهوم Pod در Kubernetes آشنایی داشته باشید. برای آشنایی با Ansible و همچنین روش نصب آن در لینوکس Ubuntu از این آموزش می توانید استفاده کنید و برای آشنایی با Plybook ها در Ansible از این آموزش استفاده کنید و برای آشنایی با Pod ها از مطلب آشنایی با مفهوم Pod در kubernetes استفاده کنید. 

مرحله اول - تنظیم دایرکتوری فضای کار و فایل فهرست Ansible 

در ابتدا یک دایرکتوری برای Workspace و استفاده فضای کاری مورد نیازمان ایجاد می کنیم. سپس در این دایرکتوری یک فایل ایجاد می کنیم که این فایل شامل اطلاعات سرور ها و گروه های سرور های می باشد. 

mkdir ~/kube-cluster
cd ~/kube-cluster
nano ~/kube-cluster/hosts

خطوط زیر را در این فایل وارد کنید و مقادیر گفته شده را با مقادیر مناسب جایگزین کنید. منظور مقادیر master_ip و worker_1_ip و worker_2_ip می باشد : 

mkdir ~/kube-cluster
cd ~/kube-cluster
nano ~/kube-cluster/hosts

مرحله دوم - ایجاد کاربر در سرور های متصل 

در این مرحله بر روی سرور ها یک کاربر non-root user با دسترسی sudo ایجاد می کنیم که سرور ها با دسترسی این کاربر به یکدیگر متصل می شوند. برای این کار از Ansible استفاده می کنیم و یک Playbook به صورت زیر ایجاد می کنیم : 

- hosts: all
  become: yes
  tasks:
    - name: create the 'ubuntu' user
      user: name=ubuntu append=yes state=present createhome=yes shell=/bin/bash

    - name: allow 'ubuntu' to have passwordless sudo
      lineinfile:
        dest: /etc/sudoers
        line: 'ubuntu ALL=(ALL) NOPASSWD: ALL'
        validate: 'visudo -cf %s'
    - name: set up authorized keys for the ubuntu user
      authorized_key: user=ubuntu key="{{item}}"
      with_file:
        - ~/.ssh/id_rsa.pub

سپس Playbook را اجرا می کنیم : 

ansible-playbook -i hosts ~/kube-cluster/initial.yml

این دستور بین دو تا 5 دقیقه اجرا می شود.

مرحله سوم - نصب پیش نیاز های kubernetes 

در این قسمت باید پکیج های مورد نیاز Kubernetes در سیستم عامل را بوسیله apt که ابزار مدیریت بسته های Ubuntu است ، نصب کنیم.  این پکیج ها به ترتیب Docker و Kubeadm و Kubelet و Kubectl هستند. این بسته ها باید بر روی تمامی سرور ها نصب شوند ، پس برای این کار نیز از Ansible با Playbook زیر استفاده می کنیم :

nano ~/kube-cluster/kube-dependencies.yml

سپس play زیر را برای نصب پکیج ها در سرور ها وارد کنید : 

- hosts: all
  become: yes
  tasks:
   - name: install Docker
     apt:
       name: docker.io
       state: present
       update_cache: true

   - name: install APT Transport HTTPS
     apt:
       name: apt-transport-https
       state: present

   - name: add Kubernetes apt-key
     apt_key:
       url: https://packages.cloud.google.com/apt/doc/apt-key.gpg
       state: present

   - name: add Kubernetes' APT repository
     apt_repository:
      repo: deb http://apt.kubernetes.io/ kubernetes-xenial main
      state: present
      filename: 'kubernetes'

   - name: install kubelet
     apt:
       name: kubelet
       state: present
       update_cache: true

   - name: install kubeadm
     apt:
       name: kubeadm
       state: present

- hosts: master
  become: yes
  tasks:
   - name: install kubectl
     apt:
       name: kubectl
       state: present

بعد از اتمام کار فایل را ذخیره کرده و خارج شوید و Playbook را اجرا کنید : 

ansible-playbook -i hosts ~/kube-cluster/kube-dependencies.yml

مرحله چهارم - تنظیم سرور Master 

در این مرحله تنظیمات سرور master را انجام می دهیم. هر Pod آدرس IP برای خود دارد ، و هر pod در هر سرور باید بتواند از طریق آدرس IP آن pod در سرور دیگر به آن متصل شود. مخازنی که بر روی یک سرور هستند براحتی بوسیله رابط های محلی ارتباط برقرار می کنند. ارتباط بین pod ها پیچیده است و نیاز به یک شبکه جداگانه دارد که مسیر شفاف از یک pod به یک pod در یک سرور دیگر مشخص شده باشد. 

این کار توسط پلاگین شبکه pod انجام می شود. در این آموزش از Flannel استفاده می کنیم که یک گزینه پایدار و مناسب است. 

یک Ansible playbook با نام master.yml ایجاد کنید : 

nano ~/kube-cluster/master.yml

متن play زیر را برای نصب Flannel و مقدار دهی اولیه کلاستر وارد کنید : 

- hosts: master
  become: yes
  tasks:
    - name: initialize the cluster
      shell: kubeadm init --pod-network-cidr=10.244.0.0/16 >> cluster_initialized.txt
      args:
        chdir: $HOME
        creates: cluster_initialized.txt

    - name: create .kube directory
      become: yes
      become_user: ubuntu
      file:
        path: $HOME/.kube
        state: directory
        mode: 0755

    - name: copy admin.conf to user's kube config
      copy:
        src: /etc/kubernetes/admin.conf
        dest: /home/ubuntu/.kube/config
        remote_src: yes
        owner: ubuntu

    - name: install Pod network
      become: yes
      become_user: ubuntu
      shell: kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.9.1/Documentation/kube-flannel.yml >> pod_network_setup.txt
      args:
        chdir: $HOME
        creates: pod_network_setup.txt

در انتها فایل را ذخیره کرده و خارج شوید. 

فایل playbook را به صورت محلی Local اجرا کنید : 

ansible-playbook -i hosts ~/kube-cluster/master.yml0  

برای بررسی وضعیت سرور master از طریق ssh با دستور زیر به سرور متصل شوید : 

ssh ubuntu@master_ip

پس از وارد شدن به سرور دستور زیر را اجرا کنید : 

kubectl get nodes

باید خروجی مشابه زیر را مشاهده کنید : 

Output
NAME      STATUS ROLES     AGE VERSION
master    Ready master    1d v1.10.1

در سرور master تمامی تنظیمات و مقداردهی های اولیه انجام شده و وضعیت سرور در حالت ready و آماده برای شروع اتصال به سرور های worker و ارسال وظایف به آنها از طریق  API Server می باشد. اکنون می توانیم سرور های worker را اضافه کنیم. 

مرحله پنجم - تنظیمات سرور های Worker 

برای اضافه کردن گره worker یک دستور را باید اجرا کنید ، که شامل جزئیات مورد نیاز کلاستر از قبیل آدرس IP و پورت API سرور master می باشد و یک توکن امنیتی می باشد. فقط سروری که توکن را قبول می کند می تواند به کلاستر متصل شود. 

به مسیر فضای کاری Workspace بروید و یک playbook به نام workers.yml ایجاد کنید : 

nano ~/kube-cluster/workers.yml

متن زیر را در فایل قرار دهید : 

- hosts: master
  become: yes
  gather_facts: false
  tasks:
    - name: get join command
      shell: kubeadm token create --print-join-command
      register: join_command_raw

    - name: set join command
      set_fact:
        join_command: "{{ join_command_raw.stdout_lines[0] }}"


- hosts: workers
  become: yes
  tasks:
    - name: join cluster
      shell: "{{ hostvars['master'].join_command }} >> node_joined.txt"
      args:
        chdir: $HOME
        creates: node_joined.txt

فایل را ذخیره کرده و خارج شوید. 

فایل playbook را اجرا کنید : 

ansible-playbook -i hosts ~/kube-cluster/workers.yml0  

با اضافه شدن سرور های worker کلاستر شما به صورت کامل تنظیم شده و آماده بهره برداری است و worker ها آماده اجرای بارهای کاری ارسالی هستند. قبل از زمان بندی برنامه ، صحت عملکرد کلاستر را بررسی می کنیم. 

مرحله ششم - بررسی کلاستر 

در این مرحله وضعیت گره ها یا سرور های متصل به سرور master را در سرور master را بررسی می کنیم. ابتدا به سرور master متصل می شویم : 

ssh ubuntu@master_ip

سپس دستور زیر را برای بررسی وضعیت سرور اجرا کنید : 

kubectl get nodes

خروجی باید مشابه زیر باشد : 

Output
NAME      STATUS ROLES     AGE VERSION
master    Ready master    1d v1.10.1
worker1   Ready <none>    1d v1.10.1 
worker2   Ready <none>    1d v1.10.1

اگر وضعیت STATUS سرور ها در حالت ready بود ، به این معنی است که این قسمت از سرور به درستی کار می کند و آماده انجام کارها می باشند. 

و اگر هر وضعیت STATUS هر سروری در حالت NotReady باشد به این معنی است که تنظیمات آن سرور هنوز تمام نشده است. حدود 5 تا 10 دقیقه قبل از اجرای مجدد دستور kubectl get node صبر کنید ، سپس مجددا خروجی را بررسی کنید. اگر هنوز وضعیت سرور ها NotReady بود ، باید دستورات مراحل قبل را مجددا بررسی و اجرا کنید. 

مرحله هفتم - اجرای یک برنامه در کلاستر 

اکنون می توانید هر برنامه ای که نیاز به مخزن دارد را اجرا کنید. برای نمونه برنامه Nginx را بر روی کلاستر اجرا می کنیم. در سرور master دستور زیر را برای ایجاد یک deployment از  nginx وارد کنید : 

kubectl run nginx --image=nginx --port 80

سپس برای ایجاد یک سرویس با نام nginx برای در اختیار عموم قرار دادن این برنامه ، دستور زیر را وارد کنید. این کار از طریق NodePort انجام می شود ، به این صورت که یک پورت دلخواه را برای اتصال به یک pod در یک سرور دیگر باز می کند : 

kubectl expose deploy nginx --port 80 --target-port 80 --type NodePort

دستور زیر را اجرا کنید : 

kubectl get services

خروجی این دستور مانند زیر است : 

Output
NAME         TYPE CLUSTER-IP       EXTERNAL-IP PORT(S)        AGE
kubernetes   ClusterIP 10.96.0.1        <none> 443/TCP        1d
nginx        NodePort    10.109.228.209   <none>     80:nginx_port/TCP   40m
 

همانطور که در خروجی مشاهده می کنید Nginx بر روی پورت 80 کار می کند. Kubernetes یک پورت تصادفی بالاتر از 30000 که مطمئن است به سرویس دیگری تعلق نگرفته است را به این برنامه می دهد. 

برای بررسی صحت عملکرد آدرس http://worker_1_ip:nginx_port یا http://worker_2_ip:nginx_port را در مرورگر سرور محلی خود وارد کنید. در این قسمت باید صفحه Nginx را مشاهده کنید. 

برای حذف برنامه Nginx ابتدا سرویس Nginx را از سرور master حذف کنید : 

kubectl delete service nginx

دستور زیر را وارد کنید تا از حذف شدن برنامه مطمئن شوید : 

kubectl get services

خروجی باید مشابه زیر باشد : 

Output
NAME         TYPE CLUSTER-IP       EXTERNAL-IP PORT(S)        AGE
kubernetes   ClusterIP 10.96.0.1        <none> 443/TCP        1d

سپس deployment را حذف کنید : 

kubectl get deployments
Output
No resources found.

برای مشاهده مشروح این آموزش و توضیح تمامی جزئیات تنظیمات انجام شده و آشنایی با مفاهیم مطرح شده شرح این آموزش را از صفحه آموزش نصب Kubernetes با Kubeadm در لینوکس Ubuntu 16.04 مطالعه کنید. 

  • با خدمات ابری پارس آشنا شوید

    اولین ارائه‌دهنده خدمات رایانش ابری در ایران هستیم

    سرور ابری

    سرور ابری

    چاپگرها و متون بلکه روزنامه و مجله در ستون و سطرآنچنان که لازم است و برای شرایط فعلی تکنولوژی مورد

    سرور هیبردی

    سرور هیبردی

    چاپگرها و متون بلکه روزنامه و مجله در ستون و سطرآنچنان که لازم است و برای شرایط فعلی تکنولوژی مورد

    سرور ماکرو

    سرور ماکرو

    چاپگرها و متون بلکه روزنامه و مجله در ستون و سطرآنچنان که لازم است و برای شرایط فعلی تکنولوژی مورد

    میزبانی ابری

    میزبانی ابری

    چاپگرها و متون بلکه روزنامه و مجله در ستون و سطرآنچنان که لازم است و برای شرایط فعلی تکنولوژی مورد

    هاست دانلود

    هاست دانلود

    چاپگرها و متون بلکه روزنامه و مجله در ستون و سطرآنچنان که لازم است و برای شرایط فعلی تکنولوژی مورد

    مطالعه این مطالب نیز پیشنهاد می‌شود

    مقالات و نظرات اعضای تیم ما درباره تکنولوژی، روزهای کاری و چیزای دیگر…

  • کلیه حقوق برای شرکت دانش بنیان پارس پک محفوظ می باشد.

    Copyright © 2019 Pars Parva System Ltd. ParsPack Cloud Computing Technology ® , All Rights Reserved.