01.11.2010 - Как управлять OpenVZ

По долгу службы пришлось столкнуться с такой прелестной штуковиной как OpenVZ. OpenVZ - система паравиртуализации, основанная на ядре Linux (т.е. для всех гостевых машин используются ресурсы ядра ноды.) При помощи OpenVZ можно обвиртуализовать всё и вся, получив отряд хорошо вышколенных серверов, вместо цирка-шапито в виде нагромождения демонов на голом железе.

0.250 Художественное вступление

Давным-давно, когда люди не умели добывать огонь всё сервисы (приложения, базы данных, http-бэкенды, etc) жили прямо на серверах, волхвов админов еженощно будили звонками бдительные (время реакции ~30 минут, хехе) мониторщики. Потому что то один, то другой демон выходил из повиновения и отжирал что-нибудь свободное — диск/память/циклы процессора… (Вступление с хабры ;] )
Были и умельцы из числа разработчиков, способные наваять генерилку xml-ек, которая держала в памяти до 8ти гигабайт оных.

0.500 Схема

Очень удобно пользоваться следующей схемой:

Один сервис — один контейнер.
Кстати, я уже писал как всё это реализовать под CentOS.
Сервис — http-фронтэнд, http-бэкенд, applications, databases, что угодно, лишь бы было однородное, и не мешало друг другу жить.

Поскольку контейнерам лимиты выдаются только по результатам нагрузочного тестирования (нет результатов — не коммерческой эксплуатации), то сервис может сходить с ума сугубо в рамках этих лимитов. Иногда бывает, что один контейнер даёт LA на всю машину, но ioprio совсем жестко не зажмёшь.

0.750 Проблема

Хорошо-то, хорошо, но как всем этим цирком управлять? Машин куча, все много чего хотят, поделить ресурсы поровну между всем как в Xen`е не получится, да и не надо, т.к. одной машине надо кучу памяти, второй проц. Вот и стала предо мной проблема, мониторить состояние виртуалок, да так, чтобы и время на личную жизнь остовалось?

1 Реализация

Поскольку программист из меня фиговый, обратился к старшему собрату и получил в ответ скриптом... =) Буквально за несколько минут, с комментарием, в код особо не всматриваться. Да я и не собирался, лишь бы работало))

Собственно, чем занимается данный скрипт:

  • Контролирует превышение пороговых значений контейнера относительно предыдущего состояния.
  • Если есть превышение показателей, отсылает на почту письмо вида:


Limits exceeded:
veid 101 : numtcpsock 948 times


Сам скрипт:

$ cat vzbc.py 

#!/usr/bin/python
 
import os,subprocess,time
vzbc_list_old={}
while "True":
        p1 = subprocess.Popen(["vzlist -o veid",], shell=True, stdout=subprocess.PIPE)
        p2 = subprocess.Popen(["grep -v ID",], shell=True, stdin=p1.stdout ,stdout=subprocess.PIPE).communicate()[0]
        p3=p2.split(" ")
        temp_list={}
        velist=[]
        p6=[]
        for i in p3:
            if i !="": velist.append(i.strip("\n").strip(""))
    alert_list = []
        for i in velist:
            temp_dict={}
        bl=i[2:]
            cmd= "cat /proc/bc/" + i + "/resources"
            p5,err = subprocess.Popen([cmd], shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()
            if err != "" :
        alert_list.append(i + " " + err)
         
        continue   
        p6=p5.split("\n")
            for ii in range(2,len(p6)):
                p7=p6[ii].split()
                exclude= i + ":"
                if p7 != []:
                    if p7[0] == exclude: p7=p7[1:]
                    temp_dict[p7[0]]=p7[5]
        temp_dict["veid"]=i
            temp_list[i]=temp_dict
 
    if vzbc_list_old != {}:
 
            for a in temp_list.keys():
                for aa in temp_list[a].keys():
                    try:
                if vzbc_list_old[a][aa] != temp_list[a][aa]:
                    delta=int(temp_list[a][aa])-int(vzbc_list_old[a][aa])
                    alert_string="veid "+str(vzbc_list_old[a]["veid"])+" : "+aa+" "+str(delta)+" times\n"
                    alert_list.append(alert_string)
            except: continue
    if alert_list !=[]:
        SENDMAIL = "/usr/sbin/sendmail"
        p = os.popen("%s -t" % SENDMAIL, "w")
        p.write("To: root@gnu.su\n")
        p.write("Subject: VZBC\n")
        p.write("\n")
        p.write("Limits exceeded:\n")
        for i in alert_list:
        p.write(i)
        sts = p.close()
     
    time.sleep(60)
        vzbc_list_old=temp_list


Или Скачать

2. Как пользоваться

Я запускаю в скрине,

$ screen
./vzbc.py
# Отцепиться от скрина
, a, d


Либо можно прописать в /etc/rc.local

/opt/vzbc.py &


После того как получили письмо, заходим на ноду и сами ручками исправляем параметры виртуалки, под ее требования.
Перед выставлением параметров прошу ознакомиться с документацией.

Да прибудет с вами сила.

Хочу попробовать какую-нибудь GUI`ню, для большей наглядности, но об этом в следующий раз...




Вас также может заинтересовать:

OpenVZ Web Panel - Open Virtuozzo Web Panel, веб-панелька для управления виртуальными машинами на Parallels OpenVZ
Проект OpenVZ Web Panel обновился до версии 2.0
Установка связки Centos + OpenVZ + httpd