Kubeadm: من أين يأخذ kubeadm إعدادات الوكيل؟

تم إنشاؤها على ٢٨ يونيو ٢٠١٧  ·  13تعليقات  ·  مصدر: kubernetes/kubeadm

إنها ليست بيئة / etc / ، وليست جلسة bash الحالية التي يعمل فيها kubeadm ، إنها ليست بيئة عامل إرساء أو kubelet. لقد تحققت من ذلك من خلال تعيين no_proxy على قيمة مختلفة في كل هذه الحالات. ولسبب ما بعد kubeadm init ، لا يزال يتم تعيين قيمة أخرى لـ no_proxy . إعادة التشغيل ، وإعادة التحميل ، وإعادة تشغيل الخدمات كلها لا تغير هذه الحقيقة.

بصراحة ، إنه أمر مزعج حقًا أنه لا يطبع سوى السطر "يحتوي عنوان IP fo.oo.ba.rr على وكيل مضبوط على blubb" بدلاً من تحديد مصدر القيمة. ولماذا لا يقرأ ببساطة القيمة من / etc / environment ، وهو المصدر الحقيقي الوحيد للحقيقة عندما يتعلق الأمر بإعداد الوكيل ، أو جلسة bash الحالية التي أسمي فيها kubeadm وهي الأسهل مكان لإجراء تغييرات عليه؟

ما أتوقعه سيكون شيئًا كهذا:

  1. يتحقق kubeadm من متغير env الحالي http_proxy . (أو https_proxy إذا تم تكوين الاتصال الآمن)
  2. يتحقق kubeadm من المتغير env الحالي HTTP_PROXY ويحذر إذا كان مختلفًا.
  3. kubeadm يتحقق من http_proxy في بيئة / etc /. إنه يحذر إذا كان مختلفًا.
  4. مماثلة للحالة الكبيرة.
  5. إذا لم يكن هناك أي متغير في أي من السياقين ، فإنه يفترض عدم وجود وكيل ويبلغ عنه.
  6. يكتب kubeadm ملفات البيان (أفترض أن هذا يتم قبل إنشاء حاويات عامل الإرساء) باستخدام الوكيل المحدد ، مع إعطاء الأفضلية لإعداد بيئة العملية في الحالة الصغيرة ، ثم الحالة الكبيرة ، ثم الحالة الصغيرة / etc / البيئة ، ثم الحالة الكبيرة / إلخ. /بيئة.
  7. kubeadm يبدأ القرون.
  8. يتحقق kubeadm مما إذا كان مدير وحدة التحكم يمكنه التحدث إلى خادم api. إذا حصل على "ممنوع" أو "مهلة" ، فإنه يفترض أن إعدادات الوكيل خاطئة وأن هناك أخطاء ، استدعاء kubeadm reset داخليًا.
  9. لا يوجد حدث حيث ينتظر إلى الأبد دون أي ناتج. يمكن أن يكتشف جيدًا على الأقل بشكل معقول ما إذا كانت هناك أخطاء مستمرة في سجلات خادم api ومدير وحدة التحكم ، بالإضافة إلى ما إذا كانت هناك أي سجلات جديدة لمدة> = 10 دقائق. وبعد ذلك يمكن أن يخطئ مع رسالة خطأ مقابلة.
  10. يقوم kubeadm داخليًا بإلحاق عنوان الإعلان مسبقًا بجميع إعدادات no_proxy (أضف النهاية التي قد يتم قطعها). <- سيكون من الأفضل أيضًا استخدام اسم مضيف إذا كان ذلك ممكنًا ، نظرًا لأن no_proxy مخصص في الواقع للأسماء ، وليس عناوين IP.

لا يمكنني بجدية التعبير عن عدد ساعات العمل التي ستوفرها للأشخاص في شبكات المؤسسات.

help wanted prioritbacklog

التعليق الأكثر فائدة

لقد "أصلحت" هذه المشكلة من خلال تضمين جميع عناوين IP الخاصة بالعقدة العنقودية في NO_PROXY واستخدام نفس NO_PROXY على جميع التوابع عند الانضمام إلى الكتلة.

تصدير NO_PROXY $ = "ip، ip، ip، ip، .example.com"
[سيد] $ kubeadm init
[العميل] $ kubeadm Join --token = {token} abcd: 6443

لأكون صادقًا ، لست متأكدًا مما إذا كانت جميع عناوين IP التي يتم تعدادها أم أن .example.com هو الذي أصلح المشكلة.

ال 13 كومينتر

erikbgithub شكرًا جزيلاً على هذه المشكلة!
في البداية يجب أن أقول إنني لست خبيرًا بالوكالة لأنني لم أجرب مثل هذه البيئات كثيرًا.

