"Kubectl apply" yürütmek için kubernetes istemcisi nasıl kullanılır

Dec 16 2020

Temel olarak aşağıdaki üç komutu çalıştıran bir python betiğim var :

kubectl apply -f class.yaml
kubectl apply -f rbac.yaml
kubectl apply -f deployment-arm.yaml

Onun yerine python ile yazılmış kubernetes istemcisini kullanmak istiyorum . Mevcut kodum, oradaki yaml dosyalarını yükler (kullanarak pyyaml), onları biraz düzenler, bir dosyaya ekler ve bu üç komutu yürütmek için kubectl komut satırını kullanır. Kodun bir kısmı:

# load files, edit them and dump into new files, part ...
result = run(['kubectl', 'apply', '-f', class_file_path])
# status check part ...
result = run(['kubectl', 'apply', '-f', rbac_file_path])
# status check part ...
result = run(['kubectl', 'apply', '-f', deployment_file_path])
# status check part ...

Yapmak istediğim şey: Bu üç komutu python kubernetes istemcisi ile değiştirin. Docs okuma ve görme konuyu , beraber rastladım create_namespaced_deploymentben için kullanmak gerektiğini düşünüyorum yöntemle deployment_file_pathdosyası. Ama diğer iki dosyayla ne yapmam gerektiğini anlayamıyorum.

Zaten üç yaml dosyaları (kullanarak PyYAML) yüklendi ve (yeni dosyalar halinde damping olmadan) bunları düzenlenebilir ve şimdi özgür yaml dicts sahip olduğunu varsayarsak deployment_dict, class_dictve rbac_dict, nasıl yöntemlerle yukarıdaki üç yürütmek müşteri kullanabilir?

DÜZENLEME : BTW, üç dicts'i geçmek mümkün değilse, onları tekrar dosyalara dökebilirim, ancak kubectl yerine python istemcisini kullanmak istiyorum. Nasıl yapılır?

Yanıtlar

1 anemyte Dec 23 2020 at 16:35

Her nesne ve eylem için ayrı bir işlev vardır:

from kubernetes import client, config
import yaml

body = yaml.safe_load("my_deployment.yml")
config.load_kube_config()
apps_api = client.AppsV1Api()
apps_api.create_namespaced_deployment(body=body, namespace="default")
apps_api.replace_namespaced_deployment(body=body, namespace="default")
apps_api.patch_namespaced_deployment(body=body, namespace="default")
apps_api.delete_namespaced_deployment(body=body, namespace="default")

body = yaml.safe_load("my_cluster_role.yml")
rbac_api = client.RbacAuthorizationV1Api()
rbac_api.create_cluster_role(body=body)
rbac_api.patch_cluster_role(body=body)
rbac_api.replace_cluster_role(body=body)
rbac_api.delete_cluster_role(body=body)

# And so on

Kullandığınızda kubectl applynesnenin zaten var olup olmadığı, hangi API'nin kullanılacağı, hangi yöntemin uygulanacağı umurunuzda değil, ancak istemciyle birlikte yapmanız gerekecek. Örnekte gördüğünüz gibi, yapmanız gerekenler:

  1. Kube-config'i yükleyin.
  2. Kullanılacak doğru API'yi seçin (yalnızca yapılandırmayı yükledikten sonra bir nesne oluşturun).
  3. Kullanmak istediğiniz yöntemi seçin. Zaten varsa create_somethingçalışmayacağını unutmayın something.

Sıkı adlandırma modeli sayesinde, gerekli işlevi istemciden almak kolaydır.

getattr(some_k8s_api, f"{verb}_{namespaced_or_not}_{kind.lower()}")

Kütüphanenin sağladığı örneklerden geçmenizi tavsiye ederim , bir şeyi öğrenmek gerçekten harikadır.

JanosVinceller Dec 29 2020 at 05:07

Hiçbir fikrim yok ama bir yerde şunu gördüm:

cat <<EOF | kubectl apply -f -
<<here the content of the yaml>>
EOF

Ve işe yaradığına bakılırsa, bu işe yarar mı?

cat class.yaml rbac.yaml deployment-arm.yaml | kubectl apply -f -