குபெர்னெட்ஸ் சேமிப்பகத்திற்கான தொகுதி செருகுநிரல்கள்: Flexvolume இலிருந்து CSI வரை

குபெர்னெட்ஸ் சேமிப்பகத்திற்கான தொகுதி செருகுநிரல்கள்: Flexvolume இலிருந்து CSI வரை

குபெர்னெட்டஸ் இன்னும் v1.0.0 ஆக இருந்தபோது, ​​தொகுதி செருகுநிரல்கள் இருந்தன. நிலையான (நிரந்தர) கொள்கலன் தரவைச் சேமிப்பதற்காக குபெர்னெட்டஸுடன் கணினிகளை இணைக்க அவை தேவைப்பட்டன. அவர்களின் எண்ணிக்கை சிறியதாக இருந்தது, மேலும் GCE PD, Ceph, AWS EBS மற்றும் பிற சேமிப்பக வழங்குநர்களில் முதன்மையானவர்கள் இருந்தனர்.

செருகுநிரல்கள் குபெர்னெட்டஸுடன் வழங்கப்பட்டன, அதனால்தான் அவை அவற்றின் பெயரைப் பெற்றன - மரத்தில். இருப்பினும், பலருக்கு, அத்தகைய செருகுநிரல்களின் தற்போதைய தொகுப்பு போதுமானதாக இல்லை. கைவினைஞர்கள் குபெர்னெட்ஸ் மையத்தில் பேட்ச்களைப் பயன்படுத்தி எளிய செருகுநிரல்களைச் சேர்த்தனர், அதன் பிறகு அவர்கள் தங்கள் சொந்த குபெர்னெட்களை அசெம்பிள் செய்து தங்கள் சேவையகங்களில் நிறுவினர். ஆனால் காலப்போக்கில், குபெர்னெட்ஸ் டெவலப்பர்கள் அதை உணர்ந்தனர் மீன் பிரச்சனை தீர்க்க முடியாது. மக்களுக்கு தேவை மீன்பிடி தடி. குபெர்னெட்டஸ் v1.2.0 வெளியீட்டில் அது தோன்றியது...

Flexvolume செருகுநிரல்: குறைந்தபட்ச மீன்பிடி கம்பி

குபெர்னெட்ஸ் டெவலப்பர்கள் FlexVolume செருகுநிரலை உருவாக்கினர், இது மூன்றாம் தரப்பு டெவலப்பர்களால் செயல்படுத்தப்பட்ட Flexvolume இயக்கிகளுடன் பணிபுரியும் மாறிகள் மற்றும் முறைகளின் தர்க்கரீதியான கட்டமைப்பாகும்.

FlexVolume இயக்கி என்றால் என்ன என்பதை நிறுத்திவிட்டு ஒரு நெருக்கமான தோற்றத்தைப் பார்ப்போம். இது உறுதியானது செயல்படுத்தபடகூடிய கோப்பு (பைனரி கோப்பு, பைதான் ஸ்கிரிப்ட், பாஷ் ஸ்கிரிப்ட் போன்றவை), செயல்படுத்தப்படும் போது, ​​கட்டளை வரி வாதங்களை உள்ளீடாக எடுத்து, JSON வடிவத்தில் முன்பே அறியப்பட்ட புலங்களுடன் ஒரு செய்தியை வழங்குகிறது. மரபுப்படி, முதல் கட்டளை வரி வாதம் எப்போதும் ஒரு முறையாகும், மீதமுள்ள வாதங்கள் அதன் அளவுருக்கள்.

குபெர்னெட்ஸ் சேமிப்பகத்திற்கான தொகுதி செருகுநிரல்கள்: Flexvolume இலிருந்து CSI வரை
OpenShift இல் CIFS பங்குகளுக்கான இணைப்பு வரைபடம். ஃப்ளெக்ஸ்வால்யூம் டிரைவர் - மையத்தில் வலதுபுறம்

முறைகளின் குறைந்தபட்ச தொகுப்பு இது போல் தெரிகிறது:

flexvolume_driver mount # отвечает за присоединение тома к pod'у
# Формат возвращаемого сообщения:
{
  "status": "Success"/"Failure"/"Not supported",
  "message": "По какой причине был возвращен именно такой статус",
}

flexvolume_driver unmount # отвечает за отсоединение тома от pod'а
# Формат возвращаемого сообщения:
{
  "status": "Success"/"Failure"/"Not supported",
  "message": "По какой причине был возвращен именно такой статус",
}

