আমি কোনও পড পাত্রে থেকে কুবারনেটস এপিআই কীভাবে অ্যাক্সেস করব?


117

আমি কার্ল করতে সক্ষম হত

https://$KUBERNETES_SERVICE_HOST:$KUBERNETES_PORT_443_TCP_PORT/api/v1beta3/namespaces/default/

আমার বেস ইউআরএল হিসাবে, তবে কুবারনেটস 0.18.0 এ এটি আমাকে "অননুমোদিত" দেয়। আশ্চর্যের বিষয় হ'ল আমি যদি এপিআই মেশিনের বহিরাগত আইপি ঠিকানা ব্যবহার করি ( http://172.17.8.101:8080/api/v1beta3/namespaces/default/), এটি ঠিক কাজ করে।


আপনি কোথায় আপনার ক্লাস্টারটি চালাচ্ছেন (জিসিই, এডাব্লুএস, ইত্যাদি) এবং কোন বেস ওএস (ডিবিয়ান, কোরিস, ইত্যাদি) ব্যবহার করছেন?
রবার্ট বেইলি

ভ্যাগ্রান্ট / কোরিওস ... আমি শেষ পর্যন্ত এডাব্লুএস / কোরিওএস এ স্থানান্তর করব
স্ল্যাটার

কোথায় $KUBERNETES_SERVICE_HOSTএবং $KUBERNETES_PORT_443_TCP_PORTভেরিয়েবল থেকে এসেছে?
ruediste

আমি এই নির্দেশিকাটি পরিষেবা অ্যাকাউন্ট, ভূমিকা এবং রোলবাইন্ডিংগুলি বিকাশকারী.আইবিএম . com/রেসিপস / টিউটোরিয়ালস/… 101 এর জন্য আশ্চর্যজনক বলে মনে করেছি । শেষ বিভাগে আমরা কীভাবে পোঁদের মধ্যে কী 8 এপিআই ফর্মটি অ্যাক্সেস করতে পারি তা বিশদ করে।
ভিভ

উত্তর:


131

অফিসিয়াল ডকুমেন্টেশনে আমি এটি পেয়েছি:

https://kubernetes.io/docs/tasks/access-application-cluster/access-cluster/#accessing-the-api-from-a-pod

স্পষ্টতই আমি একটি সুরক্ষা টোকেন নিখোঁজ ছিল যা কুবারনেটসের আগের সংস্করণে আমার দরকার নেই। সেখান থেকে, আমি আমার ধারকটিতে প্রক্সি চালানো বা গোলং ইনস্টল করার চেয়ে সহজ সমাধান হিসাবে আমি কী ধারণা করি তা তৈরি করেছি। বর্তমান কন্টেইনারটির জন্য এপিআই থেকে প্রাপ্ত তথ্যটি এই উদাহরণটি দেখুন:

KUBE_TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)
curl -sSk -H "Authorization: Bearer $KUBE_TOKEN" \
      https://$KUBERNETES_SERVICE_HOST:$KUBERNETES_PORT_443_TCP_PORT/api/v1/namespaces/default/pods/$HOSTNAME

