একক YAML ফাইলে একাধিক প্রকারের সাথে সরাসরি কুবেরনেটস এপিআই এর বিরুদ্ধে `কুবেটেল অ্যাপ্লিকেশন-এ ক্লায়েন্ট-গো ব্যবহার করা


10

আমি https://github.com/kubernetes/client-go ব্যবহার করছি এবং সমস্ত ভাল কাজ করে।

আমার কাছে অফিসিয়াল কুবারনেটস ড্যাশবোর্ডের জন্য একটি প্রকাশ (ওয়াইএএমএল) রয়েছে: https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta4/aio/deploy/rec सुझावed.yaml

আমি kubectl applyক্লায়েন্ট-গো ব্যবহার করে গো কোডে এই ম্যানিফেস্টের নকল করতে চাই ।

আমি বুঝতে পেরেছি যে প্যাকেজে সংজ্ঞায়িত সঠিক এপিআই প্রকারের জন্য আমার ওয়াইএএমএল বাইটের কিছু (আন) মার্শেলিং করতে হবে: https://github.com/kubernetes/api

আমি সফলভাবে Createআমার ক্লাস্টারে একক এপিআই টাইপগুলি সম্পাদনা করেছি, তবে আমি কীভাবে এমন ম্যানিফেস্টের জন্য এটি করতে পারি যাতে একই ধরণের তালিকা নেই ? এমন কোনও সংস্থান আছে kind: List*যা এই বিভিন্ন ধরণের সমর্থন করে?

আমার বর্তমান কাজটি হ'ল ডায়িমেটার csplitহিসাবে --- এর সাহায্যে YAML ফাইলটি বিভক্ত করা

csplit /path/to/recommended.yaml /---/ '{*}' --prefix='dashboard.' --suffix-format='%03d.yaml'

এরপরে, আমি নতুন (14) অংশগুলি তৈরি করেছি যাগুলি তৈরি হয়েছিল, তাদের বাইটগুলি পড়ুন, ইউনিভার্সালডিজারিলাইজারের ডিকোডার দ্বারা ফিরে আসা সামগ্রীর ধরণটি স্যুইচ করুন এবং আমার কে 8 এস ক্লায়েন্টসেট ব্যবহার করে সঠিক এপিআই পদ্ধতি কল করুন।

আমি আমার ক্লাস্টারে ড্যাশবোর্ডের যে কোনও নতুন সংস্করণে আপডেট করার জন্য প্রোগ্রামগতভাবে এটি করতে চাই। আমি মেট্রিক্স সার্ভার এবং অন্যান্য অনেক সংস্থানগুলির জন্য এটিও করতে হবে। বিকল্প (সম্ভবত সহজ) পদ্ধতিটি হ'ল আমার কোডটি কনটেইনার ইমেজে ইনস্টল করা কুবেেক্টল সহ শিপিং করা এবং সরাসরি কল করা kubectl apply -f -; তবে এর অর্থ হ'ল আমারও কিউব কনফিগারেশনটি ডিস্কে লিখতে হবে বা সম্ভবত এটি ইনলাইন পাস করতে হবে যাতে কুবেক্টেল এটি ব্যবহার করতে পারে।

আমি এই সমস্যাটিকে সহায়ক বলে মনে করেছি: https://github.com/kubernetes/client-go/issues/193 ডিকোডারটি এখানে বেঁচে থাকে: https://github.com/kubernetes/apimach مشين/tree/master/pkg/runtime/ serializer

এটি ক্লায়েন্ট-গো-এ প্রকাশিত হয়েছে: https://github.com/kubernetes/client-go/blob/master/kubernetes/scheme/register.go#L69

আমি রানাক্রন্ট পদ্ধতিটিও দেখেছি যা কুবেটেল দ্বারা ব্যবহৃত হয়: https://github.com/kubernetes/kubernetes/blob/master/pkg/kubectl/cmd/convert/convert.go#L139 এবং ধরে নিই যে আমি আমার নিজস্ব জেনেরিক্লিপশন সরবরাহ করতে পারে? আউটপুট পেতে আইওএস স্ট্রিম ?

দেখে মনে হচ্ছে রানকনভার্ট অবমূল্যায়নের পথে রয়েছে

আমি ট্যাগ হওয়া অন্যান্য প্রশ্নগুলিও দেখেছি [ক্লায়েন্ট-গো] তবে বেশিরভাগ পুরানো উদাহরণ ব্যবহার করে বা একক kindসংজ্ঞায়িত একটি ওয়াইএএমএল ফাইল ব্যবহার করে , এবং এপিআইপি পরিবর্তিত হয়েছে changed

সম্পাদনা: যেহেতু আমার একাধিক ক্লাস্টারের জন্য এটি করা প্রয়োজন এবং প্রোগ্রামগতভাবে ক্লাস্টারগুলি তৈরি করা হচ্ছে ( এডাব্লুএস ইকেএস এপিআই + ক্লাউডফর্মেশন / একসেক্টল ), তাই আমি অনেকগুলি এডাব্লুএসServiceAccount অ্যাকাউন্টগুলিতে অনেকগুলি ক্লাস্টার প্রসঙ্গটি তৈরি করে ওভারহেডকে ছোট করতে চাই । আদর্শভাবে, আমার ক্লায়েন্টসেট তৈরির সাথে জড়িত একমাত্র প্রমাণীকরণের পদক্ষেপটি ক্লাস্টার ডেটা (নাম, অঞ্চল, সিএ সার্টি, ইত্যাদি) ব্যবহার করে টোকেন পেতে অ্যাউস - আইএএম -প্রমাণীকরণকারী ব্যবহার করে। কিছুক্ষণের জন্য অ্যাউস-আইএএম-প্রমাণীকরণকারীর মুক্তি প্রকাশ হয়নি, তবে masterতৃতীয় পক্ষের ভূমিকা ক্রস-অ্যাকাউন্ট ভূমিকা এবং বাহ্যিক আইডি ব্যবহারের অনুমতি দেওয়ার বিষয়বস্তুগুলি পাস করার জন্য। আইএমও, এটি ServiceAccount(এবং আইআরএসএ) ব্যবহার করার চেয়ে পরিষ্কার) কারণ অন্যান্য এডাব্লুএস পরিষেবা রয়েছে অ্যাপ্লিকেশন (এই ক্লাস্টারে অ্যাড-অন তৈরি করে এবং প্রয়োগ করে এমন ব্যাকএন্ড এপিআই) এর সাথে ইন্টারঅ্যাক্ট করতে হবে needs

সম্পাদনা: আমি সম্প্রতি https://github.com/ericchiang/k8s পেয়েছি । উচ্চ-স্তরের ক্লায়েন্ট-গো-এর চেয়ে এটি অবশ্যই স্পষ্টভাবে সহজ, তবে এই আচরণটি সমর্থন করে না।


1
পরিবর্তে ধারক এর ডিস্কে kube কনফিগ লেখার ব্যবহার করার চেষ্টা করুন পরিষেবা অ্যাকাউন্ট kubernetes.io/docs/tasks/configure-pod-container/...
KFC_

1
আপনি কেবল YAML ফাইলের বিষয়বস্তুটি কেন পড়েন ^---$এবং আপনার কোডে বিভক্ত হন না?
শাওইওক

@ শাওয়াইওক কারণ ফাইলের মধ্যে কী ধরণের তা এখনও আমার জানা দরকার। বেশ কয়েকটি প্রত্যাশিত ধরণের (কুবার্নেটস অবজেক্টস) পরীক্ষা না করে প্রকারটি গতিসম্পন্ন হওয়ার কোনও উপায় নেই এবং যদি প্রত্যাশিত প্রকারটি উপস্থিত না থাকে তবে বস্তুটি ক্লাস্টারে প্রয়োগ করা হবে না (যা আরও বেশি সমস্যার দিকে পরিচালিত করে)। এর ফলে একক উপাদানগুলির জন্য প্রচুর কোড লিখতে হবে যা বেশ কয়েকটি উপাদানগুলির জন্য স্কেল করে না। ডকোডিংয়ের বাইরে ক্লাস্টারে অবজেক্টটি প্রয়োগ করতে সঠিক API পদ্ধতি কল করা হচ্ছে।
সাইমন

উত্তর:


3

দেখে মনে হচ্ছে আপনি কীভাবে ইয়ুএমএল ফাইলগুলি কুবারনেটেসে ডিেসিয়ালাইজ করতে পারবেন তা বুঝতে পেরেছেন runtime.Object, তবে সমস্যাটি runtime.Objectপ্রতিটি ধরণের জন্য বিশেষ কোড না লিখে গতিশীলভাবে মোতায়েন করা হচ্ছে ।

kubectlREST এপিআইয়ের সাথে সরাসরি আলাপ করে এটি অর্জন করে। বিশেষতঃ রিসোর্স- হেল্পারের মাধ্যমে ।

আমার কোডে আমার মতো কিছু রয়েছে:

import (
    meta "k8s.io/apimachinery/pkg/api/meta"
    "k8s.io/cli-runtime/pkg/resource"
    "k8s.io/client-go/kubernetes"
    "k8s.io/client-go/rest"
    "k8s.io/client-go/restmapper"
    "k8s.io/apimachinery/pkg/runtime"
)

func createObject(kubeClientset kubernetes.Interface, restConfig rest.Config, obj runtime.Object) error {
    // Create a REST mapper that tracks information about the available resources in the cluster.
    groupResources, err := restmapper.GetAPIGroupResources(kubeClientset.Discovery())
    if err != nil {
        return err
    }
    rm := restmapper.NewDiscoveryRESTMapper(groupResources)

    // Get some metadata needed to make the REST request.
    gvk := obj.GetObjectKind().GroupVersionKind()
    gk := schema.GroupKind{Group: gvk.Group, Kind: gvk.Kind}
    mapping, err := rm.RESTMapping(gk, gvk.Version)
    if err != nil {
        return err
    }

    name, err := meta.NewAccessor().Name(obj)
    if err != nil {
        return err
    }

    // Create a client specifically for creating the object.
    restClient, err := newRestClient(restConfig, mapping.GroupVersionKind.GroupVersion())
    if err != nil {
        return err
    }

    // Use the REST helper to create the object in the "default" namespace.
    restHelper := resource.NewHelper(restClient, mapping)
    return restHelper.Create("default", false, obj, &metav1.CreateOptions{})
}

func newRestClient(restConfig rest.Config, gv schema.GroupVersion) (rest.Interface, error) {
    restConfig.ContentConfig = resource.UnstructuredPlusDefaultContentConfig()
    restConfig.GroupVersion = &gv
    if len(gv.Group) == 0 {
        restConfig.APIPath = "/api"
    } else {
        restConfig.APIPath = "/apis"
    }

    return rest.RESTClientFor(&restConfig)
}

হ্যালো কেভিন, আপনার উত্তরের জন্য আপনাকে ধন্যবাদ! আমি এটি চেষ্টা করার আশেপাশে যাওয়ার সুযোগ পাইনি, তবে আমি অবগত ছিলাম না package restmapperএবং এটি দেখতে খুব আশাব্যঞ্জক। আপাতত উত্তরটি স্বীকার করা হচ্ছে, তবে শীঘ্রই এটি পুনরায় দেখা হবে।
সাইমন

1
আশা করি এটা তোমার জন্য কাজ করবে!
কেভিন লিন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.