flexvolume_driver init # отвечает за инициализацию плагина
# Формат возвращаемого сообщения:
{
  "status": "Success"/"Failure"/"Not supported",
  "message": "По какой причине был возвращен именно такой статус",
  // Определяет, использует ли драйвер методы attach/deatach
  "capabilities":{"attach": True/False}
}

முறைகளைப் பயன்படுத்துதல் attach и detach டிரைவரை அழைக்கும் போது எதிர்காலத்தில் குபெலெட் செயல்படும் சூழ்நிலையை வரையறுக்கும். சிறப்பு முறைகளும் உள்ளன expandvolume и expandfs, அவை ஒலியளவை மாறும் வகையில் மறுஅளவிடுவதற்குப் பொறுப்பாகும்.

முறை சேர்க்கும் மாற்றங்களின் எடுத்துக்காட்டு expandvolume, மற்றும் அதன் மூலம் நிகழ்நேரத்தில் தொகுதிகளை மறுஅளவாக்கும் திறன், நீங்கள் உங்களைப் பற்றி அறிந்துகொள்ளலாம் எங்கள் இழுக்க கோரிக்கை ரூக் செஃப் ஆபரேட்டரில்.

NFS உடன் பணிபுரிவதற்கான Flexvolume இயக்கியை செயல்படுத்துவதற்கான ஒரு எடுத்துக்காட்டு இங்கே:

usage() {
    err "Invalid usage. Usage: "
    err "t$0 init"
    err "t$0 mount <mount dir> <json params>"
    err "t$0 unmount <mount dir>"
    exit 1
}

err() {
    echo -ne $* 1>&2
}

log() {
    echo -ne $* >&1
}

ismounted() {
    MOUNT=`findmnt -n ${MNTPATH} 2>/dev/null | cut -d' ' -f1`
    if [ "${MOUNT}" == "${MNTPATH}" ]; then
        echo "1"
    else
        echo "0"
    fi
}

domount() {
    MNTPATH=$1

    NFS_SERVER=$(echo $2 | jq -r '.server')
    SHARE=$(echo $2 | jq -r '.share')

    if [ $(ismounted) -eq 1 ] ; then
        log '{"status": "Success"}'
        exit 0
    fi

    mkdir -p ${MNTPATH} &> /dev/null

    mount -t nfs ${NFS_SERVER}:/${SHARE} ${MNTPATH} &> /dev/null
    if [ $? -ne 0 ]; then
        err "{ "status": "Failure", "message": "Failed to mount ${NFS_SERVER}:${SHARE} at ${MNTPATH}"}"
        exit 1
    fi
    log '{"status": "Success"}'
    exit 0
}

unmount() {
    MNTPATH=$1
    if [ $(ismounted) -eq 0 ] ; then
        log '{"status": "Success"}'
        exit 0
    fi

    umount ${MNTPATH} &> /dev/null
    if [ $? -ne 0 ]; then
        err "{ "status": "Failed", "message": "Failed to unmount volume at ${MNTPATH}"}"
        exit 1
    fi

    log '{"status": "Success"}'
    exit 0
}

op=$1

if [ "$op" = "init" ]; then
    log '{"status": "Success", "capabilities": {"attach": false}}'
    exit 0
fi

if [ $# -lt 2 ]; then
    usage
fi

shift

case "$op" in
    mount)
        domount $*
        ;;
    unmount)
        unmount $*
        ;;
    *)
        log '{"status": "Not supported"}'
        exit 0
esac

exit 1

எனவே, உண்மையான இயங்கக்கூடிய கோப்பைத் தயாரித்த பிறகு, நீங்கள் செய்ய வேண்டும் இயக்கியை குபெர்னெட்டஸ் கிளஸ்டரில் பதிவேற்றவும். முன்னரே தீர்மானிக்கப்பட்ட பாதையின்படி ஒவ்வொரு கிளஸ்டர் முனையிலும் இயக்கி அமைந்திருக்க வேண்டும். இயல்பாக இது தேர்ந்தெடுக்கப்பட்டது:

/usr/libexec/kubernetes/kubelet-plugins/volume/exec/имя_поставщика_хранилища~имя_драйвера/

