Memecahkan masalah pekerjaan yang menggunakan PersistentVolumeClaims () PVC - Amazon EMR

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Memecahkan masalah pekerjaan yang menggunakan PersistentVolumeClaims () PVC

Jika Anda perlu membuat, membuat daftar, atau menghapus PersistentVolumeClaims (PVC) untuk suatu pekerjaan tetapi tidak menambahkan PVC izin ke emr-container peran Kubernetes default, pekerjaan akan gagal saat Anda mengirimkannya. Tanpa izin ini, peran emr-container tidak dapat membuat peran yang diperlukan untuk driver Spark atau klien Spark. Tidak cukup menambahkan izin ke driver Spark atau peran klien, seperti yang disarankan oleh pesan kesalahan. Peran utama emr-container harus menyertakan izin yang diperlukan juga. Bagian ini menjelaskan cara menambahkan izin yang diperlukan ke peran utama emr-container.

Verifikasi

Untuk memverifikasi apakah peran emr-container Anda memiliki izin yang diperlukan atau tidak, atur NAMESPACE variabel dengan nilai Anda sendiri dan kemudian jalankan perintah berikut:

export NAMESPACE=YOUR_VALUE kubectl describe role emr-containers -n ${NAMESPACE}

Selain itu, untuk memverifikasi apakah peran Spark dan klien memiliki izin yang diperlukan, jalankan perintah berikut:

kubectl describe role emr-containers-role-spark-driver -n ${NAMESPACE} kubectl describe role emr-containers-role-spark-client -n ${NAMESPACE}

Jika izin tidak ada, lanjutkan dengan tambalan, sebagai berikut.

Patch

  1. Jika pekerjaan tanpa izin sedang berjalan, hentikan pekerjaan ini.

  2. Buat file bernama RBAC_Patch.py sebagai berikut:

    import os import subprocess as sp import tempfile as temp import json import argparse import uuid def delete_if_exists(dictionary: dict, key: str): if dictionary.get(key, None) is not None: del dictionary[key] def doTerminalCmd(cmd): with temp.TemporaryFile() as f: process = sp.Popen(cmd, stdout=f, stderr=f) process.wait() f.seek(0) msg = f.read().decode() return msg def patchRole(roleName, namespace, extraRules, skipConfirmation=False): cmd = f"kubectl get role {roleName} -n {namespace} --output json".split(" ") msg = doTerminalCmd(cmd) if "(NotFound)" in msg and "Error" in msg: print(msg) return False role = json.loads(msg) rules = role["rules"] rulesToAssign = extraRules[::] passedRules = [] for rule in rules: apiGroups = set(rule["apiGroups"]) resources = set(rule["resources"]) verbs = set(rule["verbs"]) for extraRule in extraRules: passes = 0 apiGroupsExtra = set(extraRule["apiGroups"]) resourcesExtra = set(extraRule["resources"]) verbsExtra = set(extraRule["verbs"]) passes += len(apiGroupsExtra.intersection(apiGroups)) >= len(apiGroupsExtra) passes += len(resourcesExtra.intersection(resources)) >= len(resourcesExtra) passes += len(verbsExtra.intersection(verbs)) >= len(verbsExtra) if passes >= 3: if extraRule not in passedRules: passedRules.append(extraRule) if extraRule in rulesToAssign: rulesToAssign.remove(extraRule) break prompt_text = "Apply Changes?" if len(rulesToAssign) == 0: print(f"The role {roleName} seems to already have the necessary permissions!") prompt_text = "Proceed anyways?" for ruleToAssign in rulesToAssign: role["rules"].append(ruleToAssign) delete_if_exists(role, "creationTimestamp") delete_if_exists(role, "resourceVersion") delete_if_exists(role, "uid") new_role = json.dumps(role, indent=3) uid = uuid.uuid4() filename = f"Role-{roleName}-New_Permissions-{uid}-TemporaryFile.json" try: with open(filename, "w+") as f: f.write(new_role) f.flush() prompt = "y" if not skipConfirmation: prompt = input( doTerminalCmd(f"kubectl diff -f {filename}".split(" ")) + f"\n{prompt_text} y/n: " ).lower().strip() while prompt != "y" and prompt != "n": prompt = input("Please make a valid selection. y/n: ").lower().strip() if prompt == "y": print(doTerminalCmd(f"kubectl apply -f {filename}".split(" "))) except Exception as e: print(e) os.remove(f"./{filename}") if __name__ == '__main__': parser = argparse.ArgumentParser() parser.add_argument("-n", "--namespace", help="Namespace of the Role. By default its the VirtualCluster's namespace", required=True, dest="namespace" ) parser.add_argument("-p", "--no-prompt", help="Applies the patches without asking first", dest="no_prompt", default=False, action="store_true" ) args = parser.parse_args() emrRoleRules = [ { "apiGroups": [""], "resources": ["persistentvolumeclaims"], "verbs": ["list", "create", "delete", "patch"] } ] driverRoleRules = [ { "apiGroups": [""], "resources": ["persistentvolumeclaims"], "verbs": ["list", "create", "delete", "patch"] }, { "apiGroups": [""], "resources": ["services"], "verbs": ["get", "list", "describe", "create", "delete", "watch"] } ] clientRoleRules = [ { "apiGroups": [""], "resources": ["persistentvolumeclaims"], "verbs": ["list", "create", "delete", "patch"] } ] patchRole("emr-containers", args.namespace, emrRoleRules, args.no_prompt) patchRole("emr-containers-role-spark-driver", args.namespace, driverRoleRules, args.no_prompt) patchRole("emr-containers-role-spark-client", args.namespace, clientRoleRules, args.no_prompt)
  3. Jalankan skrip Python:

    python3 RBAC_Patch.py -n ${NAMESPACE}
  4. Perbedaan kubectl antara izin baru dan yang lama muncul. Tekan y untuk menambal peran.

  5. Verifikasi tiga peran dengan izin tambahan sebagai berikut:

    kubectl describe role -n ${NAMESPACE}
  6. Jalankan skrip python:

    python3 RBAC_Patch.py -n ${NAMESPACE}
  7. Setelah menjalankan perintah, itu akan menampilkan perbedaan kubectl antara izin baru dan yang lama. Tekan y untuk menambal peran.

  8. Verifikasi tiga peran dengan izin tambahan:

    kubectl describe role -n ${NAMESPACE}
  9. Kirimkan pekerjaan lagi.

