From dee98660da95b368516f512b5c1013a422a950f1 Mon Sep 17 00:00:00 2001 From: Quentin Bourgeois Date: Sat, 24 Oct 2020 10:06:14 +0000 Subject: [PATCH 01/62] Fix links MD syntax typo in FR documentation --- content/fr/docs/setup/learning-environment/minikube.md | 6 ++---- content/fr/docs/tasks/tools/install-minikube.md | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/content/fr/docs/setup/learning-environment/minikube.md b/content/fr/docs/setup/learning-environment/minikube.md index 77be61831fc14..2ab0b3ae5ae99 100644 --- a/content/fr/docs/setup/learning-environment/minikube.md +++ b/content/fr/docs/setup/learning-environment/minikube.md @@ -48,10 +48,10 @@ Suivez les étapes ci-dessous pour commencer et explorer Minikube. Starting local Kubernetes cluster... ``` - Pour plus d'informations sur le démarrage de votre cluster avec une version spécifique de Kubernetes, une machine virtuelle ou un environnement de conteneur, voir [Démarrage d'un cluster].(#starting-a-cluster). + Pour plus d'informations sur le démarrage de votre cluster avec une version spécifique de Kubernetes, une machine virtuelle ou un environnement de conteneur, voir [Démarrage d'un cluster](#starting-a-cluster). 2. Vous pouvez maintenant interagir avec votre cluster à l'aide de kubectl. - Pour plus d'informations, voir [Interagir avec votre cluster.](#interacting-with-your-cluster). + Pour plus d'informations, voir [Interagir avec votre cluster](#interacting-with-your-cluster). Créons un déploiement Kubernetes en utilisant une image existante nommée `echoserver`, qui est un serveur HTTP, et exposez-la sur le port 8080 à l’aide de `--port`. @@ -529,5 +529,3 @@ Les contributions, questions et commentaires sont les bienvenus et sont encourag Les développeurs de minikube sont dans le canal #minikube du [Slack](https://kubernetes.slack.com) de Kubernetes (recevoir une invitation [ici](http://slack.kubernetes.io/)). Nous avons également la liste de diffusion [kubernetes-dev Google Groupes](https://groups.google.com/forum/#!forum/kubernetes-dev). Si vous publiez sur la liste, veuillez préfixer votre sujet avec "minikube:". - - diff --git a/content/fr/docs/tasks/tools/install-minikube.md b/content/fr/docs/tasks/tools/install-minikube.md index b079eba6ec666..745f1e4c227ba 100644 --- a/content/fr/docs/tasks/tools/install-minikube.md +++ b/content/fr/docs/tasks/tools/install-minikube.md @@ -84,7 +84,7 @@ Vous pouvez télécharger les packages `.deb` depuis [Docker](https://www.docker {{< caution >}} Le pilote VM `none` peut entraîner des problèmes de sécurité et de perte de données. -Avant d'utiliser `--driver=none`, consultez [cette documentation] (https://minikube.sigs.k8s.io/docs/reference/drivers/none/) pour plus d'informations. +Avant d'utiliser `--driver=none`, consultez [cette documentation](https://minikube.sigs.k8s.io/docs/reference/drivers/none/) pour plus d'informations. {{}} Minikube prend également en charge un `vm-driver=podman` similaire au pilote Docker. Podman est exécuté en tant que superutilisateur (utilisateur root), c'est le meilleur moyen de garantir que vos conteneurs ont un accès complet à toutes les fonctionnalités disponibles sur votre système. From 8df84e27081523d29865df6255be87b22cfe1118 Mon Sep 17 00:00:00 2001 From: Quentin Bourgeois Date: Sat, 24 Oct 2020 13:41:56 +0000 Subject: [PATCH 02/62] Fix links MD syntax typo in FR documentation --- content/fr/docs/setup/learning-environment/minikube.md | 6 ++---- content/fr/docs/tasks/tools/install-minikube.md | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/content/fr/docs/setup/learning-environment/minikube.md b/content/fr/docs/setup/learning-environment/minikube.md index 77be61831fc14..2ab0b3ae5ae99 100644 --- a/content/fr/docs/setup/learning-environment/minikube.md +++ b/content/fr/docs/setup/learning-environment/minikube.md @@ -48,10 +48,10 @@ Suivez les étapes ci-dessous pour commencer et explorer Minikube. Starting local Kubernetes cluster... ``` - Pour plus d'informations sur le démarrage de votre cluster avec une version spécifique de Kubernetes, une machine virtuelle ou un environnement de conteneur, voir [Démarrage d'un cluster].(#starting-a-cluster). + Pour plus d'informations sur le démarrage de votre cluster avec une version spécifique de Kubernetes, une machine virtuelle ou un environnement de conteneur, voir [Démarrage d'un cluster](#starting-a-cluster). 2. Vous pouvez maintenant interagir avec votre cluster à l'aide de kubectl. - Pour plus d'informations, voir [Interagir avec votre cluster.](#interacting-with-your-cluster). + Pour plus d'informations, voir [Interagir avec votre cluster](#interacting-with-your-cluster). Créons un déploiement Kubernetes en utilisant une image existante nommée `echoserver`, qui est un serveur HTTP, et exposez-la sur le port 8080 à l’aide de `--port`. @@ -529,5 +529,3 @@ Les contributions, questions et commentaires sont les bienvenus et sont encourag Les développeurs de minikube sont dans le canal #minikube du [Slack](https://kubernetes.slack.com) de Kubernetes (recevoir une invitation [ici](http://slack.kubernetes.io/)). Nous avons également la liste de diffusion [kubernetes-dev Google Groupes](https://groups.google.com/forum/#!forum/kubernetes-dev). Si vous publiez sur la liste, veuillez préfixer votre sujet avec "minikube:". - - diff --git a/content/fr/docs/tasks/tools/install-minikube.md b/content/fr/docs/tasks/tools/install-minikube.md index b079eba6ec666..745f1e4c227ba 100644 --- a/content/fr/docs/tasks/tools/install-minikube.md +++ b/content/fr/docs/tasks/tools/install-minikube.md @@ -84,7 +84,7 @@ Vous pouvez télécharger les packages `.deb` depuis [Docker](https://www.docker {{< caution >}} Le pilote VM `none` peut entraîner des problèmes de sécurité et de perte de données. -Avant d'utiliser `--driver=none`, consultez [cette documentation] (https://minikube.sigs.k8s.io/docs/reference/drivers/none/) pour plus d'informations. +Avant d'utiliser `--driver=none`, consultez [cette documentation](https://minikube.sigs.k8s.io/docs/reference/drivers/none/) pour plus d'informations. {{}} Minikube prend également en charge un `vm-driver=podman` similaire au pilote Docker. Podman est exécuté en tant que superutilisateur (utilisateur root), c'est le meilleur moyen de garantir que vos conteneurs ont un accès complet à toutes les fonctionnalités disponibles sur votre système. From 4237738f3cfc5c122405b3b94033d15eeff6ad18 Mon Sep 17 00:00:00 2001 From: Chieh-Min Wang Date: Mon, 16 Nov 2020 09:50:32 +0800 Subject: [PATCH 03/62] docs: add partition field for EBS If the EBS volume is partitioned, you have to specify which partition to mount or the mounting process will fail. ``` mount: /var/lib/kubelet/plugins/kubernetes.io/aws-ebs/mounts/vol-: wrong fs type, bad option, bad superblock on /dev/nvme3n1, missing codepage or helper program, or other error. ``` --- content/en/docs/concepts/storage/volumes.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/content/en/docs/concepts/storage/volumes.md b/content/en/docs/concepts/storage/volumes.md index 39410ec2e5319..db06cdb3a97bc 100644 --- a/content/en/docs/concepts/storage/volumes.md +++ b/content/en/docs/concepts/storage/volumes.md @@ -106,6 +106,8 @@ spec: fsType: ext4 ``` +If the EBS volume is partitioned, you can supply the optional field `partition: ""` to specify which parition to mount on. + #### AWS EBS CSI migration {{< feature-state for_k8s_version="v1.17" state="beta" >}} From 845a8855318d3b483fec8c87041cd5fec300d154 Mon Sep 17 00:00:00 2001 From: "salva.gglez" Date: Sun, 6 Dec 2020 17:02:01 +0000 Subject: [PATCH 04/62] Add a caution message on CronJob Controller workload if using startingDeadlineSeconds with a value less than 10s --- content/en/docs/concepts/workloads/controllers/cron-jobs.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/content/en/docs/concepts/workloads/controllers/cron-jobs.md b/content/en/docs/concepts/workloads/controllers/cron-jobs.md index af12bcba25a87..cdc736aaa54e8 100644 --- a/content/en/docs/concepts/workloads/controllers/cron-jobs.md +++ b/content/en/docs/concepts/workloads/controllers/cron-jobs.md @@ -61,6 +61,11 @@ If `startingDeadlineSeconds` is set to a large value or left unset (the default) and if `concurrencyPolicy` is set to `Allow`, the jobs will always run at least once. +{{< caution >}} +If `startingDeadlineSeconds` is set to a value less than 10 seconds, then the CronJob may not be scheduled. This is because Cronjob Controller checks things every 10 seconds by default. +{{< /caution >}} + + For every CronJob, the CronJob {{< glossary_tooltip term_id="controller" >}} checks how many schedules it missed in the duration from its last scheduled time until now. If there are more than 100 missed schedules, then it does not start the job and logs the error ```` From d38c74124a89f1978e5d5f74989f439ca0cc8196 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Salvador=20Gonz=C3=A1lez=20Gonz=C3=A1lez?= Date: Sun, 6 Dec 2020 20:08:30 +0000 Subject: [PATCH 05/62] Update content/en/docs/concepts/workloads/controllers/cron-jobs.md Co-authored-by: bl-ue <54780737+bl-ue@users.noreply.github.com> --- content/en/docs/concepts/workloads/controllers/cron-jobs.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/content/en/docs/concepts/workloads/controllers/cron-jobs.md b/content/en/docs/concepts/workloads/controllers/cron-jobs.md index cdc736aaa54e8..11e30b203de3c 100644 --- a/content/en/docs/concepts/workloads/controllers/cron-jobs.md +++ b/content/en/docs/concepts/workloads/controllers/cron-jobs.md @@ -62,7 +62,7 @@ and if `concurrencyPolicy` is set to `Allow`, the jobs will always run at least once. {{< caution >}} -If `startingDeadlineSeconds` is set to a value less than 10 seconds, then the CronJob may not be scheduled. This is because Cronjob Controller checks things every 10 seconds by default. +If `startingDeadlineSeconds` is set to a value less than 10 seconds, the CronJob may not be scheduled. This is because the CronJob controller checks things every 10 seconds. {{< /caution >}} @@ -96,4 +96,3 @@ documents the format of CronJob `schedule` fields. For instructions on creating and working with cron jobs, and for an example of CronJob manifest, see [Running automated tasks with cron jobs](/docs/tasks/job/automated-tasks-with-cron-jobs). - From 18b8846b9be9a1f78f432b1867ddf4792143ce44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Salvador=20Gonz=C3=A1lez=20Gonz=C3=A1lez?= Date: Tue, 8 Dec 2020 11:00:18 +0000 Subject: [PATCH 06/62] Update cron-jobs.md Mention about v2 CronJob controller. --- content/en/docs/concepts/workloads/controllers/cron-jobs.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/en/docs/concepts/workloads/controllers/cron-jobs.md b/content/en/docs/concepts/workloads/controllers/cron-jobs.md index 11e30b203de3c..a7e1f03097a0a 100644 --- a/content/en/docs/concepts/workloads/controllers/cron-jobs.md +++ b/content/en/docs/concepts/workloads/controllers/cron-jobs.md @@ -62,7 +62,7 @@ and if `concurrencyPolicy` is set to `Allow`, the jobs will always run at least once. {{< caution >}} -If `startingDeadlineSeconds` is set to a value less than 10 seconds, the CronJob may not be scheduled. This is because the CronJob controller checks things every 10 seconds. +If `startingDeadlineSeconds` is set to a value less than 10 seconds, the CronJob may not be scheduled. This is because the CronJob controller checks things every 10 seconds. As an alpha feature, there is a V2 controller implementation with different behavior. The version 2 controller provides experimental performance improvements. {{< /caution >}} From 6ea9106c05ccfb7195cac48b78c6f55a11ce9116 Mon Sep 17 00:00:00 2001 From: Aris Cahyadi Risdianto Date: Thu, 10 Dec 2020 23:19:57 +0800 Subject: [PATCH 07/62] Add special localization documentation for Bahasa Indonesia. --- content/id/docs/contribute/_index.md | 2 +- content/id/docs/contribute/localization_id.md | 178 ++++++++++++++++++ 2 files changed, 179 insertions(+), 1 deletion(-) create mode 100644 content/id/docs/contribute/localization_id.md diff --git a/content/id/docs/contribute/_index.md b/content/id/docs/contribute/_index.md index d793a789672d9..0105a297913f1 100644 --- a/content/id/docs/contribute/_index.md +++ b/content/id/docs/contribute/_index.md @@ -75,5 +75,5 @@ terhadap dokumentasi Kubernetes, tetapi daftar ini dapat membantumu memulainya. - Untuk berkontribusi ke komunitas Kubernetes melalui forum-forum daring seperti Twitter atau Stack Overflow, atau mengetahui tentang pertemuan komunitas (_meetup_) lokal dan acara-acara Kubernetes, kunjungi [situs komunitas Kubernetes](/community/). - Untuk mulai berkontribusi ke pengembangan fitur, baca [_cheatseet_ kontributor](https://github.com/kubernetes/community/tree/master/contributors/guide/contributor-cheatsheet). - +- Untuk kontribusi khusus ke halaman Bahansa Indonesia, baca [Dokumentasi Khusus Untuk Translasi Bahasa Indonesia](/docs/contribute/localization_id.md) diff --git a/content/id/docs/contribute/localization_id.md b/content/id/docs/contribute/localization_id.md new file mode 100644 index 0000000000000..5a9c491297bc8 --- /dev/null +++ b/content/id/docs/contribute/localization_id.md @@ -0,0 +1,178 @@ +--- +title: Dokumentasi Khusus Untuk Translasi Bahasa Indonesia +content_type: concept +--- + + + +Panduan khusus untuk bergabung ke komunitas SIG DOC Indonesia dan melakukan +kontribusi untuk mentranslasikan dokumentasi Kubernetes ke dalam Bahasa +Indonesia. + + + +## Manajemen _Milestone_ Tim {#manajemen-milestone-tim} + +Secara umum siklus translasi dokumentasi ke Bahasa Indonesia akan dilakukan +3 kali dalam setahun (sekitar setiap 4 bulan). Untuk menentukan dan mengevaluasi +pencapaian atau _milestone_ dalam kurun waktu tersebut [jadwal rapat daring +reguler tim Bahasa Indonesia](https://zoom.us/j/6072809193) dilakukan secara +konsisten setiap dua minggu sekali. Dalam [agenda rapat ini](https://docs.google.com/document/d/1Qrj-WUAMA11V6KmcfxJsXcPeWwMbFsyBGV4RGbrSRXY) +juga dilakukan pemilihan PR _Wrangler_ untuk dua minggu ke depan. Tugas PR +_Wrangler_ tim Bahasa Indonesia serupa dengan PR _Wrangler_ dari proyek +_upstream_. + +Target pencapaian atau _milestone_ tim akan dirilis sebagai +[_issue tracking_ seperti ini](https://github.com/kubernetes/website/issues/22296) +pada Kubernetes GitHub Website setiap 4 bulan. Dan bersama dengan informasi +PR _Wrangler_ yang dipilih setiap dua minggu, keduanya akan diumumkan di Slack +_channel_ [#kubernetes-docs-id](https://kubernetes.slack.com/archives/CJ1LUCUHM) +dari Komunitas Kubernetes. + +## Cara Memulai Translasi + +Untuk menerjemahkan satu halaman Bahasa Inggris ke Bahasa Indonesia, lakukan +langkah-langkah berikut ini: + +* Check halaman _issue_ di GitHub dan pastikan tidak ada orang lain yang sudah +mengklaim halaman kamu dalam daftar periksa atau komentar-komentar sebelumnya. +* Klaim halaman kamu pada _issue_ di GitHub dengan memberikan komentar di bawah +dengan nama halaman yang ingin kamu terjemahkan dan ambillah hanya satu halaman +dalam satu waktu. +* _Fork_ [repo ini](https://github.com/kubernetes/website), buat terjemahan +kamu, dan kirimkan PR (_pull request_) dengan label `language/id` +* Setelah dikirim, pengulas akan memberikan komentar dalam beberapa hari, dan +tolong untuk menjawab semua komentar. Direkomendasikan juga untuk melakukan +[_squash_](https://github.com/wprig/wprig/wiki/How-to-squash-commits) _commit_ +kamu dengan pesan _commit_ yang baik. + + +## Informasi Acuan Untuk Translasi + +Tidak ada panduan gaya khusus untuk menulis translasi ke bahasa Indonesia. +Namun, secara umum kita dapat mengikuti panduan gaya bahasa Inggris dengan +beberapa tambahan untuk kata-kata impor yang dicetak miring. + +Harap berkomitmen dengan terjemahan kamu dan pada saat kamu mendapatkan komentar +dari pengulas, silahkan atasi sebaik-baiknya. Kami berharap halaman yang +diklaim akan diterjemahkan dalam waktu kurang lebih dua minggu. Jika ternyata +kamu tidak dapat berkomitmen lagi, beri tahu para pengulas agar mereka dapat +meberikan halaman tersebut ke orang lain. + +Beberapa acuan tambahan dalam melakukan translasi silahkan lihat informasi +berikut ini: + +### Daftara Glosarium Translasi dari tim SIG DOC Indonesia +Untuk kata-kata selengkapnya silahkan baca glosariumnya +[disini](#glosarium-indonesia) + +### KBBI +Konsultasikan dengan KBBI (Kamus Besar Bahasa Indonesia) +[disini](https://kbbi.web.id/) dari +[Kemendikbud](https://kbbi.kemdikbud.go.id/). + +### RSNI Glosarium dari Ivan Lanin +[RSNI Glosarium](https://github.com/jk8s/sig-docs-id-localization-how-tos/blob/master/resources/RSNI-glossarium.pdf) +dapat digunakan untuk memahami bagaimana menerjemahkan berbagai istilah teknis +dan khusus Kubernetes. + + +## Panduan Penulisan _Source Code_ + +### Mengikuti kode asli dari dokumentasi bahasa Inggris + +Untuk kenyamanan pemeliharaan, ikuti lebar teks asli dalam kode bahasa Inggris. +Dengan kata lain, jika teks asli ditulis dalam baris yang panjang tanpa putus +atu baris, maka teks tersebut ditulis panjang dalam satu baris meskipun dalam +bahasa Indonesia. Jagalah agar tetap serupa. + +### Hapus nama reviewer di kode asli bahasa Inggris + +Terkadang _reviewer_ ditentukan di bagian atas kode di teks asli Bahasa Inggris. +Secara umum, _reviewer-reviewer_ halaman aslinya akan kesulitan untuk meninjau +halaman dalam bahasa Indonesia, jadi hapus kode yang terkait dengan informasi +_reviewer_ dari metadata kode tersebut. + + +## Panduan Penulisan Kata-kata Translasi + +### Panduan umum + +* Gunakan "kamu" daripada "Anda" sebagai subyek agar lebih bersahabat dengan +para pembaca dokumentasi. +* Tulislah miring untuk kata-kata bahasa Inggris yang diimpor jika kamu tidak +dapat menemukan kata-kata tersebut dalam bahasa Indonesia. +*Benar*: _controller_. *Salah*: controller, `controller` + +### Panduan untuk kata-kata API Objek Kubernetes + +Gunakan gaya "CamelCase" untuk menulis objek API Kubernetes, lihat daftar +lengkapnya [di sini](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.18/). +Sebagai contoh: + +* *Benar*: PersistentVolume. *Salah*: volume persisten, `PersistentVolume`, +persistentVolume +* *Benar*: Pod. *Salah*: pod, `pod`, "pod" + +*Tips* : Biasanya API objek sudah ditulis dalam huruf kapital pada halaman asli +bahasa Inggris. + +### Panduan untuk kata-kata yang sama dengan API Objek Kubernetes + +Ada beberapa kata-kata yang serupa dengan nama API objek dari Kubernetes dan +dapat mengacu ke arti yang lebih umum (tidak selalu dalam konteks Kubernetes). +Sebagai contoh: _service_, _container_, _node_ , dan lain sebagainya. Kata-kata +sebaiknya ditranslasikan ke Bahasa Indonesia sebagai contoh _service_ menjadi +layanan, _container_ menjadi kontainer. + +*Tips* : Biasanya kata-kata yang mengacu ke arti yang lebih umum sudah *tidak* +ditulis dalam huruf kapital pada halaman asli bahasa Inggris. + +### Panduan untuk "Feature Gate" Kubernetes + +Istilah [_functional gate_](https://kubernetes.io/ko/docs/reference/command-line-tools-reference/feature-gates/) +Kubernetes tidak perlu diterjemahkan ke dalam bahasa Indonesia dan tetap +dipertahankan dalam bentuk aslinya. + +Contoh dari _functional gate_ adalah sebagai berikut: + +- Akselerator +- AdvancedAuditing +- AffinityInAnnotations +- AllowExtTrafficLocalEndpoints +- ... + +### Glosarium Indonesia {#glosarium-indonesia} + +Inggris | Tipe Kata | Indonesia | Sumber | Contoh Kalimat +---|---|---|---|--- +cluster | | klaster | | +container | | kontainer | | +node | kata benda | node | | +file | | berkas | | +service | kata benda | layanan | | +set | | sekumpulan | | +resource | | sumber daya | | +default | | bawaan atau standar (tergantung context) | | Secara bawaan, ...; Pada konfigurasi dan instalasi standar, ... +deploy | | menggelar | | +image | | _image_ | | +request | | permintaan | | +object | kata benda | objek | https://kbbi.web.id/objek | +command | | perintah | https://kbbi.web.id/perintah | +view | | tampilan | | +support | | tersedia atau dukungan (tergantung konteks) | "This feature is supported on version X; Fitur ini tersedia pada versi X; Supported by community; Didukung oleh komunitas" +release | kata benda | rilis | https://kbbi.web.id/rilis | +tool | | perangkat | | +deployment | | penggelaran | | +client | | klien | | +reference | | rujukan | | +update | | pembaruan | | The latest update... ; Pembaruan terkini... +state | | _state_ | | +task | | _task_ | | +certificate | | sertifikat | | +install | | instalasi | https://kbbi.web.id/instalasi | +scale | | skala | | +process | kata kerja | memproses | https://kbbi.web.id/proses | +replica | kata benda | replika | https://kbbi.web.id/replika | +flag | | tanda, parameter, argumen | | +event | | _event_ | | \ No newline at end of file From 75c599829d2bdfffe0371032e57ccb4d23361efc Mon Sep 17 00:00:00 2001 From: Denis GERMAIN Date: Mon, 14 Dec 2020 17:21:50 +0100 Subject: [PATCH 08/62] fix: errors in base64 and sed commands * All base64 commands need `-w0` argument or else the base64_encoded_ca bash variable will contain space chars (" ") where newlines were * All sed command are missing final "/" at the end of the expression. Command fails with the following error ```bash /bin/sed: -e expression #1, char 95: unterminated `s' command ``` --- .../docs/tasks/tls/manual-rotation-of-ca-certificates.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/content/en/docs/tasks/tls/manual-rotation-of-ca-certificates.md b/content/en/docs/tasks/tls/manual-rotation-of-ca-certificates.md index 3147ac3a18296..1720ab34a27e6 100644 --- a/content/en/docs/tasks/tls/manual-rotation-of-ca-certificates.md +++ b/content/en/docs/tasks/tls/manual-rotation-of-ca-certificates.md @@ -51,12 +51,12 @@ Configurations with a single API server will experience unavailability while the If any pods are started before new CA is used by API servers, they will get this update and trust both old and new CAs. ```shell - base64_encoded_ca="$(base64 )" + base64_encoded_ca="$(base64 -w0 )" for namespace in $(kubectl get ns --no-headers | awk '{print $1}'); do for token in $(kubectl get secrets --namespace "$namespace" --field-selector type=kubernetes.io/service-account-token -o name); do kubectl get $token --namespace "$namespace" -o yaml | \ - /bin/sed "s/\(ca.crt:\).*/\1 ${base64_encoded_ca}" | \ + /bin/sed "s/\(ca.crt:\).*/\1 ${base64_encoded_ca}/" | \ kubectl apply -f - done done @@ -132,10 +132,10 @@ Configurations with a single API server will experience unavailability while the 1. If your cluster is using bootstrap tokens to join nodes, update the ConfigMap `cluster-info` in the `kube-public` namespace with new CA. ```shell - base64_encoded_ca="$(base64 /etc/kubernetes/pki/ca.crt)" + base64_encoded_ca="$(base64 -w0 /etc/kubernetes/pki/ca.crt)" kubectl get cm/cluster-info --namespace kube-public -o yaml | \ - /bin/sed "s/\(certificate-authority-data:\).*/\1 ${base64_encoded_ca}" | \ + /bin/sed "s/\(certificate-authority-data:\).*/\1 ${base64_encoded_ca}/" | \ kubectl apply -f - ``` From 4bf6c31e4e1e66761a087671c5aa1a0ae59f4b44 Mon Sep 17 00:00:00 2001 From: Pierre Tessier Date: Tue, 22 Dec 2020 21:14:32 -0500 Subject: [PATCH 09/62] remove misleading instructions There is no need to restart the kubelet as part of configuring kubeadm to set the cgroup driver. At this point in the setup instructions, the kubernetes cluster isn't even up and running yet, as kubeadm init hasn't been run. The previous step even says the kubelet is in a crashloop waiting for kubeadm. --- .../tools/kubeadm/install-kubeadm.md | 7 ------- 1 file changed, 7 deletions(-) diff --git a/content/en/docs/setup/production-environment/tools/kubeadm/install-kubeadm.md b/content/en/docs/setup/production-environment/tools/kubeadm/install-kubeadm.md index fc93d46cd2718..52e903fecf740 100644 --- a/content/en/docs/setup/production-environment/tools/kubeadm/install-kubeadm.md +++ b/content/en/docs/setup/production-environment/tools/kubeadm/install-kubeadm.md @@ -304,13 +304,6 @@ or `/etc/default/kubelet`(`/etc/sysconfig/kubelet` for RPMs), please remove it a (stored in `/var/lib/kubelet/config.yaml` by default). {{< /note >}} -Restarting the kubelet is required: - -```bash -sudo systemctl daemon-reload -sudo systemctl restart kubelet -``` - The automatic detection of cgroup driver for other container runtimes like CRI-O and containerd is work in progress. From 364b9e9f5de88e69ecd86295e3be5a03a399dfc9 Mon Sep 17 00:00:00 2001 From: Mehmet Efe Umit Date: Fri, 25 Dec 2020 16:52:18 +0300 Subject: [PATCH 10/62] Replaced the Old Diagrams in Expose Intro Page --- .../expose/expose-intro.html | 8 +- .../public/images/module_04_labels.svg | 1762 ++++++++++------- 2 files changed, 1054 insertions(+), 716 deletions(-) diff --git a/content/en/docs/tutorials/kubernetes-basics/expose/expose-intro.html b/content/en/docs/tutorials/kubernetes-basics/expose/expose-intro.html index c610b6e9f4db2..1d8a069984aae 100644 --- a/content/en/docs/tutorials/kubernetes-basics/expose/expose-intro.html +++ b/content/en/docs/tutorials/kubernetes-basics/expose/expose-intro.html @@ -63,13 +63,7 @@

Summary

Services and Labels

- -
-
-

-
-
- +

A Service routes traffic across a set of Pods. Services are the abstraction that allow pods to die and replicate in Kubernetes without impacting your application. Discovery and routing among dependent Pods (such as the frontend and backend components in an application) is handled by Kubernetes Services.

diff --git a/content/en/docs/tutorials/kubernetes-basics/public/images/module_04_labels.svg b/content/en/docs/tutorials/kubernetes-basics/public/images/module_04_labels.svg index 31cd8638a1d09..781bfa0888e5a 100644 --- a/content/en/docs/tutorials/kubernetes-basics/public/images/module_04_labels.svg +++ b/content/en/docs/tutorials/kubernetes-basics/public/images/module_04_labels.svg @@ -1,710 +1,1054 @@ - - - - - - - - - - - - - - - - - - - - - - - Docker - - Kubelt - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + From 26300785f5f6fb12dbf90ae48d70c64e1bda9290 Mon Sep 17 00:00:00 2001 From: Oliver L Schoenborn Date: Wed, 6 Jan 2021 21:33:07 -0500 Subject: [PATCH 11/62] Clarify binaryData handling by kubectl create and describe --- .../tasks/configure-pod-container/configure-pod-configmap.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/content/en/docs/tasks/configure-pod-container/configure-pod-configmap.md b/content/en/docs/tasks/configure-pod-container/configure-pod-configmap.md index 2824cce64261e..1d22c2f3e7c36 100644 --- a/content/en/docs/tasks/configure-pod-container/configure-pod-configmap.md +++ b/content/en/docs/tasks/configure-pod-container/configure-pod-configmap.md @@ -201,6 +201,8 @@ allow.textmode=true how.nice.to.look=fairlyNice ``` +Note that data sources that are not ASCII or UTF-8 will be put in the `binaryData` field of the configmap. Both text and binary data sources can be combined in one configmap, but the `binaryData` field is not displayed (as of kubectl 1.20) by `kubectl describe`. To see the `binaryData` in the configmap, you can use `kubectl get configmap -o json MAP_NAME`. + Use the option `--from-env-file` to create a ConfigMap from an env-file, for example: ```shell From 929bfc95fa3d92756b3aaf7b7e9ebe54ec29a639 Mon Sep 17 00:00:00 2001 From: xiaoping Date: Sun, 10 Jan 2021 13:27:46 +0800 Subject: [PATCH 12/62] Update deployment.md fix error translation --- content/zh/docs/concepts/workloads/controllers/deployment.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/zh/docs/concepts/workloads/controllers/deployment.md b/content/zh/docs/concepts/workloads/controllers/deployment.md index 8969cad2355bb..487bba0bb1290 100644 --- a/content/zh/docs/concepts/workloads/controllers/deployment.md +++ b/content/zh/docs/concepts/workloads/controllers/deployment.md @@ -186,7 +186,7 @@ Follow the steps given below to create the above Deployment: --> * `NAME` 列出了集群中 Deployment 的名称。 * `READY` 显示应用程序的可用的 _副本_ 数。显示的模式是“就绪个数/期望个数”。 - * `UP-TO-DATE` 显示为了打到期望状态已经更新的副本数。 + * `UP-TO-DATE` 显示为了达到期望状态已经更新的副本数。 * `AVAILABLE` 显示应用可供用户使用的副本数。 * `AGE` 显示应用程序运行的时间。 From c398ae4821c05b41dce4c2c216f6d856bb7e55af Mon Sep 17 00:00:00 2001 From: Oliver L Schoenborn Date: Tue, 12 Jan 2021 19:57:21 -0500 Subject: [PATCH 13/62] Update content/en/docs/tasks/configure-pod-container/configure-pod-configmap.md Co-authored-by: Tim Bannister --- .../tasks/configure-pod-container/configure-pod-configmap.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/en/docs/tasks/configure-pod-container/configure-pod-configmap.md b/content/en/docs/tasks/configure-pod-container/configure-pod-configmap.md index 1d22c2f3e7c36..40987152e8ab3 100644 --- a/content/en/docs/tasks/configure-pod-container/configure-pod-configmap.md +++ b/content/en/docs/tasks/configure-pod-container/configure-pod-configmap.md @@ -201,7 +201,8 @@ allow.textmode=true how.nice.to.look=fairlyNice ``` -Note that data sources that are not ASCII or UTF-8 will be put in the `binaryData` field of the configmap. Both text and binary data sources can be combined in one configmap, but the `binaryData` field is not displayed (as of kubectl 1.20) by `kubectl describe`. To see the `binaryData` in the configmap, you can use `kubectl get configmap -o json MAP_NAME`. +When `kubectl` creates a ConfigMap from inputs that are not ASCII or UTF-8, the tool puts these into the `binaryData` field of the ConfigMap, and not in `data`. Both text and binary data sources can be combined in one ConfigMap. +If you want to view the `binaryData` keys (and their values) in a ConfigMap, you can run `kubectl get configmap -o jsonpath='{.binaryData}' `. Use the option `--from-env-file` to create a ConfigMap from an env-file, for example: @@ -689,4 +690,3 @@ data: * Follow a real world example of [Configuring Redis using a ConfigMap](/docs/tutorials/configuration/configure-redis-using-configmap/). - From 09cdaac0c8161a25e5c9336bb3d4092ad1828d6d Mon Sep 17 00:00:00 2001 From: Bob Killen Date: Tue, 12 Jan 2021 19:42:52 -0500 Subject: [PATCH 14/62] Add Kubernetes project values to community page --- content/en/community/_index.html | 23 +++++++++++++-- .../en/community/static/community-values.md | 28 +++++++++++++++++++ content/en/community/values.md | 13 +++++++++ static/_redirects | 1 + 4 files changed, 63 insertions(+), 2 deletions(-) create mode 100644 content/en/community/static/community-values.md create mode 100644 content/en/community/values.md diff --git a/content/en/community/_index.html b/content/en/community/_index.html index e1ebb9e9cb1ac..ad9cab5d945a3 100644 --- a/content/en/community/_index.html +++ b/content/en/community/_index.html @@ -19,6 +19,7 @@
+Community Values      Code of conduct       Videos      Discussions      @@ -41,10 +42,28 @@ Kubernetes Conference Gallery
Kubernetes Conference Gallery - - +
+
+
+
+

+

+

Community Values

+The Kubernetes Community values are the keystone to the ongoing success of the project.
+These principles guide every aspect of the Kubernetes project. +
+ +

+ + READ MORE + +
+
+
+
+
diff --git a/content/en/community/static/community-values.md b/content/en/community/static/community-values.md new file mode 100644 index 0000000000000..f6469a3e61ad2 --- /dev/null +++ b/content/en/community/static/community-values.md @@ -0,0 +1,28 @@ + + +# Kubernetes Community Values + +Kubernetes Community culture is frequently cited as a substantial contributor to the meteoric rise of this Open Source project. Below are the distilled values which have evolved over the last many years in our community pushing our project and peers toward constant improvement. + +## Distribution is better than centralization + +The scale of the Kubernetes project is only viable through high-trust and high-visibility distribution of work, which includes delegation of authority, decision making, technical design, code ownership, and documentation. Distributed asynchronous ownership, collaboration, communication and decision making are the cornerstone of our world-wide community. + +## Community over product or company + +We are here as a community first, our allegiance is to the intentional stewardship of the Kubernetes project for the benefit of all its members and users everywhere. We support working together publicly for the common goal of a vibrant interoperable ecosystem providing an excellent experience for our users. Individuals gain status through work, companies gain status through their commitments to support this community and fund the resources necessary for the project to operate. + +## Automation over process + +Large projects have a lot of less exciting, yet, hard work. We value time spent automating repetitive work more highly than toil. Where that work cannot be automated, it is our culture to recognize and reward all types of contributions. However, heroism is not sustainable. + +## Inclusive is better than exclusive + +Broadly successful and useful technology requires different perspectives and skill sets which can only be heard in a welcoming and respectful environment. Community membership is a privilege, not a right. Community Leadership is earned through effort, scope, quality, quantity, and duration of contributions. Our community shows respect for the time and effort put into a discussion regardless of where a contributor is on their growth path. + +## Evolution is better than stagnation + +Openness to new ideas and studied technological evolution make Kubernetes a stronger project. Continual improvement, servant leadership, mentorship and respect are the foundations of the Kubernetes project culture. It is the duty for leaders in the Kubernetes community to find, sponsor, and promote new community members. Leaders should expect to step aside. Community members should expect to step up. + +**"Culture eats strategy for breakfast." --Peter Drucker** diff --git a/content/en/community/values.md b/content/en/community/values.md new file mode 100644 index 0000000000000..4ae1fe30b6d55 --- /dev/null +++ b/content/en/community/values.md @@ -0,0 +1,13 @@ +--- +title: Community +layout: basic +cid: community +css: /css/community.css +--- + +
+ +
+{{< include "/static/community-values.md" >}} +
+
diff --git a/static/_redirects b/static/_redirects index d6626accc0547..cdcc8e01b2176 100644 --- a/static/_redirects +++ b/static/_redirects @@ -466,6 +466,7 @@ /docs/admin/authorization/ /docs/reference/access-authn-authz/authorization/ 301 /docs/admin/high-availability/building/ /docs/setup/production-environment/tools/kubeadm/high-availability/ 301 /code-of-conduct/ /community/code-of-conduct/ 301 +/values/ /community/values/ 302 /docs/setup/version-skew-policy/ /docs/setup/release/version-skew-policy/ 301 From 06228c06a9d7bd1722a9b85178cf6aee51c9258d Mon Sep 17 00:00:00 2001 From: Qiming Teng Date: Mon, 26 Oct 2020 22:13:24 +0800 Subject: [PATCH 15/62] Fix examples tests This PR updates the go.mod file so that tests of the example manifests are run against the 1.20 branch. The missing test cases for newly added examples are also added. To perform tests on your local machine, run the following command on the root of your local clone: ``` go test k8s.io/website/content/en/examples ``` --- content/en/examples/examples_test.go | 96 +++-- go.mod | 56 +-- go.sum | 527 +++++++++++++++++++++++++++ 3 files changed, 624 insertions(+), 55 deletions(-) diff --git a/content/en/examples/examples_test.go b/content/en/examples/examples_test.go index 012a2acaa79b4..982ddbd69353f 100644 --- a/content/en/examples/examples_test.go +++ b/content/en/examples/examples_test.go @@ -148,6 +148,11 @@ func getCodecForObject(obj runtime.Object) (runtime.Codec, error) { } func validateObject(obj runtime.Object) (errors field.ErrorList) { + podValidationOptions := validation.PodValidationOptions{ + AllowMultipleHugePageResources: true, + AllowDownwardAPIHugePages: true, + } + // Enable CustomPodDNS for testing // feature.DefaultFeatureGate.Set("CustomPodDNS=true") switch t := obj.(type) { @@ -182,7 +187,7 @@ func validateObject(obj runtime.Object) (errors field.ErrorList) { opts := validation.PodValidationOptions{ AllowMultipleHugePageResources: true, } - errors = validation.ValidatePod(t, opts) + errors = validation.ValidatePodCreate(t, opts) case *api.PodList: for i := range t.Items { errors = append(errors, validateObject(&t.Items[i])...) @@ -191,12 +196,12 @@ func validateObject(obj runtime.Object) (errors field.ErrorList) { if t.Namespace == "" { t.Namespace = api.NamespaceDefault } - errors = validation.ValidatePodTemplate(t) + errors = validation.ValidatePodTemplate(t, podValidationOptions) case *api.ReplicationController: if t.Namespace == "" { t.Namespace = api.NamespaceDefault } - errors = validation.ValidateReplicationController(t) + errors = validation.ValidateReplicationController(t, podValidationOptions) case *api.ReplicationControllerList: for i := range t.Items { errors = append(errors, validateObject(&t.Items[i])...) @@ -215,7 +220,11 @@ func validateObject(obj runtime.Object) (errors field.ErrorList) { if t.Namespace == "" { t.Namespace = api.NamespaceDefault } - errors = validation.ValidateService(t, true) + // handle clusterIPs, logic copied from service strategy + if len(t.Spec.ClusterIP) > 0 && len(t.Spec.ClusterIPs) == 0 { + t.Spec.ClusterIPs = []string{t.Spec.ClusterIP} + } + errors = validation.ValidateService(t) case *api.ServiceAccount: if t.Namespace == "" { t.Namespace = api.NamespaceDefault @@ -250,12 +259,12 @@ func validateObject(obj runtime.Object) (errors field.ErrorList) { if t.Namespace == "" { t.Namespace = api.NamespaceDefault } - errors = apps_validation.ValidateDaemonSet(t) + errors = apps_validation.ValidateDaemonSet(t, podValidationOptions) case *apps.Deployment: if t.Namespace == "" { t.Namespace = api.NamespaceDefault } - errors = apps_validation.ValidateDeployment(t) + errors = apps_validation.ValidateDeployment(t, podValidationOptions) case *networking.Ingress: if t.Namespace == "" { t.Namespace = api.NamespaceDefault @@ -265,18 +274,30 @@ func validateObject(obj runtime.Object) (errors field.ErrorList) { Version: legacyscheme.Scheme.PrioritizedVersionsForGroup(networking.GroupName)[0].Version, } errors = networking_validation.ValidateIngressCreate(t, gv) + case *networking.IngressClass: + /* + if t.Namespace == "" { + t.Namespace = api.NamespaceDefault + } + gv := schema.GroupVersion{ + Group: networking.GroupName, + Version: legacyscheme.Scheme.PrioritizedVersionsForGroup(networking.GroupName)[0].Version, + } + */ + errors = networking_validation.ValidateIngressClass(t) + case *policy.PodSecurityPolicy: errors = policy_validation.ValidatePodSecurityPolicy(t) case *apps.ReplicaSet: if t.Namespace == "" { t.Namespace = api.NamespaceDefault } - errors = apps_validation.ValidateReplicaSet(t) + errors = apps_validation.ValidateReplicaSet(t, podValidationOptions) case *batch.CronJob: if t.Namespace == "" { t.Namespace = api.NamespaceDefault } - errors = batch_validation.ValidateCronJob(t) + errors = batch_validation.ValidateCronJob(t, podValidationOptions) case *networking.NetworkPolicy: if t.Namespace == "" { t.Namespace = api.NamespaceDefault @@ -287,6 +308,9 @@ func validateObject(obj runtime.Object) (errors field.ErrorList) { t.Namespace = api.NamespaceDefault } errors = policy_validation.ValidatePodDisruptionBudget(t) + case *rbac.ClusterRole: + // clusterole does not accept namespace + errors = rbac_validation.ValidateClusterRole(t) case *rbac.ClusterRoleBinding: // clusterolebinding does not accept namespace errors = rbac_validation.ValidateClusterRoleBinding(t) @@ -414,6 +438,7 @@ func TestExampleObjectSchemas(t *testing.T) { "storagelimits": {&api.LimitRange{}}, }, "admin/sched": { + "clusterrole": {&rbac.ClusterRole{}}, "my-scheduler": {&api.ServiceAccount{}, &rbac.ClusterRoleBinding{}, &rbac.ClusterRoleBinding{}, &apps.Deployment{}}, "pod1": {&api.Pod{}}, "pod2": {&api.Pod{}}, @@ -539,6 +564,7 @@ func TestExampleObjectSchemas(t *testing.T) { "dapi-envars-pod": {&api.Pod{}}, "dapi-volume": {&api.Pod{}}, "dapi-volume-resources": {&api.Pod{}}, + "dependent-envars": {&api.Pod{}}, "envars": {&api.Pod{}}, "pod-multiple-secret-env-variable": {&api.Pod{}}, "pod-secret-envFrom": {&api.Pod{}}, @@ -596,29 +622,41 @@ func TestExampleObjectSchemas(t *testing.T) { "load-balancer-example": {&apps.Deployment{}}, }, "service/access": { - "frontend": {&api.Service{}, &apps.Deployment{}}, - "hello-application": {&apps.Deployment{}}, - "hello-service": {&api.Service{}}, - "hello": {&apps.Deployment{}}, + "backend-deployment": {&apps.Deployment{}}, + "backend-service": {&api.Service{}}, + "frontend-deployment": {&apps.Deployment{}}, + "frontend-service": {&api.Service{}}, + "hello-application": {&apps.Deployment{}}, }, "service/networking": { - "curlpod": {&apps.Deployment{}}, - "custom-dns": {&api.Pod{}}, - "dual-stack-default-svc": {&api.Service{}}, - "dual-stack-ipv4-svc": {&api.Service{}}, - "dual-stack-ipv6-lb-svc": {&api.Service{}}, - "dual-stack-ipv6-svc": {&api.Service{}}, - "hostaliases-pod": {&api.Pod{}}, - "ingress": {&networking.Ingress{}}, - "network-policy-allow-all-egress": {&networking.NetworkPolicy{}}, - "network-policy-allow-all-ingress": {&networking.NetworkPolicy{}}, - "network-policy-default-deny-egress": {&networking.NetworkPolicy{}}, - "network-policy-default-deny-ingress": {&networking.NetworkPolicy{}}, - "network-policy-default-deny-all": {&networking.NetworkPolicy{}}, - "nginx-policy": {&networking.NetworkPolicy{}}, - "nginx-secure-app": {&api.Service{}, &apps.Deployment{}}, - "nginx-svc": {&api.Service{}}, - "run-my-nginx": {&apps.Deployment{}}, + "curlpod": {&apps.Deployment{}}, + "custom-dns": {&api.Pod{}}, + "dual-stack-default-svc": {&api.Service{}}, + "dual-stack-ipfamilies-ipv6": {&api.Service{}}, + "dual-stack-ipv6-svc": {&api.Service{}}, + "dual-stack-prefer-ipv6-lb-svc": {&api.Service{}}, + "dual-stack-preferred-ipfamilies-svc": {&api.Service{}}, + "dual-stack-preferred-svc": {&api.Service{}}, + "external-lb": {&networking.IngressClass{}}, + "example-ingress": {&networking.Ingress{}}, + "hostaliases-pod": {&api.Pod{}}, + "ingress-resource-backend": {&networking.Ingress{}}, + "ingress-wildcard-host": {&networking.Ingress{}}, + "minimal-ingress": {&networking.Ingress{}}, + "name-virtual-host-ingress": {&networking.Ingress{}}, + "name-virtual-host-ingress-no-third-host": {&networking.Ingress{}}, + "network-policy-allow-all-egress": {&networking.NetworkPolicy{}}, + "network-policy-allow-all-ingress": {&networking.NetworkPolicy{}}, + "network-policy-default-deny-egress": {&networking.NetworkPolicy{}}, + "network-policy-default-deny-ingress": {&networking.NetworkPolicy{}}, + "network-policy-default-deny-all": {&networking.NetworkPolicy{}}, + "nginx-policy": {&networking.NetworkPolicy{}}, + "nginx-secure-app": {&api.Service{}, &apps.Deployment{}}, + "nginx-svc": {&api.Service{}}, + "run-my-nginx": {&apps.Deployment{}}, + "simple-fanout-example": {&networking.Ingress{}}, + "test-ingress": {&networking.Ingress{}}, + "tls-example-ingress": {&networking.Ingress{}}, }, "windows": { "configmap-pod": {&api.ConfigMap{}, &api.Pod{}}, diff --git a/go.mod b/go.mod index 30c6741140e99..b45ff242a49c8 100644 --- a/go.mod +++ b/go.mod @@ -1,34 +1,38 @@ module k8s.io/website -go 1.14 +go 1.15 require ( - k8s.io/apimachinery v0.18.4 - k8s.io/kubernetes v1.18.4 + k8s.io/apimachinery v0.20.0 + k8s.io/kubernetes v1.20.0 ) replace ( - k8s.io/api => k8s.io/api v0.18.4 - k8s.io/apiextensions-apiserver => k8s.io/apiextensions-apiserver v0.18.4 - k8s.io/apimachinery => k8s.io/apimachinery v0.18.4 - k8s.io/apiserver => k8s.io/apiserver v0.18.4 - k8s.io/cli-runtime => k8s.io/cli-runtime v0.18.4 - k8s.io/client-go => k8s.io/client-go v0.18.4 - k8s.io/cloud-provider => k8s.io/cloud-provider v0.18.4 - k8s.io/cluster-bootstrap => k8s.io/cluster-bootstrap v0.18.4 - k8s.io/code-generator => k8s.io/code-generator v0.18.4 - k8s.io/component-base => k8s.io/component-base v0.18.4 - k8s.io/cri-api => k8s.io/cri-api v0.18.4 - k8s.io/csi-translation-lib => k8s.io/csi-translation-lib v0.18.4 - k8s.io/kube-aggregator => k8s.io/kube-aggregator v0.18.4 - k8s.io/kube-controller-manager => k8s.io/kube-controller-manager v0.18.4 - k8s.io/kube-proxy => k8s.io/kube-proxy v0.18.4 - k8s.io/kube-scheduler => k8s.io/kube-scheduler v0.18.4 - k8s.io/kubectl => k8s.io/kubectl v0.18.4 - k8s.io/kubelet => k8s.io/kubelet v0.18.4 - k8s.io/legacy-cloud-providers => k8s.io/legacy-cloud-providers v0.18.4 - k8s.io/metrics => k8s.io/metrics v0.18.4 - k8s.io/sample-apiserver => k8s.io/sample-apiserver v0.18.4 - k8s.io/sample-cli-plugin => k8s.io/sample-cli-plugin v0.18.4 - k8s.io/sample-controller => k8s.io/sample-controller v0.18.4 + k8s.io/api => k8s.io/api v0.20.0 + k8s.io/apiextensions-apiserver => k8s.io/apiextensions-apiserver v0.20.0 + k8s.io/apimachinery => k8s.io/apimachinery v0.20.0 + k8s.io/apiserver => k8s.io/apiserver v0.20.0 + k8s.io/cli-runtime => k8s.io/cli-runtime v0.20.0 + k8s.io/client-go => k8s.io/client-go v0.20.0 + k8s.io/cloud-provider => k8s.io/cloud-provider v0.20.0 + k8s.io/cluster-bootstrap => k8s.io/cluster-bootstrap v0.20.0 + k8s.io/code-generator => k8s.io/code-generator v0.20.0 + k8s.io/component-base => k8s.io/component-base v0.20.0 + k8s.io/component-helpers => k8s.io/component-helpers v0.20.0 + k8s.io/controller-manager => k8s.io/controller-manager v0.20.0 + k8s.io/cri-api => k8s.io/cri-api v0.20.0 + k8s.io/csi-translation-lib => k8s.io/csi-translation-lib v0.20.0 + k8s.io/kube-aggregator => k8s.io/kube-aggregator v0.20.0 + k8s.io/kube-controller-manager => k8s.io/kube-controller-manager v0.20.0 + k8s.io/kube-proxy => k8s.io/kube-proxy v0.20.0 + k8s.io/kube-scheduler => k8s.io/kube-scheduler v0.20.0 + k8s.io/kubectl => k8s.io/kubectl v0.20.0 + k8s.io/kubelet => k8s.io/kubelet v0.20.0 + k8s.io/kubernetes => k8s.io/kubernetes v1.20.0 + k8s.io/legacy-cloud-providers => k8s.io/legacy-cloud-providers v0.20.0 + k8s.io/metrics => k8s.io/metrics v0.20.0 + k8s.io/mount-utils => k8s.io/mount-utils v0.20.0 + k8s.io/sample-apiserver => k8s.io/sample-apiserver v0.20.0 + k8s.io/sample-cli-plugin => k8s.io/sample-cli-plugin v0.20.0 + k8s.io/sample-controller => k8s.io/sample-controller v0.20.0 ) diff --git a/go.sum b/go.sum index d0f82ad655a36..723fccaf6affa 100644 --- a/go.sum +++ b/go.sum @@ -2,25 +2,66 @@ bitbucket.org/bertimus9/systemstat v0.0.0-20180207000608-0eeff89b0690/go.mod h1: cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.51.0/go.mod h1:hWtGJ6gnXH+KgDv+V0zFGDvpi07n3z8ZNj3T1RW0Gcw= +cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/Azure/azure-sdk-for-go v35.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v43.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= +github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= +github.com/Azure/go-autorest/autorest v0.9.6/go.mod h1:/FALq9T/kS7b5J5qsQ+RSTUdAmGFqi0vUdVNNx8q630= +github.com/Azure/go-autorest/autorest v0.11.1/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw= github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= +github.com/Azure/go-autorest/autorest/adal v0.8.2/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= +github.com/Azure/go-autorest/autorest/adal v0.9.0/go.mod h1:/c022QCutn2P7uY+/oQWWNcK9YU+MH96NgK+jErpbcg= +github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= +github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g= +github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= +github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM= +github.com/Azure/go-autorest/autorest/mocks v0.4.0/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= +github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= github.com/Azure/go-autorest/autorest/to v0.2.0/go.mod h1:GunWKJp1AEqgMaGLV+iocmRAJWqST1wQYhyyjXJ3SJc= github.com/Azure/go-autorest/autorest/validation v0.1.0/go.mod h1:Ha3z/SqBeaalWQvokg3NZAlQTalVMtOIAs1aGK7G6u8= github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= +github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= +github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/GoogleCloudPlatform/k8s-cloud-provider v0.0.0-20190822182118-27a4ced34534/go.mod h1:iroGtC8B3tQiqtds1l+mgk/BBOrxbqjH+eUfFQYRc14= +github.com/GoogleCloudPlatform/k8s-cloud-provider v0.0.0-20200415212048-7901bc822317/go.mod h1:DF8FZRxMHMGv/vP2lQP6h+dYzzjpuRn24VeRiYn3qjQ= github.com/JeffAshton/win_pdh v0.0.0-20161109143554-76bb4ee9f0ab/go.mod h1:3VYc5hodBMJ5+l/7J4xAyMeuM2PNuepvHlGs8yilUCA= github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd/go.mod h1:64YHyfSL2R96J44Nlwm39UHepQbyR5q10x7iYa1ks2E= github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= +github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= +github.com/Microsoft/go-winio v0.4.15/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= github.com/Microsoft/hcsshim v0.0.0-20190417211021-672e52e9209d/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= +github.com/Microsoft/hcsshim v0.8.10-0.20200715222032-5eafd1556990/go.mod h1:ay/0dTb7NsG8QMDfsRfLHgZo/6xAJShLe1+ePPflihk= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/OpenPeeDeeP/depguard v1.0.0/go.mod h1:7/4sitnI9YlQgTLLk734QlzXT8DuHVnAyztLplQjk+o= github.com/OpenPeeDeeP/depguard v1.0.1/go.mod h1:xsIw86fROiiwelg+jB2uM9PiKihMMmUx/1V+TNhjQvM= github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= @@ -33,15 +74,21 @@ github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrU github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM= github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/auth0/go-jwt-middleware v0.0.0-20170425171159-5493cabe49f7/go.mod h1:LWMyo4iOLWXHGdBki7NIht1kHru/0wM179h+d3g8ATM= +github.com/aws/aws-sdk-go v1.6.10/go.mod h1:ZRmQr0FajVIyZ4ZzBYKG5P3ZqPz9IHG41ZoMu1ADI3k= github.com/aws/aws-sdk-go v1.28.2/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.35.24/go.mod h1:tlPOdRjfxPBpNIwqDj61rmsnA85v9jc0Ps9+muhnW+k= github.com/bazelbuild/bazel-gazelle v0.18.2/go.mod h1:D0ehMSbS+vesFsLGiD6JXu3mVEzOlfUl8wNnq+x/9p0= github.com/bazelbuild/bazel-gazelle v0.19.1-0.20191105222053-70208cbdc798/go.mod h1:rPwzNHUqEzngx1iVBfO/2X2npKaT3tqPqqHW6rVsn/A= github.com/bazelbuild/buildtools v0.0.0-20190731111112-f720930ceb60/go.mod h1:5JP0TXzWDHXv8qvxRC4InIazwdyDseBDbzESUMKk1yU= @@ -50,32 +97,70 @@ github.com/bazelbuild/rules_go v0.0.0-20190719190356-6dae44dc5cab/go.mod h1:MC23 github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0 h1:HWo1m869IqiPhD389kmkxeTalrjNbbJTC8LXupb+sl0= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bifurcation/mint v0.0.0-20180715133206-93c51c6ce115/go.mod h1:zVt7zX3K/aDCk9Tj+VM7YymsX66ERvzCJzw8rFCX2JU= +github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= +github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/blang/semver v3.5.0+incompatible h1:CGxCgetQ64DKk7rdZ++Vfnb1+ogGNnB17OJKJXD2Cfs= github.com/blang/semver v3.5.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= +github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= +github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g= github.com/caddyserver/caddy v1.0.3/go.mod h1:G+ouvOY32gENkJC+jhgl62TyhvqEsFaDiZ4uw0RzP1E= github.com/cenkalti/backoff v2.1.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/prettybench v0.0.0-20150116022406-03b8cfe5406c/go.mod h1:Xe6ZsFhtM8HrDku0pxJ3/Lr51rwykrzgFwpmTzleatY= +github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5/go.mod h1:/iP1qXHoty45bqomnu2LM+VVyAEdWN+vtSHGlQgyxbw= github.com/checkpoint-restore/go-criu v0.0.0-20181120144056-17b0214f6c48/go.mod h1:TrMrLQfeENAPYPRsJuq3jsqdlRh3lvi6trTZJG8+tho= +github.com/checkpoint-restore/go-criu/v4 v4.0.2/go.mod h1:xUQBLp4RLc5zJtWY++yjOoMoB5lihDt7fai+75m+rGw= +github.com/checkpoint-restore/go-criu/v4 v4.1.0/go.mod h1:xUQBLp4RLc5zJtWY++yjOoMoB5lihDt7fai+75m+rGw= github.com/cheekybits/genny v0.0.0-20170328200008-9127e812e1e9/go.mod h1:+tQajlRqAUrPI7DOSpB0XAqZYtQakVtB7wXkRAgjxjQ= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/cilium/ebpf v0.0.0-20191025125908-95b36a581eed/go.mod h1:MA5e5Lr8slmEg9bt0VpxxWqJlO4iwu3FBdHUzV7wQVg= +github.com/cilium/ebpf v0.0.0-20200110133405-4032b1d8aae3/go.mod h1:MA5e5Lr8slmEg9bt0VpxxWqJlO4iwu3FBdHUzV7wQVg= +github.com/cilium/ebpf v0.0.0-20200507155900-a9f01edf17e3/go.mod h1:XT+cAw5wfvsodedcijoh1l9cf7v1x9FlFB/3VmF/O8s= +github.com/cilium/ebpf v0.0.0-20200601085316-9f1617e5c574/go.mod h1:XT+cAw5wfvsodedcijoh1l9cf7v1x9FlFB/3VmF/O8s= +github.com/cilium/ebpf v0.0.0-20200702112145-1c8d4c9ef775/go.mod h1:7cR51M8ViRLIdUjrmSXlK9pkrsDlLHbO8jiB8X8JnOc= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/clusterhq/flocker-go v0.0.0-20160920122132-2b8b7259d313/go.mod h1:P1wt9Z3DP8O6W3rvwCt0REIlshg1InHImaLW0t3ObY0= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa h1:OaNxuTZr7kxeODyLWsRMC+OD03aFUH+mW6r2d+MWa5Y= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/codegangsta/negroni v1.0.0/go.mod h1:v0y3T5G7Y1UlFfyxFn/QLRU4a2EuNau2iZY63YTKWo0= github.com/container-storage-interface/spec v1.2.0/go.mod h1:6URME8mwIBbpVyZV93Ce5St17xBiQJQY67NDsuohiy4= +github.com/containerd/cgroups v0.0.0-20200531161412-0dbf7f05ba59/go.mod h1:pA0z1pT8KYB3TCXK/ocprsh7MAkoW8bZVzPdih9snmM= github.com/containerd/console v0.0.0-20170925154832-84eeaae905fa/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= +github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= +github.com/containerd/console v1.0.0/go.mod h1:8Pf4gM6VEbTNRIT26AyyU7hxdQU3MvAvxVI0sc00XBE= github.com/containerd/containerd v1.0.2/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.3.2/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.3.3/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.1/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= +github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= +github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= +github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= +github.com/containerd/ttrpc v1.0.0/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= +github.com/containerd/ttrpc v1.0.2/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= +github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc= github.com/containerd/typeurl v0.0.0-20190228175220-2a93cfde8c20/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc= +github.com/containerd/typeurl v1.0.0/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc= +github.com/containerd/typeurl v1.0.1/go.mod h1:TB1hUtrpaiO88KEK56ijojHS1+NeF0izUACaJW2mdXg= github.com/containernetworking/cni v0.7.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= +github.com/containernetworking/cni v0.8.0/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= github.com/coredns/corefile-migration v1.0.6/go.mod h1:OFwBp/Wc9dJt5cAZzHWMNhK1r5L0p0jDwIBc6j8NC8E= +github.com/coredns/corefile-migration v1.0.10/go.mod h1:RMy/mXdeDlYwzt0vdMEJvT2hGJ2I86/eO0UdXmH9XNI= +github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= @@ -85,10 +170,16 @@ github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7 github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e h1:Wf6HqHfScWJN9/ZjdUKyjop4mf3Qdd+1TvvltAvM3m8= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= +github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/coreos/pkg v0.0.0-20180108230652-97fdf19511ea h1:n2Ltr3SrfQlf/9nOna1DoGKxLx3qTSI8Ttl6Xrqp6mw= github.com/coreos/pkg v0.0.0-20180108230652-97fdf19511ea/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f h1:lBNOc5arjvs8E5mO2tbpBpLoyyu8B6e44T7hJy6potg= +github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -97,14 +188,20 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/daviddengcn/go-colortext v0.0.0-20160507010035-511bcaf42ccd/go.mod h1:dv4zxwHi5C/8AeI+4gX4dCWOIvNi7I6JCSX0HvlKPgE= github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= +github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/distribution v2.7.1+incompatible h1:a5mlkVzth6W5A4fOsS3D2EO5BUmsJpcB+cRlLU7cSug= github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/docker v0.7.3-0.20190327010347-be7ac8be2ae0/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v1.4.2-0.20200309214505-aa6a9891b09c/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v17.12.0-ce-rc1.0.20200916142827-bd33bbf0497b+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.3.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= +github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= +github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= @@ -115,13 +212,17 @@ github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.m github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/euank/go-kmsg-parser v2.0.0+incompatible/go.mod h1:MhmAMZ8V4CYH4ybgdRwPr2TU5ThnS43puaKEMpja1uw= github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d/go.mod h1:ZZMPRZwes7CROmyNKgQzC3XPs6L/G2EJLHddWejkmf4= github.com/fatih/camelcase v1.0.0/go.mod h1:yN2Sb0lFhZJUdVvtELVWefmrXpuZESvPmqwoZc+/fpc= github.com/fatih/color v1.6.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= +github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fvbommel/sortorder v1.0.1/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0= github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= @@ -130,10 +231,18 @@ github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0 github.com/go-acme/lego v2.5.0+incompatible/go.mod h1:yzMNe9CasVUhkquNvti5nAtPmG94USbYxYrZfTkIn0M= github.com/go-bindata/go-bindata v3.1.1+incompatible/go.mod h1:xK8Dsgwmeed+BBsSy2XTopBn/8uK2HWuGSnA11C3Joo= github.com/go-critic/go-critic v0.3.5-0.20190526074819-1df300866540/go.mod h1:+sE8vrLDS2M0pZkBk0wy6+nLdKexVDrl/jBqQOTDThA= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-ini/ini v1.9.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-lintpack/lintpack v0.5.2/go.mod h1:NwZuYi2nUHho8XEIZ6SIxihrnPoqBTDqfpXvXAN0sXM= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= +github.com/go-logr/logr v0.2.0 h1:QvGt2nLcHH0WK9orKa+ppBPAxREcH364nPUedEpK0TY= +github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI= github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= @@ -195,6 +304,7 @@ github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslW github.com/go-toolsmith/typep v1.0.0/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= github.com/godbus/dbus v0.0.0-20181101234600-2ff6f7ffd60f/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= +github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls= @@ -204,15 +314,34 @@ github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekf github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903 h1:LbsanbbD6LieFkXbj9YNNBupiGHJgFeLpO0j0Fza1h8= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.0.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3 h1:JjCZWpVbqXDqFVmTfYWEVTMIYrL/NPdPSCHPJ0T/raM= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2/go.mod h1:k9Qvh+8juN+UKMCS/3jFtGICgW8O96FVaZsaxdzDkR4= github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a/go.mod h1:ryS0uhF+x9jgbj/N71xsEqODy9BN81/GonCZiOzirOk= github.com/golangci/errcheck v0.0.0-20181223084120-ef45e06d44b6/go.mod h1:DbHgvLiFKX1Sh2T1w8Q/h4NAI8MHIpzCdnBUDTXU3I0= @@ -237,9 +366,17 @@ github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Z github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/cadvisor v0.35.0/go.mod h1:1nql6U13uTHaLYB8rLS5x9IJc2qT6Xd/Tr1sTX6NE48= +github.com/google/cadvisor v0.37.0/go.mod h1:OhDE+goNVel0eGY8mR7Ifq1QUI1in5vJBIgIpcajK/I= +github.com/google/cadvisor v0.38.5/go.mod h1:1OFB9sOOMkBdUBGCO/1SArawTnDscgMzTodacVDe8mA= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2 h1:X2ev0eStA3AbceY54o37/0PQ/UWqKEiiO2dKL5OPaFM= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -247,56 +384,95 @@ github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.1.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= +github.com/googleapis/gnostic v0.4.1 h1:DLJCy1n/vrD4HPjOvYcT8aYQXpPIzoRZONaYwyycI+I= +github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/mux v1.7.0/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gostaticanalysis/analysisutil v0.0.0-20190318220348-4088753ea4d3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= github.com/gostaticanalysis/analysisutil v0.0.3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4 h1:z53tR0945TRRQO/fLEVPI6SMv7ZflF0TEaTAoU7tOzg= github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.5 h1:UImYN5qQ8tuGpGE16ZmjvcTtTw24zw1QAp/SlnNrZhI= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= +github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= +github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= +github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.0.0-20180201235237-0fb14efe8c47/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/hcl v0.0.0-20180404174102-ef8a98b0bbce/go.mod h1:oZtUIOe8dh44I2q6ScRibXws4Ajl+d+nod3AaR9vL5w= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= +github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= +github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/heketi/heketi v9.0.1-0.20190917153846-c2e2a4ab7ab9+incompatible/go.mod h1:bB9ly3RchcQqsQ9CpyaQwvva7RS5ytVoSoholZQON6o= github.com/heketi/tests v0.0.0-20151005000721-f3775cbcefd6/go.mod h1:xGMAM8JLi7UkZt1i4FQeQy0R2T8GLUwQhOP5M1gBhy4= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.5 h1:JboBksRwiiAJWvIYJVo46AfV+IAIKZpfrSzVKj42R4Q= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/ishidawataru/sctp v0.0.0-20190723014705-7c296d48a2b5/go.mod h1:DM4VvS+hD/kDi1U1QsX2fnZowwBhqD0Dk3bRPKF/Oc8= github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0B/fFc00Y+Rasa88328GlI/XbtyysCtTHZS8h7IrBU= github.com/jimstudt/http-authentication v0.0.0-20140401203705-3eca13d6893a/go.mod h1:wK6yTYYcgjHE1Z1QtXACPDjcFJyBskHEdagmnq3vsP8= +github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/jonboulle/clockwork v0.1.0 h1:VKV+ZcuP6l3yW9doeqz6ziZGgcynBVQO+obU0+0hcPo= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.8 h1:QiWkFLKq0T7mpzwOTu6BzNDbfTE8OLrYhVKYMLF46Ok= github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.10 h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr68= +github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= github.com/karrick/godirwalk v1.7.5/go.mod h1:2c9FRhkDxdIbgkOnCEvnSWs71Bhugbl46shStcFDJ34= +github.com/karrick/godirwalk v1.16.1/go.mod h1:j4mkqPuvaLI8mp1DroR3P6ad7cyYd4c1qeJ3RV7ULlk= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/gotool v0.0.0-20161130080628-0de1eaf82fa3/go.mod h1:jxZFDH7ILpTPQTk+E2s+z4CUas9lVNjIuKR4c5/zKgM= @@ -307,9 +483,12 @@ github.com/klauspost/cpuid v0.0.0-20180405133222-e7e905edc00e/go.mod h1:Pj4uuM52 github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= @@ -344,18 +523,30 @@ github.com/mattn/go-shellwords v1.0.5/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vq github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= +github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/mesos/mesos-go v0.0.9/go.mod h1:kPYCMQ9gsOXVAle1OsoY4I1+9kPu8GHkf88aV59fDr4= github.com/mholt/certmagic v0.6.2-0.20190624175158-6a42ef9fe8c2/go.mod h1:g4cOPxcjV0oFq3qwpjSA30LReKD8AoIfwAY9VvG35NY= +github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.3/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.4/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/mindprince/gonvml v0.0.0-20190828220739-9ebdce4bb989/go.mod h1:2eu9pRWp8mo84xCg6KswZ+USQHjwgRhNp06sozOdsTY= github.com/mistifyio/go-zfs v2.1.1+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4= +github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4= +github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-ps v0.0.0-20170309133038-4fdf99ab2936/go.mod h1:r1VsdOzOPt1ZSrGZWFoNhsAedKnEd6r9Np1+5blZCWk= +github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= +github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= +github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= +github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v0.0.0-20180220230111-00c29f56e238/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/moby/ipvs v1.0.1/go.mod h1:2pngiyseZbIKXNv7hsKj3O9UEz30c53MT9005gt2hxQ= +github.com/moby/sys/mountinfo v0.1.3/go.mod h1:w2t2Avltqx8vE7gX5l+QiBKxODu2TX0+Syr3h52Tw4o= +github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -366,6 +557,7 @@ github.com/mohae/deepcopy v0.0.0-20170603005431-491d3605edfb/go.mod h1:TaXosZuwd github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/mozilla/tls-observatory v0.0.0-20180409132520-8791a200eb40/go.mod h1:SrKMQvPiws7F7iqYp8/TX+IhxCYhzr6N/1yb8cwHsGk= github.com/mrunalp/fileutils v0.0.0-20171103030105-7d4729fb3618/go.mod h1:x8F1gnqOkIEiO4rqoeEEEqQbo7HjGMTvyoq3gej4iT0= +github.com/mrunalp/fileutils v0.0.0-20200520151820-abd8a0e76976/go.mod h1:x8F1gnqOkIEiO4rqoeEEEqQbo7HjGMTvyoq3gej4iT0= github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mvdan/xurls v1.1.0/go.mod h1:tQlNn3BED8bE/15hnSL2HLkDeLWpNPAwtw7wkEq44oU= @@ -375,6 +567,7 @@ github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h github.com/naoina/toml v0.1.1/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= github.com/nbutton23/zxcvbn-go v0.0.0-20160627004424-a22cb81b2ecd/go.mod h1:o96djdrsSGy3AWPyBgZMAGfxZNfgntdJG+11KU4QvbU= github.com/nbutton23/zxcvbn-go v0.0.0-20171102151520-eafdab6b0663/go.mod h1:o96djdrsSGy3AWPyBgZMAGfxZNfgntdJG+11KU4QvbU= +github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= @@ -385,12 +578,26 @@ github.com/onsi/gomega v1.4.2/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1Cpa github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v1.0.0-rc1 h1:WzifXhOVOEOuFYOJAW6aQqW0TooG2iki3E3Ii+WN7gQ= github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= +github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= github.com/opencontainers/runc v1.0.0-rc10/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v1.0.0-rc90.0.20200616040943-82d2fa4eb069/go.mod h1:3Sm6Dt7OT8z88EbdQqqcRN2oCT54jbi72tT/HqgflT8= +github.com/opencontainers/runc v1.0.0-rc91.0.20200707015106-819fcc687efb/go.mod h1:ZuXhqlr4EiRYgDrBDNfSbE4+n9JX4+V107NwAmF7sZA= +github.com/opencontainers/runc v1.0.0-rc92/go.mod h1:X1zlU4p7wOlX4+WRCz+hvlRv8phdL7UqbYD+vQwNMmE= github.com/opencontainers/runtime-spec v1.0.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.3-0.20200520003142-237cc4f519e2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.3-0.20200728170252-4d89ac9fbff6/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/selinux v1.3.1-0.20190929122143-5215b1806f52/go.mod h1:+BLncwf63G4dgOzykXAxcmnFlUaOlkDdmw/CqsW6pjs= +github.com/opencontainers/selinux v1.5.1/go.mod h1:yTcKuYAh6R95iDpefGLQaPaRwJFwyzAJufJyiTt7s0g= +github.com/opencontainers/selinux v1.5.2/go.mod h1:yTcKuYAh6R95iDpefGLQaPaRwJFwyzAJufJyiTt7s0g= +github.com/opencontainers/selinux v1.6.0/go.mod h1:VVGKuOLlE7v4PJyT6h7mNWvq1rzqiriPsEqVhc+svHE= +github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.1.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= @@ -398,25 +605,43 @@ github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= github.com/pquerna/ffjson v0.0.0-20180717144149-af8b230fcd20/go.mod h1:YARuvh7BUWHNhzDq2OM5tzR2RiCcN2D7sapiKyCel/M= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0 h1:vrDKnkGzuGvhNAL56c7DBz29ZL+KxnoR0x7enabFceM= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.7.1 h1:NTGy1Ja9pByO+xAeH/qiWnLrKtr3hJPNjaVUwnjpdpA= +github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1 h1:K0MGApIoQvMw27RTdJkPbr3JZ7DNbtxQNyi5STVM6Kw= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.10.0 h1:RyRA7RzGXQZiW+tGMr7sxa85G1z0yOpM1qq5c8lNawc= +github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= +github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.0-20190522114515-bc1a522cf7b1/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2 h1:6LJUbpNm42llc4HRCuvApCSWB/WfhuNo9K98Q9sNGfs= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.1.3 h1:F0+tqvhOksq22sc6iCHF5WGlWjdwj92p0udFh1VFBS8= +github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.2.0 h1:wH4vA7pcjKuZzjF7lM8awk4fnuJO6idemZXoKnULUx4= +github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/quasilyte/go-consistent v0.0.0-20190521200055-c6f3937de18c/go.mod h1:5STLWrekHfjyYwxBRVRXNOSewLJ3PWfDJd1VyTS21fI= github.com/quobyte/api v0.1.2/go.mod h1:jL7lIHrmqQ7yh05OJ+eEEdHr0u/kmT1Ff9iHd+4H6VI= +github.com/quobyte/api v0.1.8/go.mod h1:jL7lIHrmqQ7yh05OJ+eEEdHr0u/kmT1Ff9iHd+4H6VI= github.com/remyoudompheng/bigfft v0.0.0-20170806203942-52369c62f446/go.mod h1:uYEyJGbgTkfkS4+E/PavXkNJcbFIpEtjt2B0KDQ5+9M= github.com/robfig/cron v1.1.0 h1:jk4/Hud3TTdcrJgUOBgsqrZBarcxl6ADIjSC2iniwLY= github.com/robfig/cron v1.1.0/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k= @@ -424,27 +649,34 @@ github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6So github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rubiojr/go-vhd v0.0.0-20160810183302-0bfd3b39853c/go.mod h1:DM5xW0nvfNNm2uytzsvhI3OnX8uzaRAg8UX/CnDqbto= +github.com/rubiojr/go-vhd v0.0.0-20200706105327-02e210299021/go.mod h1:DM5xW0nvfNNm2uytzsvhI3OnX8uzaRAg8UX/CnDqbto= github.com/russross/blackfriday v0.0.0-20170610170232-067529f716f4/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/ryanuber/go-glob v0.0.0-20170128012129-256dc444b735/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/shirou/gopsutil v0.0.0-20180427012116-c95755e4bcd7/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc= github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.0.5/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4 h1:0HKaf1o97UwFjHH9o5XsHUOF+tqmdA7KEzXLpiyaw0E= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/sourcegraph/go-diff v0.5.1/go.mod h1:j2dHj3m8aZgQO8lMTcTnBcXkRRRqi34cd2MNlA9u1mE= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.0/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.2.2 h1:5jhuqJyZCZf2JRofRvN/nIFgIWNzPa3/Vz8mYylgbWc= @@ -454,6 +686,8 @@ github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkU github.com/spf13/cobra v0.0.2/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= +github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= +github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= github.com/spf13/jwalterweatherman v0.0.0-20180109140146-7c0cea34c8ec/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= @@ -464,7 +698,10 @@ github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.0.2/go.mod h1:A8kyI5cUJhb8N+3pkfONlcEcZbueH6nhAm0Fq7SrnBM= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= +github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= +github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/storageos/go-api v0.0.0-20180912212459-343b3eff91fc/go.mod h1:ZrLn+e0ZuF3Y65PNF6dIwbJPZqfmtCXxFm9ckv0agOY= +github.com/storageos/go-api v2.2.0+incompatible/go.mod h1:ZrLn+e0ZuF3Y65PNF6dIwbJPZqfmtCXxFm9ckv0agOY= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= @@ -472,6 +709,8 @@ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= github.com/thecodeteam/goscaleio v0.1.0/go.mod h1:68sdkZAsK8bvEwBlbQnlLS+xU+hvLYM/iQ8KXej1AwM= @@ -479,10 +718,14 @@ github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhV github.com/timakin/bodyclose v0.0.0-20190721030226-87058b9bfcec/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8 h1:ndzgwNDnKIqyCvHTXaCqh9KlOWKvBry6nuXMJmonVsE= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/ultraware/funlen v0.0.1/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA= github.com/ultraware/funlen v0.0.2/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= +github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasthttp v1.2.0/go.mod h1:4vX61m6KN+xDduDNwXrhIAVZaZaZiQ1luJk8LWSxF3s= @@ -490,22 +733,39 @@ github.com/valyala/quicktemplate v1.1.1/go.mod h1:EH+4AkTd43SvgIbQHYu59/cJyxDoOV github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= github.com/vishvananda/netlink v1.0.0/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk= +github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= github.com/vishvananda/netns v0.0.0-20171111001504-be1fbeda1936/go.mod h1:ZjcWmFBXmLKZu9Nxj3WKYEafiSqer2rnvPr0en9UNpI= +github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= +github.com/vishvananda/netns v0.0.0-20200520041808-52d707b772fe/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= +github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= github.com/vmware/govmomi v0.20.3/go.mod h1:URlwyTFZX72RmxtxuaFL2Uj3fD1JTvZdx59bHWk6aFU= +github.com/willf/bitset v1.1.11-0.20200630133818-d5bec3311243/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 h1:eY9dn8+vbi4tKz5Qo6v2eYzo7kUS51QINcR5jNpbZS8= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xlab/handysort v0.0.0-20150421192137-fb3537ed64a1/go.mod h1:QcJo0QPSfTONNIgpN5RA8prR7fF8nkF6cTWTcNerRO8= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.3 h1:MUGmc65QhB3pIlaQ5bB4LwqSj6GIonVJXpZiaKNyaKk= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738 h1:VcrIfasaLFkyjk6KNlXQSzO+B0fZcnECiDrKJsfxka0= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= +go.etcd.io/etcd v0.5.0-alpha.5.0.20200819165624-17cef6e3e9d5 h1:Gqga3zA9tdAcfqobUGjSoCob5L3f8Dt5EuOp3ihNZko= +go.etcd.io/etcd v0.5.0-alpha.5.0.20200819165624-17cef6e3e9d5/go.mod h1:skWido08r9w6Lq/w70DO5XYIKMu4QFu1+4VsqLQuJy8= +go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489 h1:1JFLBqwIgdyHN1ZtgjTBwO+blA6gVOmZurpiMEsETKo= +go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg= go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= go.mongodb.org/mongo-driver v1.1.2/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.uber.org/atomic v1.3.2 h1:2Oa65PReHzfn29GpvgsYwloV9AVFHPDk8tYxt2c2tr4= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.4.0 h1:cxzIVoETapQEqDhQu3QfnvXAV4AlzcvUCxkVUFw3+EU= +go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/multierr v1.1.0 h1:HoEmRHQPVSqub6w2z2d2EOVs2fjyFRGyofhKuyDq0QI= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/zap v1.10.0 h1:ORx85nbTijNz8ljznvCMR1ZBIPKFn3jQrag10X2AsuM= @@ -514,6 +774,7 @@ go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1 golang.org/x/build v0.0.0-20190927031335-2835ba2e683f/go.mod h1:fYw7AShPAhGMdXqA9gRadk/CcMsvLlClpE5oBwnS3dM= golang.org/x/crypto v0.0.0-20180426230345-b49d69b5da94/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190123085648-057139ce5d2b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -523,24 +784,52 @@ golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a/go.mod h1:djNgcEr1/C05ACk golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190424203555-c05e17bb3b2d/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975 h1:/Tl7pH94bvbAAHBdZJT947M/+gp0+CqQXDtMRC0fseo= golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0 h1:hb9wdF1z5waM+dSIICn1l0DkLVDT3hqhhQsDNUmHPRE= +golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190312203227-4b39c73a6495/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20170915142106-8351a756f30f/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -548,8 +837,10 @@ golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180911220305-26e67e76b6c3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181102091132-c10e9556a7bc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -558,19 +849,38 @@ golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190320064053-1272bf9dcd53/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190328230028-74de082e2cca/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190502183928-7f726cade0ab/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191004110552-13f9640d40b9 h1:rjwSpXsdiK0dV8/Naq3kAw9ymfAeJIyd0upUIElB+lI= golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200707034311-ab3426394381 h1:VXak5I6aEWmAXeQjA+QSZzlgNrpq9mjcfDemuexIKsU= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b h1:uwuIcX0g4Yl1NC5XAz37xsr2lTtcqevgzYNVt49waME= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190402181905-9f3314589c9a/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45 h1:SVwTIAaPC2U/AvvLNZ2a7OVsmBpC8L5BlwK1whH3hm0= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6 h1:pE8b58s1HRDMi8RDc79m0HISf9D4TzseP40cEA6IGfs= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d h1:TzXSXBo42m9gQenoE3b9BGiEpg5IG2JkU5FkPIawgtw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -580,9 +890,11 @@ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20171026204733-164713f0dfce/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -595,23 +907,65 @@ golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190321052220-f7bb7a8bee54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502175342-a43fa875dd82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7 h1:HmbHVPwrPEKPGLAcHSrMe6+hqSUlvZU0rab6x5EXfGU= golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200120151820-655fe14d7479/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200327173247-9dae0f8f5775/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4 h1:5/PjkGUjvEU5Gl6BxmvKRPpqo2uNMv4rcHBMwzk/st8= +golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201110211018-35f3e6cf4a65/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201112073958-5cba982894dd h1:5CtCZbICpIOFdgO940moixOPjc0178IU44m4EjOO5IY= +golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.0.0-20170915090833-1cbadb444a80/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.4 h1:0YWbFKbhXG/wIiuHDSKpS0Iy7FSA+u45VtBMfQcFTTc= +golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 h1:SvFZT6jyqRaOeXpc5h/JSfZenJ2O330aBsf7JfSUXmQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0 h1:/5xXl8Y5W96D+TtHSlonuFqGHIWVuyCkGJLwGh9JJFs= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e h1:EHBhcS0mlXEAVwNyO2dLfjToGsyY4j24pTs2ScHnX7s= +golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20170915040203-e531a2a1c15f/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -636,12 +990,39 @@ golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBn golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190521203540-521d6ed310dd/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190617190820-da514acc4774/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190909030654-5b82db07426d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200616133436-c1934b75d054/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= gonum.org/v1/gonum v0.0.0-20190331200053-3d26580ed485/go.mod h1:2ltnJ7xHfj0zHS40VVPYEAAMTa3ZGguvHGBSJeRWqE0= gonum.org/v1/gonum v0.6.2/go.mod h1:9mxDZsDKxgMAuccQkewq682L+0eCu4dCN2yonUJTCLU= @@ -650,27 +1031,77 @@ gonum.org/v1/netlib v0.0.0-20190331212654-76723241ea4e/go.mod h1:kS+toOQn6AQKjmK gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.6.1-0.20190607001116-5213b8090861/go.mod h1:btoxGiFvQNVUZQ8W08zLtrVS08CNpINPEfxXxgJL1Q4= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.1-0.20200106000736-b8fc810ca6b5/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.1/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0 h1:KxkO13IPW4Lslp2bz+KHP2E3gtFlrIGNThxkZQ3g+4c= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55 h1:gSJIx1SDwno+2ElGhA4+qG2zF97qiUzTM+rQ0klBOcE= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200117163144-32f20d992d24/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013 h1:+kGHl1aib/qcwaRi1CbqBZ1rk19r85MNUf8HaBghugY= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a h1:pOwg4OoaRYScjmR4LlLgdtnyoHYTSAVhhqe5uPdpII8= +google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.26.0 h1:2dTRdpdFEEhJYQD8EMLB61nnrzSCTbG38PhqdhvOltg= google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0 h1:rRYRFMVgRv6E0D70Skyfsr28tDXIuuPZyWGMPdMcnXg= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1 h1:zvIju4sqAGvwKspUQOhwnpcqSbzi7/H6QomNNjTL4sk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0 h1:UhZDfRO8JRQru4/+LlLE0BRKGF8L+PICnvYZmx/fEGA= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= @@ -678,6 +1109,7 @@ gopkg.in/gcfg.v1 v1.2.0/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/mcuadros/go-syslog.v2 v2.2.1/go.mod h1:l5LPIyOOyIdQquNg+oU6Z3524YwrcqEm0aKH+5zpt2U= gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= @@ -688,57 +1120,141 @@ gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bl gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools v2.1.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= gotest.tools/gotestsum v0.3.5/go.mod h1:Mnf3e5FUzXbkCfynWBGOwLssY7gTQgCHObK9tMpAriY= +gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= grpc.go4.org v0.0.0-20170609214715-11d0a25b4919/go.mod h1:77eQGdRu53HpSqPFJFmuJdjuHRquDANNeA4x7B8WQ9o= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.2/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= k8s.io/api v0.18.4 h1:8x49nBRxuXGUlDlwlWd3RMY1SayZrzFfxea3UZSkFw4= k8s.io/api v0.18.4/go.mod h1:lOIQAKYgai1+vz9J7YcDZwC26Z0zQewYOGWdyIPUUQ4= +k8s.io/api v0.19.0 h1:XyrFIJqTYZJ2DU7FBE/bSPz7b1HvbVBuBf07oeo6eTc= +k8s.io/api v0.19.0/go.mod h1:I1K45XlvTrDjmj5LoM5LuP/KYrhWbjUKT/SoPG0qTjw= +k8s.io/api v0.20.0 h1:WwrYoZNM1W1aQEbyl8HNG+oWGzLpZQBlcerS9BQw9yI= +k8s.io/api v0.20.0/go.mod h1:HyLC5l5eoS/ygQYl1BXBgFzWNlkHiAuyNAbevIn+FKg= k8s.io/apiextensions-apiserver v0.18.4/go.mod h1:NYeyeYq4SIpFlPxSAB6jHPIdvu3hL0pc36wuRChybio= +k8s.io/apiextensions-apiserver v0.19.0/go.mod h1:znfQxNpjqz/ZehvbfMg5N6fvBJW5Lqu5HVLTJQdP4Fs= +k8s.io/apiextensions-apiserver v0.20.0/go.mod h1:ZH+C33L2Bh1LY1+HphoRmN1IQVLTShVcTojivK3N9xg= k8s.io/apimachinery v0.18.4 h1:ST2beySjhqwJoIFk6p7Hp5v5O0hYY6Gngq/gUYXTPIA= k8s.io/apimachinery v0.18.4/go.mod h1:OaXp26zu/5J7p0f92ASynJa1pZo06YlV9fG7BoWbCko= +k8s.io/apimachinery v0.19.0 h1:gjKnAda/HZp5k4xQYjL0K/Yb66IvNqjthCb03QlKpaQ= +k8s.io/apimachinery v0.19.0/go.mod h1:DnPGDnARWFvYa3pMHgSxtbZb7gpzzAZ1pTfaUNDVlmA= +k8s.io/apimachinery v0.20.0 h1:jjzbTJRXk0unNS71L7h3lxGDH/2HPxMPaQY+MjECKL8= +k8s.io/apimachinery v0.20.0/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= k8s.io/apiserver v0.18.4 h1:pn1jSQkfboPSirZopkVpEdLW4FcQLnYMaIY8LFxxj30= k8s.io/apiserver v0.18.4/go.mod h1:q+zoFct5ABNnYkGIaGQ3bcbUNdmPyOCoEBcg51LChY8= +k8s.io/apiserver v0.19.0 h1:jLhrL06wGAADbLUUQm8glSLnAGP6c7y5R3p19grkBoY= +k8s.io/apiserver v0.19.0/go.mod h1:XvzqavYj73931x7FLtyagh8WibHpePJ1QwWrSJs2CLk= +k8s.io/apiserver v0.20.0 h1:0MwO4xCoqZwhoLbFyyBSJdu55CScp4V4sAgX6z4oPBY= +k8s.io/apiserver v0.20.0/go.mod h1:6gRIWiOkvGvQt12WTYmsiYoUyYW0FXSiMdNl4m+sxY8= k8s.io/cli-runtime v0.18.4/go.mod h1:9/hS/Cuf7NVzWR5F/5tyS6xsnclxoPLVtwhnkJG1Y4g= +k8s.io/cli-runtime v0.19.0/go.mod h1:tun9l0eUklT8IHIM0jors17KmUjcrAxn0myoBYwuNuo= +k8s.io/cli-runtime v0.20.0/go.mod h1:C5tewU1SC1t09D7pmkk83FT4lMAw+bvMDuRxA7f0t2s= k8s.io/client-go v0.18.4 h1:un55V1Q/B3JO3A76eS0kUSywgGK/WR3BQ8fHQjNa6Zc= k8s.io/client-go v0.18.4/go.mod h1:f5sXwL4yAZRkAtzOxRWUhA/N8XzGCb+nPZI8PfobZ9g= +k8s.io/client-go v0.19.0 h1:1+0E0zfWFIWeyRhQYWzimJOyAk2UT7TiARaLNwJCf7k= +k8s.io/client-go v0.19.0/go.mod h1:H9E/VT95blcFQnlyShFgnFT9ZnJOAceiUHM3MlRC+mU= +k8s.io/client-go v0.20.0 h1:Xlax8PKbZsjX4gFvNtt4F5MoJ1V5prDvCuoq9B7iax0= +k8s.io/client-go v0.20.0/go.mod h1:4KWh/g+Ocd8KkCwKF8vUNnmqgv+EVnQDK4MBF4oB5tY= k8s.io/cloud-provider v0.18.4/go.mod h1:JdI6cuSFPSPANEciv0v5qfwztkeyFCVc1S3krLYrw0E= +k8s.io/cloud-provider v0.19.0 h1:Ae09nHr6BVPEzmAWbZedYC0gjsIPbt7YsIY0V/NHGr0= +k8s.io/cloud-provider v0.19.0/go.mod h1:TYh7b7kQ6wiqF7Ftb+u3lN4IwvgOPbBrcvC3TDAW4cw= +k8s.io/cloud-provider v0.20.0 h1:CVPQ66iyfNgeGomUq2jE/TWrfzE77bdCpemhFS8955U= +k8s.io/cloud-provider v0.20.0/go.mod h1:Lz/luSVD5BrHDDhtVdjFh0C2qQCRYdf0b9BHQ9L+bXc= k8s.io/cluster-bootstrap v0.18.4/go.mod h1:hNG705ec9SMN2BGlJ81R2CnyJjNKfROtAxvI9JXZdiM= +k8s.io/cluster-bootstrap v0.19.0/go.mod h1:kBn1DKyqoM245wzz+AAnGkuysJ+9GqVbPYveTo4KiaA= +k8s.io/cluster-bootstrap v0.20.0/go.mod h1:6WZaNIBvcvL7MkPzSRKrZDIr4u+ePW2oIWoRsEFMjmE= k8s.io/code-generator v0.18.4/go.mod h1:TgNEVx9hCyPGpdtCWA34olQYLkh3ok9ar7XfSsr8b6c= +k8s.io/code-generator v0.19.0/go.mod h1:moqLn7w0t9cMs4+5CQyxnfA/HV8MF6aAVENF+WZZhgk= +k8s.io/code-generator v0.20.0/go.mod h1:UsqdF+VX4PU2g46NC2JRs4gc+IfrctnwHb76RNbWHJg= k8s.io/component-base v0.18.4 h1:Kr53Fp1iCGNsl9Uv4VcRvLy7YyIqi9oaJOQ7SXtKI98= k8s.io/component-base v0.18.4/go.mod h1:7jr/Ef5PGmKwQhyAz/pjByxJbC58mhKAhiaDu0vXfPk= +k8s.io/component-base v0.19.0 h1:OueXf1q3RW7NlLlUCj2Dimwt7E1ys6ZqRnq53l2YuoE= +k8s.io/component-base v0.19.0/go.mod h1:dKsY8BxkA+9dZIAh2aWJLL/UdASFDNtGYTCItL4LM7Y= +k8s.io/component-base v0.20.0 h1:BXGL8iitIQD+0NgW49UsM7MraNUUGDU3FBmrfUAtmVQ= +k8s.io/component-base v0.20.0/go.mod h1:wKPj+RHnAr8LW2EIBIK7AxOHPde4gme2lzXwVSoRXeA= +k8s.io/component-helpers v0.20.0/go.mod h1:nx6NOtfSfGOxnSZsDJxpGbnsVuUA1UXpwDvZIrtigNk= +k8s.io/controller-manager v0.20.0/go.mod h1:nD4qym/pmCz2v1tpqvlEBVlHW9CAZwedloM8GrJTLpg= k8s.io/cri-api v0.18.4/go.mod h1:OJtpjDvfsKoLGhvcc0qfygved0S0dGX56IJzPbqTG1s= +k8s.io/cri-api v0.19.0/go.mod h1:UN/iU9Ua0iYdDREBXNE9vqCJ7MIh/FW3VIL0d8pw7Fw= +k8s.io/cri-api v0.20.0/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= k8s.io/csi-translation-lib v0.18.4/go.mod h1:FTci2m8/3oN8E+8OyblBXei8w4mwbiH4boNPeob4piE= +k8s.io/csi-translation-lib v0.19.0/go.mod h1:zGS1YqV8U2So/t4Hz8SoRXMx5y5/KSKnA6BXXxGuo4A= +k8s.io/csi-translation-lib v0.20.0/go.mod h1:M4CdD66GxEI6ev8aTtsA2NkK9kIF9K5VZQMcw/SsoLs= k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20200114144118-36b2048a9120/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/gengo v0.0.0-20200428234225-8167cfdcfc14/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/gengo v0.0.0-20201113003025-83324d819ded/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= k8s.io/heapster v1.2.0-beta.1/go.mod h1:h1uhptVXMwC8xtZBYsPXKVi8fpdlYkTs6k949KozGrM= k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8= k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= +k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= +k8s.io/klog/v2 v2.2.0 h1:XRvcwJozkgZ1UQJmfMGpvRthQHOvihEhYtDfAaxMz/A= +k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= +k8s.io/klog/v2 v2.4.0 h1:7+X0fUguPyrKEC4WjH8iGDg3laWgMo5tMnRTIGTTxGQ= +k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= k8s.io/kube-aggregator v0.18.4/go.mod h1:xOVy4wqhpivXCt07Diwdms2gonG+SONVx+1e7O+GfC0= +k8s.io/kube-aggregator v0.19.0/go.mod h1:1Ln45PQggFAG8xOqWPIYMxUq8WNtpPnYsbUJ39DpF/A= +k8s.io/kube-aggregator v0.20.0/go.mod h1:3Is/gzzWmhhG/rA3CpA1+eVye87lreBQDFGcAGT7gzo= k8s.io/kube-controller-manager v0.18.4/go.mod h1:GrY1S0F7zA0LQlt0ApOLt4iMpphKTk3mFrQl1+usrfs= +k8s.io/kube-controller-manager v0.19.0/go.mod h1:uGZyiHK73NxNEN5EZv/Esm3fbCOzeq4ndttMexVZ1L0= +k8s.io/kube-controller-manager v0.20.0/go.mod h1:Pmli7dnwIVpwKJVeab97yBt35QEFdw65oqT5ti0ikUs= k8s.io/kube-openapi v0.0.0-20200410145947-61e04a5be9a6/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E= +k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o= +k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= k8s.io/kube-proxy v0.18.4/go.mod h1:h2c+ckQC1XpybDs53mWhLCvvM6txduWVLPQwwvGqR9M= +k8s.io/kube-proxy v0.19.0/go.mod h1:7NoJCFgsWb7iiMB1F6bW1St5rEXC+ir2aWiJehASmTU= +k8s.io/kube-proxy v0.20.0/go.mod h1:R97oobM6zSh3ZqFMXi5DzCH/qJXNzua/UzcDmuQRexM= k8s.io/kube-scheduler v0.18.4/go.mod h1:vRFb/8Yi7hh670beaPrXttMpjt7H8EooDkgwFm8ts4k= +k8s.io/kube-scheduler v0.19.0/go.mod h1:1XGjJUgstM0/0x8to+bSGSyCs3Dp3dbCEr3Io/mvd4s= +k8s.io/kube-scheduler v0.20.0/go.mod h1:cRTGsJU3TfQvbMJBmpoPgq9rBF5cQLpLKoOafKwdZnI= k8s.io/kubectl v0.18.4/go.mod h1:EzB+nfeUWk6fm6giXQ8P4Fayw3dsN+M7Wjy23mTRtB0= +k8s.io/kubectl v0.19.0/go.mod h1:gPCjjsmE6unJzgaUNXIFGZGafiUp5jh0If3F/x7/rRg= +k8s.io/kubectl v0.20.0/go.mod h1:8x5GzQkgikz7M2eFGGuu6yOfrenwnw5g4RXOUgbjR1M= k8s.io/kubelet v0.18.4/go.mod h1:D0V9JYaTJRF+ry+9JfnM4uyg3ySRLQ02XjfQ5f2u4CM= +k8s.io/kubelet v0.19.0/go.mod h1:cGds22piF/LnFzfAaIT+efvOYBHVYdunqka6NVuNw9g= +k8s.io/kubelet v0.20.0/go.mod h1:lMdjO1NA+JZXSYtxb48pQmNERmC+vVIXIYkJIugVhl0= k8s.io/kubernetes v1.18.4 h1:AYtJ24PIT91P1K8ekCrvay8LK8WctWhC5+NI0HZ8sqE= k8s.io/kubernetes v1.18.4/go.mod h1:Efg82S+Ti02A/Mww53bxroc7IgzX2bgPsf6hT8gAs3M= +k8s.io/kubernetes v1.19.0 h1:ir53YuXsfsuVABmtYHCTUa3xjD41Htxv3o+xoQjJdUo= +k8s.io/kubernetes v1.19.0/go.mod h1:yhT1/ltQajQsha3tnYc9QPFYSumGM45nlZdjf7WqE1A= +k8s.io/kubernetes v1.20.0 h1:mnc69esJC3PJgSptxNJomGz2gBthyGLSEy18WiyRH4U= +k8s.io/kubernetes v1.20.0/go.mod h1:/xrHGNfoQphtkhZvyd5bA1lRmz+QkDVmBZu+O8QMoek= +k8s.io/kubernetes v1.20.2 h1:EsQROw+yFsDMfjEHp52cKs4JVI6lAHA2SHGAF88cK7s= k8s.io/legacy-cloud-providers v0.18.4/go.mod h1:Mnxtra7DxVrODfGZHPsrkLi22lwmZOlWkjyyO3vW+WM= +k8s.io/legacy-cloud-providers v0.19.0/go.mod h1:Q5czDCPnStdpFohMpcbnqL+MLR75kUhIDIsnmwEm0/o= +k8s.io/legacy-cloud-providers v0.20.0/go.mod h1:1jEkaU7h9+b1EYdfWDBvhFAr+QpRfUjQfK+dGhxPGfA= k8s.io/metrics v0.18.4/go.mod h1:luze4fyI9JG4eLDZy0kFdYEebqNfi0QrG4xNEbPkHOs= +k8s.io/metrics v0.19.0/go.mod h1:WykpW8B60OeAJx1imdwUgyOID2kDljr/Q+1zrPJ98Wo= +k8s.io/metrics v0.20.0/go.mod h1:9yiRhfr8K8sjdj2EthQQE9WvpYDvsXIV3CjN4Ruq4Jw= +k8s.io/mount-utils v0.20.0/go.mod h1:Jv9NRZ5L2LF87A17GaGlArD+r3JAJdZFvo4XD1cG4Kc= k8s.io/repo-infra v0.0.1-alpha.1/go.mod h1:wO1t9WaB99V80ljbeENTnayuEEwNZt7gECYh/CEyOJ8= k8s.io/sample-apiserver v0.18.4/go.mod h1:j5XH5FUmMd/ztoz+9ch0+hL+lsvWdgxnTV7l3P3Ijoo= +k8s.io/sample-apiserver v0.19.0/go.mod h1:Bq9UulNoKnT72JqlkWF2JS14cXxJqcmvLtb5+EcwiNA= +k8s.io/sample-apiserver v0.20.0/go.mod h1:tScvbz/BcUG46IOsu2YLt4EjBP7XeUuMzMbQt2tQYWw= k8s.io/system-validators v1.0.4/go.mod h1:HgSgTg4NAGNoYYjKsUyk52gdNi2PVDswQ9Iyn66R7NI= +k8s.io/system-validators v1.1.2/go.mod h1:bPldcLgkIUK22ALflnsXk8pvkTEndYdNuaHH6gRrl0Q= +k8s.io/system-validators v1.2.0/go.mod h1:bPldcLgkIUK22ALflnsXk8pvkTEndYdNuaHH6gRrl0Q= k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89 h1:d4vVOjXm687F1iLSP2q3lyPPuyvTUt3aVoBpi2DqRsU= k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= +k8s.io/utils v0.0.0-20200414100711-2df71ebbae66/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20200729134348-d5654de09c73 h1:uJmqzgNWG7XyClnU/mLPBWwfKKF1K8Hf8whTseBgJcg= +k8s.io/utils v0.0.0-20200729134348-d5654de09c73/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20201110183641-67b214c5f920 h1:CbnUZsM497iRC5QMVkHwyl8s2tB3g7yaSHkYPkpgelw= +k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw= modernc.org/golex v1.0.0/go.mod h1:b/QX9oBD/LhixY6NDh+IdGv17hgB+51fET1i2kPSmvk= modernc.org/mathutil v1.0.0/go.mod h1:wU0vUrJsVWBZ4P6e7xtFJEhFSNsfRLJ8H458uRjg03k= @@ -747,13 +1263,24 @@ modernc.org/xc v1.0.0/go.mod h1:mRNCo0bvLjGhHO9WsyuKVU4q0ceiDDDoEeWDJHrNx8I= mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc= mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jCoyKnw3vv5biOc3JnIcYfL4= mvdan.cc/unparam v0.0.0-20190209190245-fbb59629db34/go.mod h1:H6SUd1XjIs+qQCyskXg5OFSrilMRUkD8ePJpHKDPaeY= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.7 h1:uuHDyjllyzRyCIvvn0OBjiRB0SgBZGqHNYAmjR7fO50= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.7/go.mod h1:PHgbrJT7lCHcxMU+mDHEm+nx46H4zuuHZkDP6icnhu0= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.9 h1:rusRLrDhjBp6aYtl9sGEvQJr6faoHoDLd0YcUBTZguI= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.9/go.mod h1:dzAXnQbTRyDlZPJX2SUPEqvnB+j7AJjtlox7PEwigU0= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.14 h1:TihvEz9MPj2u0KWds6E2OBUXfwaL4qRJ33c7HGiJpqk= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.14/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= sigs.k8s.io/kustomize v2.0.3+incompatible/go.mod h1:MkjgH3RdOWrievjo6c9T245dYlB5QeXV4WCbnt/PEpU= sigs.k8s.io/structured-merge-diff/v3 v3.0.0-20200116222232-67a7b8c61874/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= sigs.k8s.io/structured-merge-diff/v3 v3.0.0 h1:dOmIZBMfhcHS09XZkMyUgkq5trg3/jRyJYFZUiaOp8E= sigs.k8s.io/structured-merge-diff/v3 v3.0.0/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= +sigs.k8s.io/structured-merge-diff/v4 v4.0.1 h1:YXTMot5Qz/X1iBRJhAt+vI+HVttY0WkSqqhKxQ0xVbA= +sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= +sigs.k8s.io/structured-merge-diff/v4 v4.0.2 h1:YHQV7Dajm86OuqnIR6zAelnDWBRjo+YhYV9PmGrh1s8= +sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= From 9cc4fde6678f8684e0467758e1a520e8ed2ca0ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Salvador=20Gonz=C3=A1lez=20Gonz=C3=A1lez?= Date: Sun, 17 Jan 2021 09:36:18 +0000 Subject: [PATCH 16/62] Remove v2 controller mention I removed mention to v2 controller behaviour. --- content/en/docs/concepts/workloads/controllers/cron-jobs.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/en/docs/concepts/workloads/controllers/cron-jobs.md b/content/en/docs/concepts/workloads/controllers/cron-jobs.md index a7e1f03097a0a..11e30b203de3c 100644 --- a/content/en/docs/concepts/workloads/controllers/cron-jobs.md +++ b/content/en/docs/concepts/workloads/controllers/cron-jobs.md @@ -62,7 +62,7 @@ and if `concurrencyPolicy` is set to `Allow`, the jobs will always run at least once. {{< caution >}} -If `startingDeadlineSeconds` is set to a value less than 10 seconds, the CronJob may not be scheduled. This is because the CronJob controller checks things every 10 seconds. As an alpha feature, there is a V2 controller implementation with different behavior. The version 2 controller provides experimental performance improvements. +If `startingDeadlineSeconds` is set to a value less than 10 seconds, the CronJob may not be scheduled. This is because the CronJob controller checks things every 10 seconds. {{< /caution >}} From 99029b97d7c93373cf20e9609782428f107654c2 Mon Sep 17 00:00:00 2001 From: Paul Czarkowski Date: Mon, 3 Aug 2020 14:50:11 -0500 Subject: [PATCH 17/62] Remove Master/Slave terminology from stateless application tutorial. The stateless application tutorial is littered with unsuitable terminology. This update switches the database technology to a database that has already updated their own terminology as well as removes the terminology from the tutorial itself. The advanced logging tutorial followup is set to Draft as it will take a larger effort to convert that, and I'm not convinced its even in a working state right now. A followup PR to the examples repo to be referenced here will be made. Addresses #22918 Signed-off-by: Paul Czarkowski address comments in PR Signed-off-by: Paul Czarkowski remove confusing comment about dns, we can assume k8s has kube-dns Signed-off-by: Paul Czarkowski --- content/en/docs/tutorials/_index.md | 2 +- .../guestbook-logs-metrics-with-elk.md | 460 ------------------ .../stateless-application/guestbook.md | 188 +++---- .../guestbook/frontend-deployment.yaml | 24 +- .../guestbook/frontend-service.yaml | 10 +- .../guestbook/mongo-deployment.yaml | 31 ++ .../application/guestbook/mongo-service.yaml | 14 + .../guestbook/redis-master-deployment.yaml | 29 -- .../guestbook/redis-master-service.yaml | 17 - .../guestbook/redis-slave-deployment.yaml | 40 -- .../guestbook/redis-slave-service.yaml | 15 - 11 files changed, 124 insertions(+), 706 deletions(-) delete mode 100644 content/en/docs/tutorials/stateless-application/guestbook-logs-metrics-with-elk.md create mode 100644 content/en/examples/application/guestbook/mongo-deployment.yaml create mode 100644 content/en/examples/application/guestbook/mongo-service.yaml delete mode 100644 content/en/examples/application/guestbook/redis-master-deployment.yaml delete mode 100644 content/en/examples/application/guestbook/redis-master-service.yaml delete mode 100644 content/en/examples/application/guestbook/redis-slave-deployment.yaml delete mode 100644 content/en/examples/application/guestbook/redis-slave-service.yaml diff --git a/content/en/docs/tutorials/_index.md b/content/en/docs/tutorials/_index.md index b4f0709a7698b..630c04f5f6cae 100644 --- a/content/en/docs/tutorials/_index.md +++ b/content/en/docs/tutorials/_index.md @@ -33,7 +33,7 @@ Before walking through each tutorial, you may want to bookmark the * [Exposing an External IP Address to Access an Application in a Cluster](/docs/tutorials/stateless-application/expose-external-ip-address/) -* [Example: Deploying PHP Guestbook application with Redis](/docs/tutorials/stateless-application/guestbook/) +* [Example: Deploying PHP Guestbook application with MongoDB](/docs/tutorials/stateless-application/guestbook/) ## Stateful Applications diff --git a/content/en/docs/tutorials/stateless-application/guestbook-logs-metrics-with-elk.md b/content/en/docs/tutorials/stateless-application/guestbook-logs-metrics-with-elk.md deleted file mode 100644 index d3a38c4df5b34..0000000000000 --- a/content/en/docs/tutorials/stateless-application/guestbook-logs-metrics-with-elk.md +++ /dev/null @@ -1,460 +0,0 @@ ---- -title: "Example: Add logging and metrics to the PHP / Redis Guestbook example" -reviewers: -- sftim -content_type: tutorial -weight: 21 -card: - name: tutorials - weight: 31 - title: "Example: Add logging and metrics to the PHP / Redis Guestbook example" ---- - - -This tutorial builds upon the [PHP Guestbook with Redis](/docs/tutorials/stateless-application/guestbook) tutorial. Lightweight log, metric, and network data open source shippers, or *Beats*, from Elastic are deployed in the same Kubernetes cluster as the guestbook. The Beats collect, parse, and index the data into Elasticsearch so that you can view and analyze the resulting operational information in Kibana. This example consists of the following components: - -* A running instance of the [PHP Guestbook with Redis tutorial](/docs/tutorials/stateless-application/guestbook) -* Elasticsearch and Kibana -* Filebeat -* Metricbeat -* Packetbeat - -## {{% heading "objectives" %}} - -* Start up the PHP Guestbook with Redis. -* Install kube-state-metrics. -* Create a Kubernetes Secret. -* Deploy the Beats. -* View dashboards of your logs and metrics. - -## {{% heading "prerequisites" %}} - - -{{< include "task-tutorial-prereqs.md" >}} -{{< version-check >}} - -Additionally you need: - -* A running deployment of the [PHP Guestbook with Redis](/docs/tutorials/stateless-application/guestbook) tutorial. - -* A running Elasticsearch and Kibana deployment. You can use [Elasticsearch Service in Elastic Cloud](https://cloud.elastic.co), - run the [downloaded files](https://www.elastic.co/guide/en/elastic-stack-get-started/current/get-started-elastic-stack.html) - on your workstation or servers, or the [Elastic Helm Charts](https://github.com/elastic/helm-charts). - - - -## Start up the PHP Guestbook with Redis - -This tutorial builds on the [PHP Guestbook with Redis](/docs/tutorials/stateless-application/guestbook) tutorial. If you have the guestbook application running, then you can monitor that. If you do not have it running then follow the instructions to deploy the guestbook and do not perform the **Cleanup** steps. Come back to this page when you have the guestbook running. - -## Add a Cluster role binding - -Create a [cluster level role binding](/docs/reference/access-authn-authz/rbac/#rolebinding-and-clusterrolebinding) so that you can deploy kube-state-metrics and the Beats at the cluster level (in kube-system). - -```shell -kubectl create clusterrolebinding cluster-admin-binding \ - --clusterrole=cluster-admin --user= -``` - -## Install kube-state-metrics - -Kubernetes [*kube-state-metrics*](https://github.com/kubernetes/kube-state-metrics) is a simple service that listens to the Kubernetes API server and generates metrics about the state of the objects. Metricbeat reports these metrics. Add kube-state-metrics to the Kubernetes cluster that the guestbook is running in. - -```shell -git clone https://github.com/kubernetes/kube-state-metrics.git kube-state-metrics -kubectl apply -f kube-state-metrics/examples/standard -``` - -### Check to see if kube-state-metrics is running - -```shell -kubectl get pods --namespace=kube-system -l app.kubernetes.io/name=kube-state-metrics -``` - -Output: - -``` -NAME READY STATUS RESTARTS AGE -kube-state-metrics-89d656bf8-vdthm 1/1 Running 0 21s -``` - -## Clone the Elastic examples GitHub repo - -```shell -git clone https://github.com/elastic/examples.git -``` - -The rest of the commands will reference files in the `examples/beats-k8s-send-anywhere` directory, so change dir there: - -```shell -cd examples/beats-k8s-send-anywhere -``` - -## Create a Kubernetes Secret - -A Kubernetes {{< glossary_tooltip text="Secret" term_id="secret" >}} is an object that contains a small amount of sensitive data such as a password, a token, or a key. Such information might otherwise be put in a Pod specification or in an image; putting it in a Secret object allows for more control over how it is used, and reduces the risk of accidental exposure. - -{{< note >}} -There are two sets of steps here, one for *self managed* Elasticsearch and Kibana (running on your servers or using the Elastic Helm Charts), and a second separate set for the *managed service* Elasticsearch Service in Elastic Cloud. Only create the secret for the type of Elasticsearch and Kibana system that you will use for this tutorial. -{{< /note >}} - -{{< tabs name="tab_with_md" >}} -{{% tab name="Self Managed" %}} - -### Self managed - -Switch to the **Managed service** tab if you are connecting to Elasticsearch Service in Elastic Cloud. - -### Set the credentials - -There are four files to edit to create a k8s secret when you are connecting to self managed Elasticsearch and Kibana (self managed is effectively anything other than the managed Elasticsearch Service in Elastic Cloud). The files are: - -1. `ELASTICSEARCH_HOSTS` -1. `ELASTICSEARCH_PASSWORD` -1. `ELASTICSEARCH_USERNAME` -1. `KIBANA_HOST` - -Set these with the information for your Elasticsearch cluster and your Kibana host. Here are some examples (also see [*this configuration*](https://stackoverflow.com/questions/59892896/how-to-connect-from-minikube-to-elasticsearch-installed-on-host-local-developme/59892897#59892897)) - -#### `ELASTICSEARCH_HOSTS` - -1. A nodeGroup from the Elastic Elasticsearch Helm Chart: - - ``` - ["http://elasticsearch-master.default.svc.cluster.local:9200"] - ``` - -1. A single Elasticsearch node running on a Mac where your Beats are running in Docker for Mac: - - ``` - ["http://host.docker.internal:9200"] - ``` - -1. Two Elasticsearch nodes running in VMs or on physical hardware: - - ``` - ["http://host1.example.com:9200", "http://host2.example.com:9200"] - ``` - -Edit `ELASTICSEARCH_HOSTS`: - -```shell -vi ELASTICSEARCH_HOSTS -``` - -#### `ELASTICSEARCH_PASSWORD` - -Just the password; no whitespace, quotes, `<` or `>`: - -``` - -``` - -Edit `ELASTICSEARCH_PASSWORD`: - -```shell -vi ELASTICSEARCH_PASSWORD -``` - -#### `ELASTICSEARCH_USERNAME` - -Just the username; no whitespace, quotes, `<` or `>`: - -``` - -``` - -Edit `ELASTICSEARCH_USERNAME`: - -```shell -vi ELASTICSEARCH_USERNAME -``` - -#### `KIBANA_HOST` - -1. The Kibana instance from the Elastic Kibana Helm Chart. The subdomain `default` refers to the default namespace. If you have deployed the Helm Chart using a different namespace, then your subdomain will be different: - - ``` - "kibana-kibana.default.svc.cluster.local:5601" - ``` - -1. A Kibana instance running on a Mac where your Beats are running in Docker for Mac: - - ``` - "host.docker.internal:5601" - ``` -1. Two Elasticsearch nodes running in VMs or on physical hardware: - - ``` - "host1.example.com:5601" - ``` - -Edit `KIBANA_HOST`: - -```shell -vi KIBANA_HOST -``` - -### Create a Kubernetes Secret - -This command creates a Secret in the Kubernetes system level namespace (`kube-system`) based on the files you just edited: - -```shell -kubectl create secret generic dynamic-logging \ - --from-file=./ELASTICSEARCH_HOSTS \ - --from-file=./ELASTICSEARCH_PASSWORD \ - --from-file=./ELASTICSEARCH_USERNAME \ - --from-file=./KIBANA_HOST \ - --namespace=kube-system -``` - -{{% /tab %}} -{{% tab name="Managed service" %}} - -## Managed service - -This tab is for Elasticsearch Service in Elastic Cloud only, if you have already created a secret for a self managed Elasticsearch and Kibana deployment, then continue with [Deploy the Beats](#deploy-the-beats). - -### Set the credentials - -There are two files to edit to create a Kubernetes Secret when you are connecting to the managed Elasticsearch Service in Elastic Cloud. The files are: - -1. `ELASTIC_CLOUD_AUTH` -1. `ELASTIC_CLOUD_ID` - -Set these with the information provided to you from the Elasticsearch Service console when you created the deployment. Here are some examples: - -#### `ELASTIC_CLOUD_ID` - -``` -devk8s:ABC123def456ghi789jkl123mno456pqr789stu123vwx456yza789bcd012efg345hijj678klm901nop345zEwOTJjMTc5YWQ0YzQ5OThlN2U5MjAwYTg4NTIzZQ== -``` - -#### `ELASTIC_CLOUD_AUTH` - -Just the username, a colon (`:`), and the password, no whitespace or quotes: - -``` -elastic:VFxJJf9Tjwer90wnfTghsn8w -``` - -### Edit the required files: - -```shell -vi ELASTIC_CLOUD_ID -vi ELASTIC_CLOUD_AUTH -``` - -### Create a Kubernetes Secret - -This command creates a Secret in the Kubernetes system level namespace (`kube-system`) based on the files you just edited: - -```shell -kubectl create secret generic dynamic-logging \ - --from-file=./ELASTIC_CLOUD_ID \ - --from-file=./ELASTIC_CLOUD_AUTH \ - --namespace=kube-system -``` - -{{% /tab %}} - -{{< /tabs >}} - -## Deploy the Beats - -Manifest files are provided for each Beat. These manifest files use the secret created earlier to configure the Beats to connect to your Elasticsearch and Kibana servers. - -### About Filebeat - -Filebeat will collect logs from the Kubernetes nodes and the containers running in each pod running on those nodes. Filebeat is deployed as a {{< glossary_tooltip text="DaemonSet" term_id="daemonset" >}}. Filebeat can autodiscover applications running in your Kubernetes cluster. At startup Filebeat scans existing containers and launches the proper configurations for them, then it will watch for new start/stop events. - -Here is the autodiscover configuration that enables Filebeat to locate and parse Redis logs from the Redis containers deployed with the guestbook application. This configuration is in the file `filebeat-kubernetes.yaml`: - -```yaml -- condition.contains: - kubernetes.labels.app: redis - config: - - module: redis - log: - input: - type: docker - containers.ids: - - ${data.kubernetes.container.id} - slowlog: - enabled: true - var.hosts: ["${data.host}:${data.port}"] -``` - -This configures Filebeat to apply the Filebeat module `redis` when a container is detected with a label `app` containing the string `redis`. The redis module has the ability to collect the `log` stream from the container by using the docker input type (reading the file on the Kubernetes node associated with the STDOUT stream from this Redis container). Additionally, the module has the ability to collect Redis `slowlog` entries by connecting to the proper pod host and port, which is provided in the container metadata. - -### Deploy Filebeat: - -```shell -kubectl create -f filebeat-kubernetes.yaml -``` - -#### Verify - -```shell -kubectl get pods -n kube-system -l k8s-app=filebeat-dynamic -``` - -### About Metricbeat - -Metricbeat autodiscover is configured in the same way as Filebeat. Here is the Metricbeat autodiscover configuration for the Redis containers. This configuration is in the file `metricbeat-kubernetes.yaml`: - -```yaml -- condition.equals: - kubernetes.labels.tier: backend - config: - - module: redis - metricsets: ["info", "keyspace"] - period: 10s - - # Redis hosts - hosts: ["${data.host}:${data.port}"] -``` - -This configures Metricbeat to apply the Metricbeat module `redis` when a container is detected with a label `tier` equal to the string `backend`. The `redis` module has the ability to collect the `info` and `keyspace` metrics from the container by connecting to the proper pod host and port, which is provided in the container metadata. - -### Deploy Metricbeat - -```shell -kubectl create -f metricbeat-kubernetes.yaml -``` - -#### Verify - -```shell -kubectl get pods -n kube-system -l k8s-app=metricbeat -``` - -### About Packetbeat - -Packetbeat configuration is different than Filebeat and Metricbeat. Rather than specify patterns to match against container labels the configuration is based on the protocols and port numbers involved. Shown below is a subset of the port numbers. - -{{< note >}} -If you are running a service on a non-standard port add that port number to the appropriate type in `filebeat.yaml` and delete/create the Packetbeat DaemonSet. -{{< /note >}} - -```yaml -packetbeat.interfaces.device: any - -packetbeat.protocols: -- type: dns - ports: [53] - include_authorities: true - include_additionals: true - -- type: http - ports: [80, 8000, 8080, 9200] - -- type: mysql - ports: [3306] - -- type: redis - ports: [6379] - -packetbeat.flows: - timeout: 30s - period: 10s -``` - -#### Deploy Packetbeat - -```shell -kubectl create -f packetbeat-kubernetes.yaml -``` - -#### Verify - -```shell -kubectl get pods -n kube-system -l k8s-app=packetbeat-dynamic -``` - -## View in Kibana - -Open Kibana in your browser and then open the **Dashboard** application. In the search bar type Kubernetes and click on the Metricbeat dashboard for Kubernetes. This dashboard reports on the state of your Nodes, deployments, etc. - -Search for Packetbeat on the Dashboard page, and view the Packetbeat overview. - -Similarly, view dashboards for Apache and Redis. You will see dashboards for logs and metrics for each. The Apache Metricbeat dashboard will be blank. Look at the Apache Filebeat dashboard and scroll to the bottom to view the Apache error logs. This will tell you why there are no metrics available for Apache. - -To enable Metricbeat to retrieve the Apache metrics, enable server-status by adding a ConfigMap including a mod-status configuration file and re-deploy the guestbook. - -## Scale your Deployments and see new pods being monitored - -List the existing Deployments: - -```shell -kubectl get deployments -``` - -The output: - -``` -NAME READY UP-TO-DATE AVAILABLE AGE -frontend 3/3 3 3 3h27m -redis-master 1/1 1 1 3h27m -redis-slave 2/2 2 2 3h27m -``` - -Scale the frontend down to two pods: - -```shell -kubectl scale --replicas=2 deployment/frontend -``` - -The output: - -``` -deployment.extensions/frontend scaled -``` - -Scale the frontend back up to three pods: - -```shell -kubectl scale --replicas=3 deployment/frontend -``` - -## View the changes in Kibana - -See the screenshot, add the indicated filters and then add the columns to the view. You can see the ScalingReplicaSet entry that is marked, following from there to the top of the list of events shows the image being pulled, the volumes mounted, the pod starting, etc. -![Kibana Discover](https://raw.githubusercontent.com/elastic/examples/master/beats-k8s-send-anywhere/scaling-up.png) - -## {{% heading "cleanup" %}} - -Deleting the Deployments and Services also deletes any running Pods. Use labels to delete multiple resources with one command. - -1. Run the following commands to delete all Pods, Deployments, and Services. - - ```shell - kubectl delete deployment -l app=redis - kubectl delete service -l app=redis - kubectl delete deployment -l app=guestbook - kubectl delete service -l app=guestbook - kubectl delete -f filebeat-kubernetes.yaml - kubectl delete -f metricbeat-kubernetes.yaml - kubectl delete -f packetbeat-kubernetes.yaml - kubectl delete secret dynamic-logging -n kube-system - ``` - -1. Query the list of Pods to verify that no Pods are running: - - ```shell - kubectl get pods - ``` - - The response should be this: - - ``` - No resources found. - ``` - -## {{% heading "whatsnext" %}} - -* Learn about [tools for monitoring resources](/docs/tasks/debug-application-cluster/resource-usage-monitoring/) -* Read more about [logging architecture](/docs/concepts/cluster-administration/logging/) -* Read more about [application introspection and debugging](/docs/tasks/debug-application-cluster/) -* Read more about [troubleshoot applications](/docs/tasks/debug-application-cluster/resource-usage-monitoring/) - diff --git a/content/en/docs/tutorials/stateless-application/guestbook.md b/content/en/docs/tutorials/stateless-application/guestbook.md index 2b6eef90fa103..3b9737e831b01 100644 --- a/content/en/docs/tutorials/stateless-application/guestbook.md +++ b/content/en/docs/tutorials/stateless-application/guestbook.md @@ -1,5 +1,5 @@ --- -title: "Example: Deploying PHP Guestbook application with Redis" +title: "Example: Deploying PHP Guestbook application with MongoDB" reviewers: - ahmetb content_type: tutorial @@ -7,22 +7,19 @@ weight: 20 card: name: tutorials weight: 30 - title: "Stateless Example: PHP Guestbook with Redis" + title: "Stateless Example: PHP Guestbook with MongoDB" +min-kubernetes-server-version: v1.14 --- -This tutorial shows you how to build and deploy a simple, multi-tier web application using Kubernetes and [Docker](https://www.docker.com/). This example consists of the following components: +This tutorial shows you how to build and deploy a simple _(not production ready)_, multi-tier web application using Kubernetes and [Docker](https://www.docker.com/). This example consists of the following components: -* A single-instance [Redis](https://redis.io/) master to store guestbook entries -* Multiple [replicated Redis](https://redis.io/topics/replication) instances to serve reads +* A single-instance [MongoDB](https://www.mongodb.com/) to store guestbook entries * Multiple web frontend instances - - ## {{% heading "objectives" %}} -* Start up a Redis master. -* Start up Redis slaves. +* Start up a Mongo database. * Start up the guestbook frontend. * Expose and view the Frontend Service. * Clean up. @@ -39,24 +36,28 @@ This tutorial shows you how to build and deploy a simple, multi-tier web applica -## Start up the Redis Master +## Start up the Mongo Database -The guestbook application uses Redis to store its data. It writes its data to a Redis master instance and reads data from multiple Redis slave instances. +The guestbook application uses MongoDB to store its data. -### Creating the Redis Master Deployment +### Creating the Mongo Deployment -The manifest file, included below, specifies a Deployment controller that runs a single replica Redis master Pod. +The manifest file, included below, specifies a Deployment controller that runs a single replica MongoDB Pod. -{{< codenew file="application/guestbook/redis-master-deployment.yaml" >}} +{{< codenew file="application/guestbook/mongo-deployment.yaml" >}} 1. Launch a terminal window in the directory you downloaded the manifest files. -1. Apply the Redis Master Deployment from the `redis-master-deployment.yaml` file: +1. Apply the MongoDB Deployment from the `mongo-deployment.yaml` file: ```shell - kubectl apply -f https://k8s.io/examples/application/guestbook/redis-master-deployment.yaml + kubectl apply -f https://k8s.io/examples/application/guestbook/mongo-deployment.yaml ``` + -1. Query the list of Pods to verify that the Redis Master Pod is running: +1. Query the list of Pods to verify that the MongoDB Pod is running: ```shell kubectl get pods @@ -66,32 +67,33 @@ The manifest file, included below, specifies a Deployment controller that runs a ```shell NAME READY STATUS RESTARTS AGE - redis-master-1068406935-3lswp 1/1 Running 0 28s + mongo-5cfd459dd4-lrcjb 1/1 Running 0 28s ``` -1. Run the following command to view the logs from the Redis Master Pod: +1. Run the following command to view the logs from the MongoDB Deployment: ```shell - kubectl logs -f POD-NAME + kubectl logs -f deployment/mongo ``` -{{< note >}} -Replace POD-NAME with the name of your Pod. -{{< /note >}} +### Creating the MongoDB Service -### Creating the Redis Master Service +The guestbook application needs to communicate to the MongoDB to write its data. You need to apply a [Service](/docs/concepts/services-networking/service/) to proxy the traffic to the MongoDB Pod. A Service defines a policy to access the Pods. -The guestbook application needs to communicate to the Redis master to write its data. You need to apply a [Service](/docs/concepts/services-networking/service/) to proxy the traffic to the Redis master Pod. A Service defines a policy to access the Pods. +{{< codenew file="application/guestbook/mongo-service.yaml" >}} -{{< codenew file="application/guestbook/redis-master-service.yaml" >}} - -1. Apply the Redis Master Service from the following `redis-master-service.yaml` file: +1. Apply the MongoDB Service from the following `mongo-service.yaml` file: ```shell - kubectl apply -f https://k8s.io/examples/application/guestbook/redis-master-service.yaml + kubectl apply -f https://k8s.io/examples/application/guestbook/mongo-service.yaml ``` -1. Query the list of Services to verify that the Redis Master Service is running: + + +1. Query the list of Services to verify that the MongoDB Service is running: ```shell kubectl get service @@ -102,77 +104,17 @@ The guestbook application needs to communicate to the Redis master to write its ```shell NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.0.0.1 443/TCP 1m - redis-master ClusterIP 10.0.0.151 6379/TCP 8s + mongo ClusterIP 10.0.0.151 6379/TCP 8s ``` {{< note >}} -This manifest file creates a Service named `redis-master` with a set of labels that match the labels previously defined, so the Service routes network traffic to the Redis master Pod. +This manifest file creates a Service named `mongo` with a set of labels that match the labels previously defined, so the Service routes network traffic to the MongoDB Pod. {{< /note >}} -## Start up the Redis Slaves - -Although the Redis master is a single pod, you can make it highly available to meet traffic demands by adding replica Redis slaves. - -### Creating the Redis Slave Deployment - -Deployments scale based off of the configurations set in the manifest file. In this case, the Deployment object specifies two replicas. - -If there are not any replicas running, this Deployment would start the two replicas on your container cluster. Conversely, if there are more than two replicas running, it would scale down until two replicas are running. - -{{< codenew file="application/guestbook/redis-slave-deployment.yaml" >}} - -1. Apply the Redis Slave Deployment from the `redis-slave-deployment.yaml` file: - - ```shell - kubectl apply -f https://k8s.io/examples/application/guestbook/redis-slave-deployment.yaml - ``` - -1. Query the list of Pods to verify that the Redis Slave Pods are running: - - ```shell - kubectl get pods - ``` - - The response should be similar to this: - - ```shell - NAME READY STATUS RESTARTS AGE - redis-master-1068406935-3lswp 1/1 Running 0 1m - redis-slave-2005841000-fpvqc 0/1 ContainerCreating 0 6s - redis-slave-2005841000-phfv9 0/1 ContainerCreating 0 6s - ``` - -### Creating the Redis Slave Service - -The guestbook application needs to communicate to Redis slaves to read data. To make the Redis slaves discoverable, you need to set up a Service. A Service provides transparent load balancing to a set of Pods. - -{{< codenew file="application/guestbook/redis-slave-service.yaml" >}} - -1. Apply the Redis Slave Service from the following `redis-slave-service.yaml` file: - - ```shell - kubectl apply -f https://k8s.io/examples/application/guestbook/redis-slave-service.yaml - ``` - -1. Query the list of Services to verify that the Redis slave service is running: - - ```shell - kubectl get services - ``` - - The response should be similar to this: - - ``` - NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE - kubernetes ClusterIP 10.0.0.1 443/TCP 2m - redis-master ClusterIP 10.0.0.151 6379/TCP 1m - redis-slave ClusterIP 10.0.0.223 6379/TCP 6s - ``` - ## Set up and Expose the Guestbook Frontend -The guestbook application has a web frontend serving the HTTP requests written in PHP. It is configured to connect to the `redis-master` Service for write requests and the `redis-slave` service for Read requests. +The guestbook application has a web frontend serving the HTTP requests written in PHP. It is configured to connect to the `mongo` Service to store Guestbook entries. ### Creating the Guestbook Frontend Deployment @@ -184,6 +126,11 @@ The guestbook application has a web frontend serving the HTTP requests written i kubectl apply -f https://k8s.io/examples/application/guestbook/frontend-deployment.yaml ``` + + 1. Query the list of Pods to verify that the three frontend replicas are running: ```shell @@ -201,12 +148,12 @@ The guestbook application has a web frontend serving the HTTP requests written i ### Creating the Frontend Service -The `redis-slave` and `redis-master` Services you applied are only accessible within the container cluster because the default type for a Service is [ClusterIP](/docs/concepts/services-networking/service/#publishing-services---service-types). `ClusterIP` provides a single IP address for the set of Pods the Service is pointing to. This IP address is accessible only within the cluster. +The `mongo` Services you applied is only accessible within the Kubernetes cluster because the default type for a Service is [ClusterIP](/docs/concepts/services-networking/service/#publishing-services---service-types). `ClusterIP` provides a single IP address for the set of Pods the Service is pointing to. This IP address is accessible only within the cluster. -If you want guests to be able to access your guestbook, you must configure the frontend Service to be externally visible, so a client can request the Service from outside the container cluster. Minikube can only expose Services through `NodePort`. +If you want guests to be able to access your guestbook, you must configure the frontend Service to be externally visible, so a client can request the Service from outside the Kubernetes cluster. However a Kubernetes user you can use `kubectl port-forward` to access the service even though it uses a `ClusterIP`. {{< note >}} -Some cloud providers, like Google Compute Engine or Google Kubernetes Engine, support external load balancers. If your cloud provider supports load balancers and you want to use it, simply delete or comment out `type: NodePort`, and uncomment `type: LoadBalancer`. +Some cloud providers, like Google Compute Engine or Google Kubernetes Engine, support external load balancers. If your cloud provider supports load balancers and you want to use it, simply uncomment `type: LoadBalancer`. {{< /note >}} {{< codenew file="application/guestbook/frontend-service.yaml" >}} @@ -217,6 +164,11 @@ Some cloud providers, like Google Compute Engine or Google Kubernetes Engine, su kubectl apply -f https://k8s.io/examples/application/guestbook/frontend-service.yaml ``` + + 1. Query the list of Services to verify that the frontend Service is running: ```shell @@ -227,29 +179,27 @@ Some cloud providers, like Google Compute Engine or Google Kubernetes Engine, su ``` NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE - frontend NodePort 10.0.0.112 80:31323/TCP 6s + frontend ClusterIP 10.0.0.112 80/TCP 6s kubernetes ClusterIP 10.0.0.1 443/TCP 4m - redis-master ClusterIP 10.0.0.151 6379/TCP 2m - redis-slave ClusterIP 10.0.0.223 6379/TCP 1m + mongo ClusterIP 10.0.0.151 6379/TCP 2m ``` -### Viewing the Frontend Service via `NodePort` +### Viewing the Frontend Service via `kubectl port-forward` -If you deployed this application to Minikube or a local cluster, you need to find the IP address to view your Guestbook. - -1. Run the following command to get the IP address for the frontend Service. +1. Run the following command to forward port `8080` on your local machine to port `80` on the service. ```shell - minikube service frontend --url + kubectl port-forward svc/frontend 8080:80 ``` The response should be similar to this: ``` - http://192.168.99.100:31323 + Forwarding from 127.0.0.1:8080 -> 80 + Forwarding from [::1]:8080 -> 80 ``` -1. Copy the IP address, and load the page in your browser to view your guestbook. +1. load the page [http://localhost:8080](http://localhost:8080) in your browser to view your guestbook. ### Viewing the Frontend Service via `LoadBalancer` @@ -295,9 +245,7 @@ Scaling up or down is easy because your servers are defined as a Service that us frontend-3823415956-k22zn 1/1 Running 0 54m frontend-3823415956-w9gbt 1/1 Running 0 54m frontend-3823415956-x2pld 1/1 Running 0 5s - redis-master-1068406935-3lswp 1/1 Running 0 56m - redis-slave-2005841000-fpvqc 1/1 Running 0 55m - redis-slave-2005841000-phfv9 1/1 Running 0 55m + mongo-1068406935-3lswp 1/1 Running 0 56m ``` 1. Run the following command to scale down the number of frontend Pods: @@ -318,9 +266,7 @@ Scaling up or down is easy because your servers are defined as a Service that us NAME READY STATUS RESTARTS AGE frontend-3823415956-k22zn 1/1 Running 0 1h frontend-3823415956-w9gbt 1/1 Running 0 1h - redis-master-1068406935-3lswp 1/1 Running 0 1h - redis-slave-2005841000-fpvqc 1/1 Running 0 1h - redis-slave-2005841000-phfv9 1/1 Running 0 1h + mongo-1068406935-3lswp 1/1 Running 0 1h ``` @@ -332,20 +278,18 @@ Deleting the Deployments and Services also deletes any running Pods. Use labels 1. Run the following commands to delete all Pods, Deployments, and Services. ```shell - kubectl delete deployment -l app=redis - kubectl delete service -l app=redis - kubectl delete deployment -l app=guestbook - kubectl delete service -l app=guestbook + kubectl delete deployment -l app.kubernetes.io/name=mongo + kubectl delete service -l app.kubernetes.io/name=mongo + kubectl delete deployment -l app.kubernetes.io/name=guestbook + kubectl delete service -l app.kubernetes.io/name=guestbook ``` The responses should be: ``` - deployment.apps "redis-master" deleted - deployment.apps "redis-slave" deleted - service "redis-master" deleted - service "redis-slave" deleted - deployment.apps "frontend" deleted + deployment.apps "mongo" deleted + service "mongo" deleted + deployment.apps "frontend" deleted service "frontend" deleted ``` @@ -365,9 +309,7 @@ Deleting the Deployments and Services also deletes any running Pods. Use labels ## {{% heading "whatsnext" %}} -* Add [ELK logging and monitoring](/docs/tutorials/stateless-application/guestbook-logs-metrics-with-elk/) to your Guestbook application * Complete the [Kubernetes Basics](/docs/tutorials/kubernetes-basics/) Interactive Tutorials * Use Kubernetes to create a blog using [Persistent Volumes for MySQL and Wordpress](/docs/tutorials/stateful-application/mysql-wordpress-persistent-volume/#visit-your-new-wordpress-blog) * Read more about [connecting applications](/docs/concepts/services-networking/connect-applications-service/) * Read more about [Managing Resources](/docs/concepts/cluster-administration/manage-deployment/#using-labels-effectively) - diff --git a/content/en/examples/application/guestbook/frontend-deployment.yaml b/content/en/examples/application/guestbook/frontend-deployment.yaml index 23d64be6442cc..613c654aa97b3 100644 --- a/content/en/examples/application/guestbook/frontend-deployment.yaml +++ b/content/en/examples/application/guestbook/frontend-deployment.yaml @@ -3,22 +3,24 @@ kind: Deployment metadata: name: frontend labels: - app: guestbook + app.kubernetes.io/name: guestbook + app.kubernetes.io/component: frontend spec: selector: matchLabels: - app: guestbook - tier: frontend + app.kubernetes.io/name: guestbook + app.kubernetes.io/component: frontend replicas: 3 template: metadata: labels: - app: guestbook - tier: frontend + app.kubernetes.io/name: guestbook + app.kubernetes.io/component: frontend spec: containers: - - name: php-redis - image: gcr.io/google-samples/gb-frontend:v4 + - name: guestbook + image: paulczar/gb-frontend:v5 + # image: gcr.io/google-samples/gb-frontend:v4 resources: requests: cpu: 100m @@ -26,13 +28,5 @@ spec: env: - name: GET_HOSTS_FROM value: dns - # Using `GET_HOSTS_FROM=dns` requires your cluster to - # provide a dns service. As of Kubernetes 1.3, DNS is a built-in - # service launched automatically. However, if the cluster you are using - # does not have a built-in DNS service, you can instead - # access an environment variable to find the master - # service's host. To do so, comment out the 'value: dns' line above, and - # uncomment the line below: - # value: env ports: - containerPort: 80 diff --git a/content/en/examples/application/guestbook/frontend-service.yaml b/content/en/examples/application/guestbook/frontend-service.yaml index 6f283f347b93f..34ad3771d755f 100644 --- a/content/en/examples/application/guestbook/frontend-service.yaml +++ b/content/en/examples/application/guestbook/frontend-service.yaml @@ -3,16 +3,14 @@ kind: Service metadata: name: frontend labels: - app: guestbook - tier: frontend + app.kubernetes.io/name: guestbook + app.kubernetes.io/component: frontend spec: - # comment or delete the following line if you want to use a LoadBalancer - type: NodePort # if your cluster supports it, uncomment the following to automatically create # an external load-balanced IP for the frontend service. # type: LoadBalancer ports: - port: 80 selector: - app: guestbook - tier: frontend + app.kubernetes.io/name: guestbook + app.kubernetes.io/component: frontend diff --git a/content/en/examples/application/guestbook/mongo-deployment.yaml b/content/en/examples/application/guestbook/mongo-deployment.yaml new file mode 100644 index 0000000000000..04908ce25b1dc --- /dev/null +++ b/content/en/examples/application/guestbook/mongo-deployment.yaml @@ -0,0 +1,31 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: mongo + labels: + app.kubernetes.io/name: mongo + app.kubernetes.io/component: backend +spec: + selector: + matchLabels: + app.kubernetes.io/name: mongo + app.kubernetes.io/component: backend + replicas: 1 + template: + metadata: + labels: + app.kubernetes.io/name: mongo + app.kubernetes.io/component: backend + spec: + containers: + - name: mongo + image: mongo:4.2 + args: + - --bind_ip + - 0.0.0.0 + resources: + requests: + cpu: 100m + memory: 100Mi + ports: + - containerPort: 27017 diff --git a/content/en/examples/application/guestbook/mongo-service.yaml b/content/en/examples/application/guestbook/mongo-service.yaml new file mode 100644 index 0000000000000..b9cef607bcf79 --- /dev/null +++ b/content/en/examples/application/guestbook/mongo-service.yaml @@ -0,0 +1,14 @@ +apiVersion: v1 +kind: Service +metadata: + name: mongo + labels: + app.kubernetes.io/name: mongo + app.kubernetes.io/component: backend +spec: + ports: + - port: 27017 + targetPort: 27017 + selector: + app.kubernetes.io/name: mongo + app.kubernetes.io/component: backend diff --git a/content/en/examples/application/guestbook/redis-master-deployment.yaml b/content/en/examples/application/guestbook/redis-master-deployment.yaml deleted file mode 100644 index 478216d1accfa..0000000000000 --- a/content/en/examples/application/guestbook/redis-master-deployment.yaml +++ /dev/null @@ -1,29 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: redis-master - labels: - app: redis -spec: - selector: - matchLabels: - app: redis - role: master - tier: backend - replicas: 1 - template: - metadata: - labels: - app: redis - role: master - tier: backend - spec: - containers: - - name: master - image: k8s.gcr.io/redis:e2e # or just image: redis - resources: - requests: - cpu: 100m - memory: 100Mi - ports: - - containerPort: 6379 diff --git a/content/en/examples/application/guestbook/redis-master-service.yaml b/content/en/examples/application/guestbook/redis-master-service.yaml deleted file mode 100644 index 65cef2191c493..0000000000000 --- a/content/en/examples/application/guestbook/redis-master-service.yaml +++ /dev/null @@ -1,17 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: redis-master - labels: - app: redis - role: master - tier: backend -spec: - ports: - - name: redis - port: 6379 - targetPort: 6379 - selector: - app: redis - role: master - tier: backend diff --git a/content/en/examples/application/guestbook/redis-slave-deployment.yaml b/content/en/examples/application/guestbook/redis-slave-deployment.yaml deleted file mode 100644 index 1a7b04386a4a5..0000000000000 --- a/content/en/examples/application/guestbook/redis-slave-deployment.yaml +++ /dev/null @@ -1,40 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: redis-slave - labels: - app: redis -spec: - selector: - matchLabels: - app: redis - role: slave - tier: backend - replicas: 2 - template: - metadata: - labels: - app: redis - role: slave - tier: backend - spec: - containers: - - name: slave - image: gcr.io/google_samples/gb-redisslave:v3 - resources: - requests: - cpu: 100m - memory: 100Mi - env: - - name: GET_HOSTS_FROM - value: dns - # Using `GET_HOSTS_FROM=dns` requires your cluster to - # provide a dns service. As of Kubernetes 1.3, DNS is a built-in - # service launched automatically. However, if the cluster you are using - # does not have a built-in DNS service, you can instead - # access an environment variable to find the master - # service's host. To do so, comment out the 'value: dns' line above, and - # uncomment the line below: - # value: env - ports: - - containerPort: 6379 diff --git a/content/en/examples/application/guestbook/redis-slave-service.yaml b/content/en/examples/application/guestbook/redis-slave-service.yaml deleted file mode 100644 index 238fd63fb6a29..0000000000000 --- a/content/en/examples/application/guestbook/redis-slave-service.yaml +++ /dev/null @@ -1,15 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: redis-slave - labels: - app: redis - role: slave - tier: backend -spec: - ports: - - port: 6379 - selector: - app: redis - role: slave - tier: backend From d56ac69e9f67251b1c8c53b6af42fb66bef69509 Mon Sep 17 00:00:00 2001 From: Jailton Lopes Date: Fri, 22 Jan 2021 23:16:11 -0300 Subject: [PATCH 18/62] Add instruction to access API reference pages URL locally --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 44dcc7a7ca679..2e88a95866e08 100644 --- a/README.md +++ b/README.md @@ -100,6 +100,8 @@ make container-image make container-serve ``` +Open up your browser to http://localhost:1313/docs/reference/kubernetes-api/ to view the API reference pages. + 6. When all changes of the new contract are reflected into the configuration files `toc.yaml` and `fields.yaml`, create a Pull Request with the newly generated API reference pages. ## Troubleshooting From e4d24124a39c2d46d195c4a9087635d152e32a1e Mon Sep 17 00:00:00 2001 From: Philippe Martin Date: Sat, 23 Jan 2021 18:24:09 +0100 Subject: [PATCH 19/62] Redirects "Well-Known Labels, Annotations and Taints" page --- static/_redirects | 2 ++ 1 file changed, 2 insertions(+) diff --git a/static/_redirects b/static/_redirects index 9027eb903ddd6..5bc1ebf38c951 100644 --- a/static/_redirects +++ b/static/_redirects @@ -203,6 +203,8 @@ /docs/reference/kubernetes-api/api-index/ /docs/reference 301 +/docs/reference/kubernetes-api/labels-annotations-taints/ /docs/reference/labels-annotations-taints/ 301 + /docs/reporting-security-issues/ /security/ 301 /docs/roadmap/ https://github.com/kubernetes/kubernetes/milestones/ 301 From e239d8089f28119fa08c2c0ef4c7a33702f2ed5f Mon Sep 17 00:00:00 2001 From: ljnaresh Date: Fri, 16 Oct 2020 16:27:27 +0200 Subject: [PATCH 20/62] Replace alpine with busybox image for better response from nslookup --- .../en/docs/tasks/debug-application-cluster/debug-service.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/en/docs/tasks/debug-application-cluster/debug-service.md b/content/en/docs/tasks/debug-application-cluster/debug-service.md index 4ee9d6f490af3..ba141135fa4d5 100644 --- a/content/en/docs/tasks/debug-application-cluster/debug-service.md +++ b/content/en/docs/tasks/debug-application-cluster/debug-service.md @@ -18,10 +18,10 @@ you to figure out what's going wrong. ## Running commands in a Pod For many steps here you will want to see what a Pod running in the cluster -sees. The simplest way to do this is to run an interactive alpine Pod: +sees. The simplest way to do this is to run an interactive busybox Pod: ```none -kubectl run -it --rm --restart=Never alpine --image=alpine sh +kubectl run -it --rm --restart=Never busybox --image=gcr.io/google-containers/busybox sh ``` {{< note >}} From bb808687d05b0ecae82867f81b9c89b8a41d3dfe Mon Sep 17 00:00:00 2001 From: Zhang Yong Date: Thu, 28 Jan 2021 11:23:13 +0800 Subject: [PATCH 21/62] Use https for link to contributor covenant --- content/fr/community/static/cncf-code-of-conduct.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/fr/community/static/cncf-code-of-conduct.md b/content/fr/community/static/cncf-code-of-conduct.md index 8d67a9c21add8..93ac77947797c 100644 --- a/content/fr/community/static/cncf-code-of-conduct.md +++ b/content/fr/community/static/cncf-code-of-conduct.md @@ -24,7 +24,7 @@ Ce Code de conduite s’applique à la fois dans le cadre du projet et dans le c Des cas de conduite abusive, de harcèlement ou autre pratique inacceptable ayant cours sur Kubernetes peuvent être signalés en contactant le [comité pour le code de conduite de Kubernetes](https://git.k8s.io/community/committee-code-of-conduct) via l'adresse . Pour d'autres projets, bien vouloir contacter un responsable de projet CNCF ou notre médiateur, Mishi Choudhary à l'adresse . -Ce Code de conduite est inspiré du « Contributor Covenant » (http://contributor-covenant.org) version 1.2.0, disponible à l’adresse http://contributor-covenant.org/version/1/2/0/. +Ce Code de conduite est inspiré du « Contributor Covenant » (https://contributor-covenant.org) version 1.2.0, disponible à l’adresse https://contributor-covenant.org/version/1/2/0/. ### Code de conduite pour les événements de la CNCF From 2ddacf2ea2904762a72be3b619ab620ff28acd0f Mon Sep 17 00:00:00 2001 From: Zhang Yong Date: Thu, 28 Jan 2021 11:31:31 +0800 Subject: [PATCH 22/62] Use https for link to contributor covenant --- content/vi/community/static/cncf-code-of-conduct.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/vi/community/static/cncf-code-of-conduct.md b/content/vi/community/static/cncf-code-of-conduct.md index 9d7008e902c7b..12c5472142bde 100644 --- a/content/vi/community/static/cncf-code-of-conduct.md +++ b/content/vi/community/static/cncf-code-of-conduct.md @@ -23,8 +23,8 @@ Quy tắc ứng xử này áp dụng cả trong không gian dự án và trong k Các trường hợp lạm dụng, quấy rối hoặc hành vi không thể chấp nhận được trong Kubernetes có thể được báo cáo bằng cách liên hệ với [Ủy ban Quy tắc ứng xử Kubernetes](https://git.k8s.io/community/committee-code-of-conduct) thông qua . Đối với các dự án khác, vui lòng liên hệ với người bảo trì dự án CNCF hoặc hòa giải viên của chúng tôi, Mishi Choudhary . -Quy tắc ứng xử này được điều chỉnh từ Giao ước cộng tác viên (http://contributor-covenant.org), phiên bản 1.2.0, có sẵn tại -http://contributor-covenant.org/version/1/2/0/ +Quy tắc ứng xử này được điều chỉnh từ Giao ước cộng tác viên (https://contributor-covenant.org), phiên bản 1.2.0, có sẵn tại +https://contributor-covenant.org/version/1/2/0/ ### Quy tắc ứng xử sự kiện CNCF From 14afc4dd35c2de4a419f873d9dfebc5468bb5624 Mon Sep 17 00:00:00 2001 From: Qiming Teng Date: Wed, 20 Jan 2021 22:11:48 +0800 Subject: [PATCH 23/62] [zh] Translate kubelet-tls-bootstrapping This page, to my surprise, was not localized. --- .../kubelet-tls-bootstrapping.md | 965 +++++++++++++++--- 1 file changed, 827 insertions(+), 138 deletions(-) diff --git a/content/zh/docs/reference/command-line-tools-reference/kubelet-tls-bootstrapping.md b/content/zh/docs/reference/command-line-tools-reference/kubelet-tls-bootstrapping.md index a70f08bea1d7c..60f3772c07311 100644 --- a/content/zh/docs/reference/command-line-tools-reference/kubelet-tls-bootstrapping.md +++ b/content/zh/docs/reference/command-line-tools-reference/kubelet-tls-bootstrapping.md @@ -1,148 +1,558 @@ --- -approvers: -- ericchiang +title: TLS 启动引导 +content_type: concept +--- + + + + + +在一个 Kubernetes 集群中,工作节点上的组件(kubelet 和 kube-proxy)需要与 +Kubernetes 主控组件通信,尤其是 kube-apiserver。 +为了确保通信本身是私密的、不被干扰,并且确保集群的每个组件都在与另一个 +可信的组件通信,我们强烈建议使用节点上的客户端 TLS 证书。 + + +启动引导这些组件的正常过程,尤其是需要证书来与 kube-apiserver 安全通信的 +工作节点,可能会是一个具有挑战性的过程,因为这一过程通常不受 Kubernetes 控制, +需要不少额外工作。 +这也使得初始化或者扩缩一个集群的操作变得具有挑战性。 + + +为了简化这一过程,从 1.4 版本开始,Kubernetes 引入了一个证书请求和签名 +API 以便简化此过程。该提案可在 +[这里](https://github.com/kubernetes/kubernetes/pull/20439)看到。 + +本文档描述节点初始化的过程,如何为 kubelet 配置 TLS 客户端证书启动引导, +以及其背后的工作原理。 + + + + +## 初始化过程 {#initialization-process} + +当工作节点启动时,kubelet 执行以下操作: + + +1. 寻找自己的 `kubeconfig` 文件 +2. 检索 API 服务器的 URL 和凭据,通常是来自 `kubeconfig` 文件中的 + TLS 密钥和已签名证书 +3. 尝试使用这些凭据来与 API 服务器通信 + + +假定 kube-apiserver 成功地认证了 kubelet 的凭据数据,它会将 kubelet 视为 +一个合法的节点并开始将 Pods 分派给该节点。 + +注意,签名的过程依赖于: + +* `kubeconfig` 中包含密钥和本地主机的证书 +* 证书被 kube-apiserver 所信任的一个证书机构(CA)所签名 + + +负责部署和管理集群的人有以下责任: + +1. 创建 CA 密钥和证书 +2. 将 CA 证书发布到 kube-apiserver 运行所在的主控节点上 +3. 为每个 kubelet 创建密钥和证书;强烈建议为每个 kubelet 使用独一无二的、 + CN 取值与众不同的密钥和证书 +4. 使用 CA 密钥对 kubelet 证书签名 +5. 将 kubelet 密钥和签名的证书发布到 kubelet 运行所在的特定节点上 + +本文中描述的 TLS 启动引导过程有意简化甚至完全自动化上述过程,尤其是 +第三步之后的操作,因为这些步骤是初始化或者扩缩集群时最常见的操作。 + + +### 启动引导初始化 {#bootstrap-initialization} + +在启动引导初始化过程中,会发生以下事情: + + +1. kubelet 启动 +2. kubelet 看到自己 *没有* 对应的 `kubeconfig` 文件 +3. kubelet 搜索并发现 `bootstrap-kubeconfig` 文件 +4. kubelet 读取该启动引导文件,从中获得 API 服务器的 URL 和用途有限的 + 一个“令牌(Token)” +5. kubelet 建立与 API 服务器的连接,使用上述令牌执行身份认证 +6. kubelet 现在拥有受限制的凭据来创建和取回证书签名请求(CSR) +7. kubelet 为自己创建一个 CSR,并将其 signerName 设置为 `kubernetes.io/kube-apiserver-client-kubelet` +8. CSR 被以如下两种方式之一批复: + * 如果配置了,kube-controller-manager 会自动批复该 CSR + * 如果配置了,一个外部进程,或者是人,使用 Kubernetes API 或者使用 `kubectl` + 来批复该 CSR +9. kubelet 所需要的证书被创建 + +10. 证书被发放给 kubelet +11. kubelet 取回该证书 +12. kubelet 创建一个合适的 `kubeconfig`,其中包含密钥和已签名的证书 +13. kubelet 开始正常操作 +14. 可选地,如果配置了,kubelet 在证书接近于过期时自动请求更新证书 +15. 更新的证书被批复并发放;取决于配置,这一过程可能是自动的或者手动完成 + + +本文的其余部分描述配置 TLS 启动引导的必要步骤及其局限性。 + + +## 配置 {#configuration} + +要配置 TLS 启动引导及可选的自动批复,你必须配置以下组件的选项: + +* kube-apiserver +* kube-controller-manager +* kubelet +* 集群内的资源:`ClusterRoleBinding` 以及可能需要的 `ClusterRole` + +此外,你需要有 Kubernetes 证书机构(Certificate Authority,CA)。 + + +## 证书机构 {#certificate-authority} + +就像在没有启动引导的情况下,你会需要证书机构(CA)密钥和证书。 +这些数据会被用来对 kubelet 证书进行签名。 +如前所述,将证书机构密钥和证书发布到主控节点是你的责任。 + + +就本文而言,我们假定这些数据被发布到主控节点上的 +`/var/lib/kubernetes/ca.pem`(证书)和 +`/var/lib/kubernetes/ca-key.pem`(密钥)文件中。 +我们将这两个文件称作“Kubernetes CA 证书和密钥”。 +所有 Kubernetes 组件(kubelet、kube-apiserver、kube-controller-manager)都使用 +这些凭据,并假定这里的密钥和证书都是 PEM 编码的。 + + +## kube-apiserver 配置 {#kube-apiserver-configuration} + +启用 TLS 启动引导对 kube-apiserver 有若干需求: + +* 能够识别对客户端证书进行签名的 CA +* 能够对启动引导的 kubelet 执行身份认证,并将其置入 `system:bootstrappers` 组 +* 能够对启动引导的 kubelet 执行鉴权操作,允许其创建证书签名请求(CSR) + + +### 识别客户证书 {#recognizing-client-certificates} + +对于所有客户端证书的认证操作而言,这是很常见的。 +如果还没有设置,要为 kube-apiserver 命令添加 `--client-ca-file=FILENAME` +标志来启用客户端证书认证,在标志中引用一个包含用来签名的证书的证书机构包, +例如:`--client-ca-file=/var/lib/kubernetes/ca.pem`。 + + +### 初始启动引导认证 {#initial-bootstrap-authentication} + +为了让启动引导的 kubelet 能够连接到 kube-apiserver 并请求证书, +它必须首先在服务器上认证自身身份。你可以使用任何一种能够对 kubelet 执行身份认证的 +[身份认证组件](/zh/docs/reference/access-authn-authz/authentication/)。 + + +尽管所有身份认证策略都可以用来对 kubelet 的初始启动凭据来执行认证, +出于容易准备的因素,建议使用如下两个身份认证组件: + +1. [启动引导令牌(Bootstrap Token)](#bootstrap-tokens) +2. [令牌认证文件](#token-authentication-file) + + +启动引导令牌是一种对 kubelet 进行身份认证的方法,相对简单且容易管理, +且不需要在启动 kube-apiserver 时设置额外的标志。 +启动引导令牌从 Kubernetes 1.12 开始是一种 __Beta__ 功能特性。 + + +无论选择哪种方法,这里的需求是 kubelet 能够被身份认证为某个具有如下权限的用户: + +1. 创建和读取 CSR +2. 在启用了自动批复时,能够在请求节点客户端证书时得到自动批复 + + +使用启动引导令牌执行身份认证的 kubelet 会被认证为 `system:bootstrappers` +组中的用户。这是使用启动引导令牌的一种标准方法。 + + +随着这个功能特性的逐渐成熟,你需要确保令牌绑定到某基于角色的的访问控制(RBAC) +策略上,从而严格限制请求(使用[启动引导令牌](/zh/docs/reference/access-authn-authz/bootstrap-tokens/)) +仅限于客户端申请提供证书。当 RBAC 被配置启用时,可以将令牌限制到某个组,从而 +提高灵活性。例如,你可以在准备节点期间禁止某特定启动引导组的访问。 + + +#### 启动引导令牌 {#bootstrap-tokens} + +启动引导令牌的细节在[这里](/zh/docs/reference/access-authn-authz/bootstrap-tokens/) +详述。启动引导令牌在 Kubernetes 集群中存储为 Secret 对象,被发放给各个 kubelet。 +你可以在整个集群中使用同一个令牌,也可以为每个节点发放单独的令牌。 + + +这一过程有两个方面: + +1. 基于令牌 ID、机密数据和范畴信息创建 Kubernetes Secret +2. 将令牌发放给 kubelet + + +从 kubelet 的角度,所有令牌看起来都很像,没有特别的含义。 +从 kube-apiserver 服务器的角度,启动引导令牌是很特殊的。 +根据其 `type`、`namespace` 和 `name`,kube-apiserver 能够将认作特殊的令牌, +并授予携带该令牌的任何人特殊的启动引导权限,换言之,将其视为 +`system:bootstrappers` 组的成员。这就满足了 TLS 启动引导的基本需求。 + + +关于创建 Secret 的进一步细节可访问[这里](/zh/docs/reference/access-authn-authz/bootstrap-tokens/)。 + +如果你希望使用启动引导令牌,你必须在 kube-apiserver 上使用下面的标志启用之: -This group will later be used in the controller-manager configuration to scope approvals in the default approval -controller. As this feature matures, you should ensure tokens are bound to a Role-Based Access Control (RBAC) policy which limits requests -(using the bootstrap token) strictly to client requests related to certificate provisioning. With RBAC in place, scoping the tokens to a group allows for great flexibility (e.g. you could disable a particular bootstrap group's access when you are done provisioning the nodes). +``` +--enable-bootstrap-token-auth=true +``` -While any authentication strategy can be used for the kubelet's initial bootstrap credentials, the following two authenticators are recommended for ease of provisioning. + +#### 令牌认证文件 {#token-authentication-file} -Using bootstrap tokens is currently __alpha__ and will simplify the management of bootstrap token management especially in a HA scenario. +kube-apiserver 能够将令牌视作身份认证依据。 +这些令牌可以是任意数据,但必须表示为基于某安全的随机数生成器而得到的 +至少 128 位混沌数据。这里的随机数生成器可以是现代 Linux 系统上的 +`/dev/urandom`。生成令牌的方式有很多种。例如: -### Token authentication file -Tokens are arbitrary but should represent at least 128 bits of entropy derived from a secure random number -generator (such as /dev/urandom on most modern systems). There are multiple ways you can generate a token. For example: +``` +head -c 16 /dev/urandom | od -An -t x | tr -d ' ' +``` -`head -c 16 /dev/urandom | od -An -t x | tr -d ' '` + +上面的命令会生成类似于 `02b50b05283e98dd0fd71db496ef01e8` 这样的令牌。 -The token file should look like the following example, where the first three values can be anything and the quoted group -name should be as depicted: +令牌文件看起来是下面的例子这样,其中前面三个值可以是任何值,用引号括起来 +的组名称则只能用例子中给的值。 ``` 02b50b05283e98dd0fd71db496ef01e8,kubelet-bootstrap,10001,"system:bootstrappers" ``` -Add the `--token-auth-file=FILENAME` flag to the kube-apiserver command (in your systemd unit file perhaps) to enable the token file. -See docs [here](/docs/admin/authentication/#static-token-file) for further details. + +向 kube-apiserver 添加 `--token-auth-file=FILENAME` 标志(或许这要对 systemd +的单元文件作修改)以启用令牌文件。参见 +[这里](/zh/docs/reference/access-authn-authz/authentication/#static-token-file) +的文档以了解进一步的细节。 -### Client certificate CA bundle + +### 授权 kubelet 创建 CSR {#authorize-kubelet-to-create-csr} -### Signing assets -You must provide a Certificate Authority in order to provide the cryptographic materials necessary to issue certificates. -This CA should be trusted by kube-apiserver for authentication with the `--client-ca-file=FILENAME` flag. The management -of the CA is beyond the scope of this document but it is recommended that you generate a dedicated CA for Kubernetes. -Both certificate and key are assumed to be PEM-encoded. +现在启动引导节点被身份认证为 `system:bootstrapping` 组的成员,它需要被 _授权_ +创建证书签名请求(CSR)并在证书被签名之后将其取回。 +幸运的是,Kubernetes 提供了一个 `ClusterRole`,其中精确地封装了这些许可, +`system:node-bootstrapper`。 -The kube-controller-manager flags are: +为了实现这一点,你只需要创建 `ClusterRoleBinding`,将 `system:bootstrappers` +组绑定到集群角色 `system:node-bootstrapper`。 ``` ---cluster-signing-cert-file="/etc/path/to/kubernetes/ca/ca.crt" --cluster-signing-key-file="/etc/path/to/kubernetes/ca/ca.key" +# 允许启动引导节点创建 CSR +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: create-csrs-for-bootstrapping +subjects: +- kind: Group + name: system:bootstrappers + apiGroup: rbac.authorization.k8s.io +roleRef: + kind: ClusterRole + name: system:node-bootstrapper + apiGroup: rbac.authorization.k8s.io ``` -### Approval controller - -In 1.7 the experimental "group auto approver" controller is dropped in favor of the new `csrapproving` controller -that ships as part of [kube-controller-manager](/docs/admin/kube-controller-manager/) and is enabled by default. -The controller uses the [`SubjectAccessReview` API](/docs/admin/authorization/#checking-api-access) to determine -if a given user is authorized to request a CSR, then approves based on the authorization outcome. To prevent -conflicts with other approvers, the builtin approver doesn't explicitly deny CSRs, only ignoring unauthorized requests. - -The controller categorizes CSRs into three subresources: - -1. `nodeclient` - a request by a user for a client certificate with `O=system:nodes` and `CN=system:node:(node name)`. -2. `selfnodeclient` - a node renewing a client certificate with the same `O` and `CN`. -3. `selfnodeserver` - a node renewing a serving certificate. (ALPHA, requires feature gate) + +## kube-controller-manager 配置 {#kube-controller-manager-configuration} + +API 服务器从 kubelet 收到证书请求并对这些请求执行身份认证,但真正负责发放 +签名证书的是控制器管理器。 + + +控制器管理器通过一个证书发放的控制回路来执行此操作。该操作的执行方式是使用磁盘上 +的文件用 [cfssl](https://blog.cloudflare.com/introducing-cfssl/) 本地签名组件 +来完成。目前,所发放的所有证书都有一年的有效期,并设定了默认的一组密钥用法。 + + +为了让控制器管理器对证书签名,它需要: + +* 能够访问你之前所创建并分发的“Kubernetes CA 密钥和证书” +* 启用 CSR 签名 + + +### 访问密钥和证书 {#access-to-key-and-certificate} + +如前所述,你需要创建一个 Kubernetes CA 密钥和证书,并将其发布到主控节点。 +这些数据会被控制器管理器来对 kubelet 证书进行签名。 + + +由于这些被签名的证书反过来会被 kubelet 用来在 kube-apiserver 执行普通的 +kubelet 身份认证,很重要的一点是为控制器管理器所提供的 CA 也被 kube-apiserver +信任用来执行身份认证。CA 密钥和证书是通过 kube-apiserver 的标志 +`--client-ca-file=FILENAME`(例如,`--client-ca-file=/var/lib/kubernetes/ca.pem`), +来设定的,正如 kube-apiserver 配置节所述。 + +要将 Kubernetes CA 密钥和证书提供给 kube-controller-manager,可使用以下标志: ``` ---feature-gates=RotateKubeletServerCertificate=true +--cluster-signing-cert-file="/etc/path/to/kubernetes/ca/ca.crt" --cluster-signing-key-file="/etc/path/to/kubernetes/ca/ca.key" ``` -The following RBAC `ClusterRoles` represent the `nodeclient`, `selfnodeclient`, and `selfnodeserver` capabilities. Similar roles -may be automatically created in future releases. + +例如: -```yml -# A ClusterRole which instructs the CSR approver to approve a user requesting -# node client credentials. -kind: ClusterRole -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - name: approve-node-client-csr -rules: -- apiGroups: ["certificates.k8s.io"] - resources: ["certificatesigningrequests/nodeclient"] - verbs: ["create"] ---- -# A ClusterRole which instructs the CSR approver to approve a node renewing its -# own client credentials. -kind: ClusterRole -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - name: approve-node-client-renewal-csr -rules: -- apiGroups: ["certificates.k8s.io"] - resources: ["certificatesigningrequests/selfnodeclient"] - verbs: ["create"] ---- -# A ClusterRole which instructs the CSR approver to approve a node requesting a -# serving cert matching its client cert. -kind: ClusterRole -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - name: approve-node-server-renewal-csr -rules: -- apiGroups: ["certificates.k8s.io"] - resources: ["certificatesigningrequests/selfnodeserver"] - verbs: ["create"] +``` +--cluster-signing-cert-file="/var/lib/kubernetes/ca.pem" --cluster-signing-key-file="/var/lib/kubernetes/ca-key.pem" ``` -These powers can be granted to credentials, such as bootstrapping tokens. For example, to replicate the behavior -provided by the removed auto-approval flag, of approving all CSRs by a single group: + +所签名的证书的合法期限可以通过下面的标志来配置: ``` -# REMOVED: This flag no longer works as of 1.7. ---insecure-experimental-approve-all-kubelet-csrs-for-group="system:bootstrappers" +--cluster-signing-duration ``` -An admin would create a `ClusterRoleBinding` targeting that group. + +### 批复 {#approval} + +为了对 CSR 进行批复,你需要告诉控制器管理器批复这些 CSR 是可接受的。 +这是通过将 RBAC 访问权限授予正确的组来实现的。 + + +许可权限有两组: + +* `nodeclient`:如果节点在为节点创建新的证书,则该节点还没有证书。该节点 + 使用前文所列的令牌之一来执行身份认证,因此是组 `system:bootstrappers` 组 + 的成员。 +* `selfnodeclient`:如果节点在对证书执行续期操作,则该节点已经拥有一个证书。 + 节点持续使用现有的证书将自己认证为 `system:nodes` 组的成员。 + + +要允许 kubelet 请求并接收新的证书,可以创建一个 `ClusterRoleBinding` 将启动 +引导节点所处的组 `system:bootstrappers` 绑定到为其赋予访问权限的 +`ClusterRole` `system:certificates.k8s.io:certificatesigningrequests:nodeclient`: + +```yaml +# 批复 "system:bootstrappers" 组的所有 CSR apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding metadata: name: auto-approve-csrs-for-group subjects: @@ -151,66 +561,345 @@ subjects: apiGroup: rbac.authorization.k8s.io roleRef: kind: ClusterRole - name: approve-node-client-csr + name: system:certificates.k8s.io:certificatesigningrequests:nodeclient apiGroup: rbac.authorization.k8s.io ``` -To let a node renew its own credentials, an admin can construct a `ClusterRoleBinding` targeting -that node's credentials: + +要允许 kubelet 对其客户端证书执行续期操作,可以创建一个 `ClusterRoleBinding` +将正常工作的节点所处的组 `system:nodes` 绑定到为其授予访问许可的 `ClusterRole` +`system:certificates.k8s.io:certificatesigningrequests:selfnodeclient`: -```yml -kind: ClusterRoleBinding +```yaml +# 批复 "system:nodes" 组的 CSR 续约请求 apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding metadata: - name: node1-client-cert-renewal + name: auto-approve-renewals-for-nodes subjects: -- kind: User - name: system:node:node-1 # Let "node-1" renew its client certificate. +- kind: Group + name: system:nodes apiGroup: rbac.authorization.k8s.io roleRef: kind: ClusterRole - name: approve-node-client-renewal-csr + name: system:certificates.k8s.io:certificatesigningrequests:selfnodeclient apiGroup: rbac.authorization.k8s.io ``` -Deleting the binding will prevent the node from renewing its client credentials, effectively -removing it from the cluster once its certificate expires. - + +作为 [kube-controller-manager](/zh/docs/reference/generated/kube-controller-manager/) +的一部分的 `csrapproving` 控制器是自动被启用的。 +该控制器使用 [`SubjectAccessReview` API](/docs/reference/access-authn-authz/authorization/#checking-api-access) +来确定是否某给定用户被授权请求 CSR,之后基于鉴权结果执行批复操作。 +为了避免与其它批复组件发生冲突,内置的批复组件不会显式地拒绝任何 CSRs。 +该组件仅是忽略未被授权的请求。 +控制器也会作为垃圾收集的一部分清除已过期的证书。 + + +## kubelet 配置 {#kubelet-configuration} + +最后,当主控节点被正确配置并且所有必要的身份认证和鉴权机制都就绪时, +我们可以配置 kubelet。 + + +kubelet 需要以下配置来执行启动引导: + +* 一个用来存储所生成的密钥和证书的路径(可选,可以使用默认配置) +* 一个用来指向尚不存在的 `kubeconfig` 文件的路径;kubelet 会将启动引导 + 配置文件放到这个位置 +* 一个指向启动引导 `kubeconfig` 文件的路径,用来提供 API 服务器的 URL + 和启动引导凭据,例如,启动引导令牌 +* 可选的:轮换证书的指令 + + +启动引导 `kubeconfig` 文件应该放在一个 kubelet 可访问的路径下,例如 +`/var/lib/kubelet/bootstrap-kubeconfig`。 + +其格式与普通的 `kubeconfig` 文件完全相同。实例文件可能看起来像这样: + +```yaml +apiVersion: v1 +kind: Config +clusters: +- cluster: + certificate-authority: /var/lib/kubernetes/ca.pem + server: https://my.server.example.com:6443 + name: bootstrap +contexts: +- context: + cluster: bootstrap + user: kubelet-bootstrap + name: bootstrap +current-context: bootstrap +preferences: {} +users: +- name: kubelet-bootstrap + user: + token: 07401b.f395accd246ae52d +``` + + +需要额外注意的一些因素有: + +* `certificate-authority`:指向 CA 文件的路径,用来对 kube-apiserver 所出示 + 的服务器证书进行验证 +* `server`: 用来访问 kube-apiserver 的 URL +* `token`:要使用的令牌 + + +令牌的格式并不重要,只要它与 kube-apiserver 的期望匹配即可。 +在上面的例子中,我们使用的是启动引导令牌。 +如前所述,任何合法的身份认证方法都可以使用,不限于令牌。 + +因为启动引导 `kubeconfig` 文件是一个标准的 `kubeconfig` 文件,你可以使用 +`kubectl` 来生成该文件。要生成上面的示例文件: ``` -kubectl config set-credentials kubelet-bootstrap --token=${BOOTSTRAP_TOKEN} --kubeconfig=bootstrap.kubeconfig +kubectl config --kubeconfig=/var/lib/kubelet/bootstrap-kubeconfig set-cluster bootstrap --server='https://my.server.example.com:6443' --certificate-authority=/var/lib/kubernetes/ca.pem +kubectl config --kubeconfig=/var/lib/kubelet/bootstrap-kubeconfig set-credentials kubelet-bootstrap --token=07401b.f395accd246ae52d +kubectl config --kubeconfig=/var/lib/kubelet/bootstrap-kubeconfig set-context bootstrap --user=kubelet-bootstrap --cluster=bootstrap +kubectl config --kubeconfig=/var/lib/kubelet/bootstrap-kubeconfig use-context bootstrap ``` -When starting the kubelet, if the file specified by `--kubeconfig` does not exist, the bootstrap kubeconfig is used to request a client certificate from the API server. On approval of the certificate request and receipt back by the kubelet, a kubeconfig file referencing the generated key and obtained certificate is written to the path specified by `--kubeconfig`. The certificate and key file will be placed in the directory specified by `--cert-dir`. + +要指示 kubelet 使用启动引导 `kubeconfig` 文件,可以使用下面的 kubelet 标志: -{{< note >}} -The following flags are required to enable this bootstrapping when starting the kubelet: +``` +--bootstrap-kubeconfig="/var/lib/kubelet/bootstrap-kubeconfig" --kubeconfig="/var/lib/kubelet/kubeconfig" +``` + + +在启动 kubelet 时,如果 `--kubeconfig` 标志所指定的文件并不存在,会使用通过标志 +`--bootstrap-kubeconfig` 所指定的启动引导 kubeconfig 配置来向 API 服务器请求 +客户端证书。在证书请求被批复并被 kubelet 收回时,一个引用所生成的密钥和所获得 +证书的 kubeconfig 文件会被写入到通过 `--kubeconfig` 所指定的文件路径下。 +证书和密钥文件会被放到 `--cert-dir` 所指定的目录中。 + + +### 客户和服务证书 {#client-and-serving-certificates} + +前文所述的内容都与 kubelet _客户端_ 证书相关,尤其是 kubelet 用来向 +kube-apiserver 认证自身身份的证书。 + + +kubelet 也可以使用 _服务(Serving)_ 证书。kubelet 自身向外提供一个 +HTTPS 末端,包含若干功能特性。要保证这些末端的安全性,kubelet 可以执行以下操作 +之一: + +* 使用通过 `--tls-private-key-file` 和 `--tls-cert-file` 所设置的密钥和证书 +* 如果没有提供密钥和证书,则创建自签名的密钥和证书 +* 通过 CSR API 从集群服务器请求服务证书 + + +TLS 启动引导所提供的客户端证书默认被签名为仅用于 `client auth`(客户端认证), +因此不能作为提供服务的证书,或者 `server auth`。 + +不过,你可以启用服务器证书,至少可以部分地通过证书轮换来实现这点。 + + +### 证书轮换 {#certificate-rotation} + +Kubernetes v1.8 和更高版本的 kubelet 实现了对客户端证书与/或服务证书进行轮换 +这一 Beta 特性。这一特性通过 kubelet 对应的 `RotateKubeletClientCertificate` 和 +`RotateKubeletServerCertificate` 特性门控标志来控制,并且是默认启用的。 + + +`RotateKubeletClientCertificate` 会导致 kubelet 在其现有凭据即将过期时通过 +创建新的 CSR 来轮换其客户端证书。要启用此功能特性,可将下面的标志传递给 +kubelet: ``` ---bootstrap-kubeconfig="/path/to/bootstrap/kubeconfig" +--rotate-certificates ``` -{{< /note >}} -Additionally, in 1.7 the kubelet implements __alpha__ features for enabling rotation of both its client and/or serving certs. -These can be enabled through the respective `RotateKubeletClientCertificate` and `RotateKubeletServerCertificate` feature -flags on the kubelet, but may change in backward incompatible ways in future releases. + +`RotateKubeletServerCertificate` 会让 kubelet 在启动引导其客户端凭据之后请求 +一个服务证书 **且** 对该服务证书执行轮换操作。要启用此功能特性,将下面的标志 +传递给 kubelet: ``` ---feature-gates=RotateKubeletClientCertificate=true,RotateKubeletServerCertificate=true +--rotate-server-certificates ``` -`RotateKubeletClientCertificate` causes the kubelet to rotate its client certificates by creating new CSRs as its existing -credentials expire. `RotateKubeletServerCertificate` causes the kubelet to both request a serving certificate after -bootstrapping its client credentials and rotate the certificate. The serving cert currently does not request DNS or IP -SANs. +{{< note >}} + +Kubernetes 核心中所实现的 CSR 批复控制器出于 +[安全原因](https://github.com/kubernetes/community/pull/1982) +并不会自动批复节点的 _服务_ 证书。 +要使用 `RotateKubeletServerCertificate` 功能特性,集群运维人员需要运行一个 +定制的控制器或者手动批复服务证书的请求。 + + +对 kubelet 服务证书的批复过程因集群部署而异,通常应该仅批复如下 CSR: + +1. 由节点发出的请求(确保 `spec.username` 字段形式为 `system:node:` + 且 `spec.groups` 包含 `system:nodes`) +2. 请求中包含服务证书用法(确保 `spec.usages` 中包含 `server auth`,可选地也可 + 包含 `digital signature` 和 `key encipherment`,且不包含其它用法) +3. 仅包含隶属于请求节点的 IP 和 DNS 的 `subjectAltNames`,没有 URI 和 Email + 形式的 `subjectAltNames`(解析 `spec.request` 中的 x509 证书签名请求可以 + 检查 `subjectAltNames`) +{{< /note >}} + +## 其它身份认证组件 {#other-authenticating-components} + +本文所描述的所有 TLS 启动引导内容都与 kubelet 相关。不过,其它组件也可能需要 +直接与 kube-apiserver 直接通信。容易想到的是 kube-proxy,同样隶属于 +Kubernetes 的控制面并且运行在所有节点之上,不过也可能包含一些其它负责 +监控或者联网的组件。 + + +与 kubelet 类似,这些其它组件也需要一种向 kube-apiserver 认证身份的方法。 +你可以用几种方法来生成这类凭据: + + +* 较老的方式:和 kubelet 在 TLS 启动引导之前所做的一样,用类似的方式 + 创建和分发证书 +* DaemonSet:由于 kubelet 自身被加载到所有节点之上,并且有足够能力来启动基本服务, + 你可以运行将 kube-proxy 和其它特定节点的服务作为 `kube-system` 名字空间中的 + DaemonSet 来执行,而不是独立的进程。由于 DaemonSet 位于集群内部,你可以为其 + 指派一个合适的服务账户,使之具有适当的访问权限来完成其使命。这也许是配置此类 + 服务的最简单的方法。 + + +## kubectl 批复 {#kubectl-approval} + +CSRs 可以在控制器管理其内置的批复工作流之外被批复。 + + +签名控制器并不会立即对所有证书请求执行签名操作。相反,它会等待这些请求被某 +具有适当特权的用户标记为 “Approved(已批准)”状态。 +这一流程有意允许由外部批复控制器来自动执行的批复,或者由控制器管理器内置的 +批复控制器来自动批复。 +不过,集群管理员也可以使用 `kubectl` 来手动批准证书请求。 +管理员可以通过 `kubectl get csr` 来列举所有的 CSR,使用 +`kubectl descsribe csr ` 来描述某个 CSR 的细节。 +管理员可以使用 `kubectl certificate approve ` 来拒绝某 CSR。 + From 15be3b1c7b458823fa83224657223e7c282519c9 Mon Sep 17 00:00:00 2001 From: Qiming Teng Date: Sat, 30 Jan 2021 12:32:43 +0800 Subject: [PATCH 24/62] [zh] Resync connecting-frontend-backend --- .../connecting-frontend-backend.md | 152 +++++++++++------- .../{hello.yaml => backend-deployment.yaml} | 6 +- ...ello-service.yaml => backend-service.yaml} | 2 + .../service/access/frontend-deployment.yaml | 27 ++++ .../service/access/frontend-nginx.conf | 14 ++ .../service/access/frontend-service.yaml | 15 ++ .../zh/examples/service/access/frontend.conf | 11 -- .../zh/examples/service/access/frontend.yaml | 39 ----- 8 files changed, 152 insertions(+), 114 deletions(-) rename content/zh/examples/service/access/{hello.yaml => backend-deployment.yaml} (91%) rename content/zh/examples/service/access/{hello-service.yaml => backend-service.yaml} (95%) create mode 100644 content/zh/examples/service/access/frontend-deployment.yaml create mode 100644 content/zh/examples/service/access/frontend-nginx.conf create mode 100644 content/zh/examples/service/access/frontend-service.yaml delete mode 100644 content/zh/examples/service/access/frontend.conf delete mode 100644 content/zh/examples/service/access/frontend.yaml diff --git a/content/zh/docs/tasks/access-application-cluster/connecting-frontend-backend.md b/content/zh/docs/tasks/access-application-cluster/connecting-frontend-backend.md index 3fa7626c88e0c..a485d9ba3a341 100644 --- a/content/zh/docs/tasks/access-application-cluster/connecting-frontend-backend.md +++ b/content/zh/docs/tasks/access-application-cluster/connecting-frontend-backend.md @@ -3,31 +3,40 @@ title: 使用 Service 把前端连接到后端 content_type: tutorial weight: 70 --- + -本任务会描述如何创建前端微服务和后端微服务。后端微服务是一个 hello 欢迎程序。 -前端和后端的连接是通过 Kubernetes {{< glossary_tooltip term_id="service" text="服务" >}} -完成的。 +本任务会描述如何创建前端(Frontend)微服务和后端(Backend)微服务。后端微服务是一个 hello 欢迎程序。 +前端通过 nginx 和一个 Kubernetes {{< glossary_tooltip term_id="service" text="服务" >}} +暴露后端所提供的服务。 ## {{% heading "objectives" %}} -* 使用部署对象(Deployment object)创建并运行一个微服务 -* 从后端将流量路由到前端 -* 使用服务对象把前端应用连接到后端应用 +* 使用部署对象(Deployment object)创建并运行一个 `hello` 后端微服务 +* 使用一个 Service 对象将请求流量发送到后端微服务的多个副本 +* 同样使用一个 Deployment 对象创建并运行一个 `nginx` 前端微服务 +* 配置前端微服务将请求流量发送到后端微服务 +* 使用 `type=LoadBalancer` 的 Service 对象将全段微服务暴露到集群外部 ## {{% heading "prerequisites" %}} @@ -39,8 +48,7 @@ This task uses require a supported environment. If your environment does not support this, you can use a Service of type [NodePort](/docs/concepts/services-networking/service/#nodeport) instead. --> - -本任务使用 [外部负载均衡服务](/zh/docs/tasks/access-application-cluster/create-external-load-balancer/), +本任务使用[外部负载均衡服务](/zh/docs/tasks/access-application-cluster/create-external-load-balancer/), 所以需要对应的可支持此功能的环境。如果你的环境不能支持,你可以使用 [NodePort](/zh/docs/concepts/services-networking/service/#nodeport) 类型的服务代替。 @@ -57,7 +65,7 @@ file for the backend Deployment: 后端是一个简单的 hello 欢迎微服务应用。这是后端应用的 Deployment 配置文件: -{{< codenew file="service/access/hello.yaml" >}} +{{< codenew file="service/access/backend-deployment.yaml" >}} 查看后端的 Deployment 信息: -``` +```shell kubectl describe deployment hello ``` @@ -83,7 +91,7 @@ The output is similar to this: 输出类似于: ``` -Name: hello +Name: backend Namespace: default CreationTimestamp: Mon, 24 Oct 2016 14:21:02 -0700 Labels: app=hello @@ -91,7 +99,7 @@ Labels: app=hello track=stable Annotations: deployment.kubernetes.io/revision=1 Selector: app=hello,tier=backend,track=stable -Replicas: 7 desired | 7 updated | 7 total | 7 available | 0 unavailable +Replicas: 3 desired | 3 updated | 3 total | 3 available | 0 unavailable StrategyType: RollingUpdate MinReadySeconds: 0 RollingUpdateStrategy: 1 max unavailable, 1 max surge @@ -112,15 +120,15 @@ Conditions: Available True MinimumReplicasAvailable Progressing True NewReplicaSetAvailable OldReplicaSets: -NewReplicaSet: hello-3621623197 (7/7 replicas created) +NewReplicaSet: hello-3621623197 (3/3 replicas created) Events: ... ``` -### 创建后端服务对象 +### 创建 `hello` Service 对象 -前端连接到后端的关键是 Service(服务)。Service 创建一个固定 IP 和 DNS 解析名入口, -使得后端微服务可达。Service 使用 +将请求从前端发送到到后端的关键是后端 Service。Service 创建一个固定 IP 和 DNS 解析名入口, +使得后端微服务总是可达。Service 使用 {{< glossary_tooltip text="选择算符" term_id="selector" >}} 来寻找目标 Pod。 首先,浏览 Service 的配置文件: -{{< codenew file="service/access/hello-service.yaml" >}} +{{< codenew file="service/access/backend-service.yaml" >}} -配置文件中,你可以看到 Service 将流量路由到包含 `app: hello` 和 `tier: backend` 标签的 Pod。 +配置文件中,你可以看到名为 `hello` 的 Service 将流量路由到包含 `app: hello` +和 `tier: backend` 标签的 Pod。 -创建 `hello` Service: +创建后端 Service: ```shell -kubectl apply -f https://k8s.io/examples/service/access/hello-service.yaml +kubectl apply -f https://k8s.io/examples/service/access/backend-service.yaml ``` -此时,你已经有了一个在运行的后端 Deployment,你也有了一个 Service 用于路由网络流量。 +此时,你已经有了一个运行着 `hello` 应用的三个副本的 `backend` Deployment,你也有了 +一个 Service 用于路由网络流量。不过,这个服务在集群外部无法访问也无法解析。 ### 创建前端应用 -既然你已经有了后端应用,你可以创建一个前端应用连接到后端。前端应用通过 DNS 名连接到后端的工作 Pods。 -DNS 名是 "hello",也就是 Service 配置文件中 `name` 字段的值。 +现在你已经有了运行中的后端应用,你可以创建一个可在集群外部访问的前端,并通过代理 +前端的请求连接到后端。 + +前端使用被赋予后端 Service 的 DNS 名称将请求发送到后端工作 Pods。这一 DNS +名称为 `hello`,也就是 `examples/service/access/backend-service.yaml` 配置 +文件中 `name` 字段的取值。 -前端 Deployment 中的 Pods 运行一个 nginx 镜像,这个已经配置好镜像去寻找后端的 hello Service。 -只是 nginx 的配置文件: +前端 Deployment 中的 Pods 运行一个 nginx 镜像,这个已经配置好的镜像会将请求转发 +给后端的 hello Service。下面是 nginx 的配置文件: -{{< codenew file="service/access/frontend.conf" >}} +{{< codenew file="service/access/frontend-nginx.conf" >}} -与后端类似,前端用包含一个 Deployment 和一个 Service。Service 的配置文件包含了 `type: LoadBalancer`, -也就是说,Service 会使用你的云服务商的默认负载均衡设备。 +与后端类似,前端用包含一个 Deployment 和一个 Service。后端与前端服务之间的一个 +重要区别是前端 Service 的配置文件包含了 `type: LoadBalancer`,也就是说,Service +会使用你的云服务商的默认负载均衡设备,从而实现从集群外访问的目的。 + +{{< codenew file="service/access/frontend-service.yaml" >}} + +{{< codenew file="service/access/frontend-deployment.yaml" >}} -{{< codenew file="service/access/frontend.yaml" >}} ### 通过前端发送流量 -前端和后端已经完成连接了。你可以使用 curl 命令通过你的前端 Service 的外部 IP 访问服务端点。 +前端和后端已经完成连接了。你可以使用 curl 命令通过你的前端 Service 的外部 +IP 访问服务端点。 ```shell -curl http:// +curl http://${EXTERNAL_IP} # 将 EXTERNAL_P 替换为你之前看到的外部 IP ``` -后端生成的消息输出如下: +输出显示后端生成的消息: ```json {"message":"Hello"} @@ -299,7 +325,7 @@ To delete the Services, enter this command: 要删除服务,输入下面的命令: ```shell -kubectl delete services frontend hello +kubectl delete services frontend backend ``` -* 进一步了解[Service](/zh/docs/concepts/services-networking/service/) -* 进一步了解[ConfigMap](/zh/docs/tasks/configure-pod-container/configure-pod-configmap/) +* 进一步了解 [Service](/zh/docs/concepts/services-networking/service/) +* 进一步了解 [ConfigMap](/zh/docs/tasks/configure-pod-container/configure-pod-configmap/) +* 进一步了解 [Service 和 Pods 的 DNS](/docs/concepts/services-networking/dns-pod-service/) diff --git a/content/zh/examples/service/access/hello.yaml b/content/zh/examples/service/access/backend-deployment.yaml similarity index 91% rename from content/zh/examples/service/access/hello.yaml rename to content/zh/examples/service/access/backend-deployment.yaml index 85dff18ee1d80..5c95e38a3bcc4 100644 --- a/content/zh/examples/service/access/hello.yaml +++ b/content/zh/examples/service/access/backend-deployment.yaml @@ -1,14 +1,15 @@ +--- apiVersion: apps/v1 kind: Deployment metadata: - name: hello + name: backend spec: selector: matchLabels: app: hello tier: backend track: stable - replicas: 7 + replicas: 3 template: metadata: labels: @@ -22,3 +23,4 @@ spec: ports: - name: http containerPort: 80 +... \ No newline at end of file diff --git a/content/zh/examples/service/access/hello-service.yaml b/content/zh/examples/service/access/backend-service.yaml similarity index 95% rename from content/zh/examples/service/access/hello-service.yaml rename to content/zh/examples/service/access/backend-service.yaml index 71344ecb8be13..9262d29bb8de9 100644 --- a/content/zh/examples/service/access/hello-service.yaml +++ b/content/zh/examples/service/access/backend-service.yaml @@ -1,3 +1,4 @@ +--- apiVersion: v1 kind: Service metadata: @@ -10,3 +11,4 @@ spec: - protocol: TCP port: 80 targetPort: http +... \ No newline at end of file diff --git a/content/zh/examples/service/access/frontend-deployment.yaml b/content/zh/examples/service/access/frontend-deployment.yaml new file mode 100644 index 0000000000000..182b0e708ef16 --- /dev/null +++ b/content/zh/examples/service/access/frontend-deployment.yaml @@ -0,0 +1,27 @@ +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: frontend +spec: + selector: + matchLabels: + app: hello + tier: frontend + track: stable + replicas: 1 + template: + metadata: + labels: + app: hello + tier: frontend + track: stable + spec: + containers: + - name: nginx + image: "gcr.io/google-samples/hello-frontend:1.0" + lifecycle: + preStop: + exec: + command: ["/usr/sbin/nginx","-s","quit"] +... \ No newline at end of file diff --git a/content/zh/examples/service/access/frontend-nginx.conf b/content/zh/examples/service/access/frontend-nginx.conf new file mode 100644 index 0000000000000..39a911a09a911 --- /dev/null +++ b/content/zh/examples/service/access/frontend-nginx.conf @@ -0,0 +1,14 @@ +# The identifier Backend is internal to nginx, and used to name this specific upstream +upstream Backend { + # hello is the internal DNS name used by the backend Service inside Kubernetes + server hello; +} + +server { + listen 80; + + location / { + # The following statement will proxy traffic to the upstream named Backend + proxy_pass http://Backend; + } +} diff --git a/content/zh/examples/service/access/frontend-service.yaml b/content/zh/examples/service/access/frontend-service.yaml new file mode 100644 index 0000000000000..898a5ed51b5d2 --- /dev/null +++ b/content/zh/examples/service/access/frontend-service.yaml @@ -0,0 +1,15 @@ +--- +apiVersion: v1 +kind: Service +metadata: + name: frontend +spec: + selector: + app: hello + tier: frontend + ports: + - protocol: "TCP" + port: 80 + targetPort: 80 + type: LoadBalancer +... \ No newline at end of file diff --git a/content/zh/examples/service/access/frontend.conf b/content/zh/examples/service/access/frontend.conf deleted file mode 100644 index 9a1f5a0ed63a8..0000000000000 --- a/content/zh/examples/service/access/frontend.conf +++ /dev/null @@ -1,11 +0,0 @@ -upstream hello { - server hello; -} - -server { - listen 80; - - location / { - proxy_pass http://hello; - } -} diff --git a/content/zh/examples/service/access/frontend.yaml b/content/zh/examples/service/access/frontend.yaml deleted file mode 100644 index 9f5b6b757fe8c..0000000000000 --- a/content/zh/examples/service/access/frontend.yaml +++ /dev/null @@ -1,39 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: frontend -spec: - selector: - app: hello - tier: frontend - ports: - - protocol: "TCP" - port: 80 - targetPort: 80 - type: LoadBalancer ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: frontend -spec: - selector: - matchLabels: - app: hello - tier: frontend - track: stable - replicas: 1 - template: - metadata: - labels: - app: hello - tier: frontend - track: stable - spec: - containers: - - name: nginx - image: "gcr.io/google-samples/hello-frontend:1.0" - lifecycle: - preStop: - exec: - command: ["/usr/sbin/nginx","-s","quit"] From 72f4f64d04f6e28a7b316a0706286135a0e434c6 Mon Sep 17 00:00:00 2001 From: nasirhm Date: Sun, 31 Jan 2021 18:50:40 +0500 Subject: [PATCH 25/62] :wrench: Modify Kompose page, to remove up Signed-off-by: nasirhm --- .../translate-compose-kubernetes.md | 20 ++----------------- 1 file changed, 2 insertions(+), 18 deletions(-) diff --git a/content/en/docs/tasks/configure-pod-container/translate-compose-kubernetes.md b/content/en/docs/tasks/configure-pod-container/translate-compose-kubernetes.md index 4fadbb3f42ddb..b780baf1f042b 100644 --- a/content/en/docs/tasks/configure-pod-container/translate-compose-kubernetes.md +++ b/content/en/docs/tasks/configure-pod-container/translate-compose-kubernetes.md @@ -127,23 +127,7 @@ you need is an existing `docker-compose.yml` file. kompose.service.type: LoadBalancer ``` -2. Run the `kompose up` command to deploy to Kubernetes directly, or skip to - the next step instead to generate a file to use with `kubectl`. - - ```bash - $ kompose up - We are going to create Kubernetes Deployments, Services and PersistentVolumeClaims for your Dockerized application. - If you need different kind of resources, use the 'kompose convert' and 'kubectl apply -f' commands instead. - - INFO Successfully created Service: redis - INFO Successfully created Service: web - INFO Successfully created Deployment: redis - INFO Successfully created Deployment: web - - Your application has been deployed to Kubernetes. You can run 'kubectl get deployment,svc,pods,pvc' for details. - ``` - -3. To convert the `docker-compose.yml` file to files that you can use with +2. To convert the `docker-compose.yml` file to files that you can use with `kubectl`, run `kompose convert` and then `kubectl apply -f `. ```bash @@ -168,7 +152,7 @@ you need is an existing `docker-compose.yml` file. Your deployments are running in Kubernetes. -4. Access your application. +3. Access your application. If you're already using `minikube` for your development process: From bfea67aa82065e600394b41c0d8ce3e75c69b7ed Mon Sep 17 00:00:00 2001 From: Luke Addison Date: Mon, 1 Feb 2021 16:47:44 +0000 Subject: [PATCH 26/62] Clarify PreStop hook behaviour --- .../containers/container-lifecycle-hooks.md | 32 +++++++++---------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/content/en/docs/concepts/containers/container-lifecycle-hooks.md b/content/en/docs/concepts/containers/container-lifecycle-hooks.md index b315ba6f597ad..c2811fb118c02 100644 --- a/content/en/docs/concepts/containers/container-lifecycle-hooks.md +++ b/content/en/docs/concepts/containers/container-lifecycle-hooks.md @@ -36,10 +36,12 @@ No parameters are passed to the handler. `PreStop` -This hook is called immediately before a container is terminated due to an API request or management event such as liveness probe failure, preemption, resource contention and others. A call to the preStop hook fails if the container is already in terminated or completed state. -It is blocking, meaning it is synchronous, -so it must complete before the signal to stop the container can be sent. -No parameters are passed to the handler. +This hook is called immediately before a container is terminated due to an API request or management +event such as a liveness/startup probe failure, preemption, resource contention and others. This +hook is not called if the container crashes or exits. The Pod's termination grace period countdown +begins before the `PreStop` hook is executed. Regardless of the outcome of the handler, the +container will eventually terminate within the Pod's termination grace period. No parameters are +passed to the handler. A more detailed description of the termination behavior can be found in [Termination of Pods](/docs/concepts/workloads/pods/pod-lifecycle/#pod-termination). @@ -65,19 +67,15 @@ the Container ENTRYPOINT and hook fire asynchronously. However, if the hook takes too long to run or hangs, the Container cannot reach a `running` state. -`PreStop` hooks are not executed asynchronously from the signal -to stop the Container; the hook must complete its execution before -the signal can be sent. -If a `PreStop` hook hangs during execution, -the Pod's phase will be `Terminating` and remain there until the Pod is -killed after its `terminationGracePeriodSeconds` expires. -This grace period applies to the total time it takes for both -the `PreStop` hook to execute and for the Container to stop normally. -If, for example, `terminationGracePeriodSeconds` is 60, and the hook -takes 55 seconds to complete, and the Container takes 10 seconds to stop -normally after receiving the signal, then the Container will be killed -before it can stop normally, since `terminationGracePeriodSeconds` is -less than the total time (55+10) it takes for these two things to happen. +`PreStop` hooks are not executed asynchronously from the signal to stop the Container; the hook must +complete its execution before the TERM signal can be sent. If a `PreStop` hook hangs during +execution, the Pod's phase will be `Terminating` and remain there until the Pod is killed after its +`terminationGracePeriodSeconds` expires. This grace period applies to the total time it takes for +both the `PreStop` hook to execute and for the Container to stop normally. If, for example, +`terminationGracePeriodSeconds` is 60, and the hook takes 55 seconds to complete, and the Container +takes 10 seconds to stop normally after receiving the signal, then the Container will be killed +before it can stop normally, since `terminationGracePeriodSeconds` is less than the total time +(55+10) it takes for these two things to happen. If either a `PostStart` or `PreStop` hook fails, it kills the Container. From b84e52e2ada5a08f3800f7558369c3ccdfd947b1 Mon Sep 17 00:00:00 2001 From: Jailton Lopes Date: Mon, 1 Feb 2021 18:59:03 -0300 Subject: [PATCH 27/62] Update README.md Co-authored-by: Celeste Horgan --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2e88a95866e08..8ec876eef283d 100644 --- a/README.md +++ b/README.md @@ -100,7 +100,7 @@ make container-image make container-serve ``` -Open up your browser to http://localhost:1313/docs/reference/kubernetes-api/ to view the API reference pages. +In a web browser, go to http://localhost:1313/docs/reference/kubernetes-api/ to view the API reference. 6. When all changes of the new contract are reflected into the configuration files `toc.yaml` and `fields.yaml`, create a Pull Request with the newly generated API reference pages. From 30d887e2552777e5dbcd810ae165a749629d0529 Mon Sep 17 00:00:00 2001 From: Qiming Teng Date: Sun, 31 Jan 2021 12:52:57 +0800 Subject: [PATCH 28/62] [zh] Resync configure-liveness-readiness-startup-probes --- ...igure-liveness-readiness-startup-probes.md | 111 +++++++++++++++++- 1 file changed, 105 insertions(+), 6 deletions(-) diff --git a/content/zh/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes.md b/content/zh/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes.md index 9c3e1cf6fd1ea..a55821b51fa5c 100644 --- a/content/zh/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes.md +++ b/content/zh/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes.md @@ -512,23 +512,71 @@ Defaults to 3. Minimum value is 1. 就绪探测情况下的放弃 Pod 会被打上未就绪的标签。默认值是 3。最小值是 1。 +在 Kubernetes 1.20 版本之前,exec 探针会忽略 `timeoutSeconds`:探针会无限期地 +持续运行,甚至可能超过所配置的限期,直到返回结果为止。 + + +这一缺陷在 Kubernetes v1.20 版本中得到修复。你可能一直依赖于之前错误的探测行为, +甚至你都没有觉察到这一问题的存在,因为默认的超时值是 1 秒钟。 +作为集群管理员,你可以在所有的 kubelet 上禁用 `ExecProbeTimeout` +[特性门控](/zh/docs/reference/command-line-tools-reference/feature-gates/) +(将其设置为 `false`),从而恢复之前版本中的运行行为,之后当集群中所有的 +exec 探针都设置了 `timeoutSeconds` 参数后,移除此标志重载。 +如果你有 Pods 受到此默认 1 秒钟超时值的影响,你应该更新 Pod 对应的探针的 +超时值,这样才能为最终去除该特性门控做好准备。 + + +当此缺陷被修复之后,在使用 `dockershim` 容器运行时的 Kubernetes `1.20+` +版本中,对于 exec 探针而言,容器中的进程可能会因为超时值的设置保持持续运行, +即使探针返回了失败状态。 + +{{< caution >}} + +如果就绪态探针的实现不正确,可能会导致容器中进程的数量不断上升。 +如果不对其采取措施,很可能导致资源枯竭的状况。 +{{< /caution >}} + + +### HTTP 探测 {#http-probes} + [HTTP Probes](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#httpgetaction-v1-core) 可以在 `httpGet` 上配置额外的字段: * `host`:连接使用的主机名,默认是 Pod 的 IP。也可以在 HTTP 头中设置 “Host” 来代替。 * `scheme` :用于设置连接主机的方式(HTTP 还是 HTTPS)。默认是 HTTP。 -* `path`:访问 HTTP 服务的路径。 +* `path`:访问 HTTP 服务的路径。默认值为 "/"。 * `httpHeaders`:请求中自定义的 HTTP 头。HTTP 头字段允许重复。 * `port`:访问容器的端口号或者端口名。如果数字必须在 1 ~ 65535 之间。 @@ -542,10 +590,6 @@ Here's one scenario where you would set it. Suppose the Container listens on 127 and the Pod's `hostNetwork` field is true. Then `host`, under `httpGet`, should be set to 127.0.0.1. If your pod relies on virtual hosts, which is probably the more common case, you should not use `host`, but rather set the `Host` header in `httpHeaders`. - -For a TCP probe, the kubelet makes the probe connection at the node, not in the pod, which -means that you can not use a service name in the `host` parameter since the kubelet is unable -to resolve it. --> 对于 HTTP 探测,kubelet 发送一个 HTTP 请求到指定的路径和端口来执行检测。 除非 `httpGet` 中的 `host` 字段设置了,否则 kubelet 默认是给 Pod 的 IP 地址发送探测。 @@ -556,6 +600,61 @@ to resolve it. 可能更常见的情况是如果 Pod 依赖虚拟主机,你不应该设置 `host` 字段,而是应该在 `httpHeaders` 中设置 `Host`。 + +针对 HTTP 探针,kubelet 除了必需的 `Host` 头部之外还发送两个请求头部字段: +`User-Agent` 和 `Accept`。这些头部的默认值分别是 `kube-probe/{{ skew latestVersion >}}` +(其中 `{{< skew latestVersion >}}` 是 kubelet 的版本号)和 `*/*`。 + +你可以通过为探测设置 `.httpHeaders` 来重载默认的头部字段值;例如: + +```yaml +livenessProbe: + httpGet: + httpHeaders: + - name: Accept + value: application/json + +startupProbe: + httpGet: + httpHeaders: + - name: User-Agent + value: MyUserAgent +``` + + +你也可以通过将这些头部字段定义为空值,从请求中去掉这些头部字段。 + +```yaml +livenessProbe: + httpGet: + httpHeaders: + - name: Accept + value: "" + +startupProbe: + httpGet: + httpHeaders: + - name: User-Agent + value: "" +``` + + +### TCP 探测 {#tcp-probes} + 对于一次 TCP 探测,kubelet 在节点上(不是在 Pod 里面)建立探测连接, 这意味着你不能在 `host` 参数上配置服务名称,因为 kubelet 不能解析服务名称。 From e54d16c4c6b595b3e27e14bf3cdd5c7034568ebe Mon Sep 17 00:00:00 2001 From: chenxuc Date: Wed, 3 Feb 2021 09:14:29 +0800 Subject: [PATCH 29/62] [zh] Sych web page for topo manager This is part of work in umbrella issue: [zh] Umbrella issue: pages out of sync in tasks section #26178 Topology Manageer (L): content/zh/docs/tasks/administer-cluster/topology-manager.md --- .../administer-cluster/topology-manager.md | 144 +++++++++++++++++- 1 file changed, 139 insertions(+), 5 deletions(-) diff --git a/content/zh/docs/tasks/administer-cluster/topology-manager.md b/content/zh/docs/tasks/administer-cluster/topology-manager.md index d197f5dcf73ab..fe50dbe60629d 100644 --- a/content/zh/docs/tasks/administer-cluster/topology-manager.md +++ b/content/zh/docs/tasks/administer-cluster/topology-manager.md @@ -92,25 +92,37 @@ Support for the Topology Manager requires `TopologyManager` [feature gate](/docs 从 Kubernetes 1.18 版本开始,这一特性默认是启用的。 -### 拓扑管理器策略 +### 拓扑管理器作用域和策略 拓扑管理器目前: - - 对所有 QoS 类的 Pod 执行对齐操作 - 针对建议提供者所提供的拓扑建议,对请求的资源进行对齐 如果满足这些条件,则拓扑管理器将对齐请求的资源。 +为了定制如何进行对齐,拓扑管理器提供了两种不同的方式:`scope` 和 `policy`。 + + +`scope` 定义了资源对齐时你所希望使用的粒度(例如,是在 `pod` 还是 `container` 级别)。 +`policy` 定义了对齐时实际使用的策略(例如,`best-effort`、`restricted`、`single-numa-node` 等等)。 + +可以在下文找到现今可用的各种 `scopes` 和 `policies` 的具体信息。 + @@ -120,6 +132,117 @@ To align CPU resources with other requested resources in a Pod Spec, the CPU Man 参看[控制 CPU 管理策略](/zh/docs/tasks/administer-cluster/cpu-management-policies/). {{< /note >}} + +### 拓扑管理器作用域 + +拓扑管理器可以在以下不同的作用域内进行资源对齐: + +* `container` (默认) +* `pod` + +在 kubelet 启动时,可以使用 `--topology-manager-scope` 标志来选择其中任一选项。 + + +### 容器作用域 + +默认使用的是 `container` 作用域。 + + +在该作用域内,拓扑管理器依次进行一系列的资源对齐, +也就是,对每一个容器(包含在一个 Pod 里)计算单独的对齐。 +换句话说,在该特定的作用域内,没有根据特定的 NUMA 节点集来把容器分组的概念。 +实际上,拓扑管理器会把单个容器任意地对齐到 NUMA 节点上。 + + +容器分组的概念是在以下的作用域内特别实现的,也就是 `pod` 作用域。 + + +### Pod 作用域 + +使用命令行选项 `--topology-manager-scope=pod` 来启动 kubelet,就可以选择 `pod` 作用域。 + + +该作用域允许把一个 Pod 里的所有容器作为一个分组,分配到一个共同的 NUMA 节点集。 +也就是,拓扑管理器会把一个 Pod 当成一个整体, +并且试图把整个 Pod(所有容器)分配到一个单个的 NUMA 节点或者一个共同的 NUMA 节点集。 +以下的例子说明了拓扑管理器在不同的场景下使用的对齐方式: + + +* 所有容器可以被分配到一个单一的 NUMA 节点; +* 所有容器可以被分配到一个共享的 NUMA 节点集。 + + +整个 Pod 所请求的某种资源总量是根据 +[有效 request/limit](/zh/docs/concepts/workloads/pods/init-containers/#resources) +公式来计算的, +因此,对某一种资源而言,该总量等于以下数值中的最大值: +* 所有应用容器请求之和; +* 初始容器请求的最大值。 + + +`pod` 作用域与 `single-numa-node` 拓扑管理器策略一起使用, +对于延时敏感的工作负载,或者对于进行 IPC 的高吞吐量应用程序,都是特别有价值的。 +把这两个选项组合起来,你可以把一个 Pod 里的所有容器都放到一个单个的 NUMA 节点, +使得该 Pod 消除了 NUMA 之间的通信开销。 + + +在 `single-numa-node` 策略下,只有当可能的分配方案中存在合适的 NUMA 节点集时,Pod 才会被接受。 +重新考虑上述的例子: + + +* 节点集只包含单个 NUMA 节点时,Pod 就会被接受, +* 然而,节点集包含多个 NUMA 节点时,Pod 就会被拒绝 + (因为满足该分配方案需要两个或以上的 NUMA 节点,而不是单个 NUMA 节点)。 + + +简要地说,拓扑管理器首先计算出 NUMA 节点集,然后使用拓扑管理器策略来测试该集合, +从而决定拒绝或者接受 Pod。 + + +### 拓扑管理器策略 + +{{< note >}} +如果拓扑管理器配置使用 **Pod** 作用域, +那么在策略考量一个容器时,该容器反映的是整个 Pod 的要求, +于是该 Pod 里的每个容器都会得到 **相同的** 拓扑对齐决定。 +{{< /note >}} + + + + + +Kubernetes 的 `dockershim` 组件使得你可以把 Docker 用作 Kubernetes 的 +{{< glossary_tooltip text="容器运行时" term_id="container-runtime" >}}。 +在 Kubernetes v1.20 版本中,内建组件 `dockershim` 被弃用。 + + +本页讲解你的集群把 Docker 用作容器运行时的运作机制, +并提供使用 `dockershim` 时,它所扮演角色的详细信息, +继而展示了一组验证步骤,可用来检查弃用 `dockershim` 对你的工作负载的影响。 + + +## 检查你的应用是否依赖于 Docker {#find-docker-dependencies} + + +虽然你通过 Docker 创建了应用容器,但这些容器却可以运行于所有容器运行时。 +所以这种使用 Docker 容器运行时的方式并不构成对 Docker 的依赖。 + + +当用了替代的容器运行时之后,Docker 命令可能不工作,甚至产生意外的输出。 +这才是判定你是否依赖于 Docker 的方法。 + + +1. 确认没有特权 Pod 执行 docker 命令。 +2. 检查 Kubernetes 基础架构外部节点上的脚本和应用,确认它们没有执行 Docker 命令。可能的命令有: + - SSH 到节点排查故障; + - 节点启动脚本; + - 直接安装在节点上的监视和安全代理。 +3. 检查执行了上述特权操作的第三方工具。详细操作请参考: + [从 dockershim 迁移遥测和安全代理](/zh/docs/tasks/administer-cluster/migrating-from-dockershim/migrating-telemetry-and-security-agents/) +4. 确认没有对 dockershim 行为的间接依赖。这是一种极端情况,不太可能影响你的应用。 + 一些工具很可能被配置为使用了 Docker 特性,比如,基于特定指标发警报,或者在故障排查指令的一个环节中搜索特定的日志信息。 + 如果你有此类配置的工具,需要在迁移之前,在测试集群上完成功能验证。 + + + +## Docker 依赖详解 {#role-of-dockershim} + + +[容器运行时](/zh/docs/concepts/containers/#container-runtimes)是一个软件,用来运行组成 Kubernetes Pod 的容器。 +Kubernetes 负责编排和调度 Pod;在每一个节点上, +{{< glossary_tooltip text="kubelet" term_id="kubelet" >}} +使用抽象的容器运行时接口,所以你可以任意选用兼容的容器运行时。 + + +在早期版本中,Kubernetes 提供的兼容性只支持一个容器运行时:Docker。 +在 Kubernetes 发展历史中,集群运营人员希望采用更多的容器运行时。 +于是 CRI 被设计出来满足这类灵活性需要 - 而 kubelet 亦开始支持 CRI。 +然而,因为 Docker 在 CRI 规范创建之前就已经存在,Kubernetes 就创建了一个适配器组件:`dockershim`。 +dockershim 适配器允许 kubelet 与 Docker交互,就好像 Docker 是一个 CRI 兼容的运行时一样。 + + +你可以阅读博文 +[Kubernetes 容器集成功能的正式发布](/zh/blog/2018/05/24/kubernetes-containerd-integration-goes-ga/) + + +![Dockershim 和 Containerd CRI 的实现对比图](/images/blog/2018-05-24-kubernetes-containerd-integration-goes-ga/cri-containerd.png) + + +切换到容器运行时 Containerd 可以消除掉中间环节。 +所有以前遗留的容器可由 Containerd 这类容器运行时来运行和管理,操作体验也和以前一样。 +但是现在,由于直接用容器运行时调度容器,所以它们对 Docker 来说是不可见的。 +因此,你以前用来检查这些容器的 Docker 工具或漂亮的 UI 都不再可用。 + + +你不能再使用 `docker ps` 或 `docker inspect` 命令来获取容器信息。 +由于你不能列出容器,因此你不能获取日志、停止容器,甚至不能通过 `docker exec` 在容器中执行命令。 + + +{{< note >}} + +如果你用 Kubernetes 运行工作负载,最好通过 Kubernetes API停止容器,而不是通过容器运行时 +(此建议适用于所有容器运行时,不仅仅是针对 Docker)。 + +{{< /note >}} + + +你仍然可以下载镜像,或者用 `docker build` 命令创建它们。 +但用 Docker 创建、下载的镜像,对于容器运行时和 Kubernetes,均不可见。 +为了在 Kubernetes 中使用,需要把镜像推送(push)到某注册中心。 From 6c1ffd397c091d1dfa9dee46f8dcf60b86e4c4b2 Mon Sep 17 00:00:00 2001 From: ydFu Date: Sun, 7 Feb 2021 23:04:40 +0800 Subject: [PATCH 35/62] Fail links in compute-device-assignment.md * Update the links in compute-device-assignment, Fix issue(#26382). Signed-off-by: ydFu --- .../reference/command-line-tools-reference/feature-gates.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/en/docs/reference/command-line-tools-reference/feature-gates.md b/content/en/docs/reference/command-line-tools-reference/feature-gates.md index d9754afb5660c..67a833518260d 100644 --- a/content/en/docs/reference/command-line-tools-reference/feature-gates.md +++ b/content/en/docs/reference/command-line-tools-reference/feature-gates.md @@ -634,8 +634,8 @@ Each feature gate is designed for enabling/disabling a specific feature: - `KubeletCredentialProviders`: Enable kubelet exec credential providers for image pull credentials. - `KubeletPluginsWatcher`: Enable probe-based plugin watcher utility to enable kubelet to discover plugins such as [CSI volume drivers](/docs/concepts/storage/volumes/#csi). -- `KubeletPodResources`: Enable the kubelet's pod resources GRPC endpoint. See - [Support Device Monitoring](https://github.com/kubernetes/enhancements/blob/master/keps/sig-node/compute-device-assignment.md) +- `KubeletPodResources`: Enable the kubelet's pod resources gRPC endpoint. See + [Support Device Monitoring](https://github.com/kubernetes/enhancements/blob/master/keps/sig-node/606-compute-device-assignment/README.md) for more details. - `LegacyNodeRoleBehavior`: When disabled, legacy behavior in service load balancers and node disruption will ignore the `node-role.kubernetes.io/master` label in favor of the From d5d4877c2575133ef3c92f3800e0708d8f21733d Mon Sep 17 00:00:00 2001 From: ldsdsy Date: Sat, 6 Feb 2021 00:10:55 +0800 Subject: [PATCH 36/62] translate 2020-10-01 --- .../index.md | 211 ++++++++++++++++++ .../jorge-castro-code-of-conduct.jpg | Bin 0 -> 143155 bytes 2 files changed, 211 insertions(+) create mode 100644 content/zh/blog/_posts/2020-10-01-contributing-to-the-development-guide/index.md create mode 100644 content/zh/blog/_posts/2020-10-01-contributing-to-the-development-guide/jorge-castro-code-of-conduct.jpg diff --git a/content/zh/blog/_posts/2020-10-01-contributing-to-the-development-guide/index.md b/content/zh/blog/_posts/2020-10-01-contributing-to-the-development-guide/index.md new file mode 100644 index 0000000000000..01c1e2942faf2 --- /dev/null +++ b/content/zh/blog/_posts/2020-10-01-contributing-to-the-development-guide/index.md @@ -0,0 +1,211 @@ +--- +title: "为开发指南做贡献" +linkTitle: "为开发指南做贡献" +Author: Erik L. Arneson +Description: "一位新的贡献者描述了编写和提交对 Kubernetes 开发指南的修改的经验。" +date: 2020-10-01 +canonicalUrl: https://www.kubernetes.dev/blog/2020/09/28/contributing-to-the-development-guide/ +resources: +- src: "jorge-castro-code-of-conduct.jpg" + title: "Jorge Castro 正在 SIG ContribEx 的周例会上宣布 Kubernetes 的行为准则。" +--- + + + + + + +当大多数人想到为一个开源项目做贡献时,我猜想他们可能想到的是贡献代码修改、新功能和错误修复。作为一个软件工程师和一个长期的开源用户和贡献者,这也正是我的想法。 +虽然我已经在不同的工作流中写了不少文档,但规模庞大的 Kubernetes 社区是一种新型 "客户"。我只是不知道当 Google 要求我和 [Lion's Way](https://lionswaycontent.com/) 的同胞们对 Kubernetes 开发指南进行必要更新时会发生什么。 + +*本文最初出现在 [Kubernetes Contributor Community blog](https://www.kubernetes.dev/blog/2020/09/28/contributing-to-the-development-guide/)。* + + + +## 与社区合作的乐趣 + +作为专业的写手,我们习惯了受雇于他人去书写非常具体的项目。我们专注于技术服务,产品营销,技术培训以及文档编制,范围从相对宽松的营销邮件到针对 IT 和开发人员的深层技术白皮书。 +在这种专业服务下,每一个可交付的项目往往都有可衡量的投资回报。我知道在从事开源文档工作时不会出现这个指标,但我不确定它将如何改变我与项目的关系。 + + + +我们的写作和传统客户之间的关系有一个主要的特点,就是我们在一个公司里面总是有一两个主要的对接人。他们负责审查我们的文稿,并确保文稿内容符合公司的声明且对标于他们正在寻找的受众。 +这随之而来的压力--正好解释了为什么我很高兴我的写作伙伴、鹰眼审稿人同时也是嗜血编辑的 [Joel](https://twitter.com/JoelByronBarker) 处理了大部分的客户联系。 + + + + +在与 Kubernetes 社区合作时,所有与客户接触的压力都消失了,这让我感到惊讶和高兴。 + + + +"我必须得多仔细?如果我搞砸了怎么办?如果我让开发商生气了怎么办?如果我树敌了怎么办?"。 +当我第一次加入 Kubernetes Slack 上的 "#sig-contribex " 频道并宣布我将编写 [开发指南](https://github.com/kubernetes/community/blob/master/contributors/devel/development.md) 时,这些问题都在我脑海中奔腾,让我感觉如履薄冰。 + + + +{{< imgproc jorge-castro-code-of-conduct Fit "800x450" >}} +"Kubernetes 编码准则已经生效,让我们共同勉励。" — Jorge +Castro, SIG ContribEx co-chair +{{< /imgproc >}} + + + +事实上我的担心是多虑的。很快,我就感觉到自己是被欢迎的。我倾向于认为这不仅仅是因为我正在从事一项急需的任务,而是因为 Kubernetes 社区充满了友好、热情的人们。 +在每周的 SIG ContribEx 会议上,我们关于开发指南进展情况的报告会被立即纳入其中。此外,会议的领导会一直强调 [Kubernetes](https://www.kubernetes.dev/resources/code-of-conduct/) 编码准则,我们应该像 Bill 和 Ted 一样,相互进步。 + + + + +## 这并不意味着这一切都很简单 + +开发指南需要一次全面检查。当我们拿到它的时候,它已经捆绑了大量的信息和很多新开发者需要经历的步骤,但随着时间的推移和被忽视,它变得相当陈旧。 +文档的确需要全局观,而不仅仅是点与点的修复。结果,最终我向这个项目提交了一个巨大的 pull 请求。[社区仓库](https://github.com/kubernetes/community):新增 267 行,删除 88 行。 + + + +pull 请求的周期需要一定数量的 Kubernetes 组织成员审查和批准更改后才能合并。这是一个很好的做法,因为它使文档和代码都保持在相当不错的状态, +但要哄骗合适的人花时间来做这样一个赫赫有名的审查是很难的。 +因此,那次大规模的 PR 从我第一次提交到最后合并,用了 26 天。 但最终,[它是成功的](https://github.com/kubernetes/community/pull/5003). + + + +由于 Kubernetes 是一个发展相当迅速的项目,而且开发人员通常对编写文档并不十分感兴趣,所以我也遇到了一个问题,那就是有时候, +描述 Kubernetes 子系统工作原理的秘密珍宝被深埋在 [天才工程师的迷宫式思维](https://github.com/amwat) 中,而不是用单纯的英文写在 Markdown 文件中。 +当我要更新端到端(e2e)测试的入门文档时,就一头撞上了这个问题。 + + + +这段旅程将我带出了编写文档的领域,进入到一些未完成软件的全新用户角色。最终我花了很多心思与新的 [kubetest2`框架](https://github.com/kubernetes-sigs/kubetest2) 的开发者之一合作, +记录了最新 e2e 测试的启动和运行过程。 +你可以通过查看我的 [已完成的 pull request](https://github.com/kubernetes/community/pull/5045) 来自己判断结果。 + + + +## 没有人是老板,每个人都给出反馈。 + +但当我暗自期待混乱的时候,为 Kubernetes 开发指南做贡献以及与神奇的 Kubernetes 社区互动的过程却非常顺利。 +没有争执,我也没有树敌。每个人都非常友好和热情。这是令人*愉快的*。 + + + +对于一个开源项目,没人是老板。Kubernetes 项目,一个近乎巨大的项目,被分割成许多不同的特殊兴趣小组(SIG)、工作组和社区。 +每个小组都有自己的定期会议、职责分配和主席推选。我的工作与 SIG ContribEx(负责监督并寻求改善贡献者体验)和 SIG Testing(负责测试)的工作有交集。 +事实证明,这两个 SIG 都很容易合作,他们渴望贡献,而且都是非常友好和热情的人。 + + + +在 Kubernetes 这样一个活跃的、有生命力的项目中,文档仍然需要与代码库一起进行维护、修订和测试。 +开发指南将继续对 Kubernetes 代码库的新贡献者起到至关重要的作用,正如我们的努力所显示的那样,该指南必须与 Kubernetes 项目的发展保持同步。 + + + +Joel 和我非常喜欢与 Kubernetes 社区互动并为开发指南做出贡献。我真的很期待,不仅能继续做出更多贡献,还能继续与过去几个月在这个庞大的开源社区中结识的新朋友进行合作。 diff --git a/content/zh/blog/_posts/2020-10-01-contributing-to-the-development-guide/jorge-castro-code-of-conduct.jpg b/content/zh/blog/_posts/2020-10-01-contributing-to-the-development-guide/jorge-castro-code-of-conduct.jpg new file mode 100644 index 0000000000000000000000000000000000000000..aeea042a7a29212690777154ad7f2a457931cf09 GIT binary patch literal 143155 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%0AgI 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%0DXmN0*)P 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 z�whag_`dtS1M$($R51tV`C%6SBuIEV=~%3#;2VlP4F35w+ zedsHIu?z)g3|+%EGD%i7DF`jrn~Q2#wRvMg?*uCI>@Y+%~cNF9Gw=_)oV zh;LQ4;GYTADy3!`rQEzjyi(x2fZ#5JfFdi}8cR*gJDH^~MG#S&<#d=ja@?vN<&Q|l zGQrV2=d^$DFG!~{&pjufPrN*){STC3=;bwxxo@jkv}4<*<4&Jh>(f~D{pJ$Tw=>_b z@6$@@k4FilQHvbm9-nD(=u@EF$rXzq_!=0@8Y8`0U0uRJ0XF4ZfqwMu8K5rbL^1$; zgT#Ivo{DA#fE6swUENS_Ey}H7P|9U!S{fG+GRGdv_yJrC<^)TJxGO=shq+-@2w`a; zDTTUNy4bm3lmgAu4?Klx1yGonFPuTx8PLKDm8jt^s}igh2azse8bd(+Eis0w0^}r7 zslsV(gqxP%bq{SqT`Z1xE#&M%+byGsdW8ap#G8Du-Dv2`BLRgph}+tPaZ%+_-KcXb zvke%hfI~MfmRs8|3{thm!~mDLTU?GAN&ukkD+qN5*$Jl-))tzg2ZbY?#AeB14@@gQ zaWbPZA(X!eD>+_$0W6b|He=>v)WTX{%(PP%FD(^P@$1PHxBfk)rTT9@{{ZkV`dTbm zhf56nr^AI+{{X Date: Thu, 4 Feb 2021 16:41:29 -0500 Subject: [PATCH 37/62] clean up use of word: simply --- .../manage-deployment.md | 8 +- .../docs/concepts/configuration/configmap.md | 2 +- .../en/docs/concepts/configuration/secret.md | 2 +- .../api-extension/custom-resources.md | 4 +- .../compute-storage-net/network-plugins.md | 2 +- .../extend-kubernetes/service-catalog.md | 2 +- .../overview/working-with-objects/labels.md | 2 +- .../concepts/policy/pod-security-policy.md | 2 +- .../scheduling-eviction/assign-pod-node.md | 2 +- .../scheduler-perf-tuning.md | 2 +- .../services-networking/dns-pod-service.md | 6 +- .../concepts/services-networking/service.md | 4 +- .../concepts/storage/persistent-volumes.md | 2 +- .../docs/concepts/storage/storage-classes.md | 2 +- .../concepts/storage/volume-pvc-datasource.md | 2 +- .../workloads/controllers/deployment.md | 25 +- .../controllers/replicationcontroller.md | 8 +- .../participate/roles-and-responsibilities.md | 2 +- .../admission-controllers.md | 2 +- .../access-authn-authz/authentication.md | 6 +- .../reference/using-api/server-side-apply.md | 6 +- .../tools/kubeadm/create-cluster-kubeadm.md | 2 +- .../windows/intro-windows-in-kubernetes.md | 2 +- .../windows/user-guide-windows-containers.md | 2 +- .../access-cluster.md | 2 +- .../administer-cluster/access-cluster-api.md | 2 +- .../access-cluster-services.md | 2 +- .../change-default-storage-class.md | 2 +- .../configure-service-account.md | 8 +- .../translate-compose-kubernetes.md | 359 ++++++++++-------- .../debug-service.md | 2 +- .../tasks/extend-kubectl/kubectl-plugins.md | 32 +- .../job/parallel-processing-expansion.md | 2 +- .../run-application/delete-stateful-set.md | 2 +- .../run-replicated-stateful-application.md | 2 +- .../en/docs/tutorials/clusters/apparmor.md | 3 +- .../basic-stateful-set.md | 20 +- .../stateless-application/guestbook.md | 2 +- 38 files changed, 302 insertions(+), 237 deletions(-) diff --git a/content/en/docs/concepts/cluster-administration/manage-deployment.md b/content/en/docs/concepts/cluster-administration/manage-deployment.md index d9814a887a147..fa31fbd35f599 100644 --- a/content/en/docs/concepts/cluster-administration/manage-deployment.md +++ b/content/en/docs/concepts/cluster-administration/manage-deployment.md @@ -45,7 +45,7 @@ kubectl apply -f https://k8s.io/examples/application/nginx/ `kubectl` will read any files with suffixes `.yaml`, `.yml`, or `.json`. -It is a recommended practice to put resources related to the same microservice or application tier into the same file, and to group all of the files associated with your application in the same directory. If the tiers of your application bind to each other using DNS, then you can then simply deploy all of the components of your stack en masse. +It is a recommended practice to put resources related to the same microservice or application tier into the same file, and to group all of the files associated with your application in the same directory. If the tiers of your application bind to each other using DNS, you can deploy all of the components of your stack together. A URL can also be specified as a configuration source, which is handy for deploying directly from configuration files checked into github: @@ -265,7 +265,7 @@ For a more concrete example, check the [tutorial of deploying Ghost](https://git ## Updating labels Sometimes existing pods and other resources need to be relabeled before creating new resources. This can be done with `kubectl label`. -For example, if you want to label all your nginx pods as frontend tier, simply run: +For example, if you want to label all your nginx pods as frontend tier, run: ```shell kubectl label pods -l app=nginx tier=fe @@ -411,7 +411,7 @@ and ## Disruptive updates -In some cases, you may need to update resource fields that cannot be updated once initialized, or you may just want to make a recursive change immediately, such as to fix broken pods created by a Deployment. To change such fields, use `replace --force`, which deletes and re-creates the resource. In this case, you can simply modify your original configuration file: +In some cases, you may need to update resource fields that cannot be updated once initialized, or you may just want to make a recursive change immediately, such as to fix broken pods created by a Deployment. To change such fields, use `replace --force`, which deletes and re-creates the resource. In this case, you can modify your original configuration file: ```shell kubectl replace -f https://k8s.io/examples/application/nginx/nginx-deployment.yaml --force @@ -448,7 +448,7 @@ kubectl scale deployment my-nginx --current-replicas=1 --replicas=3 deployment.apps/my-nginx scaled ``` -To update to version 1.16.1, simply change `.spec.template.spec.containers[0].image` from `nginx:1.14.2` to `nginx:1.16.1`, with the kubectl commands we learned above. +To update to version 1.16.1, change `.spec.template.spec.containers[0].image` from `nginx:1.14.2` to `nginx:1.16.1` using the previous kubectl commands. ```shell kubectl edit deployment/my-nginx diff --git a/content/en/docs/concepts/configuration/configmap.md b/content/en/docs/concepts/configuration/configmap.md index 9a134dfc9901c..ad735388a0d57 100644 --- a/content/en/docs/concepts/configuration/configmap.md +++ b/content/en/docs/concepts/configuration/configmap.md @@ -225,7 +225,7 @@ The kubelet checks whether the mounted ConfigMap is fresh on every periodic sync However, the kubelet uses its local cache for getting the current value of the ConfigMap. The type of the cache is configurable using the `ConfigMapAndSecretChangeDetectionStrategy` field in the [KubeletConfiguration struct](https://github.com/kubernetes/kubernetes/blob/{{< param "docsbranch" >}}/staging/src/k8s.io/kubelet/config/v1beta1/types.go). -A ConfigMap can be either propagated by watch (default), ttl-based, or simply redirecting +A ConfigMap can be either propagated by watch (default), ttl-based, or by redirecting all requests directly to the API server. As a result, the total delay from the moment when the ConfigMap is updated to the moment when new keys are projected to the Pod can be as long as the kubelet sync period + cache diff --git a/content/en/docs/concepts/configuration/secret.md b/content/en/docs/concepts/configuration/secret.md index 5a6a0dd09239e..45cf9297ca804 100644 --- a/content/en/docs/concepts/configuration/secret.md +++ b/content/en/docs/concepts/configuration/secret.md @@ -669,7 +669,7 @@ The kubelet checks whether the mounted secret is fresh on every periodic sync. However, the kubelet uses its local cache for getting the current value of the Secret. The type of the cache is configurable using the `ConfigMapAndSecretChangeDetectionStrategy` field in the [KubeletConfiguration struct](https://github.com/kubernetes/kubernetes/blob/{{< param "docsbranch" >}}/staging/src/k8s.io/kubelet/config/v1beta1/types.go). -A Secret can be either propagated by watch (default), ttl-based, or simply redirecting +A Secret can be either propagated by watch (default), ttl-based, or by redirecting all requests directly to the API server. As a result, the total delay from the moment when the Secret is updated to the moment when new keys are projected to the Pod can be as long as the kubelet sync period + cache diff --git a/content/en/docs/concepts/extend-kubernetes/api-extension/custom-resources.md b/content/en/docs/concepts/extend-kubernetes/api-extension/custom-resources.md index dcfef3f6b6180..5457dc92048c1 100644 --- a/content/en/docs/concepts/extend-kubernetes/api-extension/custom-resources.md +++ b/content/en/docs/concepts/extend-kubernetes/api-extension/custom-resources.md @@ -31,7 +31,7 @@ Once a custom resource is installed, users can create and access its objects usi ## Custom controllers -On their own, custom resources simply let you store and retrieve structured data. +On their own, custom resources let you store and retrieve structured data. When you combine a custom resource with a *custom controller*, custom resources provide a true _declarative API_. @@ -120,7 +120,7 @@ Kubernetes provides two ways to add custom resources to your cluster: Kubernetes provides these two options to meet the needs of different users, so that neither ease of use nor flexibility is compromised. -Aggregated APIs are subordinate API servers that sit behind the primary API server, which acts as a proxy. This arrangement is called [API Aggregation](/docs/concepts/extend-kubernetes/api-extension/apiserver-aggregation/) (AA). To users, it simply appears that the Kubernetes API is extended. +Aggregated APIs are subordinate API servers that sit behind the primary API server, which acts as a proxy. This arrangement is called [API Aggregation](/docs/concepts/extend-kubernetes/api-extension/apiserver-aggregation/) (AA). To users, the Kubernetes API appears extended. CRDs allow users to create new types of resources without adding another API server. You do not need to understand API Aggregation to use CRDs. diff --git a/content/en/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins.md b/content/en/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins.md index 7b53fa326f3d5..0ec8bf81b1d00 100644 --- a/content/en/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins.md +++ b/content/en/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins.md @@ -24,7 +24,7 @@ Network plugins in Kubernetes come in a few flavors: The kubelet has a single default network plugin, and a default network common to the entire cluster. It probes for plugins when it starts up, remembers what it finds, and executes the selected plugin at appropriate times in the pod lifecycle (this is only true for Docker, as CRI manages its own CNI plugins). There are two Kubelet command line parameters to keep in mind when using plugins: * `cni-bin-dir`: Kubelet probes this directory for plugins on startup -* `network-plugin`: The network plugin to use from `cni-bin-dir`. It must match the name reported by a plugin probed from the plugin directory. For CNI plugins, this is simply "cni". +* `network-plugin`: The network plugin to use from `cni-bin-dir`. It must match the name reported by a plugin probed from the plugin directory. For CNI plugins, this is `cni`. ## Network Plugin Requirements diff --git a/content/en/docs/concepts/extend-kubernetes/service-catalog.md b/content/en/docs/concepts/extend-kubernetes/service-catalog.md index 3aa967578841c..af0271d9aba70 100644 --- a/content/en/docs/concepts/extend-kubernetes/service-catalog.md +++ b/content/en/docs/concepts/extend-kubernetes/service-catalog.md @@ -26,7 +26,7 @@ Fortunately, there is a cloud provider that offers message queuing as a managed A cluster operator can setup Service Catalog and use it to communicate with the cloud provider's service broker to provision an instance of the message queuing service and make it available to the application within the Kubernetes cluster. The application developer therefore does not need to be concerned with the implementation details or management of the message queue. -The application can simply use it as a service. +The application can access the message queue as a service. ## Architecture diff --git a/content/en/docs/concepts/overview/working-with-objects/labels.md b/content/en/docs/concepts/overview/working-with-objects/labels.md index 2feec438011bf..7ff6f267a0a1f 100644 --- a/content/en/docs/concepts/overview/working-with-objects/labels.md +++ b/content/en/docs/concepts/overview/working-with-objects/labels.md @@ -98,7 +98,7 @@ For both equality-based and set-based conditions there is no logical _OR_ (`||`) ### _Equality-based_ requirement _Equality-_ or _inequality-based_ requirements allow filtering by label keys and values. Matching objects must satisfy all of the specified label constraints, though they may have additional labels as well. -Three kinds of operators are admitted `=`,`==`,`!=`. The first two represent _equality_ (and are simply synonyms), while the latter represents _inequality_. For example: +Three kinds of operators are admitted `=`,`==`,`!=`. The first two represent _equality_ (and are synonyms), while the latter represents _inequality_. For example: ``` environment = production diff --git a/content/en/docs/concepts/policy/pod-security-policy.md b/content/en/docs/concepts/policy/pod-security-policy.md index 17f30906bfb7b..f355a8f539b65 100644 --- a/content/en/docs/concepts/policy/pod-security-policy.md +++ b/content/en/docs/concepts/policy/pod-security-policy.md @@ -197,7 +197,7 @@ alias kubectl-user='kubectl --as=system:serviceaccount:psp-example:fake-user -n ### Create a policy and a pod Define the example PodSecurityPolicy object in a file. This is a policy that -simply prevents the creation of privileged pods. +prevents the creation of privileged pods. The name of a PodSecurityPolicy object must be a valid [DNS subdomain name](/docs/concepts/overview/working-with-objects/names#dns-subdomain-names). diff --git a/content/en/docs/concepts/scheduling-eviction/assign-pod-node.md b/content/en/docs/concepts/scheduling-eviction/assign-pod-node.md index abe4f4b9eb84b..b6b2bd79a8114 100644 --- a/content/en/docs/concepts/scheduling-eviction/assign-pod-node.md +++ b/content/en/docs/concepts/scheduling-eviction/assign-pod-node.md @@ -261,7 +261,7 @@ for performance and security reasons, there are some constraints on topologyKey: and `preferredDuringSchedulingIgnoredDuringExecution`. 2. For pod anti-affinity, empty `topologyKey` is also not allowed in both `requiredDuringSchedulingIgnoredDuringExecution` and `preferredDuringSchedulingIgnoredDuringExecution`. -3. For `requiredDuringSchedulingIgnoredDuringExecution` pod anti-affinity, the admission controller `LimitPodHardAntiAffinityTopology` was introduced to limit `topologyKey` to `kubernetes.io/hostname`. If you want to make it available for custom topologies, you may modify the admission controller, or simply disable it. +3. For `requiredDuringSchedulingIgnoredDuringExecution` pod anti-affinity, the admission controller `LimitPodHardAntiAffinityTopology` was introduced to limit `topologyKey` to `kubernetes.io/hostname`. If you want to make it available for custom topologies, you may modify the admission controller, or disable it. 4. Except for the above cases, the `topologyKey` can be any legal label-key. In addition to `labelSelector` and `topologyKey`, you can optionally specify a list `namespaces` diff --git a/content/en/docs/concepts/scheduling-eviction/scheduler-perf-tuning.md b/content/en/docs/concepts/scheduling-eviction/scheduler-perf-tuning.md index 932e076dfca76..7936f9dedc662 100644 --- a/content/en/docs/concepts/scheduling-eviction/scheduler-perf-tuning.md +++ b/content/en/docs/concepts/scheduling-eviction/scheduler-perf-tuning.md @@ -107,7 +107,7 @@ value being calculated based on the cluster size. There is also a hardcoded minimum value of 50 nodes. {{< note >}}In clusters with less than 50 feasible nodes, the scheduler still -checks all the nodes, simply because there are not enough feasible nodes to stop +checks all the nodes because there are not enough feasible nodes to stop the scheduler's search early. In a small cluster, if you set a low value for `percentageOfNodesToScore`, your diff --git a/content/en/docs/concepts/services-networking/dns-pod-service.md b/content/en/docs/concepts/services-networking/dns-pod-service.md index 93474f24fa021..f02aede0e18ee 100644 --- a/content/en/docs/concepts/services-networking/dns-pod-service.md +++ b/content/en/docs/concepts/services-networking/dns-pod-service.md @@ -25,9 +25,9 @@ assigned a DNS name. By default, a client Pod's DNS search list will include the Pod's own namespace and the cluster's default domain. This is best illustrated by example: -Assume a Service named `foo` in the Kubernetes namespace `bar`. A Pod running -in namespace `bar` can look up this service by simply doing a DNS query for -`foo`. A Pod running in namespace `quux` can look up this service by doing a +Assume a Service named `foo` in the Kubernetes namespace `bar`. A Pod running +in namespace `bar` can look up this service by querying a DNS service for +`foo`. A Pod running in namespace `quux` can look up this service by doing a DNS query for `foo.bar`. The following sections detail the supported record types and layout that is diff --git a/content/en/docs/concepts/services-networking/service.md b/content/en/docs/concepts/services-networking/service.md index 348c1616cedf7..28d991e891abb 100644 --- a/content/en/docs/concepts/services-networking/service.md +++ b/content/en/docs/concepts/services-networking/service.md @@ -430,7 +430,7 @@ Services by their DNS name. For example, if you have a Service called `my-service` in a Kubernetes namespace `my-ns`, the control plane and the DNS Service acting together create a DNS record for `my-service.my-ns`. Pods in the `my-ns` namespace -should be able to find it by simply doing a name lookup for `my-service` +should be able to find the service by doing a name lookup for `my-service` (`my-service.my-ns` would also work). Pods in other namespaces must qualify the name as `my-service.my-ns`. These names @@ -1163,7 +1163,7 @@ rule kicks in, and redirects the packets to the proxy's own port. The "Service proxy" chooses a backend, and starts proxying traffic from the client to the backend. This means that Service owners can choose any port they want without risk of -collision. Clients can simply connect to an IP and port, without being aware +collision. Clients can connect to an IP and port, without being aware of which Pods they are actually accessing. #### iptables diff --git a/content/en/docs/concepts/storage/persistent-volumes.md b/content/en/docs/concepts/storage/persistent-volumes.md index 3423c575db592..ef46b7f99aae4 100644 --- a/content/en/docs/concepts/storage/persistent-volumes.md +++ b/content/en/docs/concepts/storage/persistent-volumes.md @@ -487,7 +487,7 @@ The following volume types support mount options: * VsphereVolume * iSCSI -Mount options are not validated, so mount will simply fail if one is invalid. +Mount options are not validated. If a mount option is invalid, the mount fails. In the past, the annotation `volume.beta.kubernetes.io/mount-options` was used instead of the `mountOptions` attribute. This annotation is still working; however, diff --git a/content/en/docs/concepts/storage/storage-classes.md b/content/en/docs/concepts/storage/storage-classes.md index e6846c7ea4cd4..6834977d70b1d 100644 --- a/content/en/docs/concepts/storage/storage-classes.md +++ b/content/en/docs/concepts/storage/storage-classes.md @@ -149,7 +149,7 @@ mount options specified in the `mountOptions` field of the class. If the volume plugin does not support mount options but mount options are specified, provisioning will fail. Mount options are not validated on either -the class or PV, so mount of the PV will simply fail if one is invalid. +the class or PV. If a mount option is invalid, the PV mount fails. ### Volume Binding Mode diff --git a/content/en/docs/concepts/storage/volume-pvc-datasource.md b/content/en/docs/concepts/storage/volume-pvc-datasource.md index ac8d16041da71..8210df661cb76 100644 --- a/content/en/docs/concepts/storage/volume-pvc-datasource.md +++ b/content/en/docs/concepts/storage/volume-pvc-datasource.md @@ -24,7 +24,7 @@ The {{< glossary_tooltip text="CSI" term_id="csi" >}} Volume Cloning feature add A Clone is defined as a duplicate of an existing Kubernetes Volume that can be consumed as any standard Volume would be. The only difference is that upon provisioning, rather than creating a "new" empty Volume, the back end device creates an exact duplicate of the specified Volume. -The implementation of cloning, from the perspective of the Kubernetes API, simply adds the ability to specify an existing PVC as a dataSource during new PVC creation. The source PVC must be bound and available (not in use). +The implementation of cloning, from the perspective of the Kubernetes API, adds the ability to specify an existing PVC as a dataSource during new PVC creation. The source PVC must be bound and available (not in use). Users need to be aware of the following when using this feature: diff --git a/content/en/docs/concepts/workloads/controllers/deployment.md b/content/en/docs/concepts/workloads/controllers/deployment.md index d8e7646aed1ba..9ba746c2ada68 100644 --- a/content/en/docs/concepts/workloads/controllers/deployment.md +++ b/content/en/docs/concepts/workloads/controllers/deployment.md @@ -47,7 +47,7 @@ In this example: * A Deployment named `nginx-deployment` is created, indicated by the `.metadata.name` field. * The Deployment creates three replicated Pods, indicated by the `.spec.replicas` field. * The `.spec.selector` field defines how the Deployment finds which Pods to manage. - In this case, you simply select a label that is defined in the Pod template (`app: nginx`). + In this case, you select a label that is defined in the Pod template (`app: nginx`). However, more sophisticated selection rules are possible, as long as the Pod template itself satisfies the rule. @@ -171,13 +171,15 @@ Follow the steps given below to update your Deployment: ```shell kubectl --record deployment.apps/nginx-deployment set image deployment.v1.apps/nginx-deployment nginx=nginx:1.16.1 ``` - or simply use the following command: - + + or use the following command: + ```shell kubectl set image deployment/nginx-deployment nginx=nginx:1.16.1 --record ``` - The output is similar to this: + The output is similar to: + ``` deployment.apps/nginx-deployment image updated ``` @@ -188,7 +190,8 @@ Follow the steps given below to update your Deployment: kubectl edit deployment.v1.apps/nginx-deployment ``` - The output is similar to this: + The output is similar to: + ``` deployment.apps/nginx-deployment edited ``` @@ -200,10 +203,13 @@ Follow the steps given below to update your Deployment: ``` The output is similar to this: + ``` Waiting for rollout to finish: 2 out of 3 new replicas have been updated... ``` + or + ``` deployment "nginx-deployment" successfully rolled out ``` @@ -212,10 +218,11 @@ Get more details on your updated Deployment: * After the rollout succeeds, you can view the Deployment by running `kubectl get deployments`. The output is similar to this: - ``` - NAME READY UP-TO-DATE AVAILABLE AGE - nginx-deployment 3/3 3 3 36s - ``` + + ```ini + NAME READY UP-TO-DATE AVAILABLE AGE + nginx-deployment 3/3 3 3 36s + ``` * Run `kubectl get rs` to see that the Deployment updated the Pods by creating a new ReplicaSet and scaling it up to 3 replicas, as well as scaling down the old ReplicaSet to 0 replicas. diff --git a/content/en/docs/concepts/workloads/controllers/replicationcontroller.md b/content/en/docs/concepts/workloads/controllers/replicationcontroller.md index a6427bedb3073..23d87f81fd617 100644 --- a/content/en/docs/concepts/workloads/controllers/replicationcontroller.md +++ b/content/en/docs/concepts/workloads/controllers/replicationcontroller.md @@ -180,16 +180,16 @@ delete`](/docs/reference/generated/kubectl/kubectl-commands#delete). Kubectl wi for it to delete each pod before deleting the ReplicationController itself. If this kubectl command is interrupted, it can be restarted. -When using the REST API or go client library, you need to do the steps explicitly (scale replicas to +When using the REST API or Go client library, you need to do the steps explicitly (scale replicas to 0, wait for pod deletions, then delete the ReplicationController). -### Deleting just a ReplicationController +### Deleting only a ReplicationController You can delete a ReplicationController without affecting any of its pods. Using kubectl, specify the `--cascade=false` option to [`kubectl delete`](/docs/reference/generated/kubectl/kubectl-commands#delete). -When using the REST API or go client library, simply delete the ReplicationController object. +When using the REST API or Go client library, you can delete the ReplicationController object. Once the original is deleted, you can create a new ReplicationController to replace it. As long as the old and new `.spec.selector` are the same, then the new one will adopt the old pods. @@ -240,7 +240,7 @@ Pods created by a ReplicationController are intended to be fungible and semantic ## Responsibilities of the ReplicationController -The ReplicationController simply ensures that the desired number of pods matches its label selector and are operational. Currently, only terminated pods are excluded from its count. In the future, [readiness](https://issue.k8s.io/620) and other information available from the system may be taken into account, we may add more controls over the replacement policy, and we plan to emit events that could be used by external clients to implement arbitrarily sophisticated replacement and/or scale-down policies. +The ReplicationController ensures that the desired number of pods matches its label selector and are operational. Currently, only terminated pods are excluded from its count. In the future, [readiness](https://issue.k8s.io/620) and other information available from the system may be taken into account, we may add more controls over the replacement policy, and we plan to emit events that could be used by external clients to implement arbitrarily sophisticated replacement and/or scale-down policies. The ReplicationController is forever constrained to this narrow responsibility. It itself will not perform readiness nor liveness probes. Rather than performing auto-scaling, it is intended to be controlled by an external auto-scaler (as discussed in [#492](https://issue.k8s.io/492)), which would change its `replicas` field. We will not add scheduling policies (for example, [spreading](https://issue.k8s.io/367#issuecomment-48428019)) to the ReplicationController. Nor should it verify that the pods controlled match the currently specified template, as that would obstruct auto-sizing and other automated processes. Similarly, completion deadlines, ordering dependencies, configuration expansion, and other features belong elsewhere. We even plan to factor out the mechanism for bulk pod creation ([#170](https://issue.k8s.io/170)). diff --git a/content/en/docs/contribute/participate/roles-and-responsibilities.md b/content/en/docs/contribute/participate/roles-and-responsibilities.md index 8ebe7a1303c98..4e8632ac0bb88 100644 --- a/content/en/docs/contribute/participate/roles-and-responsibilities.md +++ b/content/en/docs/contribute/participate/roles-and-responsibilities.md @@ -52,7 +52,7 @@ Members can: {{< note >}} Using `/lgtm` triggers automation. If you want to provide non-binding - approval, simply commenting "LGTM" works too! + approval, commenting "LGTM" works too! {{< /note >}} - Use the `/hold` comment to block merging for a pull request diff --git a/content/en/docs/reference/access-authn-authz/admission-controllers.md b/content/en/docs/reference/access-authn-authz/admission-controllers.md index 3ff113bb63a72..ef1d9a03a51af 100644 --- a/content/en/docs/reference/access-authn-authz/admission-controllers.md +++ b/content/en/docs/reference/access-authn-authz/admission-controllers.md @@ -110,7 +110,7 @@ This admission controller allows all pods into the cluster. It is deprecated bec This admission controller modifies every new Pod to force the image pull policy to Always. This is useful in a multitenant cluster so that users can be assured that their private images can only be used by those who have the credentials to pull them. Without this admission controller, once an image has been pulled to a -node, any pod from any user can use it simply by knowing the image's name (assuming the Pod is +node, any pod from any user can use it by knowing the image's name (assuming the Pod is scheduled onto the right node), without any authorization check against the image. When this admission controller is enabled, images are always pulled prior to starting containers, which means valid credentials are required. diff --git a/content/en/docs/reference/access-authn-authz/authentication.md b/content/en/docs/reference/access-authn-authz/authentication.md index 8c2c4fa5208ec..13517002f01e5 100644 --- a/content/en/docs/reference/access-authn-authz/authentication.md +++ b/content/en/docs/reference/access-authn-authz/authentication.md @@ -206,7 +206,7 @@ spec: Service account bearer tokens are perfectly valid to use outside the cluster and can be used to create identities for long standing jobs that wish to talk to the -Kubernetes API. To manually create a service account, simply use the `kubectl +Kubernetes API. To manually create a service account, use the `kubectl create serviceaccount (NAME)` command. This creates a service account in the current namespace and an associated secret. @@ -420,12 +420,12 @@ users: refresh-token: q1bKLFOyUiosTfawzA93TzZIDzH2TNa2SMm0zEiPKTUwME6BkEo6Sql5yUWVBSWpKUGphaWpxSVAfekBOZbBhaEW+VlFUeVRGcluyVF5JT4+haZmPsluFoFu5XkpXk5BXq name: oidc ``` -Once your `id_token` expires, `kubectl` will attempt to refresh your `id_token` using your `refresh_token` and `client_secret` storing the new values for the `refresh_token` and `id_token` in your `.kube/config`. +Once your `id_token` expires, `kubectl` will attempt to refresh your `id_token` using your `refresh_token` and `client_secret` storing the new values for the `refresh_token` and `id_token` in your `.kube/config`. ##### Option 2 - Use the `--token` Option -The `kubectl` command lets you pass in a token using the `--token` option. Simply copy and paste the `id_token` into this option: +The `kubectl` command lets you pass in a token using the `--token` option. Copy and paste the `id_token` into this option: ```bash kubectl --token=eyJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJodHRwczovL21sYi50cmVtb2xvLmxhbjo4MDQzL2F1dGgvaWRwL29pZGMiLCJhdWQiOiJrdWJlcm5ldGVzIiwiZXhwIjoxNDc0NTk2NjY5LCJqdGkiOiI2RDUzNXoxUEpFNjJOR3QxaWVyYm9RIiwiaWF0IjoxNDc0NTk2MzY5LCJuYmYiOjE0NzQ1OTYyNDksInN1YiI6Im13aW5kdSIsInVzZXJfcm9sZSI6WyJ1c2VycyIsIm5ldy1uYW1lc3BhY2Utdmlld2VyIl0sImVtYWlsIjoibXdpbmR1QG5vbW9yZWplZGkuY29tIn0.f2As579n9VNoaKzoF-dOQGmXkFKf1FMyNV0-va_B63jn-_n9LGSCca_6IVMP8pO-Zb4KvRqGyTP0r3HkHxYy5c81AnIh8ijarruczl-TK_yF5akjSTHFZD-0gRzlevBDiH8Q79NAr-ky0P4iIXS8lY9Vnjch5MF74Zx0c3alKJHJUnnpjIACByfF2SCaYzbWFMUNat-K1PaUk5-ujMBG7yYnr95xD-63n8CO8teGUAAEMx6zRjzfhnhbzX-ajwZLGwGUBT4WqjMs70-6a7_8gZmLZb2az1cZynkFRj2BaCkVT3A2RrjeEwZEtGXlMqKJ1_I2ulrOVsYx01_yD35-rw get nodes diff --git a/content/en/docs/reference/using-api/server-side-apply.md b/content/en/docs/reference/using-api/server-side-apply.md index 302ae94d8b358..d91497f8f2d96 100644 --- a/content/en/docs/reference/using-api/server-side-apply.md +++ b/content/en/docs/reference/using-api/server-side-apply.md @@ -16,10 +16,10 @@ min-kubernetes-server-version: 1.16 ## Introduction -Server Side Apply helps users and controllers manage their resources via -declarative configurations. It allows them to create and/or modify their +Server Side Apply helps users and controllers manage their resources through +declarative configurations. Clients can create and modify their [objects](/docs/concepts/overview/working-with-objects/kubernetes-objects/) -declaratively, simply by sending their fully specified intent. +declaratively by sending their fully specified intent. A fully specified intent is a partial object that only includes the fields and values for which the user has an opinion. That intent either creates a new diff --git a/content/en/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm.md b/content/en/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm.md index 4d932e3e05d2f..6516a1882569e 100644 --- a/content/en/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm.md +++ b/content/en/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm.md @@ -434,7 +434,7 @@ Now remove the node: kubectl delete node ``` -If you wish to start over simply run `kubeadm init` or `kubeadm join` with the +If you wish to start over, run `kubeadm init` or `kubeadm join` with the appropriate arguments. ### Clean up the control plane diff --git a/content/en/docs/setup/production-environment/windows/intro-windows-in-kubernetes.md b/content/en/docs/setup/production-environment/windows/intro-windows-in-kubernetes.md index 03ff2648164cd..014df012c785a 100644 --- a/content/en/docs/setup/production-environment/windows/intro-windows-in-kubernetes.md +++ b/content/en/docs/setup/production-environment/windows/intro-windows-in-kubernetes.md @@ -547,7 +547,7 @@ Your main source of help for troubleshooting your Kubernetes cluster should star 1. After launching `start.ps1`, flanneld is stuck in "Waiting for the Network to be created" - There are numerous reports of this [issue which are being investigated](https://github.com/coreos/flannel/issues/1066); most likely it is a timing issue for when the management IP of the flannel network is set. A workaround is to simply relaunch start.ps1 or relaunch it manually as follows: + There are numerous reports of this [issue](https://github.com/coreos/flannel/issues/1066); most likely it is a timing issue for when the management IP of the flannel network is set. A workaround is to relaunch start.ps1 or relaunch it manually as follows: ```powershell PS C:> [Environment]::SetEnvironmentVariable("NODE_NAME", "") diff --git a/content/en/docs/setup/production-environment/windows/user-guide-windows-containers.md b/content/en/docs/setup/production-environment/windows/user-guide-windows-containers.md index 6c9c05cc90cb6..9133a2de1b9a3 100644 --- a/content/en/docs/setup/production-environment/windows/user-guide-windows-containers.md +++ b/content/en/docs/setup/production-environment/windows/user-guide-windows-containers.md @@ -23,7 +23,7 @@ Windows applications constitute a large portion of the services and applications ## Before you begin * Create a Kubernetes cluster that includes a [master and a worker node running Windows Server](/docs/tasks/administer-cluster/kubeadm/adding-windows-nodes) -* It is important to note that creating and deploying services and workloads on Kubernetes behaves in much the same way for Linux and Windows containers. [Kubectl commands](/docs/reference/kubectl/overview/) to interface with the cluster are identical. The example in the section below is provided simply to jumpstart your experience with Windows containers. +* It is important to note that creating and deploying services and workloads on Kubernetes behaves in much the same way for Linux and Windows containers. [Kubectl commands](/docs/reference/kubectl/overview/) to interface with the cluster are identical. The example in the section below is provided to jumpstart your experience with Windows containers. ## Getting Started: Deploying a Windows container diff --git a/content/en/docs/tasks/access-application-cluster/access-cluster.md b/content/en/docs/tasks/access-application-cluster/access-cluster.md index 7f74320118a3d..400a54ffb23d5 100644 --- a/content/en/docs/tasks/access-application-cluster/access-cluster.md +++ b/content/en/docs/tasks/access-application-cluster/access-cluster.md @@ -280,7 +280,7 @@ at `https://104.197.5.247/api/v1/namespaces/kube-system/services/elasticsearch-l #### Manually constructing apiserver proxy URLs -As mentioned above, you use the `kubectl cluster-info` command to retrieve the service's proxy URL. To create proxy URLs that include service endpoints, suffixes, and parameters, you simply append to the service's proxy URL: +As mentioned above, you use the `kubectl cluster-info` command to retrieve the service's proxy URL. To create proxy URLs that include service endpoints, suffixes, and parameters, you append to the service's proxy URL: `http://`*`kubernetes_master_address`*`/api/v1/namespaces/`*`namespace_name`*`/services/`*`service_name[:port_name]`*`/proxy` If you haven't specified a name for your port, you don't have to specify *port_name* in the URL. diff --git a/content/en/docs/tasks/administer-cluster/access-cluster-api.md b/content/en/docs/tasks/administer-cluster/access-cluster-api.md index ffe200b118200..99fd3596b35a0 100644 --- a/content/en/docs/tasks/administer-cluster/access-cluster-api.md +++ b/content/en/docs/tasks/administer-cluster/access-cluster-api.md @@ -215,7 +215,7 @@ for i in ret.items: #### Java client -* To install the [Java Client](https://github.com/kubernetes-client/java), simply execute : +To install the [Java Client](https://github.com/kubernetes-client/java), run: ```shell # Clone java library diff --git a/content/en/docs/tasks/administer-cluster/access-cluster-services.md b/content/en/docs/tasks/administer-cluster/access-cluster-services.md index c318a3df35388..f6ba4e4fc0f13 100644 --- a/content/en/docs/tasks/administer-cluster/access-cluster-services.md +++ b/content/en/docs/tasks/administer-cluster/access-cluster-services.md @@ -83,7 +83,7 @@ See [Access Clusters Using the Kubernetes API](/docs/tasks/administer-cluster/ac #### Manually constructing apiserver proxy URLs -As mentioned above, you use the `kubectl cluster-info` command to retrieve the service's proxy URL. To create proxy URLs that include service endpoints, suffixes, and parameters, you simply append to the service's proxy URL: +As mentioned above, you use the `kubectl cluster-info` command to retrieve the service's proxy URL. To create proxy URLs that include service endpoints, suffixes, and parameters, you append to the service's proxy URL: `http://`*`kubernetes_master_address`*`/api/v1/namespaces/`*`namespace_name`*`/services/`*`[https:]service_name[:port_name]`*`/proxy` If you haven't specified a name for your port, you don't have to specify *port_name* in the URL. diff --git a/content/en/docs/tasks/administer-cluster/change-default-storage-class.md b/content/en/docs/tasks/administer-cluster/change-default-storage-class.md index 9c08a2a4ad04d..0c7c3c3ca1e2f 100644 --- a/content/en/docs/tasks/administer-cluster/change-default-storage-class.md +++ b/content/en/docs/tasks/administer-cluster/change-default-storage-class.md @@ -32,7 +32,7 @@ for example, it might provision storage that is too expensive. If this is the ca you can either change the default StorageClass or disable it completely to avoid dynamic provisioning of storage. -Simply deleting the default StorageClass may not work, as it may be re-created +Deleting the default StorageClass may not work, as it may be re-created automatically by the addon manager running in your cluster. Please consult the docs for your installation for details about addon manager and how to disable individual addons. diff --git a/content/en/docs/tasks/configure-pod-container/configure-service-account.md b/content/en/docs/tasks/configure-pod-container/configure-service-account.md index ca3d0b2966f50..d96a5c8270d7f 100644 --- a/content/en/docs/tasks/configure-pod-container/configure-service-account.md +++ b/content/en/docs/tasks/configure-pod-container/configure-service-account.md @@ -23,16 +23,10 @@ authenticated by the apiserver as a particular User Account (currently this is usually `admin`, unless your cluster administrator has customized your cluster). Processes in containers inside pods can also contact the apiserver. When they do, they are authenticated as a particular Service Account (for example, `default`). - - - ## {{% heading "prerequisites" %}} - {{< include "task-tutorial-prereqs.md" >}} {{< version-check >}} - - ## Use the Default Service Account to access the API server. @@ -129,7 +123,7 @@ then you will see that a token has automatically been created and is referenced You may use authorization plugins to [set permissions on service accounts](/docs/reference/access-authn-authz/rbac/#service-account-permissions). -To use a non-default service account, simply set the `spec.serviceAccountName` +To use a non-default service account, set the `spec.serviceAccountName` field of a pod to the name of the service account you wish to use. The service account has to exist at the time the pod is created, or it will be rejected. diff --git a/content/en/docs/tasks/configure-pod-container/translate-compose-kubernetes.md b/content/en/docs/tasks/configure-pod-container/translate-compose-kubernetes.md index b780baf1f042b..aa62ad33e5938 100644 --- a/content/en/docs/tasks/configure-pod-container/translate-compose-kubernetes.md +++ b/content/en/docs/tasks/configure-pod-container/translate-compose-kubernetes.md @@ -12,16 +12,10 @@ What's Kompose? It's a conversion tool for all things compose (namely Docker Com More information can be found on the Kompose website at [http://kompose.io](http://kompose.io). - - - ## {{% heading "prerequisites" %}} - {{< include "task-tutorial-prereqs.md" >}} {{< version-check >}} - - ## Install Kompose @@ -49,7 +43,6 @@ sudo mv ./kompose /usr/local/bin/kompose Alternatively, you can download the [tarball](https://github.com/kubernetes/kompose/releases). - {{% /tab %}} {{% tab name="Build from source" %}} @@ -87,8 +80,8 @@ On macOS you can install latest release via [Homebrew](https://brew.sh): ```bash brew install kompose - ``` + {{% /tab %}} {{< /tabs >}} @@ -97,95 +90,117 @@ brew install kompose In just a few steps, we'll take you from Docker Compose to Kubernetes. All you need is an existing `docker-compose.yml` file. -1. Go to the directory containing your `docker-compose.yml` file. If you don't - have one, test using this one. - - ```yaml - version: "2" - - services: - - redis-master: - image: k8s.gcr.io/redis:e2e - ports: - - "6379" - - redis-slave: - image: gcr.io/google_samples/gb-redisslave:v3 - ports: - - "6379" - environment: - - GET_HOSTS_FROM=dns - - frontend: - image: gcr.io/google-samples/gb-frontend:v4 - ports: - - "80:80" - environment: - - GET_HOSTS_FROM=dns - labels: - kompose.service.type: LoadBalancer - ``` - -2. To convert the `docker-compose.yml` file to files that you can use with - `kubectl`, run `kompose convert` and then `kubectl apply -f `. - - ```bash - $ kompose convert - INFO Kubernetes file "frontend-service.yaml" created - INFO Kubernetes file "redis-master-service.yaml" created - INFO Kubernetes file "redis-slave-service.yaml" created - INFO Kubernetes file "frontend-deployment.yaml" created - INFO Kubernetes file "redis-master-deployment.yaml" created - INFO Kubernetes file "redis-slave-deployment.yaml" created - ``` - - ```bash - $ kubectl apply -f frontend-service.yaml,redis-master-service.yaml,redis-slave-service.yaml,frontend-deployment.yaml,redis-master-deployment.yaml,redis-slave-deployment.yaml - service/frontend created - service/redis-master created - service/redis-slave created - deployment.apps/frontend created - deployment.apps/redis-master created - deployment.apps/redis-slave created - ``` - - Your deployments are running in Kubernetes. - -3. Access your application. - - If you're already using `minikube` for your development process: - - ```bash - $ minikube service frontend - ``` - - Otherwise, let's look up what IP your service is using! - - ```sh - $ kubectl describe svc frontend - Name: frontend - Namespace: default - Labels: service=frontend - Selector: service=frontend - Type: LoadBalancer - IP: 10.0.0.183 - LoadBalancer Ingress: 192.0.2.89 - Port: 80 80/TCP - NodePort: 80 31144/TCP - Endpoints: 172.17.0.4:80 - Session Affinity: None - No events. - - ``` - - If you're using a cloud provider, your IP will be listed next to `LoadBalancer Ingress`. - - ```sh - $ curl http://192.0.2.89 - ``` - - +1. Go to the directory containing your `docker-compose.yml` file. If you don't have one, test using this one. + + ```yaml + version: "2" + + services: + + redis-master: + image: k8s.gcr.io/redis:e2e + ports: + - "6379" + + redis-slave: + image: gcr.io/google_samples/gb-redisslave:v3 + ports: + - "6379" + environment: + - GET_HOSTS_FROM=dns + + frontend: + image: gcr.io/google-samples/gb-frontend:v4 + ports: + - "80:80" + environment: + - GET_HOSTS_FROM=dns + labels: + kompose.service.type: LoadBalancer + ``` + +2. To convert the `docker-compose.yml` file to files that you can use with + `kubectl`, run `kompose convert` and then `kubectl apply -f `. + + ```bash + kompose convert + ``` + + The output is similar to: + + ```none + INFO Kubernetes file "frontend-service.yaml" created + INFO Kubernetes file "frontend-service.yaml" created + INFO Kubernetes file "frontend-service.yaml" created + INFO Kubernetes file "redis-master-service.yaml" created + INFO Kubernetes file "redis-master-service.yaml" created + INFO Kubernetes file "redis-master-service.yaml" created + INFO Kubernetes file "redis-slave-service.yaml" created + INFO Kubernetes file "redis-slave-service.yaml" created + INFO Kubernetes file "redis-slave-service.yaml" created + INFO Kubernetes file "frontend-deployment.yaml" created + INFO Kubernetes file "frontend-deployment.yaml" created + INFO Kubernetes file "frontend-deployment.yaml" created + INFO Kubernetes file "redis-master-deployment.yaml" created + INFO Kubernetes file "redis-master-deployment.yaml" created + INFO Kubernetes file "redis-master-deployment.yaml" created + INFO Kubernetes file "redis-slave-deployment.yaml" created + INFO Kubernetes file "redis-slave-deployment.yaml" created + INFO Kubernetes file "redis-slave-deployment.yaml" created + ``` + + ```bash + kubectl apply -f frontend-service.yaml,redis-master-service.yaml,redis-slave-service.yaml,frontend-deployment.yaml, + ``` + + The output is similar to: + + ```none + redis-master-deployment.yaml,redis-slave-deployment.yaml + service/frontend created + service/redis-master created + service/redis-slave created + deployment.apps/frontend created + deployment.apps/redis-master created + deployment.apps/redis-slave created + ``` + + Your deployments are running in Kubernetes. + +3. Access your application. + + If you're already using `minikube` for your development process: + + ```bash + minikube service frontend + ``` + + Otherwise, let's look up what IP your service is using! + + ```sh + kubectl describe svc frontend + ``` + + ```none + Name: frontend + Namespace: default + Labels: service=frontend + Selector: service=frontend + Type: LoadBalancer + IP: 10.0.0.183 + LoadBalancer Ingress: 192.0.2.89 + Port: 80 80/TCP + NodePort: 80 31144/TCP + Endpoints: 172.17.0.4:80 + Session Affinity: None + No events. + ``` + + If you're using a cloud provider, your IP will be listed next to `LoadBalancer Ingress`. + + ```sh + curl http://192.0.2.89 + ``` @@ -205,15 +220,17 @@ you need is an existing `docker-compose.yml` file. Kompose has support for two providers: OpenShift and Kubernetes. You can choose a targeted provider using global option `--provider`. If no provider is specified, Kubernetes is set by default. - ## `kompose convert` Kompose supports conversion of V1, V2, and V3 Docker Compose files into Kubernetes and OpenShift objects. -### Kubernetes +### Kubernetes `kompose convert` example -```sh -$ kompose --file docker-voting.yml convert +```shell +kompose --file docker-voting.yml convert +``` + +```none WARN Unsupported key networks - ignoring WARN Unsupported key build - ignoring INFO Kubernetes file "worker-svc.yaml" created @@ -226,16 +243,24 @@ INFO Kubernetes file "result-deployment.yaml" created INFO Kubernetes file "vote-deployment.yaml" created INFO Kubernetes file "worker-deployment.yaml" created INFO Kubernetes file "db-deployment.yaml" created +``` -$ ls +```shell +ls +``` + +```none db-deployment.yaml docker-compose.yml docker-gitlab.yml redis-deployment.yaml result-deployment.yaml vote-deployment.yaml worker-deployment.yaml db-svc.yaml docker-voting.yml redis-svc.yaml result-svc.yaml vote-svc.yaml worker-svc.yaml ``` You can also provide multiple docker-compose files at the same time: -```sh -$ kompose -f docker-compose.yml -f docker-guestbook.yml convert +```shell +kompose -f docker-compose.yml -f docker-guestbook.yml convert +``` + +```none INFO Kubernetes file "frontend-service.yaml" created INFO Kubernetes file "mlbparks-service.yaml" created INFO Kubernetes file "mongodb-service.yaml" created @@ -247,8 +272,13 @@ INFO Kubernetes file "mongodb-deployment.yaml" created INFO Kubernetes file "mongodb-claim0-persistentvolumeclaim.yaml" created INFO Kubernetes file "redis-master-deployment.yaml" created INFO Kubernetes file "redis-slave-deployment.yaml" created +``` -$ ls +```shell +ls +``` + +```none mlbparks-deployment.yaml mongodb-service.yaml redis-slave-service.jsonmlbparks-service.yaml frontend-deployment.yaml mongodb-claim0-persistentvolumeclaim.yaml redis-master-service.yaml frontend-service.yaml mongodb-deployment.yaml redis-slave-deployment.yaml @@ -257,10 +287,13 @@ redis-master-deployment.yaml When multiple docker-compose files are provided the configuration is merged. Any configuration that is common will be over ridden by subsequent file. -### OpenShift +### OpenShift `kompose convert` example ```sh -$ kompose --provider openshift --file docker-voting.yml convert +kompose --provider openshift --file docker-voting.yml convert +``` + +```none WARN [worker] Service cannot be created because of missing port. INFO OpenShift file "vote-service.yaml" created INFO OpenShift file "db-service.yaml" created @@ -281,7 +314,10 @@ INFO OpenShift file "result-imagestream.yaml" created It also supports creating buildconfig for build directive in a service. By default, it uses the remote repo for the current git branch as the source repo, and the current branch as the source branch for the build. You can specify a different source repo and branch using ``--build-repo`` and ``--build-branch`` options respectively. ```sh -$ kompose --provider openshift --file buildconfig/docker-compose.yml convert +kompose --provider openshift --file buildconfig/docker-compose.yml convert +``` + +```none WARN [foo] Service cannot be created because of missing port. INFO OpenShift Buildconfig using git@github.com:rtnpro/kompose.git::master as source. INFO OpenShift file "foo-deploymentconfig.yaml" created @@ -297,23 +333,31 @@ If you are manually pushing the OpenShift artifacts using ``oc create -f``, you Kompose supports a straightforward way to deploy your "composed" application to Kubernetes or OpenShift via `kompose up`. +### Kubernetes `kompose up` example -### Kubernetes -```sh -$ kompose --file ./examples/docker-guestbook.yml up +```shell +kompose --file ./examples/docker-guestbook.yml up +``` + +```none We are going to create Kubernetes deployments and services for your Dockerized application. If you need different kind of resources, use the 'kompose convert' and 'kubectl apply -f' commands instead. -INFO Successfully created service: redis-master -INFO Successfully created service: redis-slave -INFO Successfully created service: frontend +INFO Successfully created service: redis-master +INFO Successfully created service: redis-slave +INFO Successfully created service: frontend INFO Successfully created deployment: redis-master INFO Successfully created deployment: redis-slave -INFO Successfully created deployment: frontend +INFO Successfully created deployment: frontend Your application has been deployed to Kubernetes. You can run 'kubectl get deployment,svc,pods' for details. +``` + +```shell +kubectl get deployment,svc,pods +``` -$ kubectl get deployment,svc,pods +```none NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE deployment.extensions/frontend 1 1 1 1 4m deployment.extensions/redis-master 1 1 1 1 4m @@ -331,14 +375,19 @@ pod/redis-master-1432129712-63jn8 1/1 Running 0 4m pod/redis-slave-2504961300-nve7b 1/1 Running 0 4m ``` -**Note**: +{{< note >}} - You must have a running Kubernetes cluster with a pre-configured kubectl context. - Only deployments and services are generated and deployed to Kubernetes. If you need different kind of resources, use the `kompose convert` and `kubectl apply -f` commands instead. +{{< /note >}} -### OpenShift -```sh -$ kompose --file ./examples/docker-guestbook.yml --provider openshift up +### OpenShift `kompose up` example + +```shell +kompose --file ./examples/docker-guestbook.yml --provider openshift up +``` + +```none We are going to create OpenShift DeploymentConfigs and Services for your Dockerized application. If you need different kind of resources, use the 'kompose convert' and 'oc create -f' commands instead. @@ -353,8 +402,13 @@ INFO Successfully created deployment: redis-master INFO Successfully created ImageStream: redis-master Your application has been deployed to OpenShift. You can run 'oc get dc,svc,is' for details. +``` -$ oc get dc,svc,is +```shell +oc get dc,svc,is +``` + +```none NAME REVISION DESIRED CURRENT TRIGGERED BY dc/frontend 0 1 0 config,image(frontend:v4) dc/redis-master 0 1 0 config,image(redis-master:e2e) @@ -369,16 +423,16 @@ is/redis-master 172.30.12.200:5000/fff/redis-master is/redis-slave 172.30.12.200:5000/fff/redis-slave v1 ``` -**Note**: - -- You must have a running OpenShift cluster with a pre-configured `oc` context (`oc login`) +{{< note >}} +You must have a running OpenShift cluster with a pre-configured `oc` context (`oc login`). +{{< /note >}} ## `kompose down` -Once you have deployed "composed" application to Kubernetes, `$ kompose down` will help you to take the application out by deleting its deployments and services. If you need to remove other resources, use the 'kubectl' command. +Once you have deployed "composed" application to Kubernetes, `kompose down` will help you to take the application out by deleting its deployments and services. If you need to remove other resources, use the 'kubectl' command. -```sh -$ kompose --file docker-guestbook.yml down +```shell +kompose --file docker-guestbook.yml down INFO Successfully deleted service: redis-master INFO Successfully deleted deployment: redis-master INFO Successfully deleted service: redis-slave @@ -387,16 +441,16 @@ INFO Successfully deleted service: frontend INFO Successfully deleted deployment: frontend ``` -**Note**: - -- You must have a running Kubernetes cluster with a pre-configured kubectl context. +{{< note >}} +You must have a running Kubernetes cluster with a pre-configured `kubectl` context. +{{< /note >}} ## Build and Push Docker Images Kompose supports both building and pushing Docker images. When using the `build` key within your Docker Compose file, your image will: - - Automatically be built with Docker using the `image` key specified within your file - - Be pushed to the correct Docker repository using local credentials (located at `.docker/config`) +- Automatically be built with Docker using the `image` key specified within your file +- Be pushed to the correct Docker repository using local credentials (located at `.docker/config`) Using an [example Docker Compose file](https://raw.githubusercontent.com/kubernetes/kompose/master/examples/buildconfig/docker-compose.yml): @@ -412,7 +466,7 @@ services: Using `kompose up` with a `build` key: ```none -$ kompose up +kompose up INFO Build key detected. Attempting to build and push image 'docker.io/foo/bar' INFO Building image 'docker.io/foo/bar' from directory 'build' INFO Image 'docker.io/foo/bar' from directory 'build' built successfully @@ -432,10 +486,10 @@ In order to disable the functionality, or choose to use BuildConfig generation ( ```sh # Disable building/pushing Docker images -$ kompose up --build none +kompose up --build none # Generate Build Config artifacts for OpenShift -$ kompose up --provider openshift --build build-config +kompose up --provider openshift --build build-config ``` ## Alternative Conversions @@ -443,45 +497,54 @@ $ kompose up --provider openshift --build build-config The default `kompose` transformation will generate Kubernetes [Deployments](/docs/concepts/workloads/controllers/deployment/) and [Services](/docs/concepts/services-networking/service/), in yaml format. You have alternative option to generate json with `-j`. Also, you can alternatively generate [Replication Controllers](/docs/concepts/workloads/controllers/replicationcontroller/) objects, [Daemon Sets](/docs/concepts/workloads/controllers/daemonset/), or [Helm](https://github.com/helm/helm) charts. ```sh -$ kompose convert -j +kompose convert -j INFO Kubernetes file "redis-svc.json" created INFO Kubernetes file "web-svc.json" created INFO Kubernetes file "redis-deployment.json" created INFO Kubernetes file "web-deployment.json" created ``` + The `*-deployment.json` files contain the Deployment objects. ```sh -$ kompose convert --replication-controller +kompose convert --replication-controller INFO Kubernetes file "redis-svc.yaml" created INFO Kubernetes file "web-svc.yaml" created INFO Kubernetes file "redis-replicationcontroller.yaml" created INFO Kubernetes file "web-replicationcontroller.yaml" created ``` -The `*-replicationcontroller.yaml` files contain the Replication Controller objects. If you want to specify replicas (default is 1), use `--replicas` flag: `$ kompose convert --replication-controller --replicas 3` +The `*-replicationcontroller.yaml` files contain the Replication Controller objects. If you want to specify replicas (default is 1), use `--replicas` flag: `kompose convert --replication-controller --replicas 3` -```sh -$ kompose convert --daemon-set +```shell +kompose convert --daemon-set INFO Kubernetes file "redis-svc.yaml" created INFO Kubernetes file "web-svc.yaml" created INFO Kubernetes file "redis-daemonset.yaml" created INFO Kubernetes file "web-daemonset.yaml" created ``` -The `*-daemonset.yaml` files contain the Daemon Set objects +The `*-daemonset.yaml` files contain the DaemonSet objects -If you want to generate a Chart to be used with [Helm](https://github.com/kubernetes/helm) simply do: +If you want to generate a Chart to be used with [Helm](https://github.com/kubernetes/helm) run: -```sh -$ kompose convert -c +```shell +kompose convert -c +``` + +```none INFO Kubernetes file "web-svc.yaml" created INFO Kubernetes file "redis-svc.yaml" created INFO Kubernetes file "web-deployment.yaml" created INFO Kubernetes file "redis-deployment.yaml" created chart created in "./docker-compose/" +``` -$ tree docker-compose/ +```shell +tree docker-compose/ +``` + +```none docker-compose ├── Chart.yaml ├── README.md @@ -562,7 +625,7 @@ If you want to create normal pods without controllers you can use `restart` cons | `no` | Pod | `Never` | {{< note >}} -The controller object could be `deployment` or `replicationcontroller`, etc. +The controller object could be `deployment` or `replicationcontroller`. {{< /note >}} For example, the `pival` service will become pod down here. This container calculated value of `pi`. @@ -577,7 +640,7 @@ services: restart: "on-failure" ``` -### Warning about Deployment Config's +### Warning about Deployment Configurations If the Docker Compose file has a volume specified for a service, the Deployment (Kubernetes) or DeploymentConfig (OpenShift) strategy is changed to "Recreate" instead of "RollingUpdate" (default). This is done to avoid multiple instances of a service from accessing a volume at the same time. @@ -590,5 +653,3 @@ Please note that changing service name might break some `docker-compose` files. Kompose supports Docker Compose versions: 1, 2 and 3. We have limited support on versions 2.1 and 3.2 due to their experimental nature. A full list on compatibility between all three versions is listed in our [conversion document](https://github.com/kubernetes/kompose/blob/master/docs/conversion.md) including a list of all incompatible Docker Compose keys. - - diff --git a/content/en/docs/tasks/debug-application-cluster/debug-service.md b/content/en/docs/tasks/debug-application-cluster/debug-service.md index ba141135fa4d5..902537595515e 100644 --- a/content/en/docs/tasks/debug-application-cluster/debug-service.md +++ b/content/en/docs/tasks/debug-application-cluster/debug-service.md @@ -111,7 +111,7 @@ kubectl get pods -l app=hostnames \ 10.244.0.7 ``` -The example container used for this walk-through simply serves its own hostname +The example container used for this walk-through serves its own hostname via HTTP on port 9376, but if you are debugging your own app, you'll want to use whatever port number your Pods are listening on. diff --git a/content/en/docs/tasks/extend-kubectl/kubectl-plugins.md b/content/en/docs/tasks/extend-kubectl/kubectl-plugins.md index bec423043d7ce..28fd615b459c8 100644 --- a/content/en/docs/tasks/extend-kubectl/kubectl-plugins.md +++ b/content/en/docs/tasks/extend-kubectl/kubectl-plugins.md @@ -12,20 +12,15 @@ content_type: task This guide demonstrates how to install and write extensions for [kubectl](/docs/reference/kubectl/kubectl/). By thinking of core `kubectl` commands as essential building blocks for interacting with a Kubernetes cluster, a cluster administrator can think of plugins as a means of utilizing these building blocks to create more complex behavior. Plugins extend `kubectl` with new sub-commands, allowing for new and custom features not included in the main distribution of `kubectl`. - - ## {{% heading "prerequisites" %}} - You need to have a working `kubectl` binary installed. - - ## Installing kubectl plugins -A plugin is nothing more than a standalone executable file, whose name begins with `kubectl-`. To install a plugin, simply move its executable file to anywhere on your `PATH`. +A plugin is a standalone executable file, whose name begins with `kubectl-`. To install a plugin, move its executable file to anywhere on your `PATH`. You can also discover and install kubectl plugins available in the open source using [Krew](https://krew.dev/). Krew is a plugin manager maintained by @@ -60,9 +55,9 @@ You can write a plugin in any programming language or script that allows you to There is no plugin installation or pre-loading required. Plugin executables receive the inherited environment from the `kubectl` binary. -A plugin determines which command path it wishes to implement based on its name. For -example, a plugin wanting to provide a new command `kubectl foo`, would simply be named -`kubectl-foo`, and live somewhere in your `PATH`. +A plugin determines which command path it wishes to implement based on its name. +For example, a plugin named `kubectl-foo` provides a command `kubectl foo`. You must +install the plugin executable somewhere in your `PATH`. ### Example plugin @@ -88,32 +83,34 @@ echo "I am a plugin named kubectl-foo" ### Using a plugin -To use the above plugin, simply make it executable: +To use a plugin, make the plugin executable: -``` +```shell sudo chmod +x ./kubectl-foo ``` and place it anywhere in your `PATH`: -``` +```shell sudo mv ./kubectl-foo /usr/local/bin ``` You may now invoke your plugin as a `kubectl` command: -``` +```shell kubectl foo ``` + ``` I am a plugin named kubectl-foo ``` All args and flags are passed as-is to the executable: -``` +```shell kubectl foo version ``` + ``` 1.0.0 ``` @@ -124,6 +121,7 @@ All environment variables are also passed as-is to the executable: export KUBECONFIG=~/.kube/config kubectl foo config ``` + ``` /home//.kube/config ``` @@ -131,6 +129,7 @@ kubectl foo config ```shell KUBECONFIG=/etc/kube/config kubectl foo config ``` + ``` /etc/kube/config ``` @@ -376,16 +375,11 @@ set up a build environment (if it needs compiling), and deploy the plugin. If you also make compiled packages available, or use Krew, that will make installs easier. - - ## {{% heading "whatsnext" %}} - * Check the Sample CLI Plugin repository for a [detailed example](https://github.com/kubernetes/sample-cli-plugin) of a plugin written in Go. In case of any questions, feel free to reach out to the [SIG CLI team](https://github.com/kubernetes/community/tree/master/sig-cli). * Read about [Krew](https://krew.dev/), a package manager for kubectl plugins. - - diff --git a/content/en/docs/tasks/job/parallel-processing-expansion.md b/content/en/docs/tasks/job/parallel-processing-expansion.md index e92fa9f5bb657..8f5994929e426 100644 --- a/content/en/docs/tasks/job/parallel-processing-expansion.md +++ b/content/en/docs/tasks/job/parallel-processing-expansion.md @@ -12,7 +12,7 @@ based on a common template. You can use this approach to process batches of work parallel. For this example there are only three items: _apple_, _banana_, and _cherry_. -The sample Jobs process each item simply by printing a string then pausing. +The sample Jobs process each item by printing a string then pausing. See [using Jobs in real workloads](#using-jobs-in-real-workloads) to learn about how this pattern fits more realistic use cases. diff --git a/content/en/docs/tasks/run-application/delete-stateful-set.md b/content/en/docs/tasks/run-application/delete-stateful-set.md index 57e54e679722a..a70e018b85701 100644 --- a/content/en/docs/tasks/run-application/delete-stateful-set.md +++ b/content/en/docs/tasks/run-application/delete-stateful-set.md @@ -66,7 +66,7 @@ Use caution when deleting a PVC, as it may lead to data loss. ### Complete deletion of a StatefulSet -To simply delete everything in a StatefulSet, including the associated pods, you can run a series of commands similar to the following: +To delete everything in a StatefulSet, including the associated pods, you can run a series of commands similar to the following: ```shell grace=$(kubectl get pods --template '{{.spec.terminationGracePeriodSeconds}}') diff --git a/content/en/docs/tasks/run-application/run-replicated-stateful-application.md b/content/en/docs/tasks/run-application/run-replicated-stateful-application.md index f1738ff53eea9..79d779f0df9fb 100644 --- a/content/en/docs/tasks/run-application/run-replicated-stateful-application.md +++ b/content/en/docs/tasks/run-application/run-replicated-stateful-application.md @@ -171,7 +171,7 @@ properties. The script in the `init-mysql` container also applies either `primary.cnf` or `replica.cnf` from the ConfigMap by copying the contents into `conf.d`. Because the example topology consists of a single primary MySQL server and any number of -replicas, the script simply assigns ordinal `0` to be the primary server, and everyone +replicas, the script assigns ordinal `0` to be the primary server, and everyone else to be replicas. Combined with the StatefulSet controller's [deployment order guarantee](/docs/concepts/workloads/controllers/statefulset/#deployment-and-scaling-guarantees/), diff --git a/content/en/docs/tutorials/clusters/apparmor.md b/content/en/docs/tutorials/clusters/apparmor.md index 8ca9f30bad47e..54c8a0f44c9db 100644 --- a/content/en/docs/tutorials/clusters/apparmor.md +++ b/content/en/docs/tutorials/clusters/apparmor.md @@ -168,8 +168,7 @@ k8s-apparmor-example-deny-write (enforce) *This example assumes you have already set up a cluster with AppArmor support.* -First, we need to load the profile we want to use onto our nodes. The profile we'll use simply -denies all file writes: +First, we need to load the profile we want to use onto our nodes. This profile denies all file writes: ```shell #include diff --git a/content/en/docs/tutorials/stateful-application/basic-stateful-set.md b/content/en/docs/tutorials/stateful-application/basic-stateful-set.md index f43af0e15e501..b8aaaabb5b8ee 100644 --- a/content/en/docs/tutorials/stateful-application/basic-stateful-set.md +++ b/content/en/docs/tutorials/stateful-application/basic-stateful-set.md @@ -934,10 +934,10 @@ web-2 0/1 Terminating 0 3m When the `web` StatefulSet was recreated, it first relaunched `web-0`. Since `web-1` was already Running and Ready, when `web-0` transitioned to - Running and Ready, it simply adopted this Pod. Since you recreated the StatefulSet - with `replicas` equal to 2, once `web-0` had been recreated, and once - `web-1` had been determined to already be Running and Ready, `web-2` was - terminated. +Running and Ready, it adopted this Pod. Since you recreated the StatefulSet +with `replicas` equal to 2, once `web-0` had been recreated, and once +`web-1` had been determined to already be Running and Ready, `web-2` was +terminated. Let's take another look at the contents of the `index.html` file served by the Pods' webservers: @@ -945,6 +945,7 @@ Pods' webservers: ```shell for i in 0 1; do kubectl exec -i -t "web-$i" -- curl http://localhost/; done ``` + ``` web-0 web-1 @@ -970,15 +971,18 @@ In another terminal, delete the StatefulSet again. This time, omit the ```shell kubectl delete statefulset web ``` + ``` statefulset.apps "web" deleted ``` + Examine the output of the `kubectl get` command running in the first terminal, and wait for all of the Pods to transition to Terminating. ```shell kubectl get pods -w -l app=nginx ``` + ``` NAME READY STATUS RESTARTS AGE web-0 1/1 Running 0 11m @@ -1006,10 +1010,10 @@ the cascade does not delete the headless Service associated with the StatefulSet You must delete the `nginx` Service manually. {{< /note >}} - ```shell kubectl delete service nginx ``` + ``` service "nginx" deleted ``` @@ -1019,6 +1023,7 @@ Recreate the StatefulSet and headless Service one more time: ```shell kubectl apply -f web.yaml ``` + ``` service/nginx created statefulset.apps/web created @@ -1030,6 +1035,7 @@ the contents of their `index.html` files: ```shell for i in 0 1; do kubectl exec -i -t "web-$i" -- curl http://localhost/; done ``` + ``` web-0 web-1 @@ -1044,13 +1050,17 @@ Finally, delete the `nginx` Service... ```shell kubectl delete service nginx ``` + ``` service "nginx" deleted ``` + ...and the `web` StatefulSet: + ```shell kubectl delete statefulset web ``` + ``` statefulset "web" deleted ``` diff --git a/content/en/docs/tutorials/stateless-application/guestbook.md b/content/en/docs/tutorials/stateless-application/guestbook.md index 817526c6d1adc..b60afcf5f8646 100644 --- a/content/en/docs/tutorials/stateless-application/guestbook.md +++ b/content/en/docs/tutorials/stateless-application/guestbook.md @@ -153,7 +153,7 @@ The `mongo` Services you applied is only accessible within the Kubernetes cluste If you want guests to be able to access your guestbook, you must configure the frontend Service to be externally visible, so a client can request the Service from outside the Kubernetes cluster. However a Kubernetes user you can use `kubectl port-forward` to access the service even though it uses a `ClusterIP`. {{< note >}} -Some cloud providers, like Google Compute Engine or Google Kubernetes Engine, support external load balancers. If your cloud provider supports load balancers and you want to use it, simply uncomment `type: LoadBalancer`. +Some cloud providers, like Google Compute Engine or Google Kubernetes Engine, support external load balancers. If your cloud provider supports load balancers and you want to use it, uncomment `type: LoadBalancer`. {{< /note >}} {{< codenew file="application/guestbook/frontend-service.yaml" >}} From 5ed2b712a2cebf473d37a23afa4d88510867fe35 Mon Sep 17 00:00:00 2001 From: Arhell Date: Mon, 8 Feb 2021 01:57:13 +0200 Subject: [PATCH 38/62] =?UTF-8?q?[zh]=20Tidy=20list=20of=20generators=20fo?= =?UTF-8?q?r=20=E2=80=9Ckubectl=20create=E2=80=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../zh/docs/reference/kubectl/conventions.md | 68 +++++++++---------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/content/zh/docs/reference/kubectl/conventions.md b/content/zh/docs/reference/kubectl/conventions.md index de8232d75baf6..d8f372086ed52 100644 --- a/content/zh/docs/reference/kubectl/conventions.md +++ b/content/zh/docs/reference/kubectl/conventions.md @@ -85,42 +85,42 @@ See the Kubernetes v1.17 documentation for a [list](https://v1-17.docs.kubernete #### 生成器 你可以使用 kubectl 命令生成以下资源, `kubectl create --dry-run=client -o yaml`: -``` - clusterrole 创建 ClusterRole。 - clusterrolebinding 为特定的 ClusterRole 创建 ClusterRoleBinding。 - configmap 使用本地文件、目录或文本值创建 Configmap。 - cronjob 使用指定的名称创建 Cronjob。 - deployment 使用指定的名称创建 Deployment。 - job 使用指定的名称创建 Job。 - namespace 使用指定的名称创建名称空间。 - poddisruptionbudget 使用指定名称创建 Pod 干扰预算。 - priorityclass 使用指定的名称创建 Priorityclass。 - quota 使用指定的名称创建配额。 - role 使用单一规则创建角色。 - rolebinding 为特定角色或 ClusterRole 创建 RoleBinding。 - secret 使用指定的子命令创建 Secret。 - service 使用指定的子命令创建服务。 - serviceaccount 使用指定的名称创建服务帐户。 -``` + +* `clusterrole`: 创建 ClusterRole。 +* `clusterrolebinding`: 为特定的 ClusterRole 创建 ClusterRoleBinding。 +* `configmap`: 使用本地文件、目录或文本值创建 Configmap。 +* `cronjob`: 使用指定的名称创建 Cronjob。 +* `deployment`: 使用指定的名称创建 Deployment。 +* `job`: 使用指定的名称创建 Job。 +* `namespace`: 使用指定的名称创建名称空间。 +* `poddisruptionbudget`: 使用指定名称创建 Pod 干扰预算。 +* `priorityclass`: 使用指定的名称创建 Priorityclass。 +* `quota`: 使用指定的名称创建配额。 +* `role`: 使用单一规则创建角色。 +* `rolebinding`: 为特定角色或 ClusterRole 创建 RoleBinding。 +* `secret`: 使用指定的子命令创建 Secret。 +* `service`: 使用指定的子命令创建服务。 +* `serviceaccount`: 使用指定的名称创建服务帐户。 + ### `kubectl apply` From a0325b1a0174fac35a4ab29b7ccef5c77107917e Mon Sep 17 00:00:00 2001 From: childe Date: Mon, 8 Feb 2021 14:41:13 +0800 Subject: [PATCH 39/62] Update taint-and-toleration.md --- .../docs/concepts/scheduling-eviction/taint-and-toleration.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/zh/docs/concepts/scheduling-eviction/taint-and-toleration.md b/content/zh/docs/concepts/scheduling-eviction/taint-and-toleration.md index c2631fb9584e4..430f0d60b6134 100644 --- a/content/zh/docs/concepts/scheduling-eviction/taint-and-toleration.md +++ b/content/zh/docs/concepts/scheduling-eviction/taint-and-toleration.md @@ -169,7 +169,7 @@ scheduled onto the node (if it is not yet running on the node). 则 Kubernetes 不会将 Pod 分配到该节点。 * 如果未被过滤的污点中不存在 effect 值为 `NoSchedule` 的污点, 但是存在 effect 值为 `PreferNoSchedule` 的污点, - 则 Kubernetes 会 *尝试* 将 Pod 分配到该节点。 + 则 Kubernetes 会 *尝试* 不将 Pod 分配到该节点。 * 如果未被过滤的污点中存在至少一个 effect 值为 `NoExecute` 的污点, 则 Kubernetes 不会将 Pod 分配到该节点(如果 Pod 还未在节点上运行), 或者将 Pod 从该节点驱逐(如果 Pod 已经在节点上运行)。 From af40c89b7befc2ffd2ae1c16b8d38b305ce3fa54 Mon Sep 17 00:00:00 2001 From: Paran Lee Date: Sun, 7 Feb 2021 22:46:46 -0900 Subject: [PATCH 40/62] Update Kompose version from 1.21.0 to 1.22.0 --- .../configure-pod-container/translate-compose-kubernetes.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/content/en/docs/tasks/configure-pod-container/translate-compose-kubernetes.md b/content/en/docs/tasks/configure-pod-container/translate-compose-kubernetes.md index b780baf1f042b..cc4d5c9e3cc1b 100644 --- a/content/en/docs/tasks/configure-pod-container/translate-compose-kubernetes.md +++ b/content/en/docs/tasks/configure-pod-container/translate-compose-kubernetes.md @@ -35,13 +35,13 @@ Kompose is released via GitHub on a three-week cycle, you can see all current re ```sh # Linux -curl -L https://github.com/kubernetes/kompose/releases/download/v1.21.0/kompose-linux-amd64 -o kompose +curl -L https://github.com/kubernetes/kompose/releases/download/v1.22.0/kompose-linux-amd64 -o kompose # macOS -curl -L https://github.com/kubernetes/kompose/releases/download/v1.21.0/kompose-darwin-amd64 -o kompose +curl -L https://github.com/kubernetes/kompose/releases/download/v1.22.0/kompose-darwin-amd64 -o kompose # Windows -curl -L https://github.com/kubernetes/kompose/releases/download/v1.21.0/kompose-windows-amd64.exe -o kompose.exe +curl -L https://github.com/kubernetes/kompose/releases/download/v1.22.0/kompose-windows-amd64.exe -o kompose.exe chmod +x kompose sudo mv ./kompose /usr/local/bin/kompose From 892aedc0107d53274d10feb8fd6f1a03cf10a06f Mon Sep 17 00:00:00 2001 From: Luke Addison Date: Mon, 8 Feb 2021 10:52:15 +0000 Subject: [PATCH 41/62] Address review comments --- .../concepts/containers/container-lifecycle-hooks.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/content/en/docs/concepts/containers/container-lifecycle-hooks.md b/content/en/docs/concepts/containers/container-lifecycle-hooks.md index c2811fb118c02..b41c183bc2e88 100644 --- a/content/en/docs/concepts/containers/container-lifecycle-hooks.md +++ b/content/en/docs/concepts/containers/container-lifecycle-hooks.md @@ -37,11 +37,12 @@ No parameters are passed to the handler. `PreStop` This hook is called immediately before a container is terminated due to an API request or management -event such as a liveness/startup probe failure, preemption, resource contention and others. This -hook is not called if the container crashes or exits. The Pod's termination grace period countdown -begins before the `PreStop` hook is executed. Regardless of the outcome of the handler, the -container will eventually terminate within the Pod's termination grace period. No parameters are -passed to the handler. +event such as a liveness/startup probe failure, preemption, resource contention and others. A call +to the `PreStop` hook fails if the container is already in a terminated or completed state and the +hook must complete before the TERM signal to stop the container can be sent. The Pod's termination +grace period countdown begins before the `PreStop` hook is executed so regardless of the outcome of +the handler, the container will eventually terminate within the Pod's termination grace period. No +parameters are passed to the handler. A more detailed description of the termination behavior can be found in [Termination of Pods](/docs/concepts/workloads/pods/pod-lifecycle/#pod-termination). From cbf7a63a32483511c648cbff3224c4b7199db752 Mon Sep 17 00:00:00 2001 From: Luke Addison Date: Mon, 8 Feb 2021 10:53:36 +0000 Subject: [PATCH 42/62] Add comma --- .../en/docs/concepts/containers/container-lifecycle-hooks.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/en/docs/concepts/containers/container-lifecycle-hooks.md b/content/en/docs/concepts/containers/container-lifecycle-hooks.md index b41c183bc2e88..96569f95189cf 100644 --- a/content/en/docs/concepts/containers/container-lifecycle-hooks.md +++ b/content/en/docs/concepts/containers/container-lifecycle-hooks.md @@ -40,7 +40,7 @@ This hook is called immediately before a container is terminated due to an API r event such as a liveness/startup probe failure, preemption, resource contention and others. A call to the `PreStop` hook fails if the container is already in a terminated or completed state and the hook must complete before the TERM signal to stop the container can be sent. The Pod's termination -grace period countdown begins before the `PreStop` hook is executed so regardless of the outcome of +grace period countdown begins before the `PreStop` hook is executed, so regardless of the outcome of the handler, the container will eventually terminate within the Pod's termination grace period. No parameters are passed to the handler. From 6b19266c3e69230d6bec6bc32b42aa31aef241cc Mon Sep 17 00:00:00 2001 From: Yao Ding Date: Mon, 8 Feb 2021 14:43:40 -0500 Subject: [PATCH 43/62] fix indentation --- content/en/docs/concepts/workloads/pods/ephemeral-containers.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/en/docs/concepts/workloads/pods/ephemeral-containers.md b/content/en/docs/concepts/workloads/pods/ephemeral-containers.md index 49894937e3e00..c999e5263b17f 100644 --- a/content/en/docs/concepts/workloads/pods/ephemeral-containers.md +++ b/content/en/docs/concepts/workloads/pods/ephemeral-containers.md @@ -103,7 +103,7 @@ the ephemeral container to add as an `EphemeralContainers` list: "apiVersion": "v1", "kind": "EphemeralContainers", "metadata": { - "name": "example-pod" + "name": "example-pod" }, "ephemeralContainers": [{ "command": [ From da2d988e6744a7e8242b9c52fc206c7c2c997309 Mon Sep 17 00:00:00 2001 From: Arhell Date: Tue, 9 Feb 2021 00:58:25 +0200 Subject: [PATCH 44/62] [zh] update docker-cli-to-kubectl --- content/zh/docs/reference/kubectl/docker-cli-to-kubectl.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/zh/docs/reference/kubectl/docker-cli-to-kubectl.md b/content/zh/docs/reference/kubectl/docker-cli-to-kubectl.md index a89f43c32c347..b53e6fcd77a19 100644 --- a/content/zh/docs/reference/kubectl/docker-cli-to-kubectl.md +++ b/content/zh/docs/reference/kubectl/docker-cli-to-kubectl.md @@ -62,7 +62,7 @@ kubectl create deployment --image=nginx nginx-app deployment.apps/nginx-app created ``` -``` +```shell # add env to nginx-app kubectl set env deployment/nginx-app DOMAIN=cluster ``` From 0ec95934a251f16cc0e06590a368307d1815ae57 Mon Sep 17 00:00:00 2001 From: Zhang Yong Date: Tue, 9 Feb 2021 11:05:57 +0800 Subject: [PATCH 45/62] Dual-stack docs correction --- content/en/docs/concepts/services-networking/dual-stack.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/en/docs/concepts/services-networking/dual-stack.md b/content/en/docs/concepts/services-networking/dual-stack.md index d8b900847f31f..20cbcb5f33d55 100644 --- a/content/en/docs/concepts/services-networking/dual-stack.md +++ b/content/en/docs/concepts/services-networking/dual-stack.md @@ -163,7 +163,7 @@ status: loadBalancer: {} ``` -1. When dual-stack is enabled on a cluster, existing [headless Services](/docs/concepts/services-networking/service/#headless-services) with selectors are configured by the control plane to set `.spec.ipFamilyPolicy` to `SingleStack` and set `.spec.ipFamilies` to the address family of the first service cluster IP range (configured via the `--service-cluster-ip-range` flag to the kube-controller-manager) even though `.spec.ClusterIP` is set to `None`. +1. When dual-stack is enabled on a cluster, existing [headless Services](/docs/concepts/services-networking/service/#headless-services) with selectors are configured by the control plane to set `.spec.ipFamilyPolicy` to `SingleStack` and set `.spec.ipFamilies` to the address family of the first service cluster IP range (configured via the `--service-cluster-ip-range` flag to the kube-apiserver) even though `.spec.ClusterIP` is set to `None`. {{< codenew file="service/networking/dual-stack-default-svc.yaml" >}} From 188ccc220b8383fbb6fb73314e8a85b4199fa161 Mon Sep 17 00:00:00 2001 From: Weiping Cai Date: Thu, 28 Jan 2021 16:38:55 +0800 Subject: [PATCH 46/62] Clairly Resourcequota limit for PriorityClass Signed-off-by: Weiping Cai --- .../docs/concepts/policy/resource-quotas.md | 27 +++++++++++++------ .../policy/priority-class-resourcequota.yaml | 10 +++++++ 2 files changed, 29 insertions(+), 8 deletions(-) create mode 100644 content/en/examples/policy/priority-class-resourcequota.yaml diff --git a/content/en/docs/concepts/policy/resource-quotas.md b/content/en/docs/concepts/policy/resource-quotas.md index 0edb1be338047..d5c94d99cf559 100644 --- a/content/en/docs/concepts/policy/resource-quotas.md +++ b/content/en/docs/concepts/policy/resource-quotas.md @@ -610,17 +610,28 @@ plugins: values: ["cluster-services"] ``` -Now, "cluster-services" pods will be allowed in only those namespaces where a quota object with a matching `scopeSelector` is present. -For example: +Then, create a resource quota object in the `kube-system` namespace: -```yaml - scopeSelector: - matchExpressions: - - scopeName: PriorityClass - operator: In - values: ["cluster-services"] +{{< codenew file="policy/priority-class-resourcequota.yaml" >}} + +```shell +$ kubectl apply -f https://k8s.io/examples/policy/priority-class-resourcequota.yaml -n kube-system +``` + +``` +resourcequota/pods-cluster-services created ``` +In this case, a pod creation will be allowed if: + +1. the Pod's `priorityClassName` is not specified. +1. the Pod's `priorityClassName` is specified to a value other than `cluster-services`. +1. the Pod's `priorityClassName` is set to `cluster-services`, it is to be created + in the `kube-system` namespace, and it has passed the resource quota check. + +A Pod creation request is rejected if its `priorityClassName` is set to `cluster-services` +and it is to be created in a namespace other than `kube-system`. + ## {{% heading "whatsnext" %}} - See [ResourceQuota design doc](https://git.k8s.io/community/contributors/design-proposals/resource-management/admission_control_resource_quota.md) for more information. diff --git a/content/en/examples/policy/priority-class-resourcequota.yaml b/content/en/examples/policy/priority-class-resourcequota.yaml new file mode 100644 index 0000000000000..7350d00c8f397 --- /dev/null +++ b/content/en/examples/policy/priority-class-resourcequota.yaml @@ -0,0 +1,10 @@ +apiVersion: v1 +kind: ResourceQuota +metadata: + name: pods-cluster-services +spec: + scopeSelector: + matchExpressions: + - operator : In + scopeName: PriorityClass + values: ["cluster-services"] \ No newline at end of file From ecbbb15a59311f287854ec6852e5a8f17a6913a1 Mon Sep 17 00:00:00 2001 From: luzg Date: Sun, 7 Feb 2021 11:30:58 +0800 Subject: [PATCH 47/62] [zh] translate Migrating telemetry and security agents from dockershim fix according to howieyuen and tengqm --- ...migrating-telemetry-and-security-agents.md | 157 ++++++++++++++++++ 1 file changed, 157 insertions(+) create mode 100644 content/zh/docs/tasks/administer-cluster/migrating-from-dockershim/migrating-telemetry-and-security-agents.md diff --git a/content/zh/docs/tasks/administer-cluster/migrating-from-dockershim/migrating-telemetry-and-security-agents.md b/content/zh/docs/tasks/administer-cluster/migrating-from-dockershim/migrating-telemetry-and-security-agents.md new file mode 100644 index 0000000000000..b22c7d4b67eff --- /dev/null +++ b/content/zh/docs/tasks/administer-cluster/migrating-from-dockershim/migrating-telemetry-and-security-agents.md @@ -0,0 +1,157 @@ +--- +title: 从 dockershim 迁移遥测和安全代理 +content_type: task +weight: 70 +--- + + + + + +在 Kubernetes 1.20 版本中,dockershim 被弃用。 +在博文[弃用 Dockershim 常见问题](/zh/blog/2020/12/02/dockershim-faq/)中, +你大概已经了解到,大多数应用并没有直接通过运行时来托管容器。 +但是,仍然有大量的遥测和安全代理依赖 docker 来收集容器元数据、日志和指标。 +本文汇总了一些信息和链接:信息用于阐述如何探查这些依赖,链接用于解释如何迁移这些代理去使用通用的工具或其他容器运行。 + + +## 遥测和安全代理 {#telemetry-and-security-agents} + + +为了让代理运行在 Kubernetes 集群中,我们有几种办法。 +代理既可以直接在节点上运行,也可以作为守护进程运行。 + + +### 为什么遥测代理依赖于 Docker? {#why-do-telemetry-agents-relyon-docker} + + +因为历史原因,Kubernetes 建立在 Docker 之上。 +Kubernetes 管理网络和调度,Docker 则在具体的节点上定位并操作容器。 +所以,你可以从 Kubernetes 取得调度相关的元数据,比如 Pod 名称;从 Docker 取得容器状态信息。 +后来,人们开发了更多的运行时来管理容器。 +同时一些项目和 Kubernetes 特性也不断涌现,支持跨多个运行时收集容器状态信息。 + + +一些代理和 Docker 工具紧密绑定。此类代理可以这样运行命令,比如用 +[`docker ps`](https://docs.docker.com/engine/reference/commandline/ps/) +或 [`docker top`](https://docs.docker.com/engine/reference/commandline/top/) +这类命令来列出容器和进程,用 +[docker logs](https://docs.docker.com/engine/reference/commandline/logs/) +订阅 Docker 的日志。 +但随着 Docker 作为容器运行时被弃用,这些命令将不再工作。 + + +### 识别依赖于 Docker 的 DaemonSet {#identify-docker-dependency} + + +如果某 Pod 想调用运行在节点上的 `dockerd`,该 Pod 必须满足以下两个条件之一: + +- 将包含 Docker 守护进程特权套接字的文件系统挂载为一个{{< glossary_tooltip text="卷" term_id="volume" >}};或 +- 直接以卷的形式挂载 Docker 守护进程特权套接字的特定路径。 + + +举例来说:在 COS 镜像中,Docker 通过 `/var/run/docker.sock` 开放其 Unix 域套接字。 +这意味着 Pod 的规约中需要包含 `hostPath` 卷以挂载 `/var/run/docker.sock`。 + + +下面是一个 shell 示例脚本,用于查找包含直接映射 Docker 套接字的挂载点的 Pod。 +你也可以删掉 grep `/var/run/docker.sock` 这一代码片段以查看其它挂载信息。 + +```bash +kubectl get pods --all-namespaces \ +-o=jsonpath='{range .items[*]}{"\n"}{.metadata.namespace}{":\t"}{.metadata.name}{":\t"}{range .spec.volumes[*]}{.hostPath.path}{", "}{end}{end}' \ +| sort \ +| grep '/var/run/docker.sock' +``` + + +{{< note >}} +对于 Pod 来说,访问宿主机上的 Docker 还有其他方式。 +例如,可以挂载 `/var/run` 的父目录而非其完整路径 +(就像[这个例子](https://gist.github.com/itaysk/7bc3e56d69c4d72a549286d98fd557dd))。 +上述脚本只检测最常见的使用方式。 +{{< /note >}} + + +### 检测节点代理对 Docker 的依赖性 {#detecting-docker-dependency-from-node-agents} + + +在你的集群节点被定制、且在各个节点上均安装了额外的安全和遥测代理的场景下, +一定要和代理的供应商确认:该代理是否依赖于 Docker。 + + +### 遥测和安全代理的供应商 {#telemetry-and-security-agent-vendors} + + +我们通过 +[谷歌文档](https://docs.google.com/document/d/1ZFi4uKit63ga5sxEiZblfb-c23lFhvy6RXVPikS8wf0/edit#) +提供了为各类遥测和安全代理供应商准备的持续更新的迁移指导。 +请与供应商联系,获取从 dockershim 迁移的最新说明。 From 70ebc7f6ec73680507283873ef8f8094fcc77fc9 Mon Sep 17 00:00:00 2001 From: Yao Ding Date: Tue, 9 Feb 2021 08:11:02 -0500 Subject: [PATCH 48/62] Update ephemeral-containers.md --- content/en/docs/concepts/workloads/pods/ephemeral-containers.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/en/docs/concepts/workloads/pods/ephemeral-containers.md b/content/en/docs/concepts/workloads/pods/ephemeral-containers.md index c999e5263b17f..011fa4adf4053 100644 --- a/content/en/docs/concepts/workloads/pods/ephemeral-containers.md +++ b/content/en/docs/concepts/workloads/pods/ephemeral-containers.md @@ -103,7 +103,7 @@ the ephemeral container to add as an `EphemeralContainers` list: "apiVersion": "v1", "kind": "EphemeralContainers", "metadata": { - "name": "example-pod" + "name": "example-pod" }, "ephemeralContainers": [{ "command": [ From ee5b6e82471c5525f96cd9ba3ed1f60f40ba6f9b Mon Sep 17 00:00:00 2001 From: Jailton Lopes Date: Tue, 9 Feb 2021 13:20:06 -0300 Subject: [PATCH 49/62] Add content/pt/docs/tutorials/hello-minikube.md --- content/pt/docs/tutorials/hello-minikube.md | 258 ++++++++++++++++++++ 1 file changed, 258 insertions(+) create mode 100644 content/pt/docs/tutorials/hello-minikube.md diff --git a/content/pt/docs/tutorials/hello-minikube.md b/content/pt/docs/tutorials/hello-minikube.md new file mode 100644 index 0000000000000..3f6238777b38d --- /dev/null +++ b/content/pt/docs/tutorials/hello-minikube.md @@ -0,0 +1,258 @@ +--- +title: Olá, Minikube! +content_type: tutorial +weight: 5 +menu: + main: + title: "Iniciar" + weight: 10 + post: > +

Pronto para meter a mão na massa? Vamos criar um cluster Kubernetes simples e executar uma aplicacão exemplo.

+card: + name: tutorials + weight: 10 +--- + + + +Este tutorial mostra como executar uma aplicação exemplo no Kubernetes utilizando o [Minikube](https://minikube.sigs.k8s.io) e o [Katacoda](https://www.katacoda.com). O Katacoda disponibiliza um ambiente Kubernetes gratuito e acessível via navegador. + +{{< note >}} +Você também consegue seguir os passos desse tutorial instalando o Minikube localmente. Para instruções de instalação, acesse: [iniciando com minikube](https://minikube.sigs.k8s.io/docs/start/). +{{< /note >}} + +## Objetivos + +* Instalar uma aplicação exemplo no minikube. +* Executar a aplicação. +* Visualizar os logs da aplicação. + +## Antes de você iniciar + +Este tutorial disponibiliza uma imagem de contêiner que utiliza o NGIX para retornar todas as requisições. + + + +## Criando um cluster do Minikube + +1. Clique no botão abaixo **para iniciar o terminal do Katacoda**. + + {{< kat-button >}} + +{{< note >}} +Se você instalou o Minikube localmente, execute: `minikube start`. +{{< /note >}} + +2. Abra o painel do Kubernetes em um navegador: + + ```shell + minikube dashboard + ``` + +3. Apenas no ambiente do Katacoda: Na parte superior do terminal, clique em **Preview Port 30000**. + +## Criando um Deployment + +Um [*Pod*](/docs/concepts/workloads/pods/) Kubernetes consiste em um ou mais contêineres agrupados para fins de administração e gerenciamento de rede. O Pod desse tutorial possui apenas um contêiner. Um [*Deployment*](/docs/concepts/workloads/controllers/deployment/) Kubernetes verifica a saúde do seu Pod e reinicia o contêiner do Pod caso o mesmo seja finalizado. Deployments são a maneira recomendada de gerenciar a criação e escalonamento dos Pods. + +1. Usando o comando `kubectl create` para criar um Deployment que gerencia um Pod. O Pod executa um contêiner baseado na imagem docker disponibilizada. + + ```shell + kubectl create deployment hello-node --image=k8s.gcr.io/echoserver:1.4 + ``` + +2. Visualizando o Deployment: + + ```shell + kubectl get deployments + ``` + + A saída será semelhante a: + + ``` + NAME READY UP-TO-DATE AVAILABLE AGE + hello-node 1/1 1 1 1m + ``` + +3. Visualizando o Pod: + + ```shell + kubectl get pods + ``` + + A saída será semelhante a: + + ``` + NAME READY STATUS RESTARTS AGE + hello-node-5f76cf6ccf-br9b5 1/1 Running 0 1m + ``` + +4. Visualizando os eventos do cluster: + + ```shell + kubectl get events + ``` + +5. Visualizando a configuração do `kubectl`: + + ```shell + kubectl config view + ``` + +{{< note >}} +Para mais informações sobre o comando `kubectl`, veja o [kubectl overview](/docs/reference/kubectl/overview/). +{{< /note >}} + +## Criando um serviço + +Por padrão, um Pod só é acessível utilizando o seu endereço IP interno no cluster Kubernetes. Para dispobiblilizar o contêiner `hello-node` fora da rede virtual do Kubernetes, você deve expor o Pod como um [*serviço*](/docs/concepts/services-networking/service/) Kubernetes. + +1. Expondo o Pod usando o comando `kubectl expose`: + + ```shell + kubectl expose deployment hello-node --type=LoadBalancer --port=8080 + ``` + + O parâmetro `--type=LoadBalancer` indica que você deseja expor o seu serviço fora do cluster Kubernetes. + + A aplicação dentro da imagem `k8s.gcr.io/echoserver` "escuta" apenas na porta TCP 8080. Se você usou + `kubectl expose` para expor uma porta diferente, os clientes não conseguirão se conectar a essa outra porta. + +2. Visualizando o serviço que você acabou de criar: + + ```shell + kubectl get services + ``` + + A saída será semelhante a: + + ``` + NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE + hello-node LoadBalancer 10.108.144.78 8080:30369/TCP 21s + kubernetes ClusterIP 10.96.0.1 443/TCP 23m + ``` + + Em provedores de Cloud que fornecem serviços de balaceamento de carga para o Kubernetes, um IP externo seria provisionado para acessar o serviço. No Minikube, o tipo `LoadBalancer` torna o serviço acessível por meio do comando `minikube service`. + +3. Executar o comando a seguir: + + ```shell + minikube service hello-node + ``` + +4. (**Apenas no ambiente do Katacoda**) Clicar no sinal de mais e então clicar em **Select port to view on Host 1**. + +5. (**Apenas no ambiente do Katacoda**) Observe o número da porta com 5 dígitos exibido ao lado de `8080` na saída do serviço. Este número de porta é gerado aleatoriamente e pode ser diferente para você. Digite seu número na caixa de texto do número da porta e clique em **Display Port**. Usando o exemplo anterior, você digitaria `30369`. + +Isso abre uma janela do navegador, acessa o seu aplicativo e mostra o retorno da requisição. + +## Habilitando Complementos (addons) + +O Minikube inclue um conjunto integrado de {{< glossary_tooltip text="complementos" term_id="addons" >}} que podem ser habilitados, desabilitados e executados no ambiente Kubernetes local. + +1. Listando os complementos suportados atualmente: + + ```shell + minikube addons list + ``` + + A saída será semelhante a: + + ``` + addon-manager: enabled + dashboard: enabled + default-storageclass: enabled + efk: disabled + freshpod: disabled + gvisor: disabled + helm-tiller: disabled + ingress: disabled + ingress-dns: disabled + logviewer: disabled + metrics-server: disabled + nvidia-driver-installer: disabled + nvidia-gpu-device-plugin: disabled + registry: disabled + registry-creds: disabled + storage-provisioner: enabled + storage-provisioner-gluster: disabled + ``` + +2. Habilitando um complemento, por exemplo, `metrics-server`: + + ```shell + minikube addons enable metrics-server + ``` + + A saída será semelhante a: + + ``` + metrics-server was successfully enabled + ``` + +3. Visualizando os Pods e os Serviços que você acabou de criar: + + ```shell + kubectl get pod,svc -n kube-system + ``` + + A saída será semelhante a: + + ``` + NAME READY STATUS RESTARTS AGE + pod/coredns-5644d7b6d9-mh9ll 1/1 Running 0 34m + pod/coredns-5644d7b6d9-pqd2t 1/1 Running 0 34m + pod/metrics-server-67fb648c5 1/1 Running 0 26s + pod/etcd-minikube 1/1 Running 0 34m + pod/influxdb-grafana-b29w8 2/2 Running 0 26s + pod/kube-addon-manager-minikube 1/1 Running 0 34m + pod/kube-apiserver-minikube 1/1 Running 0 34m + pod/kube-controller-manager-minikube 1/1 Running 0 34m + pod/kube-proxy-rnlps 1/1 Running 0 34m + pod/kube-scheduler-minikube 1/1 Running 0 34m + pod/storage-provisioner 1/1 Running 0 34m + + NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE + service/metrics-server ClusterIP 10.96.241.45 80/TCP 26s + service/kube-dns ClusterIP 10.96.0.10 53/UDP,53/TCP 34m + service/monitoring-grafana NodePort 10.99.24.54 80:30002/TCP 26s + service/monitoring-influxdb ClusterIP 10.111.169.94 8083/TCP,8086/TCP 26s + ``` + +4. Desabilitando o complemento `metrics-server`: + + ```shell + minikube addons disable metrics-server + ``` + + A saída será semelhante a: + + ``` + metrics-server was successfully disabled + ``` + +## Removendo os recursos do Minikube + +Agora você pode remover todos os recursos criados no seu cluster: + +```shell +kubectl delete service hello-node +kubectl delete deployment hello-node +``` +(**Opcional**) Pare a máquina virtual (VM) do Minikube: + +```shell +minikube stop +``` +(**Opcional**) Remova a VM do Minikube: + +```shell +minikube delete +``` + +## Próximos passos + +* Aprender mais sobre [Deployment objects](/docs/concepts/workloads/controllers/deployment/). +* Aprender mais sobre [Deploying applications](/docs/tasks/run-application/run-stateless-application-deployment/). +* Aprender mais sobre [Service objects](/docs/concepts/services-networking/service/). + From 52f35431d9c6d5e8bd16a09e8052632f432fc6ea Mon Sep 17 00:00:00 2001 From: Bin Chen Date: Wed, 10 Feb 2021 16:41:32 +1100 Subject: [PATCH 50/62] service-network: add some clarity to headless service --- content/en/docs/concepts/services-networking/service.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/en/docs/concepts/services-networking/service.md b/content/en/docs/concepts/services-networking/service.md index 83b7850364d98..e8578ac642571 100644 --- a/content/en/docs/concepts/services-networking/service.md +++ b/content/en/docs/concepts/services-networking/service.md @@ -458,7 +458,7 @@ selectors defined: For headless Services that define selectors, the endpoints controller creates `Endpoints` records in the API, and modifies the DNS configuration to return -records (addresses) that point directly to the `Pods` backing the `Service`. +A records (IP addresses) that point directly to the `Pods` backing the `Service`. ### Without selectors From ddf8d77d7ae44a79d607d0c18a1f550134910513 Mon Sep 17 00:00:00 2001 From: Jack Henschel Date: Wed, 10 Feb 2021 10:39:32 +0100 Subject: [PATCH 51/62] Fix column alignment in debug-service.md Previously, the columns showing one of kubectl's output were misaligned and thereby confusing. --- .../en/docs/tasks/debug-application-cluster/debug-service.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/en/docs/tasks/debug-application-cluster/debug-service.md b/content/en/docs/tasks/debug-application-cluster/debug-service.md index 902537595515e..3613e5b2cb9d4 100644 --- a/content/en/docs/tasks/debug-application-cluster/debug-service.md +++ b/content/en/docs/tasks/debug-application-cluster/debug-service.md @@ -421,7 +421,7 @@ Earlier you saw that the Pods were running. You can re-check that: kubectl get pods -l app=hostnames ``` ```none -NAME READY STATUS RESTARTS AGE +NAME READY STATUS RESTARTS AGE hostnames-632524106-bbpiw 1/1 Running 0 1h hostnames-632524106-ly40y 1/1 Running 0 1h hostnames-632524106-tlaok 1/1 Running 0 1h From a1f5566dc0f13aeac7da8ca9a42eeeb6368aeb80 Mon Sep 17 00:00:00 2001 From: Naoki Oketani Date: Wed, 10 Feb 2021 21:33:19 +0900 Subject: [PATCH 52/62] remove command from output block --- .../run-application/run-stateless-application-deployment.md | 1 - 1 file changed, 1 deletion(-) diff --git a/content/en/docs/tasks/run-application/run-stateless-application-deployment.md b/content/en/docs/tasks/run-application/run-stateless-application-deployment.md index df604facf8b7a..62bd984ddc7e3 100644 --- a/content/en/docs/tasks/run-application/run-stateless-application-deployment.md +++ b/content/en/docs/tasks/run-application/run-stateless-application-deployment.md @@ -51,7 +51,6 @@ a Deployment that runs the nginx:1.14.2 Docker image: The output is similar to this: - user@computer:~/website$ kubectl describe deployment nginx-deployment Name: nginx-deployment Namespace: default CreationTimestamp: Tue, 30 Aug 2016 18:11:37 -0700 From 5d973fa5fd325a4c1d5f8822236f8f51c545f5a8 Mon Sep 17 00:00:00 2001 From: Jailton Lopes Date: Wed, 10 Feb 2021 10:13:46 -0300 Subject: [PATCH 53/62] Fix typos in file docs/tutorials/hello-minikube.md --- content/pt/docs/tutorials/hello-minikube.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/content/pt/docs/tutorials/hello-minikube.md b/content/pt/docs/tutorials/hello-minikube.md index 3f6238777b38d..e3f5ebbc2fe31 100644 --- a/content/pt/docs/tutorials/hello-minikube.md +++ b/content/pt/docs/tutorials/hello-minikube.md @@ -29,7 +29,7 @@ Você também consegue seguir os passos desse tutorial instalando o Minikube loc ## Antes de você iniciar -Este tutorial disponibiliza uma imagem de contêiner que utiliza o NGIX para retornar todas as requisições. +Este tutorial disponibiliza uma imagem de contêiner que utiliza o NGINX para retornar todas as requisições. @@ -132,7 +132,7 @@ Por padrão, um Pod só é acessível utilizando o seu endereço IP interno no c kubernetes ClusterIP 10.96.0.1 443/TCP 23m ``` - Em provedores de Cloud que fornecem serviços de balaceamento de carga para o Kubernetes, um IP externo seria provisionado para acessar o serviço. No Minikube, o tipo `LoadBalancer` torna o serviço acessível por meio do comando `minikube service`. + Em provedores de Cloud que fornecem serviços de balanceamento de carga para o Kubernetes, um IP externo seria provisionado para acessar o serviço. No Minikube, o tipo `LoadBalancer` torna o serviço acessível por meio do comando `minikube service`. 3. Executar o comando a seguir: @@ -148,7 +148,7 @@ Isso abre uma janela do navegador, acessa o seu aplicativo e mostra o retorno da ## Habilitando Complementos (addons) -O Minikube inclue um conjunto integrado de {{< glossary_tooltip text="complementos" term_id="addons" >}} que podem ser habilitados, desabilitados e executados no ambiente Kubernetes local. +O Minikube inclui um conjunto integrado de {{< glossary_tooltip text="complementos" term_id="addons" >}} que podem ser habilitados, desabilitados e executados no ambiente Kubernetes local. 1. Listando os complementos suportados atualmente: From dc4836b6263df9723961509f123c8cf373c4cdea Mon Sep 17 00:00:00 2001 From: eTimS Date: Wed, 10 Feb 2021 15:22:48 +0100 Subject: [PATCH 54/62] Minor - Systemd enable command to enable CRI-O at boot time Added "sudo systemctl enable crio enable" to configure systemd to enable CRI-O at boot time, as shown in the CRI-O install.md doc: https://github.com/cri-o/cri-o/blob/master/install.md#user-content-starting-cri-o --- .../en/docs/setup/production-environment/container-runtimes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/content/en/docs/setup/production-environment/container-runtimes.md b/content/en/docs/setup/production-environment/container-runtimes.md index 59725188d806c..f56fc4ede2632 100644 --- a/content/en/docs/setup/production-environment/container-runtimes.md +++ b/content/en/docs/setup/production-environment/container-runtimes.md @@ -420,6 +420,7 @@ Start CRI-O: ```shell sudo systemctl daemon-reload +sudo systemctl enable crio sudo systemctl start crio ``` From f26aab795e55da19f6342b0b1c49e4fdcb5ce148 Mon Sep 17 00:00:00 2001 From: Jailton Lopes Date: Wed, 10 Feb 2021 17:13:31 -0300 Subject: [PATCH 55/62] Fix typo in file docs/tutorials/hello-minikube.md --- content/pt/docs/tutorials/hello-minikube.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/pt/docs/tutorials/hello-minikube.md b/content/pt/docs/tutorials/hello-minikube.md index e3f5ebbc2fe31..0db5d20ddcea5 100644 --- a/content/pt/docs/tutorials/hello-minikube.md +++ b/content/pt/docs/tutorials/hello-minikube.md @@ -7,7 +7,7 @@ menu: title: "Iniciar" weight: 10 post: > -

Pronto para meter a mão na massa? Vamos criar um cluster Kubernetes simples e executar uma aplicacão exemplo.

+

Pronto para meter a mão na massa? Vamos criar um cluster Kubernetes simples e executar uma aplicação exemplo.

card: name: tutorials weight: 10 From f4a96f4e7cd7143d81a14a2b3e79bbdc95c95f1a Mon Sep 17 00:00:00 2001 From: eTimS Date: Thu, 11 Feb 2021 00:27:23 +0100 Subject: [PATCH 56/62] Update content/en/docs/setup/production-environment/container-runtimes.md Co-authored-by: Tim Bannister --- .../en/docs/setup/production-environment/container-runtimes.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/content/en/docs/setup/production-environment/container-runtimes.md b/content/en/docs/setup/production-environment/container-runtimes.md index f56fc4ede2632..5aa4ac894e2e6 100644 --- a/content/en/docs/setup/production-environment/container-runtimes.md +++ b/content/en/docs/setup/production-environment/container-runtimes.md @@ -420,8 +420,7 @@ Start CRI-O: ```shell sudo systemctl daemon-reload -sudo systemctl enable crio -sudo systemctl start crio +sudo systemctl enable crio --now ``` Refer to the [CRI-O installation guide](https://github.com/cri-o/cri-o/blob/master/install.md) From 9a3347cd2d7c1019d04a99d84d2ae7e86c1875a2 Mon Sep 17 00:00:00 2001 From: Bin Chen Date: Thu, 11 Feb 2021 10:40:49 +1100 Subject: [PATCH 57/62] security: add container runtime class as an option to provider extra container security --- content/en/docs/concepts/security/overview.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/content/en/docs/concepts/security/overview.md b/content/en/docs/concepts/security/overview.md index fe9129c109bd8..b23a07c79ab2d 100644 --- a/content/en/docs/concepts/security/overview.md +++ b/content/en/docs/concepts/security/overview.md @@ -120,6 +120,7 @@ Area of Concern for Containers | Recommendation | Container Vulnerability Scanning and OS Dependency Security | As part of an image build step, you should scan your containers for known vulnerabilities. Image Signing and Enforcement | Sign container images to maintain a system of trust for the content of your containers. Disallow privileged users | When constructing containers, consult your documentation for how to create users inside of the containers that have the least level of operating system privilege necessary in order to carry out the goal of the container. +Use container runtime with stronger isolation | Select [container runtime classes](/docs/concepts/containers/runtime-class/) that provider stronger isolation ## Code @@ -152,3 +153,4 @@ Learn about related Kubernetes security topics: * [Data encryption in transit](/docs/tasks/tls/managing-tls-in-a-cluster/) for the control plane * [Data encryption at rest](/docs/tasks/administer-cluster/encrypt-data/) * [Secrets in Kubernetes](/docs/concepts/configuration/secret/) +* [Runtime class](/docs/concepts/containers/runtime-class) From a33e903e3a1f436d3ca7dc6ae75e9da5cf8d1d2c Mon Sep 17 00:00:00 2001 From: Jack Henschel Date: Wed, 10 Feb 2021 12:23:04 +0100 Subject: [PATCH 58/62] Clarify selection of default HPA scaling policy Without first mentioning where the number 40 is coming from, it was a bit unclear why 40 would be the threshold value for policy selection in this case. I hope this patch clarifies it. --- .../run-application/horizontal-pod-autoscale.md | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/content/en/docs/tasks/run-application/horizontal-pod-autoscale.md b/content/en/docs/tasks/run-application/horizontal-pod-autoscale.md index 56a48c8b308ac..763d9ab996624 100644 --- a/content/en/docs/tasks/run-application/horizontal-pod-autoscale.md +++ b/content/en/docs/tasks/run-application/horizontal-pod-autoscale.md @@ -383,7 +383,12 @@ behavior: periodSeconds: 60 ``` -When the number of pods is more than 40 the second policy will be used for scaling down. +`periodSeconds` indicates the length of time in the past for which the policy must hold true. +The first policy _(Pods)_ allows at most 4 replicas to be scaled down in one minute. The second policy +_(Percent)_ allows at most 10% of the current replicas to be scaled down in one minute. + +Since by default the policy which allows the highest amount of change is selected, the second policy will +only be used when the number of pod replicas is more than 40. With 40 or less replicas, the first policy will be applied. For instance if there are 80 replicas and the target has to be scaled down to 10 replicas then during the first step 8 replicas will be reduced. In the next iteration when the number of replicas is 72, 10% of the pods is 7.2 but the number is rounded up to 8. On each loop of @@ -391,10 +396,6 @@ the autoscaler controller the number of pods to be change is re-calculated based of current replicas. When the number of replicas falls below 40 the first policy _(Pods)_ is applied and 4 replicas will be reduced at a time. -`periodSeconds` indicates the length of time in the past for which the policy must hold true. -The first policy allows at most 4 replicas to be scaled down in one minute. The second policy -allows at most 10% of the current replicas to be scaled down in one minute. - The policy selection can be changed by specifying the `selectPolicy` field for a scaling direction. By setting the value to `Min` which would select the policy which allows the smallest change in the replica count. Setting the value to `Disabled` completely disables @@ -441,7 +442,7 @@ behavior: periodSeconds: 15 selectPolicy: Max ``` -For scaling down the stabilization window is _300_ seconds(or the value of the +For scaling down the stabilization window is _300_ seconds (or the value of the `--horizontal-pod-autoscaler-downscale-stabilization` flag if provided). There is only a single policy for scaling down which allows a 100% of the currently running replicas to be removed which means the scaling target can be scaled down to the minimum allowed replicas. From e0e68de173d017c89e6c74c5423e7d3d4f9198e5 Mon Sep 17 00:00:00 2001 From: Naoki Oketani Date: Thu, 11 Feb 2021 18:29:01 +0900 Subject: [PATCH 59/62] style: separate commands from output --- .../run-single-instance-stateful-application.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/content/en/docs/tasks/run-application/run-single-instance-stateful-application.md b/content/en/docs/tasks/run-application/run-single-instance-stateful-application.md index 4c43948a215c8..bdc3b0c524a4f 100644 --- a/content/en/docs/tasks/run-application/run-single-instance-stateful-application.md +++ b/content/en/docs/tasks/run-application/run-single-instance-stateful-application.md @@ -65,6 +65,8 @@ for a secure solution. kubectl describe deployment mysql + The output is similar to this: + Name: mysql Namespace: default CreationTimestamp: Tue, 01 Nov 2016 11:18:45 -0700 @@ -105,6 +107,8 @@ for a secure solution. kubectl get pods -l app=mysql + The output is similar to this: + NAME READY STATUS RESTARTS AGE mysql-63082529-2z3ki 1/1 Running 0 3m @@ -112,6 +116,8 @@ for a secure solution. kubectl describe pvc mysql-pv-claim + The output is similar to this: + Name: mysql-pv-claim Namespace: default StorageClass: From e13caad951ac48d665fa3b8cd8fa177c8d72e0f1 Mon Sep 17 00:00:00 2001 From: Naoki Oketani Date: Thu, 11 Feb 2021 20:04:59 +0900 Subject: [PATCH 60/62] fix an invalid location.hash --- .../run-application/run-replicated-stateful-application.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/en/docs/tasks/run-application/run-replicated-stateful-application.md b/content/en/docs/tasks/run-application/run-replicated-stateful-application.md index 79d779f0df9fb..36e5334f3d5b6 100644 --- a/content/en/docs/tasks/run-application/run-replicated-stateful-application.md +++ b/content/en/docs/tasks/run-application/run-replicated-stateful-application.md @@ -174,7 +174,7 @@ Because the example topology consists of a single primary MySQL server and any n replicas, the script assigns ordinal `0` to be the primary server, and everyone else to be replicas. Combined with the StatefulSet controller's -[deployment order guarantee](/docs/concepts/workloads/controllers/statefulset/#deployment-and-scaling-guarantees/), +[deployment order guarantee](/docs/concepts/workloads/controllers/statefulset/#deployment-and-scaling-guarantees), this ensures the primary MySQL server is Ready before creating replicas, so they can begin replicating. From f141a3c4146a9177a3782bb0341d114e12dd3a60 Mon Sep 17 00:00:00 2001 From: Ricardo Castro Date: Thu, 11 Feb 2021 13:16:12 +0000 Subject: [PATCH 61/62] fix: add missing end --- .../2019-03-15-Kubernetes-setup-using-Ansible-and-Vagrant.md | 1 + 1 file changed, 1 insertion(+) diff --git a/content/en/blog/_posts/2019-03-15-Kubernetes-setup-using-Ansible-and-Vagrant.md b/content/en/blog/_posts/2019-03-15-Kubernetes-setup-using-Ansible-and-Vagrant.md index 8b31d1df0b79b..247748b6f0059 100644 --- a/content/en/blog/_posts/2019-03-15-Kubernetes-setup-using-Ansible-and-Vagrant.md +++ b/content/en/blog/_posts/2019-03-15-Kubernetes-setup-using-Ansible-and-Vagrant.md @@ -66,6 +66,7 @@ Vagrant.configure("2") do |config| end end end +end ``` ### Step 2: Create an Ansible playbook for Kubernetes master. From 69e0994fb09dcbad2379bd24ca1475fe9c0cdcea Mon Sep 17 00:00:00 2001 From: Naoki Oketani Date: Fri, 12 Feb 2021 20:56:51 +0900 Subject: [PATCH 62/62] chore: fix a broken link "FrameworkHandle" --- .../docs/concepts/scheduling-eviction/scheduling-framework.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/en/docs/concepts/scheduling-eviction/scheduling-framework.md b/content/en/docs/concepts/scheduling-eviction/scheduling-framework.md index ae32f840fd8d8..06ed901c2a8bb 100644 --- a/content/en/docs/concepts/scheduling-eviction/scheduling-framework.md +++ b/content/en/docs/concepts/scheduling-eviction/scheduling-framework.md @@ -183,7 +183,7 @@ the three things: {{< note >}} While any plugin can access the list of "waiting" Pods and approve them -(see [`FrameworkHandle`](https://github.com/kubernetes/enhancements/blob/master/keps/sig-scheduling/20180409-scheduling-framework.md#frameworkhandle)), we expect only the permit +(see [`FrameworkHandle`](https://git.k8s.io/enhancements/keps/sig-scheduling/624-scheduling-framework#frameworkhandle)), we expect only the permit plugins to approve binding of reserved Pods that are in "waiting" state. Once a Pod is approved, it is sent to the [PreBind](#pre-bind) phase. {{< /note >}}