... ஆனால் வெவ்வேறு Kubernetes விநியோகங்களைப் பயன்படுத்தும் போது (OpenShift, Rancher...) பாதை வேறுபட்டிருக்கலாம்.

ஃப்ளெக்ஸ் வால்யூம் சிக்கல்கள்: ஒரு மீன்பிடி கம்பியை சரியாக போடுவது எப்படி?

ஃப்ளெக்ஸ்வால்யூம் இயக்கியை கிளஸ்டர் நோட்களில் பதிவேற்றுவது அற்பமான செயல் அல்ல. ஒரு முறை கைமுறையாக அறுவை சிகிச்சை செய்த பிறகு, கிளஸ்டரில் புதிய முனைகள் தோன்றும் சூழ்நிலையை சந்திப்பது எளிது: ஒரு புதிய முனை, தானியங்கி கிடைமட்ட அளவிடுதல், அல்லது - மோசமானது - செயலிழப்பு காரணமாக ஒரு முனையை மாற்றுவது. இந்த வழக்கில், இந்த முனைகளில் சேமிப்பகத்துடன் வேலை செய்யப்பட வேண்டும் சாத்தியமற்றது, Flexvolume இயக்கியை நீங்கள் கைமுறையாகச் சேர்க்கும் வரை.

இந்த சிக்கலுக்கான தீர்வு குபெர்னெட்ஸ் ஆதிகாலங்களில் ஒன்றாகும் - DaemonSet. கிளஸ்டரில் ஒரு புதிய முனை தோன்றும் போது, ​​அது தானாகவே எங்கள் டீமான்செட்டிலிருந்து ஒரு பாட் கொண்டிருக்கும், அதில் Flexvolume இயக்கிகளைக் கண்டறிய பாதையில் ஒரு உள்ளூர் தொகுதி இணைக்கப்பட்டுள்ளது. வெற்றிகரமான உருவாக்கத்தில், பாட் இயக்கிக்கு தேவையான கோப்புகளை வட்டில் நகலெடுக்கிறது.

Flexvolume செருகுநிரலை அமைப்பதற்கான அத்தகைய DaemonSet இன் உதாரணம் இங்கே:

apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
  name: flex-set
spec:
  template:
    metadata:
      name: flex-deploy
      labels:
        app: flex-deploy
    spec:
      containers:
        - image: <deployment_image>
          name: flex-deploy
          securityContext:
              privileged: true
          volumeMounts:
            - mountPath: /flexmnt
              name: flexvolume-mount
      volumes:
        - name: flexvolume-mount
          hostPath:
            path: <host_driver_directory>

... மற்றும் Flexvolume இயக்கியை அமைப்பதற்கான பாஷ் ஸ்கிரிப்ட்டின் உதாரணம்:

#!/bin/sh

set -o errexit
set -o pipefail

VENDOR=k8s.io
DRIVER=nfs

driver_dir=$VENDOR${VENDOR:+"~"}${DRIVER}
if [ ! -d "/flexmnt/$driver_dir" ]; then
  mkdir "/flexmnt/$driver_dir"
fi

cp "/$DRIVER" "/flexmnt/$driver_dir/.$DRIVER"
mv -f "/flexmnt/$driver_dir/.$DRIVER" "/flexmnt/$driver_dir/$DRIVER"

while : ; do
  sleep 3600
done

நகல் செயல்பாடு என்பதை மறந்துவிடக் கூடாது அணு அல்ல. க்யூபெலெட் அதன் வழங்கல் செயல்முறை முடிவதற்குள் இயக்கியைப் பயன்படுத்தத் தொடங்கும் அதிக வாய்ப்பு உள்ளது, இதனால் கணினி செயலிழந்துவிடும். முதலில் இயக்கி கோப்புகளை வேறொரு பெயரில் நகலெடுத்து, பின்னர் அணு மறுபெயரிடுதல் செயல்பாட்டைப் பயன்படுத்துவதே சரியான அணுகுமுறை.

குபெர்னெட்ஸ் சேமிப்பகத்திற்கான தொகுதி செருகுநிரல்கள்: Flexvolume இலிருந்து CSI வரை
Rook ஆபரேட்டரில் Ceph உடன் பணிபுரியும் வரைபடம்: வரைபடத்தில் உள்ள Flexvolume இயக்கி Rook முகவர் உள்ளே அமைந்துள்ளது