Tambalan manual

Jika izin yang diperlukan aplikasi Anda berlaku untuk sesuatu selain PVC aturan, Anda dapat menambahkan izin Kubernetes secara manual untuk klaster EMR virtual Amazon Anda sesuai kebutuhan.

catatan

Peran emr-container adalah peran utama. Ini berarti bahwa itu harus memberikan semua izin yang diperlukan sebelum Anda dapat mengubah peran driver atau klien yang mendasarinya.

  1. Unduh izin saat ini ke dalam file yaml dengan menjalankan perintah di bawah ini:

    kubectl get role -n ${NAMESPACE} emr-containers -o yaml >> emr-containers-role-patch.yaml kubectl get role -n ${NAMESPACE} emr-containers-role-spark-driver -o yaml >> driver-role-patch.yaml kubectl get role -n ${NAMESPACE} emr-containers-role-spark-client -o yaml >> client-role-patch.yaml
  2. Berdasarkan izin yang diperlukan aplikasi Anda, edit setiap file dan tambahkan aturan tambahan seperti berikut ini:

    • emr-containers-role-patch.yaml

      - apiGroups: - "" resources: - persistentvolumeclaims verbs: - list - create - delete - patch
    • driver-role-patch.yaml

      - apiGroups: - "" resources: - persistentvolumeclaims verbs: - list - create - delete - patch - apiGroups: - "" resources: - services verbs: - get - list - describe - create - delete - watch
    • client-role-patch.yaml

      - apiGroups: - "" resources: - persistentvolumeclaims verbs: - list - create - delete - patch
  3. Hapus atribut berikut dengan nilainya. Ini diperlukan untuk menerapkan pembaruan.

    • creationTimestamp

    • resourceVersion

    • uid

  4. Akhirnya, jalankan tambalan:

    kubectl apply -f emr-containers-role-patch.yaml kubectl apply -f driver-role-patch.yaml kubectl apply -f client-role-patch.yaml