لذلك لا يمكنني التعليق على العبارات المحددة أعلاه حقًا ، لكنني سأكون سعيدًا جدًا إذا كنت تريد المساهمة في kubeadm لجعل السلوك وراء الوكيل أفضل.

للإجابة على سؤالك ، إليك رمز go ذي الصلة:
https://github.com/kubernetes/kubernetes/blob/master/cmd/kubeadm/app/phases/controlplane/manifests.go#L432

func getProxyEnvVars() []v1.EnvVar {
    envs := []v1.EnvVar{}
    for _, env := range os.Environ() {
        pos := strings.Index(env, "=")
        if pos == -1 {
            // malformed environment variable, skip it.
            continue
        }
        name := env[:pos]
        value := env[pos+1:]
        if strings.HasSuffix(strings.ToLower(name), "_proxy") && value != "" {
            envVar := v1.EnvVar{Name: name, Value: value}
            envs = append(envs, envVar)
        }
    }
    return envs
}

https://github.com/kubernetes/kubernetes/blob/master/cmd/kubeadm/app/preflight/checks.go#L291

// HTTPProxyCheck checks if https connection to specific host is going
// to be done directly or over proxy. If proxy detected, it will return warning.
type HTTPProxyCheck struct {
    Proto string
    Host  string
    Port  int
}

func (hst HTTPProxyCheck) Check() (warnings, errors []error) {

    url := fmt.Sprintf("%s://%s:%d", hst.Proto, hst.Host, hst.Port)

    req, err := http.NewRequest("GET", url, nil)
    if err != nil {
        return nil, []error{err}
    }

    proxy, err := http.DefaultTransport.(*http.Transport).Proxy(req)
    if err != nil {
        return nil, []error{err}
    }
    if proxy != nil {
        return []error{fmt.Errorf("Connection to %q uses proxy %q. If that is not intended, adjust your proxy settings", url, proxy)}, nil
    }
    return nil, nil
}

لا يمكنني بجدية التعبير عن عدد ساعات العمل التي ستوفرها للأشخاص في شبكات المؤسسات.

لا يمكن أن نتفق أكثر

تضمين التغريدة

luxas شكرًا سأعمل على ذلك عندما أحصل على بذلة مستديرة. قبل أن أتمكن من توفير التصحيحات ، أحتاج إلى تعلم البعض ، لذلك سأكون ممتنًا إذا كان بإمكان الآخرين المشاركة في الوقت الحالي. ؛-)

السؤال الفرعي الأول الذي سأبحث فيه هو ما الذي يحصل عليه go فعليًا عبر os.Environ() .

erikbgithub أخبرني إذا كنت بحاجة إلى بعض المساعدة في إنشاء التصحيحات

erikbgithub كمؤلف أصلي لهذا الشيك ، سأكون سعيدًا بالإجابة على أي أسئلة.
الإجابات القليلة الأولى:

  • kubeadm يحصل ويتحقق من البيئة من جلسة العمل الحالية. يمكنك أن ترى ماذا لديك إذا قمت بتنفيذ $ env | grep -i _proxy= | sort . على سبيل المثال ، يوجد داخل جدار الحماية الخاص بشركتنا شيء مثل هذا:
    !shell $ env | grep -i _proxy= | sort ALL_PROXY=http://proxy-ir.example.com:911 FTP_PROXY=http://proxy-ir.example.com:911 HTTPS_PROXY=http://proxy-ir.example.com:911 HTTP_PROXY=http://proxy-ir.example.com:911 NO_PROXY=.example.com all_proxy=http://proxy-ir.example.com:911 ftp_proxy=http://proxy-ir.example.com:911 http_proxy=http://proxy-ir.example.com:911 https_proxy=http://proxy-ir.example.com:911 no_proxy=.example.com $
  • المشكلة المعتادة التي يتقدم عليها الأشخاص دون أن يدركوا ذلك ، وهي أن المتغير no_proxy لا يدعم نطاقات الشبكة. لذا فإن وضع شيء مثل NO_PROXY=10.0.0.0/8, 192.168.0.0/16 لن يكون له أي تأثير وسيظل ينتج تحذيرًا في فحص ما قبل الرحلة.
  • لا يهم اختلاف المحتوى بين المتغيرات الكبيرة / الصغيرة * _proxy. رمز Go الذي يتعامل مع متغيرات بيئة الوكيل له منطقه الداخلي الذي يقوم بمعالجته به (على ما أذكر ، الحالة الأولى الكبيرة ، ثم الأحرف الصغيرة ، ولكن لا ينبغي أن يكون ذلك مهمًا ، لا يمكنك ضمان الترتيب الذي يقوم به كل تطبيق بمعالجتها)
  • ملفات مثل / etc / environment خاصة بالتوزيعة ولا يقرأها كل ثنائي فردي. تتم قراءتها وحقنها في متغيرات بيئة العملية عن طريق البرامج النصية لتسجيل الدخول ووحدات PAM وما إلى ذلك. يمكن أن تأتي متغيرات البيئة أيضًا من جلسات SSH أو من أدوات الإدارة الخارجية (مثل ansible) أثناء استدعاء الثنائيات الأخرى ، مثل kubeadm. لذا ، فإن الاعتماد على بيئة معينة / etc / بيئة أو ما شابه ذلك ليس مجديًا ولا منطقيًا.
  • بالنسبة إلى 8 نقاط ، فإن فحص الاختبار المبدئي يتعلق بذلك تحديدًا. إنه يعطي تحذيرًا إذا اكتشف kubeadm أنه يتخطى الخادم الوكيل إلى خادم API. أثناء المناقشة حول فحص الاختبار المبدئي هذا في البداية ، تم الاتفاق على أن هذه الحالات قد تكون مشروعة ، وبالتالي فهي تحذر فقط ، ولا تنتج خطأ.
  • لمدة 10: كانت أيضًا اعتراضات حول التلاعب بهذه المتغيرات من عدة أشخاص. (كانت فكرتي الأولية على الإطلاق هي إسقاط جميع إعدادات * _proxy لفرض اتصالات مباشرة ، ولكن تم رفضها ، لأنها قد تكون أسبابًا مشروعة للاتصال عبر الوكلاء).

