إنها ليست بيئة / etc / ، وليست جلسة bash الحالية التي يعمل فيها kubeadm ، إنها ليست بيئة عامل إرساء أو kubelet. لقد تحققت من ذلك من خلال تعيين no_proxy
على قيمة مختلفة في كل هذه الحالات. ولسبب ما بعد kubeadm init
، لا يزال يتم تعيين قيمة أخرى لـ no_proxy
. إعادة التشغيل ، وإعادة التحميل ، وإعادة تشغيل الخدمات كلها لا تغير هذه الحقيقة.
بصراحة ، إنه أمر مزعج حقًا أنه لا يطبع سوى السطر "يحتوي عنوان IP fo.oo.ba.rr على وكيل مضبوط على blubb" بدلاً من تحديد مصدر القيمة. ولماذا لا يقرأ ببساطة القيمة من / etc / environment ، وهو المصدر الحقيقي الوحيد للحقيقة عندما يتعلق الأمر بإعداد الوكيل ، أو جلسة bash الحالية التي أسمي فيها kubeadm
وهي الأسهل مكان لإجراء تغييرات عليه؟
ما أتوقعه سيكون شيئًا كهذا:
http_proxy
. (أو https_proxy
إذا تم تكوين الاتصال الآمن)HTTP_PROXY
ويحذر إذا كان مختلفًا.http_proxy
في بيئة / etc /. إنه يحذر إذا كان مختلفًا.kubeadm reset
داخليًا.no_proxy
(أضف النهاية التي قد يتم قطعها). <- سيكون من الأفضل أيضًا استخدام اسم مضيف إذا كان ذلك ممكنًا ، نظرًا لأن no_proxy
مخصص في الواقع للأسماء ، وليس عناوين IP.لا يمكنني بجدية التعبير عن عدد ساعات العمل التي ستوفرها للأشخاص في شبكات المؤسسات.
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 كمؤلف أصلي لهذا الشيك ، سأكون سعيدًا بالإجابة على أي أسئلة.
الإجابات القليلة الأولى:
$ 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=10.0.0.0/8, 192.168.0.0/16
لن يكون له أي تأثير وسيظل ينتج تحذيرًا في فحص ما قبل الرحلة.لقد "أصلحت" هذه المشكلة من خلال تضمين جميع عناوين 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.
راجع # 687 أو # 182 أو تجاوز سعة المكدس: https://stackoverflow.com/questions/45580788/how-to-install-kubernetes-cluster-behind-proxy-with-kubeadm
من واقع خبرتي ، يستخدم kubeadm الوكيل المحدد في / etc / environment
من واقع خبرتي ، يستخدم kubeadm الوكيل المحدد في / etc / environment
نعم - في حالتي هي أيضًا بيئة / etc /
التعليق الأكثر فائدة
لقد "أصلحت" هذه المشكلة من خلال تضمين جميع عناوين IP الخاصة بالعقدة العنقودية في NO_PROXY واستخدام نفس NO_PROXY على جميع التوابع عند الانضمام إلى الكتلة.
لأكون صادقًا ، لست متأكدًا مما إذا كانت جميع عناوين IP التي يتم تعدادها أم أن .example.com هو الذي أصلح المشكلة.