ব্যাশ স্ক্রিপ্টগুলিতে ব্যবহারের জন্য জেসনকে পার্স করার জন্য আমি একটি সাধারণ বাইনারি, জেকিউ ( http://stedolan.github.io/jq/download/ ) অন্তর্ভুক্ত ব্যবহার করি ।


5
সম্প্রতি মোতায়েন ক্লাস্টার জন্য আপনি পরিবর্তন করতে চান পারে v1beta3থেকেv1
Eyal লেভিন

6
নোট যে এই কার্ল কমান্ড সংযুক্ত করবে insecurely apiserver করার জন্য (উপার্জন এটা সম্ভব একজন মানুষ-ইন--মধ্য বাহক টোকেন ব্যাহত করার জন্য), তাই আপনি শুধুমাত্র এটি ব্যবহার করা উচিত যদি শুঁটি এবং apiserver মধ্যে নেটওয়ার্ক সম্পূর্ণরূপে বিশ্বস্ত। অন্যথায়, আপনার --cacertপতাকা কার্ল হয়ে যাবে যাতে কার্লটি এপিএসভারের উপস্থাপিত শংসাপত্রটিকে বৈধতা দেয়।
রবার্ট বেইলি

1
আমি ব্যবহার করতে হয়েছে KUBERNETES_SERVICE_HOST=kubernetes.default, $KUBERNETES_443_TCP_PORT=443, NAMESPACE == $ (<প্রথমেই / var / রান / গোপন / kubernetes.io / serviceaccount / নামস্থান) . The URL was kubernetes.default: 443 / API / v1 এ / নামব্যবধান / $ NAMESPACE / pods / ... `। নোট করুন যে API সংস্করণটি v1beta3 এর পরিবর্তে v1 এ সেট করা আছে এবং ডিফল্ট নেমস্পেসটি $ NAMESPACE দিয়ে প্রতিস্থাপন করা হয়েছিল।
ruediste

74

প্রতিটি পডের একটি পরিষেবা অ্যাকাউন্ট স্বয়ংক্রিয়ভাবে প্রয়োগ হয় যা এটি এপিএসবারে অ্যাক্সেস করতে দেয়। পরিষেবা অ্যাকাউন্ট উভয় ক্লায়েন্ট শংসাপত্র সরবরাহ করে, একটি বহনকারী টোকেন আকারে এবং শংসাপত্র কর্তৃপক্ষের শংসাপত্র যা এপিএসভারের দ্বারা উপস্থাপিত শংসাপত্রটিতে স্বাক্ষর করতে ব্যবহৃত হয়েছিল। এই দুটি টুকরো তথ্যের সাহায্যে, আপনি curl -k(ওরফে curl --insecure) ব্যবহার না করে এপিএসভারের সাথে একটি সুরক্ষিত, প্রমাণীকৃত সংযোগ তৈরি করতে পারেন :

curl -v --cacert /var/run/secrets/kubernetes.io/serviceaccount/ca.crt -H "Authorization: Bearer $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)" https://kubernetes.default.svc/

2
এটি লক্ষ করা উচিত যে পরিষেবা অ্যাকাউন্টে ক্যাসর্ট এবং টোকেন উভয়ের উপস্থিতির জন্য, প্রতিলিপি-নিয়ন্ত্রণকারীকে একটি --root-ca-file=যুক্তি দিতে হবে যখন শুরু হবে। (এটি বেশিরভাগ কুবেরনেট ইনস্টলারের মধ্যে স্বয়ংক্রিয়ভাবে পরিচালিত হয়)। আরও তথ্যের জন্য এখানে আলোচনা দেখুন: github.com/kubernetes/kubernetes/issues/10265
জে নাইট

7
আমি একটি আলাদা নেমস্পেসের সাথে একটি পোড থেকে এপিআই সার্ভার অ্যাক্সেস করছিলাম। এইভাবে আমাকে https://kubernetes.default/হোস্ট হিসাবে ব্যবহার করতে হয়েছিল
ruediste

অফিসিয়াল হোস্টটি kubernetes.io/docs/tasks/access-application-cluster/…kubernetes.default.svc নথিভুক্ত রয়েছে
মার্টিন টেপ

17

পাইথন কুবারনেটস ক্লায়েন্ট ব্যবহার করে ..

from kubernetes import client, config

config.load_incluster_config()
v1_core = client.CoreV1Api()

1
ধন্যবাদ! আপনার কোডটির সাথে এই খেলাকে আরও সহজ করার জন্য আপনার উত্তরের উপর ভিত্তি করে এখানে একটি ছোট্ট রেপো রয়েছে।
ওমর লেভি হেভরনি

10

উইজেট সংস্করণ:

KUBE_TOKEN=$(</var/run/secrets/kubernetes.io/serviceaccount/token)    
wget -vO- --ca-certificate /var/run/secrets/kubernetes.io/serviceaccount/ca.crt  --header "Authorization: Bearer $KUBE_TOKEN" https://$KUBERNETES_SERVICE_HOST:$KUBERNETES_PORT_443_TCP_PORT/api/v1/namespaces/default/pods/$HOSTNAME

6

ইতিমধ্যে উল্লিখিত বিবরণগুলির মধ্যে সর্বাধিক গুরুত্বপূর্ণ সংযোজনটি হ'ল আপনি যে পোড থেকে API সার্ভারটি অ্যাক্সেস করার চেষ্টা করছেন তার আরবিএসি ক্ষমতা থাকা উচিত।

কে 8 এস সিস্টেমে প্রতিটি সত্তা পরিষেবা-অ্যাকাউন্ট (ব্যবহারকারীদের জন্য ব্যবহারকারীর অ্যাকাউন্ট হিসাবে) দ্বারা চিহ্নিত করা হয়। আরবিএসি সক্ষমতার উপর ভিত্তি করে, পরিষেবা অ্যাকাউন্ট টোকেন (/var/run/secrets/kubernetes.io/serviceaccount/token) জনবসতিযুক্ত। কিউবে-এপি-বাইন্ডিংগুলি (যেমন পাইক्यूब) কুব-এপি-সার্ভারগুলির সাথে সংযোগ তৈরি করার সময় এই টোকনটিকে একটি ইনপুট হিসাবে নিতে পারে। পোডের সঠিক আরবিএসি ক্ষমতা থাকলে, পোড কুবে-এপি সার্ভারের সাথে সংযোগ স্থাপন করতে সক্ষম হবে।


5

গো কোড ব্যবহার করে কোনও পডের ভেতর থেকে এপিআই অ্যাক্সেস করার চেষ্টা করার সময় আমি এই সমস্যার মধ্যে পড়েছিলাম। নীচে আমি সেই কাজটি করার জন্য যা বাস্তবায়িত করেছি তা যদি কেউ এই প্রশ্নটিও আসে যে গো ব্যবহার করতে চাইছে across

উদাহরণটিতে একটি পড সংস্থান ব্যবহার করা হয়েছে, যার জন্য আপনি client-goযদি দেশীয় কুবেরনেটসের সাথে কাজ করে থাকেন তবে আপনার গ্রন্থাগারটি ব্যবহার করা উচিত । এই কোডটি কাস্টম রিসোর্সস ডেফিনেশনগুলির সাথে কাজ করে তাদের জন্য আরও সহায়ক।

serviceHost := os.GetEnv("KUBERNETES_SERVICE_HOST")
servicePort := os.GetEnv("KUBERNETES_SERVICE_PORT")
apiVersion := "v1" // For example
namespace := default // For example
resource := "pod" // For example
httpMethod := http.MethodGet // For Example

url := fmt.Sprintf("https://%s:%s/apis/%s/namespaces/%s/%s", serviceHost, servicePort, apiVersion, namespace, resource)

u, err := url.Parse(url)
if err != nil {
  panic(err)
}
req, err := http.NewRequest(httpMethod, u.String(), bytes.NewBuffer(payload))
if err != nil {
    return err
}

caToken, err := ioutil.ReadFile("/var/run/secrets/kubernetes.io/serviceaccount/token")
if err != nil {
    panic(err) // cannot find token file
}

req.Header.Set("Content-Type", "application/json")
req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", string(caToken)))

caCertPool := x509.NewCertPool()
caCert, err := ioutil.ReadFile("/var/run/secrets/kubernetes.io/serviceaccount/ca.crt")
if err != nil {
    return panic(err) // Can't find cert file
}
caCertPool.AppendCertsFromPEM(caCert)

client := &http.Client{
  Transport: &http.Transport{
    TLSClientConfig: &tls.Config{
        RootCAs: caCertPool,
    },
  },
}

resp, err := client.Do(req)
if err != nil {
    log.Printf("sending helm deploy payload failed: %s", err.Error())
    return err
}
defer resp.Body.Close()

// Check resp.StatusCode
// Check resp.Status

4

পোডের অভ্যন্তর থেকে, কুবারনেটস এপিআই সার্ভারটি " https: //kubernetes.default " এ সরাসরি অ্যাক্সেসযোগ্য । ডিফল্টরূপে এটি এপিআই সার্ভার অ্যাক্সেসের জন্য "ডিফল্ট পরিষেবা অ্যাকাউন্ট" ব্যবহার করে।

সুতরাং, এপিআই সার্ভারের সাথে প্রমাণীকরণের জন্য আমাদের একটি "সিএ সার্ট" এবং "ডিফল্ট পরিষেবা অ্যাকাউন্ট টোকেন "ও পাস করতে হবে।

শংসাপত্র ফাইলটি শুঁটির ভিতরে নিম্নলিখিত স্থানে সংরক্ষণ করা হয়: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt

এবং ডিফল্ট পরিষেবা অ্যাকাউন্ট টোকেন: /var/run/secrets/kubernetes.io/serviceaccount/token

আপনি নোডেজ কুবারনেটস গডাডি ক্লায়েন্ট ব্যবহার করতে পারেন ।

let getRequestInfo = () => {
    return {
        url: "https://kubernetes.default",
        ca:   fs.readFileSync('/var/run/secrets/kubernetes.io/serviceaccount/ca.crt').toString(),
        auth: {
            bearer: fs.readFileSync('/var/run/secrets/kubernetes.io/serviceaccount/token').toString(),
        },
        timeout: 1500
    };
}

let initK8objs = () =>{
    k8obj = getRequestInfo();
    k8score = new Api.Core(k8obj),
    k8s = new Api.Api(k8obj);
}


3

আমার জিকেকে তে একইরকম লেখক সমস্যা ছিল যেখানে পাইথন স্ক্রিপ্টগুলি হঠাৎ ব্যতিক্রম ছুঁড়ে ফেলেছে। আমার জন্য যে সমাধানটি কাজ করেছিল তা হ'ল ভুট্টার মাধ্যমে শুঁটি অনুমতি দেওয়া

apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: fabric8-rbac
subjects:
  - kind: ServiceAccount
  # Reference to upper's `metadata.name`
  name: default
  # Reference to upper's `metadata.namespace`
  namespace: default
roleRef:
  kind: ClusterRole
  name: cluster-admin
  apiGroup: rbac.authorization.k8s.io

আরও তথ্যের জন্য লিঙ্ক বিবরণ এখানে লিখুন



2

আরবিএসি সক্ষম থাকলে ডিফল্ট পরিষেবা অ্যাকাউন্টে কোনও অনুমতি নেই।

আপনার প্রয়োজনের জন্য পৃথক পরিষেবা অ্যাকাউন্ট তৈরি করা ভাল এবং আপনার পোড তৈরি করতে এটি ব্যবহার করুন।

spec:
  serviceAccountName: secret-access-sa
  containers:
    ...

এটা ভাল এখানে ব্যাখ্যা হচ্ছে https://developer.ibm.com/recipes/tutorials/service-accounts-and-auditing-in-kubernetes/


0
curl -v -cacert <path to>/ca.crt --cert <path to>/kubernetes-node.crt --key <path to>/kubernetes-node.key https://<ip:port>

আমার কে 8 এস সংস্করণটি 1.2.0, এবং অন্যান্য সংস্করণগুলিতে এটি খুব বেশি কাজ করার কথা work ^ ^


উপরেরটি সঠিক যদি আপনি ওয়েব হুকস বা অন্য কিছু আরবিএসি সক্ষম করেছেন। এটি বিশেষত সত্য> কে-এস এর 1.2 টি
doktoroblivion

0

This is from the কুবেরনেটস অ্যাকশন book.

আপনার প্রমাণীকরণের যত্ন নেওয়া দরকার । এপিআই সার্ভার নিজেই বলেছে যে আপনি এটি অ্যাক্সেসের জন্য অনুমোদিত নন, কারণ এটি জানেন না যে আপনি কে

প্রমাণীকরণের জন্য আপনার একটি প্রমাণীকরণ টোকেন দরকার ভাগ্যক্রমে, টোকেনটি পূর্বনির্ধারিত ডিফল্ট-টোকেন সিক্রেটের মাধ্যমে সরবরাহ করা হয় এবং গোপন ভলিউমে টোকেন ফাইলে সংরক্ষণ করা হয়।

আপনি API সার্ভার অ্যাক্সেস করতে টোকেন ব্যবহার করতে যাচ্ছেন । প্রথমে টোকনকে পরিবেশের পরিবর্তনশীলে লোড করুন:

root@myhome:/# TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)

টোকেন এখন মধ্যে সংরক্ষিত হয় টোকেনটি পরিবেশ পরিবর্তনশীল । আপনি এপিআই সার্ভারে অনুরোধগুলি প্রেরণ করার সময় এটি ব্যবহার করতে পারেন:

root@curl:/# curl -H "Authorization: Bearer $TOKEN"  https://$KUBERNETES_SERVICE_HOST:$KUBERNETES_PORT_443_TCP_PORT/api/v1/namespaces/default/pods/$HOSTNAME
   {  "paths": 
      [    
        "/api",    
        "/api/v1",   
        "/apis",    
        "/apis/apps",    
        "/apis/apps/v1beta1",    
        "/apis/authorization.k8s.io",        
         ...    
        "/ui/",    
        "/version"  
      ]
  }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.