Ini bukan / etc / environment, ini bukan sesi bash saat ini yang dijalankan kubeadm, ini bukan lingkungan docker atau kubelet. Saya memverifikasi ini dengan menyetel no_proxy
ke nilai yang berbeda dalam semua contoh ini. Dan untuk beberapa alasan setelah kubeadm init
itu masih terus menetapkan nilai lain untuk no_proxy
. Mulai ulang, muat ulang daemon, mulai ulang semua layanan tidak mengubah fakta itu.
Jujur saja sangat menjengkelkan karena hanya mencetak baris "alamat ip fo.oo.ba.rr memiliki proxy yang disetel ke blubb" alih-alih mengatakan dari mana ia mengambil nilainya. Dan mengapa tidak hanya membaca nilai dari / etc / environment, yang merupakan satu-satunya sumber kebenaran yang sebenarnya ketika datang ke pengaturan proxy, atau sesi bash saat ini di mana saya memanggil kubeadm
yang paling mudah tempat untuk melakukan perubahan?
Yang saya harapkan akan menjadi seperti ini:
http_proxy
. (atau https_proxy
jika komunikasi aman dikonfigurasi)HTTP_PROXY
dan memperingatkan jika berbeda.http_proxy
di / etc / environment. Ini memperingatkan jika berbeda.kubeadm reset
internal.no_proxy
pengaturan (tambahkan akhirnya mungkin mendapatkan potongan). <- Juga akan jauh lebih baik menggunakan nama host jika memungkinkan, karena no_proxy
sebenarnya dimaksudkan untuk nama, bukan IP.Saya benar-benar tidak dapat mengungkapkan berapa jam kerja yang akan menyelamatkan orang-orang di jaringan perusahaan.
@erikbgithub Terima kasih banyak untuk masalah ini!
Di depan saya harus mengatakan bahwa saya bukan ahli proxy karena saya belum banyak bereksperimen di lingkungan seperti itu.
Jadi saya benar-benar tidak dapat mengomentari pernyataan persis di atas, tetapi saya akan sangat senang jika Anda ingin berkontribusi pada kubeadm untuk membuat perilaku di balik proxy menjadi lebih baik.
Untuk menjawab pertanyaan Anda, berikut ini kode go yang relevan:
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
}
Saya benar-benar tidak dapat mengungkapkan berapa jam kerja yang akan menyelamatkan orang-orang di jaringan perusahaan.
Sangat setuju
cc @kad @timothysc
@luxas Terima kasih saya akan bekerja melalui itu ketika saya mendapatkan tuit bulat. Sebelum saya dapat menyediakan tambalan, saya perlu mempelajari beberapa cara, jadi saya akan sangat menghargai jika orang lain dapat masuk untuk saat ini. ;-)
Sub-pertanyaan pertama yang akan saya bahas adalah apa yang sebenarnya didapat melalui os.Environ()
.
@erikbgithub Beri tahu saya jika Anda memerlukan bantuan dalam membuat tambalan dan saya akan membantu
@erikbgithub sebagai penulis asli cek tersebut, saya akan dengan senang hati menjawab pertanyaan apa pun.
Beberapa jawaban pertama:
$ env | grep -i _proxy= | sort
. Misalnya di dalam firewall perusahaan kami, saya memiliki sesuatu seperti ini:!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
tidak akan berpengaruh apa pun dan masih akan menghasilkan peringatan dalam pemeriksaan pra-penerbangan.Saya "memperbaiki" masalah ini dengan memasukkan semua IP node cluster saya di NO_PROXY dan menggunakan NO_PROXY yang sama pada semua antek saat bergabung dengan cluster.
$ ekspor NO_PROXY = 'ip, ip, ip, ip, .example.com'
[master] $ kubeadm init
[antek] $ kubeadm bergabung --token = {token} abcd: 6443
Sejujurnya, saya tidak yakin apakah itu semua alamat IP yang disebutkan atau .example.com yang memperbaiki masalah.
jika PR kubernetes / kubernetes # 52788 akan digabungkan, dimungkinkan untuk menentukan dalam rentang IP NO_PROXY untuk node Anda. itu akan menyederhanakan banyak hal.
Sedikit lelah. jika saya melihat kode "checks.go".
Itu selalu mengembalikan pesan kesalahan jika ada nilai di proxy.
jika proxy! = nil {
return [] error {fmt.Errorf ("Sambungan ke% q menggunakan proxy% q. Jika itu tidak diinginkan, sesuaikan pengaturan proxy Anda", url, proxy)}, nihil
}
kembali nihil, nihil
Di perusahaan ... pasti ada tiga opsi proxy. (http_proxy, https_proxy, no_proxy)
http_ * adalah opsi wajib untuk menarik gambar untuk koneksi ke internet.
jika ada opsi no_proxy disetel ... maka itu harus mengembalikan pesan kesalahan.
"pl, setel opsi (no_proxy) agar tidak diarahkan ke proxy untuk koneksi internal"
Saya ingin bertanya apakah kubeadm join mendukung http_proxy?
Saya berhasil membuat kubeadm init bekerja dengan http_proxy dan no_proxy tetapi tampaknya kubeadm bergabung menghasilkan kesalahan seperti
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
dan juga
/ etc / environment kosong alih-alih diisi dengan konfigurasi seperti di master.
yang membuat saya percaya mungkin http_proxy dan no_proxy belum didukung untuk bergabung dengan kubeadm.
Mengalami masalah ini sekali lagi. Itu masih menggunakan proxy secara tidak benar dan saya tampaknya tidak dapat mengubah pengaturan proxy dan no_proxy.
lihat # 687, # 182, atau stack overflow: https://stackoverflow.com/questions/45580788/how-to-install-kubernetes-cluster-behind-proxy-with-kubeadm
Dari pengalaman saya, kubeadm menggunakan proxy yang didefinisikan di / etc / environment
Dari pengalaman saya, kubeadm menggunakan proxy yang didefinisikan di / etc / environment
Yup - dalam kasus saya ini juga / etc / environment
Komentar yang paling membantu
Saya "memperbaiki" masalah ini dengan memasukkan semua IP node cluster saya di NO_PROXY dan menggunakan NO_PROXY yang sama pada semua antek saat bergabung dengan cluster.
Sejujurnya, saya tidak yakin apakah itu semua alamat IP yang disebutkan atau .example.com yang memperbaiki masalah.