Flexvolume இயக்கிகளைப் பயன்படுத்தும் போது ஏற்படும் அடுத்த சிக்கல், கிளஸ்டர் முனையில் உள்ள பெரும்பாலான சேமிப்பகமாகும் இதற்கு தேவையான மென்பொருள் நிறுவப்பட வேண்டும் (எடுத்துக்காட்டாக, Ceph க்கான ceph-common தொகுப்பு). ஆரம்பத்தில், Flexvolume செருகுநிரல் அத்தகைய சிக்கலான அமைப்புகளை செயல்படுத்த வடிவமைக்கப்படவில்லை.

இந்த சிக்கலுக்கான அசல் தீர்வை ரூக் ஆபரேட்டரின் Flexvolume இயக்கி செயல்படுத்தலில் காணலாம்:

இயக்கி ஒரு RPC கிளையண்டாக வடிவமைக்கப்பட்டுள்ளது. தகவல்தொடர்புக்கான ஐபிசி சாக்கெட் டிரைவரின் அதே கோப்பகத்தில் அமைந்துள்ளது. இயக்கி கோப்புகளை நகலெடுக்க DaemonSet ஐப் பயன்படுத்துவது நல்லது என்பதை நாங்கள் நினைவில் கொள்கிறோம், இது ஒரு தொகுதியாக இயக்கியுடன் கோப்பகத்தை இணைக்கிறது. தேவையான ரூக் இயக்கி கோப்புகளை நகலெடுத்த பிறகு, இந்த பாட் இறக்காது, ஆனால் ஒரு முழு அளவிலான RPC சேவையகமாக இணைக்கப்பட்ட தொகுதி மூலம் IPC சாக்கெட்டுடன் இணைக்கிறது. ceph-common தொகுப்பு ஏற்கனவே பாட் கொள்கலனுக்குள் நிறுவப்பட்டுள்ளது. IPC சாக்கெட், குபெலெட் அதே முனையில் அமைந்துள்ள பாட் உடன் சரியாகத் தொடர்புகொள்வதை உறுதி செய்கிறது. புத்திசாலித்தனமான அனைத்தும் எளிமையானவை!

குட்பை, எங்கள் அன்பான... மரத்தில் செருகுநிரல்கள்!

கர்னலில் சேமிப்பதற்கான செருகுநிரல்களின் எண்ணிக்கை இருபது என்று குபெர்னெட்ஸ் டெவலப்பர்கள் கண்டுபிடித்தனர். அவை ஒவ்வொன்றிலும் ஒரு மாற்றம், ஒரு வழி அல்லது வேறு, முழு குபெர்னெட்ஸ் வெளியீட்டு சுழற்சியில் செல்கிறது.

சேமிப்பக செருகுநிரலின் புதிய பதிப்பைப் பயன்படுத்த இது மாறிவிடும், நீங்கள் முழு கிளஸ்டரையும் புதுப்பிக்க வேண்டும். இது தவிர, குபெர்னெட்ஸின் புதிய பதிப்பு நீங்கள் பயன்படுத்தும் லினக்ஸ் கர்னலுடன் திடீரென ஒத்துப்போகாமல் போவது உங்களுக்கு ஆச்சரியமாக இருக்கலாம்... எனவே நீங்கள் உங்கள் கண்ணீரைத் துடைத்து, பற்களை நசுக்கி, உங்கள் நிர்வாகத்துடனும் பயனர்களுடனும் ஒருங்கிணைக்க வேண்டும். லினக்ஸ் கர்னல் மற்றும் குபெர்னெட்ஸ் கிளஸ்டரை புதுப்பிக்கவும். சேவைகளை வழங்குவதில் சாத்தியமான வேலையில்லா நேரத்துடன்.

நிலைமை நகைச்சுவையை விட அதிகம், நீங்கள் நினைக்கவில்லையா? அணுகுமுறை வேலை செய்யவில்லை என்பது முழு சமூகத்திற்கும் தெளிவாகத் தெரிந்தது. வேண்டுமென்றே முடிவெடுப்பதன் மூலம், சேமிப்பகத்துடன் பணிபுரியும் புதிய செருகுநிரல்கள் இனி கர்னலில் ஏற்றுக்கொள்ளப்படாது என்று குபெர்னெட்ஸ் டெவலப்பர்கள் அறிவிக்கின்றனர். கூடுதலாக, நாம் ஏற்கனவே அறிந்தபடி, Flexvolume செருகுநிரலை செயல்படுத்துவதில் பல குறைபாடுகள் அடையாளம் காணப்பட்டுள்ளன.