لقد "أصلحت" هذه المشكلة من خلال تضمين جميع عناوين IP الخاصة بالعقدة العنقودية في NO_PROXY واستخدام نفس NO_PROXY على جميع التوابع عند الانضمام إلى الكتلة.

تصدير NO_PROXY $ = "ip، ip، ip، ip، .example.com"
[سيد] $ kubeadm init
[العميل] $ kubeadm Join --token = {token} abcd: 6443

لأكون صادقًا ، لست متأكدًا مما إذا كانت جميع عناوين IP التي يتم تعدادها أم أن .example.com هو الذي أصلح المشكلة.

إذا تم دمج PR kubernetes / kubernetes # 52788 ، فسيكون من الممكن تحديد نطاقات IP للعقد الخاصة بك في NO_PROXY. سوف يبسط الأمور كثيرًا.

قليلا غريب. إذا نظرت في رمز "checks.go".
يقوم دائمًا بإرجاع رسالة خطأ إذا كانت هناك قيمة في الوكيل.

إذا كان الوكيل!
إرجاع [] الخطأ {fmt.Errorf ("الاتصال بـ٪ q يستخدم الوكيل٪ q. إذا لم يكن ذلك مقصودًا ، اضبط إعدادات الوكيل" ، url ، الوكيل)} ، لا شيء
}
العودة لا شيء ، لا شيء

في المؤسسة ... هناك بالضرورة ثلاثة خيارات للوكيل. (http_proxy ، https_proxy ، no_proxy)
http_ * هو خيار إلزامي لسحب الصور للاتصال بالإنترنت.
إذا كان هناك خيار no_proxy يتم تعيينه ... فيجب أن يعرض رسالة الخطأ.

"pl ، تعيين الخيار (no_proxy) عدم توجيهه إلى الوكيل للاتصال الداخلي"

أريد أن أسأل ما إذا كان kubeadm Join يدعم http_proxy؟

تمكنت من جعل kubeadm init تعمل مع http_proxy و no_proxy ولكن يبدو أن kubeadm Join ينتج أخطاء مثل

kubelet.go:2105] Container runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized

remote_runtime.go:92] RunPodSandbox from runtime service failed: rpc error: code = Unknown desc = failed pulling image "gcr.io/google_containers/pause-amd64:3.0": Get https://gcr.io/v1/_ping: read tcp <my-ip>:58742->74.125.68.82:443: read: connection reset by peer

و أيضا
/ etc / environment فارغ بدلاً من ملؤه بالتكوين كما هو الحال في Master.

مما جعلني أصدق أنه ربما لم يتم دعم http_proxy و no_proxy للانضمام kubeadm.

الوقوع في هذه المشكلة مرة أخرى. لا يزال يستخدم الوكيل بشكل غير صحيح ويبدو أنني غير قادر على تعديل إعدادات الوكيل و no_proxy.

من واقع خبرتي ، يستخدم kubeadm الوكيل المحدد في / etc / environment

من واقع خبرتي ، يستخدم kubeadm الوكيل المحدد في / etc / environment

نعم - في حالتي هي أيضًا بيئة / etc /

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات