실수로 삭제되지 않도록 Kubernetes Persistent Volume을 보호하십시오.

안녕하세요, 영구 볼륨을 프로비저닝하는 데 사용되는 스토리지 클래스의 기본값을 "삭제"로 지정하고 싶습니다. 즉, 어떤 이유로 영구 볼륨 클레임이 제거되면 결과적으로 영구 볼륨에서도 동일한 일이 발생한다는 의미입니다. 잃게 될 것이다.

따라서 다음 Python 스크립트를 사용하여 영구 볼륨의 회수 정책 패치를 자동화하거나 공식 Kubernetes 문서에 있는 다음 유용한 항목guide을 사용하여 수동으로 패치할 것을 강력히 제안합니다.

Python 스크립트는 Kubernetes 네임스페이스의 모든 영구 볼륨을 검색하고 PV 회수 정책을 업데이트할 수 있습니다. 실제로 볼 수 있듯이 어떤 영구 볼륨이 회수 정책으로 적용하려는 원하는 값의 반대 값을 가지고 있는지 보고할 수 있습니다. (pv_patch_operation).

from kubernetes import client, config
from datetime import datetime
import logging
from logging.handlers import RotatingFileHandler
from pytz import timezone

def timetz(*args):
    return datetime.now(tz).timetuple()

tz = timezone('Europe/Athens') # UTC, Europe/Berlin

logging.Formatter.converter = timetz

logging.basicConfig(
        level=logging.INFO,
        format='[%(asctime)s] %(levelname)s [%(name)s.%(funcName)s:%(lineno)d] %(message)s',
        datefmt='%Y-%m-%dT%H:%M:%S',
        handlers=[
            RotatingFileHandler('logs/app.log', mode='w', maxBytes=100000000, backupCount=10),
            logging.StreamHandler()
            ]
        )

logging.info('Timezone: ' + str(tz))
logger = logging.getLogger(__name__)  

pv_patch_operation="Retain"

def get_pvs_from_api(v1):

    get_pvs_list=[]
    pv_response = v1.list_persistent_volume(watch=False)

    for pv in pv_response.items:
        get_pvs_list.append({
            "pv_name": pv.metadata.name,
            "pv_retain_policy": pv.spec.persistent_volume_reclaim_policy,
            "pvc_reference": {
                "kind": pv.spec.claim_ref.kind, 
                "deploment_name": pv.spec.claim_ref.name,
                "namespace":  pv.spec.claim_ref.namespace
            } 
        })
    return get_pvs_list

def update_pv_reclaim_policy(v1,get_pvs_list):
    for pvs in get_pvs_list:
        if pvs.get('pv_retain_policy') !=pv_patch_operation: 
            v1.patch_persistent_volume(name=pvs.get('pv_name'), pretty=True, body={'spec': {'persistentVolumeReclaimPolicy': pv_patch_operation }})


def main():
    try: 
        ## Read The kubeconfig and show the current context
        contexts, active_context = config.list_kube_config_contexts()
        if not contexts:
            print("Cannot find any context in kube-config file.")
            return
        contexts = [context['name'] for context in contexts]
        config.load_kube_config(context=active_context['name'])
        logger.info("Current Context: "  + str(active_context['name']))

        ACTION = input("Please Specify Action [get/update]: ")
        logger.info('You are going to "' + str(ACTION) + '" all the pvs from the cluster "' + str(active_context['name']) + '"' )
        CONFIRM = input("Do you want to Proceed[y/n]: ")
        if CONFIRM.strip() in ['y','Y']:
            v1 = client.CoreV1Api()
            get_pvs_list=get_pvs_from_api(v1)
            if len(get_pvs_list) != 0:
                if ACTION.strip() not in ['get','g', 'u','update']:
                    logger.error('Please select one of following options ["g","get","u","update"]')
                    exit(1)
                if ACTION.strip() in ['u','update']:
                    update_pv_reclaim_policy(v1, get_pvs_list)
                    get_pvs_list=get_pvs_from_api(v1)
                    logger.info(get_pvs_list)
                if ACTION.strip() in ['g','get']:
                    logger.info(get_pvs_list)
            else: 
                logger.error('I cannot find any persistent volumes')
        elif CONFIRM in ['n','N']:
            logger.info('Bye.')
            exit(0)
        else: 
            logger.error('Please select between the following valid options ["y","Y","n","N"]')
            exit(1)



    except Exception as e:
        print(e)

if __name__ == "__main__":
    main()


엄지 척을 포기한다면 튜토리얼이 마음에 드시기 바랍니다! 에서 나를 팔로우하고 내Newletter 를 구독하여 다가오는 자습서를 놓치지 않도록 할 수도 있습니다.

미디어 속성



내 게시물에서 사용하고 있는 멋진Clark Tibbs을 디자인해 준 것에 대해photo 감사합니다.

좋은 웹페이지 즐겨찾기