Kubernetes, CSI இல் உள்ள தொகுதிகளுக்கான சமீபத்திய சேர்க்கப்பட்ட செருகுநிரல், நிலையான தரவு சேமிப்பகத்தின் சிக்கலை ஒருமுறை மற்றும் அனைவருக்கும் மூடுவதற்கு அழைக்கப்பட்டது. அதன் ஆல்பா பதிப்பு, அவுட்-ஆஃப்-ட்ரீ CSI தொகுதி செருகுநிரல்கள் என முழுமையாக குறிப்பிடப்படுகிறது, இது வெளியீட்டில் அறிவிக்கப்பட்டது. குபர்னெட்டஸ் 1.9.

கொள்கலன் சேமிப்பு இடைமுகம் அல்லது CSI 3000 ஸ்பின்னிங் ராட்!

முதலாவதாக, CSI என்பது ஒரு தொகுதி செருகுநிரல் மட்டுமல்ல, உண்மையானது என்பதை நான் கவனிக்க விரும்புகிறேன் நிலையான தரவுக் கிடங்குகளுடன் பணிபுரிய தனிப்பயன் கூறுகளை உருவாக்குதல். குபெர்னெட்ஸ் மற்றும் மெசோஸ் போன்ற கொள்கலன் ஆர்கெஸ்ட்ரேஷன் அமைப்புகள் இந்த தரநிலையின்படி செயல்படுத்தப்பட்ட கூறுகளுடன் எவ்வாறு செயல்படுவது என்பதை "கற்றுக்கொள்ள" வேண்டும். இப்போது நான் ஏற்கனவே குபர்னெட்டஸைக் கற்றுக்கொண்டேன்.

குபெர்னெட்ஸில் உள்ள CSI செருகுநிரலின் அமைப்பு என்ன? CSI சொருகி சிறப்பு இயக்கிகளுடன் வேலை செய்கிறது (சிஎஸ்ஐ டிரைவர்கள்) மூன்றாம் தரப்பு டெவலப்பர்களால் எழுதப்பட்டது. குபெர்னெட்டஸில் உள்ள ஒரு CSI இயக்கி குறைந்தபட்சம் இரண்டு கூறுகளை (காய்களை) கொண்டிருக்க வேண்டும்:

  • கட்டுப்படுத்தி - வெளிப்புற நிலையான சேமிப்பகங்களை நிர்வகிக்கிறது. இது ஒரு gRPC சேவையகமாக செயல்படுத்தப்படுகிறது, இதற்கு பழமையானது பயன்படுத்தப்படுகிறது StatefulSet.
  • கணு — கிளஸ்டர் முனைகளுக்கு நிலையான சேமிப்பகத்தை ஏற்றுவதற்கு பொறுப்பாகும். இது ஒரு gRPC சேவையகமாகவும் செயல்படுத்தப்படுகிறது, ஆனால் இது பழமையானதைப் பயன்படுத்துகிறது DaemonSet.

குபெர்னெட்ஸ் சேமிப்பகத்திற்கான தொகுதி செருகுநிரல்கள்: Flexvolume இலிருந்து CSI வரை
குபெர்னெட்டஸில் CSI செருகுநிரல் எவ்வாறு செயல்படுகிறது

சிஎஸ்ஐயின் பணியின் வேறு சில விவரங்களைப் பற்றி நீங்கள் அறியலாம், எடுத்துக்காட்டாக, "" என்ற கட்டுரையிலிருந்துசி.எஸ்.ஐ.யைப் புரிந்துகொள்வது." அதன் மொழிபெயர்ப்பு ஒரு வருடம் முன்பு வெளியிட்டோம்.

அத்தகைய நடைமுறையின் நன்மைகள்

  • ஒரு முனைக்கு இயக்கியைப் பதிவு செய்வது போன்ற அடிப்படை விஷயங்களுக்காக, குபெர்னெட்ஸ் டெவலப்பர்கள் கொள்கலன்களின் தொகுப்பைச் செயல்படுத்தினர். Flexvolume செருகுநிரலுக்கு செய்யப்பட்டது போல், திறன்களுடன் JSON பதிலை நீங்களே உருவாக்க வேண்டியதில்லை.
  • இயங்கக்கூடிய கோப்புகளை நோட்களில் "நழுவுவதற்கு" பதிலாக, இப்போது காய்களை கிளஸ்டரில் பதிவேற்றுகிறோம். குபெர்னெட்டஸிடம் இருந்து நாம் முதலில் எதிர்பார்ப்பது இதுதான்: அனைத்து செயல்முறைகளும் குபெர்னெட்டஸ் பழமையானவற்றைப் பயன்படுத்தி பயன்படுத்தப்படும் கொள்கலன்களுக்குள் நிகழ்கின்றன.
  • சிக்கலான இயக்கிகளை செயல்படுத்த, நீங்கள் இனி RPC சர்வர் மற்றும் RPC கிளையண்டை உருவாக்க வேண்டியதில்லை. வாடிக்கையாளர் எங்களுக்காக குபெர்னெட்ஸ் டெவலப்பர்களால் செயல்படுத்தப்பட்டது.
  • கட்டளை வரி வாதங்கள் மூலம் அவற்றை அனுப்புவதை விட gRPC நெறிமுறையில் வேலை செய்ய வாதங்களை அனுப்புவது மிகவும் வசதியானது, நெகிழ்வானது மற்றும் நம்பகமானது. தரப்படுத்தப்பட்ட ஜிஆர்பிசி முறையைச் சேர்ப்பதன் மூலம் சிஎஸ்ஐக்கு தொகுதி பயன்பாட்டு அளவீடுகளுக்கான ஆதரவை எவ்வாறு சேர்ப்பது என்பதைப் புரிந்துகொள்ள, நீங்கள் படிக்கலாம்: எங்கள் இழுக்க கோரிக்கை vsphere-csi இயக்கிக்கு.
  • ஐபிசி சாக்கெட்டுகள் வழியாக தகவல்தொடர்பு நிகழ்கிறது, எனவே குபெலெட் கோரிக்கையை சரியான பாட்க்கு அனுப்பியதா என்று குழப்பமடையக்கூடாது.

இந்தப் பட்டியல் உங்களுக்கு ஏதாவது நினைவூட்டுகிறதா? CSI இன் நன்மைகள் அதே பிரச்சினைகளை தீர்க்கும், Flexvolume செருகுநிரலை உருவாக்கும் போது கணக்கில் எடுத்துக்கொள்ளப்படவில்லை.

கண்டுபிடிப்புகள்

தரவுக் கிடங்குகளுடன் தொடர்புகொள்வதற்கான தனிப்பயன் செருகுநிரல்களைச் செயல்படுத்துவதற்கான ஒரு தரநிலையாக CSI சமூகத்தால் மிகவும் அன்புடன் வரவேற்கப்பட்டது. மேலும், அவற்றின் நன்மைகள் மற்றும் பல்துறைத்திறன் காரணமாக, CSI இயக்கிகள் Ceph அல்லது AWS EBS போன்ற சேமிப்பக அமைப்புகளுக்காகவும் உருவாக்கப்படுகின்றன, அவை வேலை செய்வதற்கான செருகுநிரல்கள் குபெர்னெட்ஸின் முதல் பதிப்பில் சேர்க்கப்பட்டுள்ளன.

2019 இன் தொடக்கத்தில், மரத்தில் செருகுநிரல்கள் வழக்கற்றுப் போனதாக அறிவிக்கப்பட்டுள்ளன. Flexvolume செருகுநிரலை தொடர்ந்து ஆதரிக்க திட்டமிட்டுள்ளோம், ஆனால் அதற்கான புதிய செயல்பாட்டை உருவாக்க மாட்டோம்.

நாங்கள் ஏற்கனவே ceph-csi, vsphere-csi ஐப் பயன்படுத்தி அனுபவம் பெற்றுள்ளோம், மேலும் இந்தப் பட்டியலில் சேர்க்கத் தயாராக உள்ளோம்! இதுவரை, CSI தனக்கென ஒதுக்கப்பட்ட பணிகளைச் சமாளித்து வருகிறது, ஆனால் நாம் பொறுத்திருந்து பார்ப்போம்.

புதியவை அனைத்தும் பழையதை மறுபரிசீலனை செய்வதை மறந்துவிடாதே!

சோசலிஸ்ட் கட்சி

எங்கள் வலைப்பதிவிலும் படிக்கவும்:

ஆதாரம்: www.habr.com

கருத்தைச் சேர்