From f9cd47f7587498edec7f1952b49aee32f660db17 Mon Sep 17 00:00:00 2001 From: "marcos.silvestrini" Date: Mon, 1 Apr 2024 20:24:01 -0300 Subject: [PATCH] =?UTF-8?q?=F0=9F=94=A7=20upd:=20action?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/readme.yml | 14 +- README.ar.md | 1160 ---------------------------------- README.fr.md | 1160 ---------------------------------- README.md | 14 +- README.pt.md | 1160 ---------------------------------- README.zh-TW.md | 1160 ---------------------------------- 6 files changed, 8 insertions(+), 4660 deletions(-) delete mode 100644 README.ar.md delete mode 100644 README.fr.md delete mode 100644 README.pt.md delete mode 100644 README.zh-TW.md diff --git a/.github/workflows/readme.yml b/.github/workflows/readme.yml index a1dedf1..6c8b747 100644 --- a/.github/workflows/readme.yml +++ b/.github/workflows/readme.yml @@ -14,19 +14,7 @@ jobs: uses: actions/setup-node@v1 with: node-version: 12.x - # ISO Langusge Codes: https://cloud.google.com/translate/docs/languages - - name: Adding README - Chinese Traditional - uses: dephraiim/translate-readme@main - with: - LANG: zh-TW - - name: Adding README - Arabic - uses: dephraiim/translate-readme@main - with: - LANG: ar - - name: Adding README - French - uses: dephraiim/translate-readme@main - with: - LANG: fr + # ISO Langusge Codes: https://cloud.google.com/translate/docs/languages - name: Adding README - Portuguese uses: dephraiim/translate-readme@main with: diff --git a/README.ar.md b/README.ar.md deleted file mode 100644 index 194abe3..0000000 --- a/README.ar.md +++ /dev/null @@ -1,1160 +0,0 @@ -

- -[![PSScriptAnalyzer](https://github.com/marcossilvestrini/learning-kubernetes/actions/workflows/powershell.yml/badge.svg)](https://github.com/marcossilvestrini/learning-kubernetes/actions/workflows/powershell.yml)[![Release](https://github.com/marcossilvestrini/learning-kubernetes/actions/workflows/release.yml/badge.svg)](https://github.com/marcossilvestrini/learning-kubernetes/actions/workflows/release.yml)[![Deploy GitHub Pages](https://github.com/marcossilvestrini/learning-kubernetes/actions/workflows/jekyll-gh-pages.yml/badge.svg)](https://github.com/marcossilvestrini/learning-kubernetes/actions/workflows/jekyll-gh-pages.yml)[![Generate HTML&PDF](https://github.com/marcossilvestrini/learning-kubernetes/actions/workflows/deploy.yml/badge.svg)](https://github.com/marcossilvestrini/learning-kubernetes/actions/workflows/deploy.yml) - -[![MIT License][license-shield]][license-url][![Forks][forks-shield]][forks-url][![Stargazers][stars-shield]][stars-url][![Contributors][contributors-shield]][contributors-url][![Issues][issues-shield]][issues-url][![LinkedIn][linkedin-shield]][linkedin-url] - -# تعلم كوبيرنتس - -![kubernetes Arch](images/kubernetes.jpg) - -![Kubernetes Cluster](/images/k8s-cluster.png) - -

-Explore the docs »
- Main Page - - - Code Page - - - Report Bug - - - Request Feature -

- -## ملخص - -
- TABLE OF CONTENT -
    -
  1. - About The Project -
  2. -
  3. - Getting Started - -
  4. -
  5. Usage
  6. -
  7. Roadmap
  8. -
  9. Linux Namespaces
  10. -
  11. Kubernetes Architecture
  12. -
  13. Install Kubernetes
  14. -
  15. Rancher RKE2
  16. -
  17. Kubectl
  18. -
  19. Containers
  20. -
  21. Pods
  22. -
  23. Deployment
  24. -
  25. Replicaset
  26. -
  27. Daemonset
  28. -
  29. Probes
  30. -
  31. Volumes
  32. -
  33. Statefulset
  34. -
  35. Services
  36. -
  37. Secrets
  38. -
  39. License
  40. -
  41. Contact
  42. -
  43. Acknowledgments
  44. -
-

- - - -## حول المشروع - -> يهدف هذا المشروع إلى مساعدة الطلاب أو المحترفين على تعلم المفاهيم الأساسية لـ kubernetes - -

(back to top)

- - - -## ابدء - -هذا مثال على كيفية تقديم تعليمات حول إعداد مشروعك محليًا. -للحصول على نسخة محلية وتشغيلها، اتبع هذه الخطوات البسيطة. - - - -### المتطلبات الأساسية - -هذا مثال لكيفية إدراج الأشياء التي تحتاجها لاستخدام البرنامج -وكيفية تثبيتها. - -- شخص سخيف -- الصندوق الافتراضي والامتداد -- المتشرد - - - -### تثبيت - -#### مستودع النسخ - -```sh -git clone https://github.com/marcossilvestrini/learning-kubernetes.git -``` - -#### قم بتعيين مفاتيح SSH في مجلد الأمان - -```sh -# generate ssh key pair for your user access hosts -ssh-keygen -q -t ecdsa -b 521 -N '' -f ~/.ssh/id_ecdsa <</dev/null 2>&1 -cp ~/.ssh/id_ecdsa.pub security/ - -# generate ssh key pair for rancher -ssh-keygen -q -t ecdsa -b 521 -N '' -f security/kubernetes-key-ecdsa <</dev/null 2>&1 -``` - -#### تعيين تجمع العقدة - -يمكنك زيادة أو زيادة عدد طائرات التحكم والعاملين في مجموعة Vagrantfile. - -مثال: - -```ruby -... - # Node|Control Plane Servers - PLANES = ["control-plane01", "control-plane02", "control-plane03"] - N = 2 - - (0..N).each do |i| - config.vm.define PLANES[i] do |node| -... -``` - -#### ضبط الشبكة - -قم بتعيين تكوين الشبكة لكل جهاز افتراضي في Vagrantfile. - -مثال: - -```ruby -... -# NETWORK - ol9_server01.vm.network "public_network", nic_type: "virtio", mac: "080027f3066a", ip: "192.168.0.130", netmask: "255.255.255.0", mode: "bridge",bridge: [ - "Intel(R) I211 Gigabit Network Connection", - "MediaTek Wi-Fi 6 MT7921 Wireless LAN" - ] -... -``` - -#### قم بتعيين موارد VM - -قم بتعيين تكوين الموارد كوحدة المعالجة المركزية والذاكرة وما إلى ذلك لكل جهاز افتراضي في Vagrantfile. - -مثال: - -```ruby -... -# PROVIDER -infra_server01.vm.provider "virtualbox" do |vb| - vb.linked_clone = true - vb.name =VM_INFRA_SERVER01 - vb.memory = 2048 - vb.cpus = 1 -end -... -``` - -#### أعلى مجموعة kubernetes - -```sh -cd learning-kubernetes/vagrant/linux -vagrant up -``` - - - -## الاستخدام - -استخدم هذا المستودع للتعرف على اختبار kubernetes - -

(back to top)

- - - -## خريطة الطريق - -- [x] إنشاء مستودع -- [x] إنشاء إجراء جيثب لمهام الأتمتة -- [x] تثبيت مجموعة kubernetes -- [x] قم بتثبيت kubectl -- [x] أضف أمثلة kubernetes -- [x] إضافة نشر التطبيق -- [x] إنشاء صورة عامل إرساء بمحتويات المشروع -- [x] إنشاء إجراء جيثب لبناء صورة عامل الإرساء - -

(back to roadmap)

-

(back to top)

- - - -## مساحات أسماء لينكس - -يعمل محرك kubernetes مع مساحات الأسماء (PID، NET، IPC، MNT، UTS) ومجموعات cgroup. - -![linux-namespaces](images/linux-namespaces.png) - -## معرف الهوية - -معرف العملية هذا الملف عبارة عن مؤشر لمساحة اسم PID الخاصة بالعملية. تعمل مساحات أسماء PID على عزل مساحة رقم معرف العملية، مما يعني أن العمليات في مساحات أسماء PID المختلفة يمكن أن يكون لها نفس معرف المنتج. تسمح مساحات أسماء PID للحاويات بتوفير وظائف مثل تعليق/استئناف مجموعة العمليات في الحاوية وترحيل الحاوية إلى مضيف جديد بينما تحافظ العمليات داخل الحاوية على نفس معرفات PID - -## شبكة - -هذا الملف هو مؤشر لمساحة اسم الشبكة الخاصة بالعملية. وهذا يوفر عزل موارد النظام المرتبطة بالشبكات ويعزل أجهزة الشبكة. يتم استخدام IP netns - لمعالجة إدارة مساحة اسم الشبكة -mount هذا الملف هو مؤشر لمساحة اسم التحميل للعملية ويعزل نقاط التثبيت - -## ipc - -هذا الملف عبارة عن مقبض لمساحة اسم IPC للعملية ويعزل قوائم انتظار رسائل System Vs IPC وPOSIX - -## uts - -هذا الملف عبارة عن مؤشر لمساحة اسم UTS للعملية ويعزل اسم المضيف واسم مجال NIS - -## مستخدم - -هذا الملف هو مؤشر لمساحة اسم المستخدم للعملية - -## com.cgroup - -سيكون للحاوية عرض معزول للتسلسل الهرمي لمجموعة التحكم. - -## cgroup مقابل مساحة الاسم - -_cgroup هي وسيلة للتحكم في مرشح التحكم في حركة المرور على أساس المجموعة، على سبيل المثال_ - -```json -"cgroupsPath": "/myRuntime/myContainer", - "resources": { - "memory": { - "limit": 100000, - "reservation": 200000 - }, - "devices": [ - { - "allow": false, - "access": "rwm" - } - ] - } -``` - -_مساحة الاسم: تحديد/تجريد ما يمكنك رؤيته في نظام التشغيل Linux_ - -الخط:[هتبص://ضغوف.عرج/دكس/لينوكسنمصبك.جسب](https://8gwifi.org/docs/linux-namespace.jsp) - -

(back to linux-namespaces)

-

(back to top)

- -## العمارة كوبرنيتيس - - - -![Kubernetes Architecture](images/kubernetes-architecture.jpg) - -### طائرة مراقبة - -![Control Plane](images/control-plane.jpg) - -### العقدة - -![Control Plane](images/worker.jpg) - -### منافذ كوبيرنيتيس - -![kubernetes control plane ports](images/kubernetes-cp-ports.jpg) - -![kubernetes works ports](images/kubernetes-wk-ports.jpg) - -### منافذ لعقد خادم Rancher على RKE2 - -![RKE2 Ports](images/rke2-ports.png) - -

(back to kubernetes-architecture)

-

(back to top)

- -## قم بتثبيت كوبيرنيت - - - -### قبيح - -```sh -# install -curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 -chmod +x ./minikube -sudo mv ./minikube /usr/local/bin/minikube - -# get version -minikube version - -# set hypervisor -minikube config set driver - -# up without hypervisor -minikube start --driver=hyperkit - -# create cluster -minikube start --nodes 3 -p multinode-cluster - -# get status of cluster -minikube status - -# get ip address -minikube ip - -# access minikube host -minikube ssh - -# dashboard -minikube dashboard - -# logs -minikube logs - -# delete cluster -minikube delete -minikube delete --purge -``` - -### عطوف - -```sh -# Install -curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.14.0/kind-linux-amd64 -chmod +x ./kind -sudo mv ./kind /usr/local/bin/kind - -# create cluster -kind create cluster -kind create cluster --name silvestrini - -# get clusters -kind get clusters - -# delete clusters -kind delete clusters $(kind get clusters) - -## create yaml -cat << EOF > $HOME/kind-3nodes.yaml -kind: Cluster -apiVersion: kind.x-k8s.io/v1alpha4 -nodes: - - role: control-plane - - role: worker - - role: worker -EOF - -# create cluster -kind create cluster --name kind-multinodes --config $HOME/kind-3nodes.yaml -``` - -

(back to install-kubernetes)

-

(back to top)

- -## رقيق - - - -لإنشاء مجموعة kubernetes باستخدام RKE2، راجع البرامج النصية في المجلد scripts/linux/k8s/install-rke2.sh - -### بعض أوامر المكدس rke2 - -قم بتعيين متغير PATH الخاص بك: - -```sh -export PATH=$PATH:/opt/rke2/bin:/var/lib/rancher/rke2/bin -``` - -#### حاوية - أوامر CTR - -```zhs -#list containers using ctr -ctr --address /run/k3s/containerd/containerd.sock --namespace k8s.io container ls -``` - -#### CONTAINERD - أوامر crictl - -```zhs -#list containers using crictl - -## example 1 -export CRI_CONFIG_FILE=/var/lib/rancher/rke2/agent/etc/crictl.yaml -crictl ps - -## example 2 -crictl --config /var/lib/rancher/rke2/agent/etc/crictl.yaml ps - -## example 3 -crictl --runtime-endpoint unix:///run/k3s/containerd/containerd.sock ps -a - - -# stats containers -crictl stats -``` - -### تسجيل - -```sh -journalctl -f -u rke2-server -/var/lib/rancher/rke2/agent/containerd/containerd.log -/var/lib/rancher/rke2/agent/logs/kubelet.log -``` - -مرجع:[هتبص://جيست.جذب.كوم/سوبرسب/٣بحضف٤٧٩٨٩ي٠دبس١٢٩٥٤٨٦س١٨٦يص٤٤بف](https://gist.github.com/superseb/3b78f47989e0dbc1295486c186e944bf) - -

(back to rke2)

-

(back to top)

- -## كوبيكتل - - - -### ثَبَّتَ - -```sh -# install -curl -LO https://storage.googleapis.com/kubernetes-release/release/`curl -s \ -https://storage.googleapis.com/kubernetes-release/release/stable.txt`/bin/linux/amd64/kubectl -chmod +x ./kubectl -mv ./kubectl /usr/local/bin/kubectl - -# get version -kubectl version --output=yaml --client - -# kubectl autocomplete -source <(kubectl completion bash) - -# kubectl alias -alias k=kubectl -complete -F __start_kubectl k -``` - -### الأوامر - كوبيكتل - -```bash - -########## resources ############ - -# list all resources -kubectl get all - -########## namespaces ########### - -# get namespaces -kubectl get namespaces - -# describe namespaces -kubectl describe namespaces - -########## nodes ############ - -# list nodes -kubectl get nodes -kubectl get nodes -o wide - -# delete node -kubectl drain --ignore-daemonsets --delete-emptydir-data -kubectl delete node - -# get logs -kubectl logs my-nginx -kubectl logs -f my-nginx -kubectl logs -n kube-system --all-containers=true etcd-control-plane01 -``` - -

(back to kubectl)

-

(back to top)

- -## حاويات - - - -![Containers](images/docker.jpg) - -### الأوامر - الحاويات - -```sh -# get containers in pod -kubectl -n kube-system describe pods kube-proxy-worker01 | grep -ws -A 10 Containers - -# connect in container -kubectl attach silvestrini -c infra - -# connect in container -kubectl exec -it pod_name -c container_name bash -kubectl exec infra ls -kubectl exec silvestrini -c infra -- ls -kubectl exec silvestrini -c infra -it sh - -# access container in specific namespace -kubectl exec -it -n kube-system kube-proxy-worker01 -c kube-proxy -- bash -``` - -

(back to containers)

-

(back to top)

- -## القرون - - - -![Pod](images/pod.jpg) - -الكبسولة هي أصغر وحدة تنفيذ في Kubernetes. تحتوي الكبسولة على تطبيق واحد أو أكثر.\\ -تعتبر البودات سريعة الزوال بطبيعتها، إذا فشلت الكبسولة (أو العقدة التي يتم تنفيذها عليها)،\\ -يستطيع Kubernetes إنشاء نسخة متماثلة جديدة من تلك الحافظة تلقائيًا لمواصلة العمليات.\\ -تتضمن البودات حاوية واحدة أو أكثر (مثل حاويات Docker). - -توفر القرون أيضًا تبعيات بيئية، بما في ذلك التبعيات المستمرة\\ -أحجام التخزين (التخزين الدائم والمتاح لجميع البودات\\ -في المجموعة) وبيانات التكوين اللازمة لتشغيل الحاوية (الحاويات) داخل الحجرة. - -### الأوامر - القرون - -```sh -# create pods without manifest -kubectl run nginx --image nginx -kubectl run -it --rm debug --image=busybox --restart=Never -- sh - -# create pod with manifest -kubectl apply -f pod-template.yaml -kubectl create -f pod.yaml - -# list pods -kubectl get pods - -# list all pods -kubectl get pods --all-namespaces -kubectl get pods -A -kubectl get pods -A -o wide - -# list pods in specific node -kubectl get pods --all-namespaces -o wide --field-selector spec.nodeName=worker01 - -# list pods in kube-system namespace -kubectl get pod -n kube-system -kubectl get pods -n kube-system -o=jsonpath='{range.items[*]}{"\n"}{.metadata.name}{range.spec.containers}' - -# list pods with specif output -kubectl get pods -n kube-system -o yaml -kubectl get pods -n kube-system -o json - -# list images used in pods -kubectl get pods -o=jsonpath='{range .items[*]}{"\n"}{.metadata.name}{"\t"}{range .spec.containers[*]}{.image}{"\t"}{end}{end}' - -# describe details of pods -kubectl describe pod nginx -kubectl -n kube-system describe pods kube-proxy-worker01 - -# delete pods -kubectl delete pod nginx -kubectl delete -f pod-template.yaml - -# create Service | expose pod -kubectl expose pod my-nginx - -``` - -### فهم موارد الكبسولة - -![Pod Resources](images/resources.jpg) - -

(back to pods)

-

(back to top)

- -## تعيين - - - -![Deployment](images/deployment.jpg) - -يوفر النشر تحديثات تعريفية لـ Pods وReplicaSets. -أنت تصف الحالة المطلوبة في النشر، ووحدة تحكم النشر\\ -يغير الحالة الفعلية إلى الحالة المطلوبة بمعدل متحكم فيه.\\ -يمكنك تحديد عمليات النشر لإنشاء مجموعات نسخ متماثلة جديدة، أو لإزالة\\ الموجودة -عمليات النشر واعتماد جميع مواردها من خلال عمليات النشر الجديدة. - -### الأوامر - النشر - -```sh -# create manifest|template -kubectl run my-nginx --image nginx --port 80 --dry-run=client -o yaml >pod-template.yaml - -# apply\update deployment -kubectl apply -f deployment.yaml - -# list deployments -kubectl get deployments -A -kubectl -n kube-system get deployments.apps -kubectl get deployments -l app=nginx-deployment - -# get pods management by deployment -kubectl get pods -l app=nginx-deployment - -# describe deployment -kubectl describe deployment nginx-deployment - -# check status of deployment -kubectl rollout status deployment nginx-deployment - -# running rollback deployment -kubectl rollout undo deployment nginx-deployment -kubectl rollout undo deployment nginx-deployment --to-revision=1 - -# get deployment history -kubectl rollout history deployment nginx-deployment -kubectl rollout history deployment nginx-deployment --revision=2 - -# pause deployment(block updates) -kubectl rollout pause deployment nginx-deployment - -# resume deployment(allow updates) -kubectl rollout resume deployment nginx-deployment - -# restart deployment (recreate all pods in deployment) -kubectl rollout restart deployment nginx-deployment - -# delete deployment -kubectl delete deployment nginx-deployment -``` - -

(back to deployment)

-

(back to top)

- -## مجموعة النسخ المتماثلة - - - -![ReplicaSet](images/replicaset.jpg) - -الغرض من مجموعة النسخ المتماثلة هو الحفاظ على تشغيل مجموعة ثابتة من العلب المتماثلة\\ -في أي وقت. على هذا النحو، غالبًا ما يتم استخدامه لضمان توفر\\ -عدد محدد من القرون متطابقة. - -### الأوامر - مجموعة النسخ المتماثلة - -````sh -# list replicaset -kubectl get replicaset -l app=nginx-deployment - -# describe replicaset -kubectl describe replicaset nginx-replicaset - -# create replicaset - see folder replicaset/ for examples -kubectl apply -f replicaset.yaml - -# delete replicaset -kubectl delete replicas - -

(back to replicaset)

-

(back to top)

- -## Daemonset - -![Daemonset](images/daemonset.png) - -A DaemonSet ensures that all (or some) Nodes run a copy of a Pod.\ -As nodes are added to the cluster, Pods are added to them.\ -As nodes are removed from the cluster, those Pods are garbage collected.\ -Deleting a DaemonSet will clean up the Pods it created. - -### Commands - Daemonset - -```sh -# list daemonset -kubectl get daemonset -A - -#$ describe daemonset -kubectl describe daemonset node-exporter - -# create daemonset - see folder daemonset/ for examples -kubectl apply -f daemonset.yaml - -# delete daemonset -kubectl delete daemonset node-exporter -```` - -## المجسات - - - -![Probes](images/probes.jpg) - -Kubernetes probes are health checks that are used to monitor the health of applications and services in a Kubernetes cluster.\\ -Kubernetes probes are typically implemented using the Kubernetes API, which allows them to query the application or service for information.\\ -This information can then be used to determine the application's or service's health.\\ -Kubernetes probes can also be used to detect changes in the application or\\ service and send a notification to the Kubernetes control plane, which can\\ then take corrective action. - -### أنواع المجسات - -#### مجسات بدء التشغيل - -يتم استخدام مسبار بدء التشغيل لتحديد ما إذا كانت الحاوية قد بدأت بنجاح.\\ -يُستخدم هذا النوع من المسبار عادةً للتطبيقات التي تستغرق وقتًا أطول لبدء التشغيل،\\ -أو للحاويات التي تقوم بمهام التهيئة قبل أن تصبح جاهزة لاستقبال حركة المرور.\\ -يتم تشغيل مسبار بدء التشغيل مرة واحدة فقط، بعد إنشاء الحاوية، وسيؤدي ذلك إلى تأخير البدء\\ -من الجاهزية والحيوية يسبر غورها حتى تنجح.\\ -إذا فشل مسبار بدء التشغيل، فسيتم اعتبار الحاوية قد فشلت في بدء التشغيل\\ -وسيحاول Kubernetes إعادة تشغيل الحاوية. - -#### تحقيقات الاستعداد - -يتم استخدام مسبار الاستعداد لتحديد ما إذا كانت الحاوية جاهزة لاستقبال حركة المرور.\\ -يتم استخدام هذا النوع من المسبار للتأكد من أن الحاوية جاهزة للعمل بشكل كامل ويمكنها\\ -قبول الاتصالات الواردة قبل إضافتها إلى موازن تحميل الخدمة.\\ -يمكن استخدام مسبار الاستعداد للتحقق من توفر تبعيات التطبيق\\ -أو لإجراء أي فحص آخر يشير إلى أن الحاوية جاهزة لخدمة حركة المرور.\\ -إذا فشل مسبار الاستعداد، تتم إزالة الحاوية من موازن تحميل الخدمة حتى ينجح المسبار مرة أخرى. - -#### مجسات الحياة - -يتم استخدام مسبار الحيوية لتحديد ما إذا كانت الحاوية لا تزال قيد التشغيل وتعمل بشكل صحيح.\\ -يتم استخدام هذا النوع من المسبار للكشف عن أعطال الحاويات أو توقفها والتعافي منها.\\ -يمكن استخدام مسبار الحيوية للتحقق من استجابة التطبيق أو لتنفيذ\\ -أي فحص آخر يدل على أن الحاوية لا تزال حية وبصحة جيدة.\\ -إذا فشل اختبار الحيوية، فسيحاول Kubernetes إعادة تشغيل الحاوية لاستعادة وظائفها. - -

(back to probes)

-

(back to top)

- -## أحجام - - - -![Volumes](images/volumes01.png) - -### فئة التخزين - -![Storage Class](/images/storageclass.png) - -بعض موفري فئة التخزين - -- kubernetes.io/aws-ebs: AWS Elastic Block Store (EBS) -- kubernetes.io/azure-disk: قرص أزور -- kubernetes.io/gce-pd: القرص الثابت لمحرك Google Compute Engine (GCE) -- kubernetes.io/cinder: OpenStack Cinder -- kubernetes.io/vsphere-volume: vSphere -- kubernetes.io/no-provisioner: المجلدات المحلية -- kubernetes.io/host-path: وحدات التخزين المحلية - -### PV - الحجم المستمر - -![PV](images/pv.png) - -بعض أنواع الطاقة الكهروضوئية - -- محلي - - مسار المضيف -- شبكة - - NFS - - بروتوكول iSCSI - - Ceph RBD (جهاز كتلة RAdos) - - جلوسترفس - - موفرو السحابة (EBS، Google Cloud Persistent Disk، Azure Disk Storage) - -#### نوع التخزين (hostPath) - -- hostPath -- nfs -- com.iscsi -- منظمة التضامن المسيحي الدولية -- محلي -- نادي - -### PVC - المطالبة بالحجم المستمر - -![PVC](/images/pvc.png) - -### الأوامر - المجلدات - -```bash -# list storage classes -kubectl get storageclass - -# describe storage class -kubectl describe storageclass silvestrini - -# get storage class provisioners -kubectl get storageclasses.storage.k8s.io -o=jsonpath='{range.items[*]}{.provisioner}{"\n"}' - -# list pv in cluster -kubectl get pv -A - -# describe pv -kubectl describe pv my-pv - -# list pvc -kubectl get pvc -o wide - -# delete pvc -kubectl delete pvc my-pvc - -# describe pvc -kubectl describe pvc my-pvc - -# get events -kubectl get events my-pvc.1772cda2d4c7069b -``` - -

(back to volumes)

-

(back to top)

- -## StatefulSet - - - -![StatefulSet](images/statefulset.png) - -StatefulSet هو كائن واجهة برمجة تطبيقات عبء العمل المستخدم لإدارة التطبيقات ذات الحالة. - -يدير نشر وتوسيع نطاق مجموعة من البودات، ويوفر ضمانات حول ترتيب هذه البودات وتفردها. - -مثل عملية النشر، تقوم StatefulSet بإدارة البودات المستندة إلى مواصفات حاوية متطابقة.\\ -على عكس عملية النشر، تحتفظ مجموعة StatefulSet بهوية ثابتة لكل حاوية من وحداتها.\\ - -يتم إنشاء هذه الكبسولات من نفس المواصفات، ولكنها غير قابلة للتبديل: لكل منها معرف ثابت تحتفظ به خلال أي عملية إعادة جدولة. - -If you want to use storage volumes to provide persistence for your workload,\\ -you can use a StatefulSet as part of the solution. Although individual Pods in\\ -a StatefulSet are susceptible to failure, the persistent Pod identifiers make\\ -it easier to match existing volumes to the new Pods that replace any that have failed. - -### DNS للقرون في StatefulSet - -```sh -...svc.cluster.local -# Example: nginx-0.nginx.default.svc.cluster.local -``` - -### الأوامر - StatefulSet - -```bash -# list statefulsets -kubectl get statefulsets - -# describe statefulsets -kubectl describe statefulsets.apps nginx - -# delete statefulset -kubectl delete statefulset nginx - -# test network service -## create container for test -kubectl run -it --rm --image=busybox --restart=Never -- sh - -## test nslookup -nslookup nginx-0.nginx.default.svc.cluster.local - -## test web page -wget -O- http://nginx-0.nginx.default.svc.cluster.local -``` - -

(back to statefulset)

-

(back to top)

- -## خدمات - - - -![Services](images/services.png) - -تعد خدمة Kubernetes تجريدًا منطقيًا لمجموعة من البودات المنتشرة في المجموعة\\ -(والتي تؤدي جميعها نفس الوظيفة).\\ -نظرًا لأن البودات سريعة الزوال، فإن الخدمة تتيح مجموعة من البودات التي توفر\\ -الوظائف (خدمات الويب، ومعالجة الصور، وما إلى ذلك) ليتم تعيين اسم وIP فريد لها. -العنوان (clusterIP). - -### أنواع الخدمة في Kubernetes - -#### خدمات ClusterIP - -ClusterIP هو نوع الخدمة الافتراضي في Kubernetes، ويوفر اتصالاً داخليًا بين المكونات المختلفة لتطبيقنا. يقوم Kubernetes بتعيين عنوان IP افتراضي لخدمة ClusterIP التي لا يمكن الوصول إليها إلا من داخل المجموعة أثناء إنشائها. عنوان IP هذا مستقر ولا يتغير حتى إذا تمت إعادة جدولة أو استبدال البودات الموجودة خلف الخدمة. - -تعد خدمات ClusterIP خيارًا ممتازًا للاتصال الداخلي بين المكونات المختلفة لتطبيقنا والتي لا تحتاج إلى التعرض للعالم الخارجي. على سبيل المثال، إذا كانت لدينا خدمة صغيرة تعالج البيانات وترسلها إلى خدمة صغيرة أخرى لمزيد من المعالجة، فيمكننا استخدام خدمة ClusterIP لتوصيلها. - -لإنشاء خدمة ClusterIP في Kubernetes، نحتاج إلى تعريفها في ملف YAML وتطبيقها على المجموعة. فيما يلي مثال لتعريف خدمة ClusterIP البسيط: - -```yaml -apiVersion: v1 -kind: Service -metadata: - name: backend -spec: - selector: - app: backend - ports: - - name: http - port: 80 - targetPort: 8080 -``` - -في هذا المثال، نحدد خدمة تسمى الواجهة الخلفية مع محدد يستهدف البودات المسمى بالتطبيق: الواجهة الخلفية. تكشف الخدمة عن المنفذ 80، وهو المنفذ الذي يستخدمه العملاء للوصول إلى الخدمة، وتقوم بإعادة توجيه حركة المرور إلى منفذ البودات 8080، حيث يتم تشغيل تطبيق الواجهة الخلفية. - -#### خدمات نودبورت - -تعمل خدمات NodePort على توسيع وظائف خدمات ClusterIP من خلال تمكين الاتصال الخارجي بتطبيقنا. عندما نقوم بإنشاء خدمة NodePort على أي عقدة داخل المجموعة التي تفي بالمعايير المحددة، يفتح Kubernetes منفذًا معينًا يعيد توجيه حركة المرور إلى خدمة ClusterIP المقابلة التي تعمل على العقدة. - -تعتبر هذه الخدمات مثالية للتطبيقات التي تحتاج إلى إمكانية الوصول إليها من خارج المجموعة، مثل تطبيقات الويب أو واجهات برمجة التطبيقات. باستخدام خدمات NodePort، يمكننا الوصول إلى تطبيقنا باستخدام عنوان IP الخاص بالعقدة ورقم المنفذ المخصص للخدمة. - -دعونا نلقي نظرة على مثال لتعريف خدمة NodePort البسيط: - -```yaml -apiVersion: v1 -kind: Service -metadata: - name: frontend -spec: - selector: - app: frontend - type: NodePort - ports: - - name: http - port: 80 - targetPort: 8080 -``` - -نحدد خدمة تسمى الواجهة الأمامية والتي تستهدف البودات المسمى بالتطبيق: الواجهة الأمامية عن طريق تعيين محدد. تكشف الخدمة عن المنفذ 80 وتعيد توجيه حركة المرور إلى منفذ البودات 8080. قمنا بتعيين نوع الخدمة على NodePort، ويعرض Kubernetes الخدمة على منفذ معين على عقدة مؤهلة داخل المجموعة. - -عندما نقوم بإنشاء خدمة NodePort، يقوم Kubernetes بتعيين رقم منفذ من نطاق محدد مسبقًا من 30000-32767. بالإضافة إلى ذلك، يمكننا تحديد رقم منفذ مخصص عن طريق إضافة حقل NodePort إلى تعريف الخدمة: - -```yaml - -apiVersion: v1 -kind: Service -metadata: - name: frontend -spec: - selector: - app: frontend - type: NodePort - ports: - - name: http - port: 80 - targetPort: 8080 - nodePort: 30080 -``` - -تم تحديد حقلNodePort كـ 30080، والذي يخبر Kubernetes بكشف الخدمة على المنفذ 30080 على كل عقدة في المجموعة. - -#### خدمات موازن التحميل - -تقوم خدمات LoadBalancer بتوصيل تطبيقاتنا خارجيًا، وتستخدمها بيئات الإنتاج عندما يكون التوافر العالي وقابلية التوسع أمرًا بالغ الأهمية. عندما نقوم بإنشاء خدمة LoadBalancer، يقوم Kubernetes بتوفير موازن تحميل في بيئتنا السحابية وإعادة توجيه حركة المرور إلى العقد التي تقوم بتشغيل الخدمة. - -تعتبر خدمات LoadBalancer مثالية للتطبيقات التي تحتاج إلى التعامل مع كميات كبيرة من حركة المرور، مثل تطبيقات الويب أو واجهات برمجة التطبيقات. باستخدام خدمات LoadBalancer، يمكننا الوصول إلى تطبيقنا باستخدام عنوان IP واحد مخصص لموازن التحميل. - -فيما يلي مثال لتعريف خدمة LoadBalancer البسيط: - -```yaml -apiVersion: v1 -kind: Service -metadata: - name: web -spec: - selector: - app: web - type: LoadBalancer - ports: - - name: http - port: 80 - targetPort: 8080 -``` - -قمنا بتعيين نوع الخدمة على LoadBalancer لتوجيه Kubernetes لتوفير موازن التحميل. هنا، نحدد خدمة تسمى web ونحدد محددًا يستهدف البودات المسمى بالتطبيق: web. بالإضافة إلى ذلك، نقوم بكشف المنفذ 80 وتوجيه حركة المرور إلى منفذ البودات 8080. - -بعد إنشاء خدمة LoadBalancer، يوفر Kubernetes موازن تحميل في البيئة السحابية بعنوان IP عام. يمكننا استخدام عنوان IP هذا للوصول إلى تطبيقنا من خارج المجموعة. - -![Services Types](/images/service-types.png) - -مرجع:[هتبص://وو.بالدنج.كوم/عبس/كوبرنتصصرفكتيبس](https://www.baeldung.com/ops/kubernetes-service-types) - -### الأوامر - الخدمات - -```sh -# list services -kubectl get services -kubectl get svc -o wide - -# list services in system namespace -kubectl get svc -n kube-system - -# details of services -kubectl describe svc nginx -kubectl describe svc -n kube-system - -# list endpoints -kubectl get endpoints - -# create ClusterIP service -kubectl expose deployment app-silvestrini --port=80 --target-port=8080 - -# create NodePort service -kubectl expose deployment app-silvestrini --type=NodePort --port=80 --target-port=8080 - -# create loadbalance service -kubectl expose deployment app-silvestrini --type=LoadBalancer --port=80 --target-port=8080 - -#create external name service -kubectl create service externalname app-silvestrini --external-name my-db.skynet.com.br - -# delete service -kubectl delete service nginx -``` - -

(back to services)

-

(back to top)

- -## أسرار - - - -![Secrets](images/secrets.png) - -السر هو كائن يحتوي على كمية صغيرة من البيانات الحساسة مثل كلمة المرور أو الرمز المميز أو المفتاح. قد يتم وضع هذه المعلومات في مواصفات Pod أو في صورة حاوية. استخدام السر يعني أنك لا تحتاج إلى تضمين بيانات سرية في رمز التطبيق الخاص بك. - -نظرًا لأنه يمكن إنشاء الأسرار بشكل مستقل عن البودات التي تستخدمها، فهناك خطر أقل في كشف السر (وبياناته) أثناء سير العمل الخاص بإنشاء البودات وعرضها وتحريرها. يمكن لـ Kubernetes والتطبيقات التي تعمل في مجموعتك أيضًا اتخاذ احتياطات إضافية فيما يتعلق بالأسرار، مثل تجنب كتابة البيانات السرية إلى وحدة تخزين غير متطايرة. - -تشبه الأسرار ConfigMaps ولكنها مصممة خصيصًا للاحتفاظ بالبيانات السرية. - -### أنواع الأسرار - -- الأسرار المبهمة - هذه هي الأسرار الأبسط والأكثر شيوعًا. يقومون بتخزين بيانات عشوائية مثل مفاتيح API وكلمات المرور والرموز المميزة. يتم تشفير الأسرار الغامضة في base64 عند تخزينها في Kubernetes، لكنها غير مشفرة. يمكن استخدامها لتخزين البيانات الحساسة ولكنها ليست آمنة بما يكفي للمعلومات الحساسة للغاية مثل كلمات مرور قاعدة البيانات. - -- kubernetes.io/service-account-token - يُستخدم لتخزين الرموز المميزة للوصول إلى حساب الخدمة. تُستخدم هذه الرموز المميزة لمصادقة Pods باستخدام Kubernetes API. ويتم تثبيتها تلقائيًا في البودات التي تستخدم حسابات الخدمة. - -- kubernetes.io/dockercfg و kubernetes.io/dockerconfigjson - يُستخدم لتخزين بيانات اعتماد تسجيل Docker. يتم استخدامها لمصادقة Pods باستخدام سجل Docker. يتم تركيبها في كبسولات تستخدم صور حاوية خاصة. - -- kubernetes.io/tls وkubernetes.io/ssh-auth وkubernetes.io/basic-auth - يُستخدم لتخزين شهادات TLS ومفاتيح SSH وبيانات اعتماد المصادقة الأساسية، على التوالي. يتم استخدامها لمصادقة Pods مع الخدمات الأخرى. - -- bootstrap.kubernetes.io/token - يُستخدم لتخزين الرموز المميزة للتشغيل العنقودي. يتم استخدامها لمصادقة العقد باستخدام مستوى التحكم Kubernetes. - -### أوامر - أسرار - -```sh -# get secrets -kubectl get secrets -A - -# describe secrets -kubectl describe secret -n cert-manager cert-manager-webhook-ca - -# create opaque secret -kubectl create secret generic silvestrini-secret --from-literal=username=silvestrini --from-literal=password=silvestrini - -# create tls secret -# generate certs -# openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout private-key.key -out cert.crt -kubectl create secret tls my-service-web-tls-secret --cert=cert.crt --key=private-key.key -``` - -

(back to secrets)

-

(back to top)

- -## خرائط التكوين - - - -![ConfigMap](/images/configmap.png) - -إن ConfigMap هو كائن API يُستخدم لتخزين البيانات غير السرية في أزواج قيمة المفتاح.\\ -يمكن أن تستخدم Pods ConfigMaps كمتغيرات بيئة، أو وسيطات سطر أوامر، أو كملفات تكوين في وحدة تخزين. - -يتيح لك ConfigMap فصل التكوين الخاص بالبيئة عن صور الحاوية الخاصة بك، بحيث يمكن نقل تطبيقاتك بسهولة. - -### الأوامر - خرائط التكوين - -```sh -# create configmap -kubectl create configmap nginx-config --from-file=kubernetes/configmaps/nginx.conf - -# get configmaps -kubectl get configmaps - -# describe configmaps -kubectl describe configmaps nginx-config -``` - -

(back to configmap)

-

(back to top)

- -## المساهمة - -المساهمات هي ما يجعل مجتمع المصادر المفتوحة مكانًا رائعًا للتفاعل معه -التعلم والإلهام والإبداع. أي مساهمات تقدمها هي**اقدر هذا جدا**. - -إذا كان لديك اقتراح من شأنه أن يجعل هذا أفضل، يرجى شوكة الريبو و -إنشاء طلب سحب. يمكنك أيضًا ببساطة فتح مشكلة بالعلامة "التحسين". -لا تنسى أن تعطي المشروع نجمة! شكرًا لك مرة أخرى! - -1. شوكة المشروع -2. قم بإنشاء فرع الميزات الخاص بك (`git checkout -b feature/AmazingFeature`) -3. تنفيذ التغييرات (`git commit -m 'Add some AmazingFeature'`) -4. ادفع إلى الفرع (`git push origin feature/AmazingFeature`) -5. افتح طلب السحب - -## رخصة - -- تم ترخيص هذا المشروع بموجب ترخيص MIT \* راجع ملف LICENSE.md للحصول على التفاصيل - -## اتصال - -ماركوس سيلفستريني -[ماركوس.سيلفسترن@جميل.كوم](mailto:marcos.silvestrini@gmail.com)\\[![Twitter](https://img.shields.io/twitter/url/https/twitter.com/mrsilvestrini.svg?style=social&label=Follow%20%40mrsilvestrini)](https://twitter.com/mrsilvestrini) - -رابط المشروع:[هتبص://جذب.كوم/ماركسيلفصترن/ليرننجكبرنتس](https://github.com/marcossilvestrini/learning-kubernetes) - -

(back to top)

- -## شكر وتقدير - -- [CNCF - مؤسسة الحوسبة السحابية الأصلية](https://www.cncf.io/) -- [OCI - مبادرة الحاوية المفتوحة](https://opencontainers.org/) -- [بورغ](https://kubernetes.io/blog/2015/04/borg-predecessor-to-kubernetes/) -- [موقع كوبرنيتس](https://kubernetes.io/) -- [العمارة كوبرنيتيس](https://platform9.com/blog/kubernetes-enterprise-chapter-2-kubernetes-architecture-concepts/) -- [جيثب](https://github.com/kubernetes/kubernetes/) -- [مشاكل](https://github.com/kubernetes/kubernetes/issues) -- [شهادة CKA](https://www.cncf.io/certification/cka/) -- [شهادة سيكاد](https://www.cncf.io/certification/ckad/) -- [شهادة سي كي اس](https://www.cncf.io/certification/cks/) -- [عطوف](https://kind.sigs.k8s.io/docs/user/quick-start) -- [قبيح](https://github.com/kubernetes/minikube) -- [ك0س](https://k0sproject.io/) -- [كعص](https://k3s.io/) -- [رقيق](https://docs.rke2.io/architecture) -- [حتى مجموعة RKE2 HA](https://computingforgeeks.com/deploy-kubernetes-on-rocky-using-rke2/?expand_article=1) -- [أحمال عمل Kubernetes](https://www.suse.com/c/rancher_blog/introduction-to-kubernetes-workloads/) -- [مزود المسار المحلي للمزرعة](https://github.com/rancher/local-path-provisioner) -- [لوحة تحكم Kubernetes](https://upcloud.com/resources/tutorials/deploy-kubernetes-dashboard) -- [إدارة الكتلة Openlens](https://github.com/MuhammedKalkan/OpenLens) -- [كتاب لينكس ملاحظة](https://livro.descomplicandokubernetes.com.br/pt/) -- [خدمات كوبرنيتيس](https://cast.ai/blog/kubernetes-load-balancer-expert-guide-with-examples/) - -

(back to top)

- - - - - -[contributors-shield]: https://img.shields.io/github/contributors/marcossilvestrini/learning-kubernetes.svg?style=for-the-badge - -[contributors-url]: https://github.com/marcossilvestrini/learning-kubernetes/graphs/contributors - -[forks-shield]: https://img.shields.io/github/forks/marcossilvestrini/learning-kubernetes.svg?style=for-the-badge - -[forks-url]: https://github.com/marcossilvestrini/learning-kubernetes/network/members - -[stars-shield]: https://img.shields.io/github/stars/marcossilvestrini/learning-kubernetes.svg?style=for-the-badge - -[stars-url]: https://github.com/marcossilvestrini/learning-kubernetes/stargazers - -[issues-shield]: https://img.shields.io/github/issues/marcossilvestrini/learning-kubernetes.svg?style=for-the-badge - -[issues-url]: https://github.com/marcossilvestrini/learning-kubernetes/issues - -[license-shield]: https://img.shields.io/github/license/marcossilvestrini/learning-kubernetes.svg?style=for-the-badge - -[license-url]: https://github.com/marcossilvestrini/learning-kubernetes/blob/master/LICENSE - -[linkedin-shield]: https://img.shields.io/badge/-LinkedIn-black.svg?style=for-the-badge&logo=linkedin&colorB=555 - -[linkedin-url]: https://linkedin.com/in/marcossilvestrini diff --git a/README.fr.md b/README.fr.md deleted file mode 100644 index 8effe2f..0000000 --- a/README.fr.md +++ /dev/null @@ -1,1160 +0,0 @@ -

- -[![PSScriptAnalyzer](https://github.com/marcossilvestrini/learning-kubernetes/actions/workflows/powershell.yml/badge.svg)](https://github.com/marcossilvestrini/learning-kubernetes/actions/workflows/powershell.yml)[![Release](https://github.com/marcossilvestrini/learning-kubernetes/actions/workflows/release.yml/badge.svg)](https://github.com/marcossilvestrini/learning-kubernetes/actions/workflows/release.yml)[![Deploy GitHub Pages](https://github.com/marcossilvestrini/learning-kubernetes/actions/workflows/jekyll-gh-pages.yml/badge.svg)](https://github.com/marcossilvestrini/learning-kubernetes/actions/workflows/jekyll-gh-pages.yml)[![Generate HTML&PDF](https://github.com/marcossilvestrini/learning-kubernetes/actions/workflows/deploy.yml/badge.svg)](https://github.com/marcossilvestrini/learning-kubernetes/actions/workflows/deploy.yml) - -[![MIT License][license-shield]][license-url][![Forks][forks-shield]][forks-url][![Stargazers][stars-shield]][stars-url][![Contributors][contributors-shield]][contributors-url][![Issues][issues-shield]][issues-url][![LinkedIn][linkedin-shield]][linkedin-url] - -# APPRENTISSAGE DE KUBERNETES - -![kubernetes Arch](images/kubernetes.jpg) - -![Kubernetes Cluster](/images/k8s-cluster.png) - -

-Explore the docs »
- Main Page - - - Code Page - - - Report Bug - - - Request Feature -

- -## Résumé - -
- TABLE OF CONTENT -
    -
  1. - About The Project -
  2. -
  3. - Getting Started - -
  4. -
  5. Usage
  6. -
  7. Roadmap
  8. -
  9. Linux Namespaces
  10. -
  11. Kubernetes Architecture
  12. -
  13. Install Kubernetes
  14. -
  15. Rancher RKE2
  16. -
  17. Kubectl
  18. -
  19. Containers
  20. -
  21. Pods
  22. -
  23. Deployment
  24. -
  25. Replicaset
  26. -
  27. Daemonset
  28. -
  29. Probes
  30. -
  31. Volumes
  32. -
  33. Statefulset
  34. -
  35. Services
  36. -
  37. Secrets
  38. -
  39. License
  40. -
  41. Contact
  42. -
  43. Acknowledgments
  44. -
-

- - - -## À propos du projet - -> Ce projet a pour objectif d'aider les étudiants ou professionnels à apprendre les principaux concepts de kubernetes - -

(back to top)

- - - -## Commencer - -Ceci est un exemple de la façon dont vous pouvez donner des instructions sur la mise en place de votre projet localement. -Pour obtenir une copie locale opérationnelle, suivez ces exemples d’étapes simples. - - - -### Conditions préalables - -Ceci est un exemple de la façon de lister les éléments dont vous avez besoin pour utiliser le logiciel. -et comment les installer. - -- git -- Boîte virtuelle et extension -- Vagabond - - - -### Installation - -#### Cloner le référentiel - -```sh -git clone https://github.com/marcossilvestrini/learning-kubernetes.git -``` - -#### Définir les clés ssh dans le dossier de sécurité - -```sh -# generate ssh key pair for your user access hosts -ssh-keygen -q -t ecdsa -b 521 -N '' -f ~/.ssh/id_ecdsa <</dev/null 2>&1 -cp ~/.ssh/id_ecdsa.pub security/ - -# generate ssh key pair for rancher -ssh-keygen -q -t ecdsa -b 521 -N '' -f security/kubernetes-key-ecdsa <</dev/null 2>&1 -``` - -#### Set Node pool - -Vous pouvez augmenter ou diminuer le nombre de plans de contrôle et de travailleurs dans le tableau Vagrantfile. - -Exemple: - -```ruby -... - # Node|Control Plane Servers - PLANES = ["control-plane01", "control-plane02", "control-plane03"] - N = 2 - - (0..N).each do |i| - config.vm.define PLANES[i] do |node| -... -``` - -#### Définir le réseau - -Définissez la configuration réseau pour chaque VM dans Vagrantfile. - -Exemple: - -```ruby -... -# NETWORK - ol9_server01.vm.network "public_network", nic_type: "virtio", mac: "080027f3066a", ip: "192.168.0.130", netmask: "255.255.255.0", mode: "bridge",bridge: [ - "Intel(R) I211 Gigabit Network Connection", - "MediaTek Wi-Fi 6 MT7921 Wireless LAN" - ] -... -``` - -#### Définir les ressources de la VM - -Définissez la configuration des ressources en tant que CPU, mémoire, etc. pour chaque VM dans Vagrantfile. - -Exemple: - -```ruby -... -# PROVIDER -infra_server01.vm.provider "virtualbox" do |vb| - vb.linked_clone = true - vb.name =VM_INFRA_SERVER01 - vb.memory = 2048 - vb.cpus = 1 -end -... -``` - -#### Monter le cluster Kubernetes - -```sh -cd learning-kubernetes/vagrant/linux -vagrant up -``` - - - -## Usage - -Utilisez ce référentiel pour en savoir plus sur l'examen Kubernetes - -

(back to top)

- - - -## Feuille de route - -- [x] Créer un référentiel -- [x] Créer une action github pour les tâches d'automatisation -- [x] Installer le cluster Kubernetes -- [x] Installer Kubectl -- [x] Ajouter des exemples de Kubernetes -- [x] Ajouter le déploiement d'applications -- [x] Créer une image Docker avec le contenu du projet -- [x] Créer une action github pour créer une image Docker - -

(back to roadmap)

-

(back to top)

- - - -## Espaces de noms Linux - -Kubernetes Engine fonctionne avec les espaces de noms (PID, NET, IPC, MNT, UTS) et les groupes de contrôle. - -![linux-namespaces](images/linux-namespaces.png) - -## pid - -L’ID du processus. Ce fichier est un handle pour l'espace de noms PID du processus. Les espaces de noms PID isolent l'espace du numéro d'identification du processus, ce qui signifie que les processus dans différents espaces de noms PID peuvent avoir le même PID. Les espaces de noms PID permettent aux conteneurs de fournir des fonctionnalités telles que la suspension/la reprise de l'ensemble des processus dans le conteneur et la migration du conteneur vers un nouvel hôte tandis que les processus à l'intérieur du conteneur conservent les mêmes PID. - -## filet - -Ce fichier est un handle pour l'espace de noms réseau du processus. Cela permet d'isoler les ressources système associées au réseau et d'isoler les périphériques réseau. L'ip netns - est utilisé pour traiter la gestion de l'espace de noms du réseau -mount Ce fichier est un handle pour l'espace de noms de montage du processus et isole les points de montage - -## CIP - -Ce fichier est un handle pour l'espace de noms IPC du processus et isole les files d'attente de messages System Vs IPC et POSIX. - -## uts - -Ce fichier est un handle pour l'espace de noms UTS du processus et isole le nom d'hôte et le nom de domaine NIS. - -## utilisateur - -Ce fichier est un handle pour l'espace de noms utilisateur du processus - -## groupe de contrôle - -le conteneur aura une vue isolée de la hiérarchie du groupe de contrôle. - -## groupe de contrôle et espace de noms - -_cgroup est un moyen de contrôler le filtre de contrôle du trafic basé sur un groupe, exemple_ - -```json -"cgroupsPath": "/myRuntime/myContainer", - "resources": { - "memory": { - "limit": 100000, - "reservation": 200000 - }, - "devices": [ - { - "allow": false, - "access": "rwm" - } - ] - } -``` - -_espace de noms : Limiter/abstraction ce que vous pouvez voir dans le processus Linux_ - -Font: - -

(back to linux-namespaces)

-

(back to top)

- -## Architecture Kubernetes - - - -![Kubernetes Architecture](images/kubernetes-architecture.jpg) - -### Avion de contrôle - -![Control Plane](images/control-plane.jpg) - -### Nœud - -![Control Plane](images/worker.jpg) - -### Ports Kubernetes - -![kubernetes control plane ports](images/kubernetes-cp-ports.jpg) - -![kubernetes works ports](images/kubernetes-wk-ports.jpg) - -### Ports pour les nœuds de serveur Rancher sur RKE2 - -![RKE2 Ports](images/rke2-ports.png) - -

(back to kubernetes-architecture)

-

(back to top)

- -## Installer Kubernetes - - - -### Laid - -```sh -# install -curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 -chmod +x ./minikube -sudo mv ./minikube /usr/local/bin/minikube - -# get version -minikube version - -# set hypervisor -minikube config set driver - -# up without hypervisor -minikube start --driver=hyperkit - -# create cluster -minikube start --nodes 3 -p multinode-cluster - -# get status of cluster -minikube status - -# get ip address -minikube ip - -# access minikube host -minikube ssh - -# dashboard -minikube dashboard - -# logs -minikube logs - -# delete cluster -minikube delete -minikube delete --purge -``` - -### Gentil - -```sh -# Install -curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.14.0/kind-linux-amd64 -chmod +x ./kind -sudo mv ./kind /usr/local/bin/kind - -# create cluster -kind create cluster -kind create cluster --name silvestrini - -# get clusters -kind get clusters - -# delete clusters -kind delete clusters $(kind get clusters) - -## create yaml -cat << EOF > $HOME/kind-3nodes.yaml -kind: Cluster -apiVersion: kind.x-k8s.io/v1alpha4 -nodes: - - role: control-plane - - role: worker - - role: worker -EOF - -# create cluster -kind create cluster --name kind-multinodes --config $HOME/kind-3nodes.yaml -``` - -

(back to install-kubernetes)

-

(back to top)

- -## délicat - - - -Pour créer un cluster Kubernetes à l'aide de RKE2, consultez les scripts dans le dossier scripts/linux/k8s/install-rke2.sh - -### Quelques commandes de la stack rke2 - -Définissez votre variable PATH : - -```sh -export PATH=$PATH:/opt/rke2/bin:/var/lib/rancher/rke2/bin -``` - -#### CONTAINERD - Commandes ctr - -```zhs -#list containers using ctr -ctr --address /run/k3s/containerd/containerd.sock --namespace k8s.io container ls -``` - -#### CONTAINERD - Commandes crictl - -```zhs -#list containers using crictl - -## example 1 -export CRI_CONFIG_FILE=/var/lib/rancher/rke2/agent/etc/crictl.yaml -crictl ps - -## example 2 -crictl --config /var/lib/rancher/rke2/agent/etc/crictl.yaml ps - -## example 3 -crictl --runtime-endpoint unix:///run/k3s/containerd/containerd.sock ps -a - - -# stats containers -crictl stats -``` - -### Enregistrement - -```sh -journalctl -f -u rke2-server -/var/lib/rancher/rke2/agent/containerd/containerd.log -/var/lib/rancher/rke2/agent/logs/kubelet.log -``` - -Référence: - -

(back to rke2)

-

(back to top)

- -## Kubectl - - - -### Installer - -```sh -# install -curl -LO https://storage.googleapis.com/kubernetes-release/release/`curl -s \ -https://storage.googleapis.com/kubernetes-release/release/stable.txt`/bin/linux/amd64/kubectl -chmod +x ./kubectl -mv ./kubectl /usr/local/bin/kubectl - -# get version -kubectl version --output=yaml --client - -# kubectl autocomplete -source <(kubectl completion bash) - -# kubectl alias -alias k=kubectl -complete -F __start_kubectl k -``` - -### Commandes - Kubectl - -```bash - -########## resources ############ - -# list all resources -kubectl get all - -########## namespaces ########### - -# get namespaces -kubectl get namespaces - -# describe namespaces -kubectl describe namespaces - -########## nodes ############ - -# list nodes -kubectl get nodes -kubectl get nodes -o wide - -# delete node -kubectl drain --ignore-daemonsets --delete-emptydir-data -kubectl delete node - -# get logs -kubectl logs my-nginx -kubectl logs -f my-nginx -kubectl logs -n kube-system --all-containers=true etcd-control-plane01 -``` - -

(back to kubectl)

-

(back to top)

- -## Conteneurs - - - -![Containers](images/docker.jpg) - -### Commandes - Conteneurs - -```sh -# get containers in pod -kubectl -n kube-system describe pods kube-proxy-worker01 | grep -ws -A 10 Containers - -# connect in container -kubectl attach silvestrini -c infra - -# connect in container -kubectl exec -it pod_name -c container_name bash -kubectl exec infra ls -kubectl exec silvestrini -c infra -- ls -kubectl exec silvestrini -c infra -it sh - -# access container in specific namespace -kubectl exec -it -n kube-system kube-proxy-worker01 -c kube-proxy -- bash -``` - -

(back to containers)

-

(back to top)

- -## Gousses - - - -![Pod](images/pod.jpg) - -Un pod est la plus petite unité d'exécution de Kubernetes. Un pod encapsule une ou plusieurs applications.\\ -Les pods sont éphémères par nature, si un pod (ou le nœud sur lequel il s'exécute) échoue,\\ -Kubernetes peut créer automatiquement une nouvelle réplique de ce pod pour poursuivre les opérations.\\ -Les pods incluent un ou plusieurs conteneurs (tels que des conteneurs Docker). - -Les pods fournissent également des dépendances environnementales, notamment des dépendances persistantes\\ -volumes de stockage (stockage permanent et disponible pour tous les pods\\ -dans le cluster) et les données de configuration nécessaires pour exécuter le(s) conteneur(s) dans le pod. - -### Commandes - Pods - -```sh -# create pods without manifest -kubectl run nginx --image nginx -kubectl run -it --rm debug --image=busybox --restart=Never -- sh - -# create pod with manifest -kubectl apply -f pod-template.yaml -kubectl create -f pod.yaml - -# list pods -kubectl get pods - -# list all pods -kubectl get pods --all-namespaces -kubectl get pods -A -kubectl get pods -A -o wide - -# list pods in specific node -kubectl get pods --all-namespaces -o wide --field-selector spec.nodeName=worker01 - -# list pods in kube-system namespace -kubectl get pod -n kube-system -kubectl get pods -n kube-system -o=jsonpath='{range.items[*]}{"\n"}{.metadata.name}{range.spec.containers}' - -# list pods with specif output -kubectl get pods -n kube-system -o yaml -kubectl get pods -n kube-system -o json - -# list images used in pods -kubectl get pods -o=jsonpath='{range .items[*]}{"\n"}{.metadata.name}{"\t"}{range .spec.containers[*]}{.image}{"\t"}{end}{end}' - -# describe details of pods -kubectl describe pod nginx -kubectl -n kube-system describe pods kube-proxy-worker01 - -# delete pods -kubectl delete pod nginx -kubectl delete -f pod-template.yaml - -# create Service | expose pod -kubectl expose pod my-nginx - -``` - -### Comprendre les ressources des pods - -![Pod Resources](images/resources.jpg) - -

(back to pods)

-

(back to top)

- -## Déploiement - - - -![Deployment](images/deployment.jpg) - -Un déploiement fournit des mises à jour déclaratives pour les pods et les ReplicaSets. -Vous décrivez un état souhaité dans un déploiement et le contrôleur de déploiement\\ -change l'état réel en l'état souhaité à un rythme contrôlé.\\ -Vous pouvez définir des déploiements pour créer de nouveaux ReplicaSets ou pour supprimer des\\ -Déploiements et adopter toutes leurs ressources avec de nouveaux déploiements. - -### Commandes - Déploiement - -```sh -# create manifest|template -kubectl run my-nginx --image nginx --port 80 --dry-run=client -o yaml >pod-template.yaml - -# apply\update deployment -kubectl apply -f deployment.yaml - -# list deployments -kubectl get deployments -A -kubectl -n kube-system get deployments.apps -kubectl get deployments -l app=nginx-deployment - -# get pods management by deployment -kubectl get pods -l app=nginx-deployment - -# describe deployment -kubectl describe deployment nginx-deployment - -# check status of deployment -kubectl rollout status deployment nginx-deployment - -# running rollback deployment -kubectl rollout undo deployment nginx-deployment -kubectl rollout undo deployment nginx-deployment --to-revision=1 - -# get deployment history -kubectl rollout history deployment nginx-deployment -kubectl rollout history deployment nginx-deployment --revision=2 - -# pause deployment(block updates) -kubectl rollout pause deployment nginx-deployment - -# resume deployment(allow updates) -kubectl rollout resume deployment nginx-deployment - -# restart deployment (recreate all pods in deployment) -kubectl rollout restart deployment nginx-deployment - -# delete deployment -kubectl delete deployment nginx-deployment -``` - -

(back to deployment)

-

(back to top)

- -## Jeu de réplicas - - - -![ReplicaSet](images/replicaset.jpg) - -Le but d'un ReplicaSet est de maintenir un ensemble stable de pods de réplique en cours d'exécution\\ -n'importe quand. A ce titre, il est souvent utilisé pour garantir la disponibilité de\\ -un nombre spécifié de pods identiques. - -### Commandes - ReplicaSet - -````sh -# list replicaset -kubectl get replicaset -l app=nginx-deployment - -# describe replicaset -kubectl describe replicaset nginx-replicaset - -# create replicaset - see folder replicaset/ for examples -kubectl apply -f replicaset.yaml - -# delete replicaset -kubectl delete replicas - -

(back to replicaset)

-

(back to top)

- -## Daemonset - -![Daemonset](images/daemonset.png) - -A DaemonSet ensures that all (or some) Nodes run a copy of a Pod.\ -As nodes are added to the cluster, Pods are added to them.\ -As nodes are removed from the cluster, those Pods are garbage collected.\ -Deleting a DaemonSet will clean up the Pods it created. - -### Commands - Daemonset - -```sh -# list daemonset -kubectl get daemonset -A - -#$ describe daemonset -kubectl describe daemonset node-exporter - -# create daemonset - see folder daemonset/ for examples -kubectl apply -f daemonset.yaml - -# delete daemonset -kubectl delete daemonset node-exporter -```` - -## Sondes - - - -![Probes](images/probes.jpg) - -Les sondes Kubernetes sont des vérifications de l'état utilisées pour surveiller l'état des applications et des services dans un cluster Kubernetes.\\ -Les sondes Kubernetes sont généralement implémentées à l'aide de l'API Kubernetes, qui leur permet d'interroger l'application ou le service pour obtenir des informations.\\ -Ces informations peuvent ensuite être utilisées pour déterminer l'état de santé de l'application ou du service.\\ -Les sondes Kubernetes peuvent également être utilisées pour détecter les modifications apportées à l'application ou au service et envoyer une notification au plan de contrôle Kubernetes, qui peut ensuite prendre des mesures correctives. - -### Types de sondes - -#### Sondes de démarrage - -Une sonde de démarrage est utilisée pour déterminer si un conteneur a démarré avec succès.\\ -Ce type de sonde est généralement utilisé pour les applications dont le démarrage prend plus de temps,\\ -ou pour les conteneurs qui effectuent des tâches d'initialisation avant d'être prêts à recevoir du trafic.\\ -La sonde de démarrage n'est exécutée qu'une seule fois, après la création du conteneur, et elle retardera le démarrage\\ -des sondes de préparation et de vivacité jusqu'à ce qu'elles réussissent. -Si la sonde de démarrage échoue, le conteneur est considéré comme n'ayant pas pu démarrer\\ -et Kubernetes tentera de redémarrer le conteneur. - -#### Sondes de préparation - -Une sonde de préparation est utilisée pour déterminer si un conteneur est prêt à recevoir du trafic.\\ -Ce type de sonde est utilisé pour garantir qu'un conteneur est entièrement opérationnel et peut\\ -accepter les connexions entrantes avant de les ajouter à l'équilibreur de charge du service.\\ -Une sonde de préparation peut être utilisée pour vérifier la disponibilité des dépendances d'une application\\ -ou pour effectuer toute autre vérification indiquant que le conteneur est prêt à desservir le trafic.\\ -Si la sonde de préparation échoue, le conteneur est supprimé de l'équilibreur de charge de service jusqu'à ce que la sonde réussisse à nouveau. - -#### Sondes de vivacité - -Une sonde d'activité est utilisée pour déterminer si un conteneur est toujours en cours d'exécution et fonctionne correctement.\\ -Ce type de sonde est utilisé pour détecter et récupérer des pannes ou des blocages de conteneur.\\ -Une sonde d'activité peut être utilisée pour vérifier la réactivité d'une application ou pour effectuer\\ -toute autre vérification indiquant que le conteneur est toujours vivant et sain.\\ -Si la sonde d'activité échoue, Kubernetes tentera de redémarrer le conteneur pour restaurer ses fonctionnalités. - -

(back to probes)

-

(back to top)

- -## Volumes - - - -![Volumes](images/volumes01.png) - -### Classe de stockage - -![Storage Class](/images/storageclass.png) - -Certains fournisseurs de classes de stockage - -- kubernetes.io/aws-ebs : AWS Elastic Block Store (EBS) -- kubernetes.io/azure-disk : disque Azure -- kubernetes.io/gce-pd : disque persistant de Google Compute Engine (GCE) -- kubernetes.io/cinder : OpenStack Cinder -- kubernetes.io/vsphere-volume : vSphere -- kubernetes.io/no-provisioner: Volumes locais -- kubernetes.io/host-path : volumes locaux - -### PV - Volume persistant - -![PV](images/pv.png) - -Certains types de PV - -- Locale - - Chemin d'hôte -- Réseau - - NFS - - iSCSI - - Ceph RBD (dispositif de blocage RAdos) - - GlusterFS - - Fournisseurs de cloud (EBS, disque persistant Google Cloud, stockage sur disque Azure) - -#### Type de stockage (hostPath) - -- cheminhôte -- nfs -- iscsi -- CSI -- locale -- fc - -### PVC – Réclamation de volume persistante - -![PVC](/images/pvc.png) - -### Commandes - Volumes - -```bash -# list storage classes -kubectl get storageclass - -# describe storage class -kubectl describe storageclass silvestrini - -# get storage class provisioners -kubectl get storageclasses.storage.k8s.io -o=jsonpath='{range.items[*]}{.provisioner}{"\n"}' - -# list pv in cluster -kubectl get pv -A - -# describe pv -kubectl describe pv my-pv - -# list pvc -kubectl get pvc -o wide - -# delete pvc -kubectl delete pvc my-pvc - -# describe pvc -kubectl describe pvc my-pvc - -# get events -kubectl get events my-pvc.1772cda2d4c7069b -``` - -

(back to volumes)

-

(back to top)

- -## Ensemble avec état - - - -![StatefulSet](images/statefulset.png) - -StatefulSet est l'objet API de charge de travail utilisé pour gérer les applications avec état. - -Gère le déploiement et la mise à l'échelle d'un ensemble de pods, et fournit des garanties sur l'ordre et l'unicité de ces pods. - -Comme un déploiement, un StatefulSet gère les pods basés sur une spécification de conteneur identique.\\ -Contrairement à un déploiement, un StatefulSet conserve une identité persistante pour chacun de ses pods.\\ - -Ces pods sont créés à partir de la même spécification, mais ne sont pas interchangeables : chacun possède un identifiant persistant qu'il conserve lors de toute replanification. - -Si vous souhaitez utiliser des volumes de stockage pour assurer la persistance de votre charge de travail,\\ -vous pouvez utiliser un StatefulSet dans le cadre de la solution. Bien que les pods individuels dans\\ -un StatefulSet est susceptible d'échouer, les identifiants de Pod persistants font\\ -il est plus facile de faire correspondre les volumes existants aux nouveaux pods qui remplacent ceux qui sont en panne. - -### DNS pour les pods dans StatefulSet - -```sh -...svc.cluster.local -# Example: nginx-0.nginx.default.svc.cluster.local -``` - -### Commandes - StatefulSet - -```bash -# list statefulsets -kubectl get statefulsets - -# describe statefulsets -kubectl describe statefulsets.apps nginx - -# delete statefulset -kubectl delete statefulset nginx - -# test network service -## create container for test -kubectl run -it --rm --image=busybox --restart=Never -- sh - -## test nslookup -nslookup nginx-0.nginx.default.svc.cluster.local - -## test web page -wget -O- http://nginx-0.nginx.default.svc.cluster.local -``` - -

(back to statefulset)

-

(back to top)

- -## Prestations de service - - - -![Services](images/services.png) - -Un service Kubernetes est une abstraction logique pour un groupe de pods déployés dans un cluster\\ -(qui remplissent tous la même fonction).\\ -Les pods étant éphémères, un service active un groupe de pods, qui fournissent des informations spécifiques\\ -fonctions (web services, traitement d'images, etc.) à attribuer un nom et une IP unique\\ -adresse (clusterIP). - -### Types de services dans Kubernetes - -#### Services ClusterIP - -ClusterIP est le type de service par défaut dans Kubernetes et fournit une connectivité interne entre les différents composants de notre application. Kubernetes attribue une adresse IP virtuelle à un service ClusterIP accessible uniquement depuis l'intérieur du cluster lors de sa création. Cette adresse IP est stable et ne change pas même si les pods derrière le service sont reprogrammés ou remplacés. - -Les services ClusterIP sont un excellent choix pour la communication interne entre les différents composants de notre application qui n'ont pas besoin d'être exposés au monde extérieur. Par exemple, si nous disposons d'un microservice qui traite les données et les envoie à un autre microservice pour un traitement ultérieur, nous pouvons utiliser un service ClusterIP pour les connecter. - -Pour créer un service ClusterIP dans Kubernetes, nous devons le définir dans un fichier YAML et l'appliquer au cluster. Voici un exemple de définition simple de service ClusterIP : - -```yaml -apiVersion: v1 -kind: Service -metadata: - name: backend -spec: - selector: - app: backend - ports: - - name: http - port: 80 - targetPort: 8080 -``` - -Dans cet exemple, nous définissons un service nommé backend avec un sélecteur qui cible les pods étiquetés avec app: backend. Le service expose le port 80, qui est le port utilisé par les clients pour accéder au service, et transfère le trafic vers le port 8080 des pods, où l'application backend est exécutée. - -#### Services NodePort - -Les services NodePort étendent les fonctionnalités des services ClusterIP en permettant une connectivité externe à notre application. Lorsque nous créons un service NodePort sur n'importe quel nœud du cluster qui répond aux critères définis, Kubernetes ouvre un port désigné qui transfère le trafic vers le service ClusterIP correspondant exécuté sur le nœud. - -Ces services sont idéaux pour les applications qui doivent être accessibles depuis l'extérieur du cluster, telles que les applications Web ou les API. Avec les services NodePort, nous pouvons accéder à notre application en utilisant l'adresse IP du nœud et le numéro de port attribué au service. - -Examinons un exemple de définition simple d'un service NodePort : - -```yaml -apiVersion: v1 -kind: Service -metadata: - name: frontend -spec: - selector: - app: frontend - type: NodePort - ports: - - name: http - port: 80 - targetPort: 8080 -``` - -Nous définissons un service nommé frontend qui cible les pods étiquetés avec app: frontend en définissant un sélecteur. Le service expose le port 80 et transfère le trafic vers le port 8080 des pods. Nous définissons le type de service sur NodePort et Kubernetes expose le service sur un port spécifique sur un nœud qualifié au sein du cluster. - -Lorsque nous créons un service NodePort, Kubernetes attribue un numéro de port parmi une plage prédéfinie de 30000 à 32767. De plus, nous pouvons spécifier un numéro de port personnalisé en ajoutant le champ nodePort à la définition du service : - -```yaml - -apiVersion: v1 -kind: Service -metadata: - name: frontend -spec: - selector: - app: frontend - type: NodePort - ports: - - name: http - port: 80 - targetPort: 8080 - nodePort: 30080 -``` - -Le champ nodePort est spécifié comme 30080, ce qui indique à Kubernetes d'exposer le service sur le port 30080 sur chaque nœud du cluster. - -#### Services d'équilibrage de charge - -Les services LoadBalancer connectent nos applications en externe et les environnements de production les utilisent là où la haute disponibilité et l'évolutivité sont essentielles. Lorsque nous créons un service LoadBalancer, Kubernetes provisionne un équilibreur de charge dans notre environnement cloud et transfère le trafic vers les nœuds exécutant le service. - -Les services LoadBalancer sont idéaux pour les applications qui doivent gérer des volumes de trafic élevés, telles que les applications Web ou les API. Avec les services LoadBalancer, nous pouvons accéder à notre application en utilisant une seule adresse IP attribuée à l'équilibreur de charge. - -Voici un exemple de définition simple du service LoadBalancer : - -```yaml -apiVersion: v1 -kind: Service -metadata: - name: web -spec: - selector: - app: web - type: LoadBalancer - ports: - - name: http - port: 80 - targetPort: 8080 -``` - -Nous définissons le type de service sur LoadBalancer pour demander à Kubernetes de provisionner un équilibreur de charge. Ici, nous définissons un service nommé web et spécifions un sélecteur qui cible les pods étiquetés avec app: web. De plus, nous exposons le port 80 et transmettons le trafic vers le port 8080 des pods. - -Après avoir créé le service LoadBalancer, Kubernetes provisionne un équilibreur de charge dans l'environnement cloud avec une adresse IP publique. Nous pouvons utiliser cette adresse IP pour accéder à notre application depuis l'extérieur du cluster. - -![Services Types](/images/service-types.png) - -Référence: - -### Commandes - Services - -```sh -# list services -kubectl get services -kubectl get svc -o wide - -# list services in system namespace -kubectl get svc -n kube-system - -# details of services -kubectl describe svc nginx -kubectl describe svc -n kube-system - -# list endpoints -kubectl get endpoints - -# create ClusterIP service -kubectl expose deployment app-silvestrini --port=80 --target-port=8080 - -# create NodePort service -kubectl expose deployment app-silvestrini --type=NodePort --port=80 --target-port=8080 - -# create loadbalance service -kubectl expose deployment app-silvestrini --type=LoadBalancer --port=80 --target-port=8080 - -#create external name service -kubectl create service externalname app-silvestrini --external-name my-db.skynet.com.br - -# delete service -kubectl delete service nginx -``` - -

(back to services)

-

(back to top)

- -## Secrets - - - -![Secrets](images/secrets.png) - -Un secret est un objet qui contient une petite quantité de données sensibles telles qu'un mot de passe, un jeton ou une clé. Ces informations pourraient autrement être placées dans une spécification de pod ou dans une image de conteneur. L'utilisation d'un secret signifie que vous n'avez pas besoin d'inclure de données confidentielles dans le code de votre application. - -Étant donné que les secrets peuvent être créés indépendamment des pods qui les utilisent, il y a moins de risque que le secret (et ses données) soient exposés pendant le flux de travail de création, d'affichage et de modification des pods. Kubernetes et les applications qui s'exécutent dans votre cluster peuvent également prendre des précautions supplémentaires avec les secrets, par exemple en évitant d'écrire des données secrètes sur un stockage non volatile. - -Les secrets sont similaires aux ConfigMaps mais sont spécifiquement destinés à contenir des données confidentielles. - -### Types de secrets - -- Secrets opaques – ce sont les secrets les plus simples et les plus courants. Ils stockent des données arbitraires telles que des clés API, des mots de passe et des jetons. Les secrets opaques sont codés en base64 lorsqu'ils sont stockés dans Kubernetes, mais ils ne sont pas chiffrés. Ils peuvent être utilisés pour stocker des données sensibles, mais ne sont pas suffisamment sécurisés pour les informations hautement sensibles telles que les mots de passe des bases de données. - -- kubernetes.io/service-account-token - utilisé pour stocker les jetons d'accès au compte de service. Ces jetons sont utilisés pour authentifier les pods avec l'API Kubernetes. Ils sont automatiquement montés dans les pods qui utilisent des comptes de service. - -- kubernetes.io/dockercfg et kubernetes.io/dockerconfigjson - utilisés pour stocker les informations d'identification du registre Docker. Ils sont utilisés pour authentifier les Pods auprès d’un registre Docker. Ils sont montés dans des pods qui utilisent des images de conteneurs privés. - -- kubernetes.io/tls, kubernetes.io/ssh-auth, and kubernetes.io/basic-auth - used to store TLS certificates, SSH keys, and basic authentication credentials, respectively. They are used to authenticate Pods with other services. - -- bootstrap.kubernetes.io/token - utilisé pour stocker les jetons d'amorçage du cluster. Ils sont utilisés pour authentifier les nœuds auprès du plan de contrôle Kubernetes. - -### Commandes - Secrets - -```sh -# get secrets -kubectl get secrets -A - -# describe secrets -kubectl describe secret -n cert-manager cert-manager-webhook-ca - -# create opaque secret -kubectl create secret generic silvestrini-secret --from-literal=username=silvestrini --from-literal=password=silvestrini - -# create tls secret -# generate certs -# openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout private-key.key -out cert.crt -kubectl create secret tls my-service-web-tls-secret --cert=cert.crt --key=private-key.key -``` - -

(back to secrets)

-

(back to top)

- -## Cartes de configuration - - - -![ConfigMap](/images/configmap.png) - -Un ConfigMap est un objet API utilisé pour stocker des données non confidentielles dans des paires clé-valeur.\\ -Les pods peuvent utiliser des ConfigMaps en tant que variables d'environnement, arguments de ligne de commande ou en tant que fichiers de configuration dans un volume. - -Un ConfigMap vous permet de découpler la configuration spécifique à l'environnement de vos images de conteneur, afin que vos applications soient facilement portables. - -### Commandes - ConfigMaps - -```sh -# create configmap -kubectl create configmap nginx-config --from-file=kubernetes/configmaps/nginx.conf - -# get configmaps -kubectl get configmaps - -# describe configmaps -kubectl describe configmaps nginx-config -``` - -

(back to configmap)

-

(back to top)

- -## Contribuant - -Les contributions sont ce qui fait de la communauté open source un endroit si formidable pour -apprendre, inspirer et créer. Toutes les contributions que vous apportez sont**très appréciée**. - -Si vous avez une suggestion pour améliorer les choses, veuillez créer le dépôt et -créer une pull request. Vous pouvez aussi simplement ouvrir un ticket avec la balise « amélioration ». -N'oubliez pas de donner une étoile au projet ! Merci encore! - -1. Forkez le projet -2. Créez votre branche de fonctionnalités (`git checkout -b feature/AmazingFeature`) -3. Validez vos modifications (`git commit -m 'Add some AmazingFeature'`) -4. Pousser vers la succursale (`git push origin feature/AmazingFeature`) -5. Ouvrir une demande de tirage - -## Licence - -- Ce projet est sous licence MIT \* voir le fichier LICENSE.md pour plus de détails - -## Contact - -Marcos Sylvestrini -[marcos.silvestrini@gmail.com](mailto:marcos.silvestrini@gmail.com)\\[![Twitter](https://img.shields.io/twitter/url/https/twitter.com/mrsilvestrini.svg?style=social&label=Follow%20%40mrsilvestrini)](https://twitter.com/mrsilvestrini) - -Lien du projet : - -

(back to top)

- -## Remerciements - -- [CNCF - Fondation Cloud Native Computing](https://www.cncf.io/) -- [OCI - Initiative de conteneurs ouverts](https://opencontainers.org/) -- [Borg](https://kubernetes.io/blog/2015/04/borg-predecessor-to-kubernetes/) -- [Site Web Kubernetes](https://kubernetes.io/) -- [Architecture Kubernetes](https://platform9.com/blog/kubernetes-enterprise-chapter-2-kubernetes-architecture-concepts/) -- [GitHub](https://github.com/kubernetes/kubernetes/) -- [Problèmes](https://github.com/kubernetes/kubernetes/issues) -- [Certification de l'ACK](https://www.cncf.io/certification/cka/) -- [Certification CKAD](https://www.cncf.io/certification/ckad/) -- [Certification CKS](https://www.cncf.io/certification/cks/) -- [Gentil](https://kind.sigs.k8s.io/docs/user/quick-start) -- [Laid](https://github.com/kubernetes/minikube) -- [k0s](https://k0sproject.io/) -- [Comme un bâton](https://k3s.io/) -- [délicat](https://docs.rke2.io/architecture) -- [Jusqu'à la haute disponibilité du cluster RKE2](https://computingforgeeks.com/deploy-kubernetes-on-rocky-using-rke2/?expand_article=1) -- [Charges de travail Kubernetes](https://www.suse.com/c/rancher_blog/introduction-to-kubernetes-workloads/) -- [Fournisseur de chemins locaux pour éleveurs](https://github.com/rancher/local-path-provisioner) -- [Tableau de bord Kubernetes](https://upcloud.com/resources/tutorials/deploy-kubernetes-dashboard) -- [Gestion des clusters Openlens](https://github.com/MuhammedKalkan/OpenLens) -- [Réserver Linux Ps](https://livro.descomplicandokubernetes.com.br/pt/) -- [Services Kubernetes](https://cast.ai/blog/kubernetes-load-balancer-expert-guide-with-examples/) - -

(back to top)

- - - - - -[contributors-shield]: https://img.shields.io/github/contributors/marcossilvestrini/learning-kubernetes.svg?style=for-the-badge - -[contributors-url]: https://github.com/marcossilvestrini/learning-kubernetes/graphs/contributors - -[forks-shield]: https://img.shields.io/github/forks/marcossilvestrini/learning-kubernetes.svg?style=for-the-badge - -[forks-url]: https://github.com/marcossilvestrini/learning-kubernetes/network/members - -[stars-shield]: https://img.shields.io/github/stars/marcossilvestrini/learning-kubernetes.svg?style=for-the-badge - -[stars-url]: https://github.com/marcossilvestrini/learning-kubernetes/stargazers - -[issues-shield]: https://img.shields.io/github/issues/marcossilvestrini/learning-kubernetes.svg?style=for-the-badge - -[issues-url]: https://github.com/marcossilvestrini/learning-kubernetes/issues - -[license-shield]: https://img.shields.io/github/license/marcossilvestrini/learning-kubernetes.svg?style=for-the-badge - -[license-url]: https://github.com/marcossilvestrini/learning-kubernetes/blob/master/LICENSE - -[linkedin-shield]: https://img.shields.io/badge/-LinkedIn-black.svg?style=for-the-badge&logo=linkedin&colorB=555 - -[linkedin-url]: https://linkedin.com/in/marcossilvestrini diff --git a/README.md b/README.md index dbcdd49..92beedc 100644 --- a/README.md +++ b/README.md @@ -79,19 +79,19 @@ ## Getting Started -This is an example of how you may give instructions on setting up your project locally. To get a local copy up and running follow these simple example steps. ### Prerequisites -This is an example of how to list things you need to use the software -and how to install them. +List things you need to use the software and how to install them. -* git -* Virtual Box and extension -* Vagrant +```sh +git +Virtual Box and extension +Vagrant +``` @@ -176,7 +176,7 @@ vagrant up ## Usage -Use this repository for get learning about kubernetes exam +Use this repository for get learning about kubernetes

(back to top)

diff --git a/README.pt.md b/README.pt.md deleted file mode 100644 index f185fed..0000000 --- a/README.pt.md +++ /dev/null @@ -1,1160 +0,0 @@ -

- -[![PSScriptAnalyzer](https://github.com/marcossilvestrini/learning-kubernetes/actions/workflows/powershell.yml/badge.svg)](https://github.com/marcossilvestrini/learning-kubernetes/actions/workflows/powershell.yml)[![Release](https://github.com/marcossilvestrini/learning-kubernetes/actions/workflows/release.yml/badge.svg)](https://github.com/marcossilvestrini/learning-kubernetes/actions/workflows/release.yml)[![Deploy GitHub Pages](https://github.com/marcossilvestrini/learning-kubernetes/actions/workflows/jekyll-gh-pages.yml/badge.svg)](https://github.com/marcossilvestrini/learning-kubernetes/actions/workflows/jekyll-gh-pages.yml)[![Generate HTML&PDF](https://github.com/marcossilvestrini/learning-kubernetes/actions/workflows/deploy.yml/badge.svg)](https://github.com/marcossilvestrini/learning-kubernetes/actions/workflows/deploy.yml) - -[![MIT License][license-shield]][license-url][![Forks][forks-shield]][forks-url][![Stargazers][stars-shield]][stars-url][![Contributors][contributors-shield]][contributors-url][![Issues][issues-shield]][issues-url][![LinkedIn][linkedin-shield]][linkedin-url] - -# APRENDENDO KUBERNETES - -![kubernetes Arch](images/kubernetes.jpg) - -![Kubernetes Cluster](/images/k8s-cluster.png) - -

-Explore the docs »
- Main Page - - - Code Page - - - Report Bug - - - Request Feature -

- -## Resumo - -
- TABLE OF CONTENT -
    -
  1. - About The Project -
  2. -
  3. - Getting Started - -
  4. -
  5. Usage
  6. -
  7. Roadmap
  8. -
  9. Linux Namespaces
  10. -
  11. Kubernetes Architecture
  12. -
  13. Install Kubernetes
  14. -
  15. Rancher RKE2
  16. -
  17. Kubectl
  18. -
  19. Containers
  20. -
  21. Pods
  22. -
  23. Deployment
  24. -
  25. Replicaset
  26. -
  27. Daemonset
  28. -
  29. Probes
  30. -
  31. Volumes
  32. -
  33. Statefulset
  34. -
  35. Services
  36. -
  37. Secrets
  38. -
  39. License
  40. -
  41. Contact
  42. -
  43. Acknowledgments
  44. -
-

- - - -## Sobre o projeto - -> Este projeto visa ajudar estudantes ou profissionais a aprender os principais conceitos do kubernetes - -

(back to top)

- - - -## Começando - -Este é um exemplo de como você pode dar instruções sobre como configurar seu projeto localmente. -Para obter uma cópia local instalada e funcionando, siga estas etapas simples de exemplo. - - - -### Pré-requisitos - -Este é um exemplo de como listar coisas que você precisa para usar o software -e como instalá-los. - -- idiota -- Caixa Virtual e extensão -- Vagabundo - - - -### Instalação - -#### Clonar repositório - -```sh -git clone https://github.com/marcossilvestrini/learning-kubernetes.git -``` - -#### Defina chaves ssh na pasta de segurança - -```sh -# generate ssh key pair for your user access hosts -ssh-keygen -q -t ecdsa -b 521 -N '' -f ~/.ssh/id_ecdsa <</dev/null 2>&1 -cp ~/.ssh/id_ecdsa.pub security/ - -# generate ssh key pair for rancher -ssh-keygen -q -t ecdsa -b 521 -N '' -f security/kubernetes-key-ecdsa <</dev/null 2>&1 -``` - -#### Definir pool de nós - -Você pode diminuir ou aumentar o número de planos de controle e trabalhadores na matriz Vagrantfile. - -Exemplo: - -```ruby -... - # Node|Control Plane Servers - PLANES = ["control-plane01", "control-plane02", "control-plane03"] - N = 2 - - (0..N).each do |i| - config.vm.define PLANES[i] do |node| -... -``` - -#### Definir rede - -Defina a configuração de rede para cada VM no Vagrantfile. - -Exemplo: - -```ruby -... -# NETWORK - ol9_server01.vm.network "public_network", nic_type: "virtio", mac: "080027f3066a", ip: "192.168.0.130", netmask: "255.255.255.0", mode: "bridge",bridge: [ - "Intel(R) I211 Gigabit Network Connection", - "MediaTek Wi-Fi 6 MT7921 Wireless LAN" - ] -... -``` - -#### Definir recursos da VM - -Defina a configuração de recursos como CPU, memória, etc. para cada VM no Vagrantfile. - -Exemplo: - -```ruby -... -# PROVIDER -infra_server01.vm.provider "virtualbox" do |vb| - vb.linked_clone = true - vb.name =VM_INFRA_SERVER01 - vb.memory = 2048 - vb.cpus = 1 -end -... -``` - -#### Acima do cluster Kubernetes - -```sh -cd learning-kubernetes/vagrant/linux -vagrant up -``` - - - -## Uso - -Use este repositório para aprender sobre o exame Kubernetes - -

(back to top)

- - - -## Roteiro - -- [x] Criar repositório -- [x] Crie ação no GitHub para tarefas de automação -- [x] Instale o cluster Kubernetes -- [x] Instalar o kubectl -- [x] Adicionar exemplos de Kubernetes -- [x] Adicionar implantação de aplicativo -- [x] Crie uma imagem docker com o conteúdo do projeto -- [x] Criar ação no github para construir imagem docker - -

(back to roadmap)

-

(back to top)

- - - -## Namespaces Linux - -O Kubernetes Engine funciona com namespaces (PID,NET,IPC,MNT,UTS) e cgroups. - -![linux-namespaces](images/linux-namespaces.png) - -## pid - -O ID do processo. Este arquivo é um identificador para o namespace PID do processo. Os namespaces PID isolam o espaço do número de ID do processo, o que significa que processos em diferentes namespaces PID podem ter o mesmo PID. Os namespaces PID permitem que os contêineres forneçam funcionalidades como suspender/retomar o conjunto de processos no contêiner e migrar o contêiner para um novo host enquanto os processos dentro do contêiner mantêm os mesmos PIDs - -## líquido - -Este arquivo é um identificador para o namespace de rede do processo. Isso fornece o isolamento dos recursos do sistema associados à rede e isola os dispositivos de rede. O ip netns - é usado para processar o gerenciamento de namespace de rede -mount Este arquivo é um identificador para o namespace de montagem do processo e isola os pontos de montagem - -## ipc - -Este arquivo é um identificador para o namespace IPC do processo e isola filas de mensagens System Vs IPC e POSIX - -## uts - -Este arquivo é um identificador para o namespace UTS do processo e isola o nome do host e o nome de domínio NIS - -## do utilizador - -Este arquivo é um identificador para o namespace do usuário do processo - -## cgrupo - -o contêiner terá uma visão isolada da hierarquia do cgroup. - -## cgroup vs namespace - -_cgroup é uma forma de controlar filtro de controle de tráfego baseado em grupo, exemplo_ - -```json -"cgroupsPath": "/myRuntime/myContainer", - "resources": { - "memory": { - "limit": 100000, - "reservation": 200000 - }, - "devices": [ - { - "allow": false, - "access": "rwm" - } - ] - } -``` - -_namespace: Limite/abstração do que você pode ver no linux proc_ - -Fonte: - -

(back to linux-namespaces)

-

(back to top)

- -## Arquitetura Kubernetes - - - -![Kubernetes Architecture](images/kubernetes-architecture.jpg) - -### Plano de controle - -![Control Plane](images/control-plane.jpg) - -### Nó - -![Control Plane](images/worker.jpg) - -### Portas Kubernetes - -![kubernetes control plane ports](images/kubernetes-cp-ports.jpg) - -![kubernetes works ports](images/kubernetes-wk-ports.jpg) - -### Portas para nós do servidor Rancher em RKE2 - -![RKE2 Ports](images/rke2-ports.png) - -

(back to kubernetes-architecture)

-

(back to top)

- -## Instale Kubernetes - - - -### Feio - -```sh -# install -curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 -chmod +x ./minikube -sudo mv ./minikube /usr/local/bin/minikube - -# get version -minikube version - -# set hypervisor -minikube config set driver - -# up without hypervisor -minikube start --driver=hyperkit - -# create cluster -minikube start --nodes 3 -p multinode-cluster - -# get status of cluster -minikube status - -# get ip address -minikube ip - -# access minikube host -minikube ssh - -# dashboard -minikube dashboard - -# logs -minikube logs - -# delete cluster -minikube delete -minikube delete --purge -``` - -### Tipo - -```sh -# Install -curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.14.0/kind-linux-amd64 -chmod +x ./kind -sudo mv ./kind /usr/local/bin/kind - -# create cluster -kind create cluster -kind create cluster --name silvestrini - -# get clusters -kind get clusters - -# delete clusters -kind delete clusters $(kind get clusters) - -## create yaml -cat << EOF > $HOME/kind-3nodes.yaml -kind: Cluster -apiVersion: kind.x-k8s.io/v1alpha4 -nodes: - - role: control-plane - - role: worker - - role: worker -EOF - -# create cluster -kind create cluster --name kind-multinodes --config $HOME/kind-3nodes.yaml -``` - -

(back to install-kubernetes)

-

(back to top)

- -## delicado - - - -Para criar cluster kubernetes usando RKE2, consulte scripts na pasta scripts/linux/k8s/install-rke2.sh - -### Alguns comandos da pilha rke2 - -Defina sua variável PATH: - -```sh -export PATH=$PATH:/opt/rke2/bin:/var/lib/rancher/rke2/bin -``` - -#### CONTAINERD - Comandos ctr - -```zhs -#list containers using ctr -ctr --address /run/k3s/containerd/containerd.sock --namespace k8s.io container ls -``` - -#### CONTAINERD - Comandos crictl - -```zhs -#list containers using crictl - -## example 1 -export CRI_CONFIG_FILE=/var/lib/rancher/rke2/agent/etc/crictl.yaml -crictl ps - -## example 2 -crictl --config /var/lib/rancher/rke2/agent/etc/crictl.yaml ps - -## example 3 -crictl --runtime-endpoint unix:///run/k3s/containerd/containerd.sock ps -a - - -# stats containers -crictl stats -``` - -### Exploração madeireira - -```sh -journalctl -f -u rke2-server -/var/lib/rancher/rke2/agent/containerd/containerd.log -/var/lib/rancher/rke2/agent/logs/kubelet.log -``` - -Referência: - -

(back to rke2)

-

(back to top)

- -## Kubectl - - - -### Instalar - -```sh -# install -curl -LO https://storage.googleapis.com/kubernetes-release/release/`curl -s \ -https://storage.googleapis.com/kubernetes-release/release/stable.txt`/bin/linux/amd64/kubectl -chmod +x ./kubectl -mv ./kubectl /usr/local/bin/kubectl - -# get version -kubectl version --output=yaml --client - -# kubectl autocomplete -source <(kubectl completion bash) - -# kubectl alias -alias k=kubectl -complete -F __start_kubectl k -``` - -### Comandos - Kubectl - -```bash - -########## resources ############ - -# list all resources -kubectl get all - -########## namespaces ########### - -# get namespaces -kubectl get namespaces - -# describe namespaces -kubectl describe namespaces - -########## nodes ############ - -# list nodes -kubectl get nodes -kubectl get nodes -o wide - -# delete node -kubectl drain --ignore-daemonsets --delete-emptydir-data -kubectl delete node - -# get logs -kubectl logs my-nginx -kubectl logs -f my-nginx -kubectl logs -n kube-system --all-containers=true etcd-control-plane01 -``` - -

(back to kubectl)

-

(back to top)

- -## Containers - - - -![Containers](images/docker.jpg) - -### Comandos - Contêineres - -```sh -# get containers in pod -kubectl -n kube-system describe pods kube-proxy-worker01 | grep -ws -A 10 Containers - -# connect in container -kubectl attach silvestrini -c infra - -# connect in container -kubectl exec -it pod_name -c container_name bash -kubectl exec infra ls -kubectl exec silvestrini -c infra -- ls -kubectl exec silvestrini -c infra -it sh - -# access container in specific namespace -kubectl exec -it -n kube-system kube-proxy-worker01 -c kube-proxy -- bash -``` - -

(back to containers)

-

(back to top)

- -## Vagens - - - -![Pod](images/pod.jpg) - -Um pod é a menor unidade de execução do Kubernetes. Um pod encapsula um ou mais aplicativos.\\ -Os pods são efêmeros por natureza. Se um pod (ou o nó em que ele é executado) falhar,\\ -O Kubernetes pode criar automaticamente uma nova réplica desse pod para continuar as operações.\\ -Os pods incluem um ou mais contêineres (como contêineres Docker). - -Os pods também fornecem dependências ambientais, incluindo dependências persistentes\\ -volumes de armazenamento (armazenamento permanente e disponível para todos os pods\\ -no cluster) e dados de configuração necessários para executar os contêineres dentro do pod. - -### Comandos - Pods - -```sh -# create pods without manifest -kubectl run nginx --image nginx -kubectl run -it --rm debug --image=busybox --restart=Never -- sh - -# create pod with manifest -kubectl apply -f pod-template.yaml -kubectl create -f pod.yaml - -# list pods -kubectl get pods - -# list all pods -kubectl get pods --all-namespaces -kubectl get pods -A -kubectl get pods -A -o wide - -# list pods in specific node -kubectl get pods --all-namespaces -o wide --field-selector spec.nodeName=worker01 - -# list pods in kube-system namespace -kubectl get pod -n kube-system -kubectl get pods -n kube-system -o=jsonpath='{range.items[*]}{"\n"}{.metadata.name}{range.spec.containers}' - -# list pods with specif output -kubectl get pods -n kube-system -o yaml -kubectl get pods -n kube-system -o json - -# list images used in pods -kubectl get pods -o=jsonpath='{range .items[*]}{"\n"}{.metadata.name}{"\t"}{range .spec.containers[*]}{.image}{"\t"}{end}{end}' - -# describe details of pods -kubectl describe pod nginx -kubectl -n kube-system describe pods kube-proxy-worker01 - -# delete pods -kubectl delete pod nginx -kubectl delete -f pod-template.yaml - -# create Service | expose pod -kubectl expose pod my-nginx - -``` - -### Compreendendo os recursos do pod - -![Pod Resources](images/resources.jpg) - -

(back to pods)

-

(back to top)

- -## Implantação - - - -![Deployment](images/deployment.jpg) - -Uma implantação fornece atualizações declarativas para pods e ReplicaSets. -Você descreve um estado desejado em uma implantação e o controlador de implantação\\ -altera o estado real para o estado desejado a uma taxa controlada.\\ -Você pode definir implantações para criar novos ReplicaSets ou para remover os existentes\\ -Implantações e adote todos os seus recursos com novas implantações. - -### Comandos - Implantação - -```sh -# create manifest|template -kubectl run my-nginx --image nginx --port 80 --dry-run=client -o yaml >pod-template.yaml - -# apply\update deployment -kubectl apply -f deployment.yaml - -# list deployments -kubectl get deployments -A -kubectl -n kube-system get deployments.apps -kubectl get deployments -l app=nginx-deployment - -# get pods management by deployment -kubectl get pods -l app=nginx-deployment - -# describe deployment -kubectl describe deployment nginx-deployment - -# check status of deployment -kubectl rollout status deployment nginx-deployment - -# running rollback deployment -kubectl rollout undo deployment nginx-deployment -kubectl rollout undo deployment nginx-deployment --to-revision=1 - -# get deployment history -kubectl rollout history deployment nginx-deployment -kubectl rollout history deployment nginx-deployment --revision=2 - -# pause deployment(block updates) -kubectl rollout pause deployment nginx-deployment - -# resume deployment(allow updates) -kubectl rollout resume deployment nginx-deployment - -# restart deployment (recreate all pods in deployment) -kubectl rollout restart deployment nginx-deployment - -# delete deployment -kubectl delete deployment nginx-deployment -``` - -

(back to deployment)

-

(back to top)

- -## Conjunto de réplicas - - - -![ReplicaSet](images/replicaset.jpg) - -O objetivo de um ReplicaSet é manter um conjunto estável de pods de réplica em execução\\ -a qualquer momento. Como tal, é frequentemente usado para garantir a disponibilidade de\\ -um número especificado de pods idênticos. - -### Comandos - ReplicaSet - -````sh -# list replicaset -kubectl get replicaset -l app=nginx-deployment - -# describe replicaset -kubectl describe replicaset nginx-replicaset - -# create replicaset - see folder replicaset/ for examples -kubectl apply -f replicaset.yaml - -# delete replicaset -kubectl delete replicas - -

(back to replicaset)

-

(back to top)

- -## Daemonset - -![Daemonset](images/daemonset.png) - -A DaemonSet ensures that all (or some) Nodes run a copy of a Pod.\ -As nodes are added to the cluster, Pods are added to them.\ -As nodes are removed from the cluster, those Pods are garbage collected.\ -Deleting a DaemonSet will clean up the Pods it created. - -### Commands - Daemonset - -```sh -# list daemonset -kubectl get daemonset -A - -#$ describe daemonset -kubectl describe daemonset node-exporter - -# create daemonset - see folder daemonset/ for examples -kubectl apply -f daemonset.yaml - -# delete daemonset -kubectl delete daemonset node-exporter -```` - -## Sondas - - - -![Probes](images/probes.jpg) - -As sondagens do Kubernetes são verificações de integridade usadas para monitorar a integridade de aplicativos e serviços em um cluster do Kubernetes.\\ -Os probes do Kubernetes normalmente são implementados usando a API do Kubernetes, que permite consultar informações no aplicativo ou serviço.\\ -Essas informações podem então ser usadas para determinar a integridade do aplicativo ou serviço.\\ -Os testes do Kubernetes também podem ser usados ​​para detectar alterações no aplicativo ou serviço e enviar uma notificação ao plano de controle do Kubernetes, que pode então tomar medidas corretivas. - -### Tipos de sondas - -#### Sondas de inicialização - -Uma investigação de inicialização é usada para determinar se um contêiner foi iniciado com êxito.\\ -Esse tipo de investigação normalmente é usado para aplicativos que demoram mais para inicializar,\\ -ou para contêineres que executam tarefas de inicialização antes de ficarem prontos para receber tráfego.\\ -A investigação de inicialização é executada apenas uma vez, após a criação do contêiner, e atrasará o início\\ -das sondagens de prontidão e vivacidade até que seja bem-sucedido.\\ -Se a investigação de inicialização falhar, considera-se que o contêiner falhou ao iniciar\\ -e o Kubernetes tentará reiniciar o contêiner. - -#### Sondas de prontidão - -Uma investigação de prontidão é usada para determinar se um contêiner está pronto para receber tráfego.\\ -Este tipo de investigação é usado para garantir que um contêiner esteja totalmente instalado e funcionando e possa\\ -aceita conexões de entrada antes de serem adicionadas ao balanceador de carga de serviço.\\ -Uma sondagem de prontidão pode ser usada para verificar a disponibilidade das dependências de um aplicativo\\ -ou para realizar qualquer outra verificação que indique que o contêiner está pronto para atender o tráfego.\\ -Se a investigação de prontidão falhar, o contêiner será removido do balanceador de carga de serviço até que a investigação seja bem-sucedida novamente. - -#### Sondas de vivacidade - -Uma investigação de atividade é usada para determinar se um contêiner ainda está em execução e funcionando corretamente.\\ -Esse tipo de investigação é usado para detectar e recuperar falhas ou travamentos de contêineres.\\ -Uma sonda de atividade pode ser usada para verificar a capacidade de resposta de um aplicativo ou para executar\\ -qualquer outra verificação que indique que o contêiner ainda está ativo e íntegro.\\ -Se a investigação de atividade falhar, o Kubernetes tentará reiniciar o contêiner para restaurar sua funcionalidade. - -

(back to probes)

-

(back to top)

- -## Volumes - - - -![Volumes](images/volumes01.png) - -### Classe de armazenamento - -![Storage Class](/images/storageclass.png) - -Alguns provedores de classe de armazenamento - -- kubernetes.io/aws-ebs: AWS Elastic Block Store (EBS) -- kubernetes.io/azure-disk: Disco Azure -- kubernetes.io/gce-pd: disco permanente do Google Compute Engine (GCE) -- kubernetes.io/cinder: OpenStack Cinder -- kubernetes.io/vsphere-volume: vSphere -- kubernetes.io/no-provisioner: Volumes locais -- kubernetes.io/host-path: Volumes locais - -### PV - Volume persistente - -![PV](images/pv.png) - -Alguns tipos de PV - -- Local - - HostPath -- Rede - - NFS - - iSCSI - - Ceph RBD (dispositivo de bloco Rados) - - GlusterFS - - Provedores de nuvem (EBS, disco permanente do Google Cloud, armazenamento em disco do Azure) - -#### Tipo de armazenamento (hostPath) - -- hostPath -- nfs -- iscsi -- csi -- local -- FC - -### PVC - Reivindicação de Volume Persistente - -![PVC](/images/pvc.png) - -### Comandos - Volumes - -```bash -# list storage classes -kubectl get storageclass - -# describe storage class -kubectl describe storageclass silvestrini - -# get storage class provisioners -kubectl get storageclasses.storage.k8s.io -o=jsonpath='{range.items[*]}{.provisioner}{"\n"}' - -# list pv in cluster -kubectl get pv -A - -# describe pv -kubectl describe pv my-pv - -# list pvc -kubectl get pvc -o wide - -# delete pvc -kubectl delete pvc my-pvc - -# describe pvc -kubectl describe pvc my-pvc - -# get events -kubectl get events my-pvc.1772cda2d4c7069b -``` - -

(back to volumes)

-

(back to top)

- -## StatefulSet - - - -![StatefulSet](images/statefulset.png) - -StatefulSet é o objeto da API de carga de trabalho usado para gerenciar aplicativos com estado. - -Gerencia a implantação e o escalonamento de um conjunto de pods e fornece garantias sobre a ordem e a exclusividade desses pods. - -Assim como uma implantação, um StatefulSet gerencia pods baseados em especificações de contêiner idênticas.\\ -Ao contrário de uma implantação, um StatefulSet mantém uma identidade fixa para cada um de seus pods.\\ - -Esses pods são criados a partir da mesma especificação, mas não são intercambiáveis: cada um tem um identificador persistente que mantém durante qualquer reagendamento. - -Se você quiser usar volumes de armazenamento para fornecer persistência para sua carga de trabalho,\\ -você pode usar um StatefulSet como parte da solução. Embora pods individuais em\\ -um StatefulSet são suscetíveis a falhas, os identificadores de pod persistentes fazem\\ -é mais fácil combinar os volumes existentes com os novos pods que substituem aqueles que falharam. - -### DNS para pods em StatefulSet - -```sh -...svc.cluster.local -# Example: nginx-0.nginx.default.svc.cluster.local -``` - -### Comandos - StatefulSet - -```bash -# list statefulsets -kubectl get statefulsets - -# describe statefulsets -kubectl describe statefulsets.apps nginx - -# delete statefulset -kubectl delete statefulset nginx - -# test network service -## create container for test -kubectl run -it --rm --image=busybox --restart=Never -- sh - -## test nslookup -nslookup nginx-0.nginx.default.svc.cluster.local - -## test web page -wget -O- http://nginx-0.nginx.default.svc.cluster.local -``` - -

(back to statefulset)

-

(back to top)

- -## Serviços - - - -![Services](images/services.png) - -Um serviço Kubernetes é uma abstração lógica para um grupo implantado de pods em um cluster\\ -(todos desempenham a mesma função).\\ -Como os pods são efêmeros, um serviço habilita um grupo de pods, que fornecem informações\\ -funções (serviços web, processamento de imagens, etc.) receberão um nome e IP exclusivo\\ -endereço (clusterIP). - -### Tipos de serviço no Kubernetes - -#### Serviços ClusterIP - -ClusterIP é o tipo de serviço padrão no Kubernetes e fornece conectividade interna entre diferentes componentes de nosso aplicativo. Kubernetes atribui um endereço IP virtual a um serviço ClusterIP que só pode ser acessado de dentro do cluster durante sua criação. Este endereço IP é estável e não muda mesmo se os pods por trás do serviço forem reprogramados ou substituídos. - -Os serviços ClusterIP são uma excelente escolha para comunicação interna entre diferentes componentes da nossa aplicação que não precisam de ser expostos ao mundo exterior. Por exemplo, se tivermos um microsserviço que processa dados e os envia para outro microsserviço para processamento posterior, podemos usar um serviço ClusterIP para conectá-los. - -Para criar um serviço ClusterIP no Kubernetes, precisamos defini-lo em um arquivo YAML e aplicá-lo ao cluster. Aqui está um exemplo de uma definição simples de serviço ClusterIP: - -```yaml -apiVersion: v1 -kind: Service -metadata: - name: backend -spec: - selector: - app: backend - ports: - - name: http - port: 80 - targetPort: 8080 -``` - -Neste exemplo, definimos um serviço chamado backend com um seletor direcionado a pods rotulados com app: backend. O serviço expõe a porta 80, que é a porta usada pelos clientes para acessar o serviço, e encaminha o tráfego para a porta 8080 dos pods, que é onde o aplicativo backend está sendo executado. - -#### Serviços NodePort - -Os serviços NodePort estendem a funcionalidade dos serviços ClusterIP, permitindo conectividade externa ao nosso aplicativo. Quando criamos um serviço NodePort em qualquer nó do cluster que atenda aos critérios definidos, o Kubernetes abre uma porta designada que encaminha o tráfego para o serviço ClusterIP correspondente em execução no nó. - -Esses serviços são ideais para aplicações que precisam ser acessíveis de fora do cluster, como aplicações web ou APIs. Com os serviços NodePort, podemos acessar nossa aplicação usando o endereço IP do nó e o número da porta atribuído ao serviço. - -Vejamos um exemplo de definição simples de serviço NodePort: - -```yaml -apiVersion: v1 -kind: Service -metadata: - name: frontend -spec: - selector: - app: frontend - type: NodePort - ports: - - name: http - port: 80 - targetPort: 8080 -``` - -Definimos um serviço chamado frontend que tem como alvo pods rotulados com app: frontend definindo um seletor. O serviço expõe a porta 80 e encaminha o tráfego para a porta 8080 dos pods. Definimos o tipo de serviço como NodePort e o Kubernetes expõe o serviço em uma porta específica em um nó qualificado dentro do cluster. - -Quando criamos um serviço NodePort, o Kubernetes atribui um número de porta de um intervalo predefinido de 30000-32767. Além disso, podemos especificar um número de porta personalizado adicionando o campo nodePort à definição de serviço: - -```yaml - -apiVersion: v1 -kind: Service -metadata: - name: frontend -spec: - selector: - app: frontend - type: NodePort - ports: - - name: http - port: 80 - targetPort: 8080 - nodePort: 30080 -``` - -O campo nodePort é especificado como 30080, que informa ao Kubernetes para expor o serviço na porta 30080 em cada nó do cluster. - -#### Serviços LoadBalancer - -Os serviços LoadBalancer conectam nossos aplicativos externamente e os ambientes de produção os utilizam onde alta disponibilidade e escalabilidade são essenciais. Quando criamos um serviço LoadBalancer, o Kubernetes provisiona um balanceador de carga em nosso ambiente de nuvem e encaminha o tráfego para os nós que executam o serviço. - -Os serviços LoadBalancer são ideais para aplicações que precisam lidar com altos volumes de tráfego, como aplicações web ou APIs. Com os serviços LoadBalancer, podemos acessar nosso aplicativo usando um único endereço IP atribuído ao balanceador de carga. - -Aqui está um exemplo de uma definição simples de serviço LoadBalancer: - -```yaml -apiVersion: v1 -kind: Service -metadata: - name: web -spec: - selector: - app: web - type: LoadBalancer - ports: - - name: http - port: 80 - targetPort: 8080 -``` - -Definimos o tipo de serviço como LoadBalancer para instruir o Kubernetes a provisionar um balanceador de carga. Aqui, definimos um serviço chamado web e especificamos um seletor direcionado a pods rotulados com app: web. Além disso, expomos a porta 80 e encaminhamos o tráfego para a porta 8080 dos pods. - -Depois de criar o serviço LoadBalancer, o Kubernetes provisiona um balanceador de carga no ambiente de nuvem com um endereço IP público. Podemos usar este endereço IP para acessar nosso aplicativo de fora do cluster. - -![Services Types](/images/service-types.png) - -Referência: - -### Comandos - Serviços - -```sh -# list services -kubectl get services -kubectl get svc -o wide - -# list services in system namespace -kubectl get svc -n kube-system - -# details of services -kubectl describe svc nginx -kubectl describe svc -n kube-system - -# list endpoints -kubectl get endpoints - -# create ClusterIP service -kubectl expose deployment app-silvestrini --port=80 --target-port=8080 - -# create NodePort service -kubectl expose deployment app-silvestrini --type=NodePort --port=80 --target-port=8080 - -# create loadbalance service -kubectl expose deployment app-silvestrini --type=LoadBalancer --port=80 --target-port=8080 - -#create external name service -kubectl create service externalname app-silvestrini --external-name my-db.skynet.com.br - -# delete service -kubectl delete service nginx -``` - -

(back to services)

-

(back to top)

- -## Segredos - - - -![Secrets](images/secrets.png) - -Um segredo é um objeto que contém uma pequena quantidade de dados confidenciais, como uma senha, um token ou uma chave. Caso contrário, essas informações poderiam ser colocadas em uma especificação de pod ou em uma imagem de contêiner. Usar um segredo significa que você não precisa incluir dados confidenciais no código do seu aplicativo. - -Como os segredos podem ser criados independentemente dos pods que os utilizam, há menos risco de o segredo (e seus dados) serem expostos durante o fluxo de trabalho de criação, visualização e edição de pods. Kubernetes e aplicativos executados em seu cluster também podem tomar precauções adicionais com segredos, como evitar gravar dados secretos em armazenamento não volátil. - -Os segredos são semelhantes aos ConfigMaps, mas destinam-se especificamente a armazenar dados confidenciais. - -### Tipos de segredos - -- Segredos opacos - estes são os segredos mais simples e comuns. Eles armazenam dados arbitrários, como chaves de API, senhas e tokens. Os segredos opacos são codificados em base64 quando armazenados no Kubernetes, mas não são criptografados. Eles podem ser usados ​​para armazenar dados confidenciais, mas não são seguros o suficiente para informações altamente confidenciais, como senhas de bancos de dados. - -- kubernetes.io/service-account-token - usado para armazenar tokens de acesso à conta de serviço. Esses tokens são usados ​​para autenticar pods com a API Kubernetes. Eles são montados automaticamente em pods que usam contas de serviço. - -- kubernetes.io/dockercfg e kubernetes.io/dockerconfigjson - usados ​​para armazenar credenciais de registro do Docker. Eles são usados ​​para autenticar pods com um registro Docker. Eles são montados em pods que usam imagens de contêiner privadas. - -- kubernetes.io/tls, kubernetes.io/ssh-auth e kubernetes.io/basic-auth – usados ​​para armazenar certificados TLS, chaves SSH e credenciais básicas de autenticação, respectivamente. Eles são usados ​​para autenticar pods com outros serviços. - -- bootstrap.kubernetes.io/token - usado para armazenar tokens de inicialização de cluster. Eles são usados ​​para autenticar nós com o plano de controle do Kubernetes. - -### Comandos - Segredos - -```sh -# get secrets -kubectl get secrets -A - -# describe secrets -kubectl describe secret -n cert-manager cert-manager-webhook-ca - -# create opaque secret -kubectl create secret generic silvestrini-secret --from-literal=username=silvestrini --from-literal=password=silvestrini - -# create tls secret -# generate certs -# openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout private-key.key -out cert.crt -kubectl create secret tls my-service-web-tls-secret --cert=cert.crt --key=private-key.key -``` - -

(back to secrets)

-

(back to top)

- -## ConfigMaps - - - -![ConfigMap](/images/configmap.png) - -Um ConfigMap é um objeto API usado para armazenar dados não confidenciais em pares chave-valor.\\ -Os pods podem consumir ConfigMaps como variáveis ​​de ambiente, argumentos de linha de comando ou como arquivos de configuração em um volume. - -Um ConfigMap permite dissociar a configuração específica do ambiente das imagens do contêiner, para que seus aplicativos sejam facilmente portáveis. - -### Comandos - ConfigMaps - -```sh -# create configmap -kubectl create configmap nginx-config --from-file=kubernetes/configmaps/nginx.conf - -# get configmaps -kubectl get configmaps - -# describe configmaps -kubectl describe configmaps nginx-config -``` - -

(back to configmap)

-

(back to top)

- -## Contribuindo - -As contribuições são o que tornam a comunidade de código aberto um lugar incrível para -aprender, inspirar e criar. Qualquer contribuição que você fizer será**muito apreciado**. - -Se você tiver uma sugestão que possa melhorar isso, bifurque o repositório e -crie uma solicitação pull. Você também pode simplesmente abrir um problema com a tag “aprimoramento”. -Não se esqueça de dar uma estrela ao projeto! Obrigado novamente! - -1. Bifurque o projeto -2. Crie sua ramificação de recursos (`git checkout -b feature/AmazingFeature`) -3. Confirme suas alterações (`git commit -m 'Add some AmazingFeature'`) -4. Empurre para a filial (`git push origin feature/AmazingFeature`) -5. Abra uma solicitação pull - -## Licença - -- Este projeto está licenciado sob a licença MIT \* consulte o arquivo LICENSE.md para obter detalhes - -## Contato - -Marcos Silvestrini -[marcos.silvestrini@gmail.com](mailto:marcos.silvestrini@gmail.com)\\[![Twitter](https://img.shields.io/twitter/url/https/twitter.com/mrsilvestrini.svg?style=social&label=Follow%20%40mrsilvestrini)](https://twitter.com/mrsilvestrini) - -Link do projeto: - -

(back to top)

- -## Agradecimentos - -- [CNCF - Fundação de Computação Nativa em Nuvem](https://www.cncf.io/) -- [OCI - Iniciativa de Contêineres Abertos](https://opencontainers.org/) -- [Borg](https://kubernetes.io/blog/2015/04/borg-predecessor-to-kubernetes/) -- [Site Kubernetes](https://kubernetes.io/) -- [Arquitetura Kubernetes](https://platform9.com/blog/kubernetes-enterprise-chapter-2-kubernetes-architecture-concepts/) -- [GitHub](https://github.com/kubernetes/kubernetes/) -- [Problemas](https://github.com/kubernetes/kubernetes/issues) -- [Certificação CKA](https://www.cncf.io/certification/cka/) -- [Certificação CKAD](https://www.cncf.io/certification/ckad/) -- [Certificação CKS](https://www.cncf.io/certification/cks/) -- [Tipo](https://kind.sigs.k8s.io/docs/user/quick-start) -- [Feio](https://github.com/kubernetes/minikube) -- [k0s](https://k0sproject.io/) -- [Como um bastão](https://k3s.io/) -- [delicado](https://docs.rke2.io/architecture) -- [Acima do cluster RKE2 HA](https://computingforgeeks.com/deploy-kubernetes-on-rocky-using-rke2/?expand_article=1) -- [Cargas de trabalho do Kubernetes](https://www.suse.com/c/rancher_blog/introduction-to-kubernetes-workloads/) -- [Provisionador de caminho local rancheiro](https://github.com/rancher/local-path-provisioner) -- [Painel do Kubernetes](https://upcloud.com/resources/tutorials/deploy-kubernetes-dashboard) -- [Gerenciamento de cluster Openlens](https://github.com/MuhammedKalkan/OpenLens) -- [Reserve Linux Ps](https://livro.descomplicandokubernetes.com.br/pt/) -- [Serviços Kubernetes](https://cast.ai/blog/kubernetes-load-balancer-expert-guide-with-examples/) - -

(back to top)

- - - - - -[contributors-shield]: https://img.shields.io/github/contributors/marcossilvestrini/learning-kubernetes.svg?style=for-the-badge - -[contributors-url]: https://github.com/marcossilvestrini/learning-kubernetes/graphs/contributors - -[forks-shield]: https://img.shields.io/github/forks/marcossilvestrini/learning-kubernetes.svg?style=for-the-badge - -[forks-url]: https://github.com/marcossilvestrini/learning-kubernetes/network/members - -[stars-shield]: https://img.shields.io/github/stars/marcossilvestrini/learning-kubernetes.svg?style=for-the-badge - -[stars-url]: https://github.com/marcossilvestrini/learning-kubernetes/stargazers - -[issues-shield]: https://img.shields.io/github/issues/marcossilvestrini/learning-kubernetes.svg?style=for-the-badge - -[issues-url]: https://github.com/marcossilvestrini/learning-kubernetes/issues - -[license-shield]: https://img.shields.io/github/license/marcossilvestrini/learning-kubernetes.svg?style=for-the-badge - -[license-url]: https://github.com/marcossilvestrini/learning-kubernetes/blob/master/LICENSE - -[linkedin-shield]: https://img.shields.io/badge/-LinkedIn-black.svg?style=for-the-badge&logo=linkedin&colorB=555 - -[linkedin-url]: https://linkedin.com/in/marcossilvestrini diff --git a/README.zh-TW.md b/README.zh-TW.md deleted file mode 100644 index a2033ab..0000000 --- a/README.zh-TW.md +++ /dev/null @@ -1,1160 +0,0 @@ -

- -[![PSScriptAnalyzer](https://github.com/marcossilvestrini/learning-kubernetes/actions/workflows/powershell.yml/badge.svg)](https://github.com/marcossilvestrini/learning-kubernetes/actions/workflows/powershell.yml)[![Release](https://github.com/marcossilvestrini/learning-kubernetes/actions/workflows/release.yml/badge.svg)](https://github.com/marcossilvestrini/learning-kubernetes/actions/workflows/release.yml)[![Deploy GitHub Pages](https://github.com/marcossilvestrini/learning-kubernetes/actions/workflows/jekyll-gh-pages.yml/badge.svg)](https://github.com/marcossilvestrini/learning-kubernetes/actions/workflows/jekyll-gh-pages.yml)[![Generate HTML&PDF](https://github.com/marcossilvestrini/learning-kubernetes/actions/workflows/deploy.yml/badge.svg)](https://github.com/marcossilvestrini/learning-kubernetes/actions/workflows/deploy.yml) - -[![MIT License][license-shield]][license-url][![Forks][forks-shield]][forks-url][![Stargazers][stars-shield]][stars-url][![Contributors][contributors-shield]][contributors-url][![Issues][issues-shield]][issues-url][![LinkedIn][linkedin-shield]][linkedin-url] - -# 學習線上課程,掌握職場技能 - -![kubernetes Arch](images/kubernetes.jpg) - -![Kubernetes Cluster](/images/k8s-cluster.png) - -

-Explore the docs »
- Main Page - - - Code Page - - - Report Bug - - - Request Feature -

- -## 概括 - -
- TABLE OF CONTENT -
    -
  1. - About The Project -
  2. -
  3. - Getting Started - -
  4. -
  5. Usage
  6. -
  7. Roadmap
  8. -
  9. Linux Namespaces
  10. -
  11. Kubernetes Architecture
  12. -
  13. Install Kubernetes
  14. -
  15. Rancher RKE2
  16. -
  17. Kubectl
  18. -
  19. Containers
  20. -
  21. Pods
  22. -
  23. Deployment
  24. -
  25. Replicaset
  26. -
  27. Daemonset
  28. -
  29. Probes
  30. -
  31. Volumes
  32. -
  33. Statefulset
  34. -
  35. Services
  36. -
  37. Secrets
  38. -
  39. License
  40. -
  41. Contact
  42. -
  43. Acknowledgments
  44. -
-

- - - -## 關於項目 - -> 該計畫旨在幫助學生或專業人士學習 kubernetes 的主要概念 - -

(back to top)

- - - -## 入門 - -這是一個範例,說明如何在本地設定項目。 -若要啟動並執行本機副本,請按照以下簡單的範例步驟操作。 - - - -### 先決條件 - -這是如何列出使用該軟體所需的物品的範例 -以及如何安裝它們。 - -- git -- 虛擬盒和擴展 -- 流浪漢 - - - -### 安裝 - -#### 克隆儲存庫 - -```sh -git clone https://github.com/marcossilvestrini/learning-kubernetes.git -``` - -#### 在安全資料夾中設定 ssh 金鑰 - -```sh -# generate ssh key pair for your user access hosts -ssh-keygen -q -t ecdsa -b 521 -N '' -f ~/.ssh/id_ecdsa <</dev/null 2>&1 -cp ~/.ssh/id_ecdsa.pub security/ - -# generate ssh key pair for rancher -ssh-keygen -q -t ecdsa -b 521 -N '' -f security/kubernetes-key-ecdsa <</dev/null 2>&1 -``` - -#### 設定節點池 - -您可以減少或增加 Vagrantfile 陣列中控制平面和工作執行緒的數量。 - -例子: - -```ruby -... - # Node|Control Plane Servers - PLANES = ["control-plane01", "control-plane02", "control-plane03"] - N = 2 - - (0..N).each do |i| - config.vm.define PLANES[i] do |node| -... -``` - -#### 設定網路 - -在 Vagrantfile 中為每個虛擬機器設定網路配置。 - -例子: - -```ruby -... -# NETWORK - ol9_server01.vm.network "public_network", nic_type: "virtio", mac: "080027f3066a", ip: "192.168.0.130", netmask: "255.255.255.0", mode: "bridge",bridge: [ - "Intel(R) I211 Gigabit Network Connection", - "MediaTek Wi-Fi 6 MT7921 Wireless LAN" - ] -... -``` - -#### 設定VM的資源 - -在 Vagrantfile 中為每個虛擬機器設定 CPU、記憶體等資源配置。 - -例子: - -```ruby -... -# PROVIDER -infra_server01.vm.provider "virtualbox" do |vb| - vb.linked_clone = true - vb.name =VM_INFRA_SERVER01 - vb.memory = 2048 - vb.cpus = 1 -end -... -``` - -#### 啟動kubernetes集群 - -```sh -cd learning-kubernetes/vagrant/linux -vagrant up -``` - - - -## 用法 - -使用此存儲庫來了解 kubernetes 考試 - -

(back to top)

- - - -## 路線圖 - -- [x] 建立儲存庫 -- [x] 為自動化任務建立 github 操作 -- [x] 安裝kubernetes集群 -- [x] 安裝 kubectl -- [x] 新增 kubernetes 範例 -- [x] 新增應用程式部署 -- [x] 使用專案內容建立 docker 映像 -- [x] 建立 github 操作來建置 docker 映像 - -

(back to roadmap)

-

(back to top)

- - - -## Linux 命名空間 - -kubernetes 引擎可與命名空間(PID、NET、IPC、MNT、UTS)和 cgroup 搭配使用。 - -![linux-namespaces](images/linux-namespaces.png) - -## PID - -進程 ID。該檔案是進程的PID命名空間的句柄。PID命名空間隔離了進程ID號空間,這意味著不同PID命名空間中的進程可以具有相同的PID。 PID 命名空間允許容器提供諸如掛起/恢復容器中的進程集以及將容器遷移到新主機等功能,同時容器內的進程保持相同的 PID - -## 網 - -該檔案是進程的網路命名空間的句柄。這提供了與網路相關的系統資源的隔離並隔離了網路設備。 ip netns - 用於處理網路命名空間管理 -mount 該檔案是進程的掛載命名空間的句柄,並隔離掛載點 - -## 工控機 - -該檔案是進程的IPC命名空間的句柄,隔離系統與IPC和POSIX訊息佇列 - -## UTS - -該檔案是進程的UTS命名空間的句柄,隔離Hostname和NIS域名 - -## 使用者 - -該檔案是進程的使用者命名空間的句柄 - -## 組組 - -容器將具有 cgroup 層次結構的獨立視圖。 - -## cgroup 與命名空間 - -_cgroup 是一種控制基於群組的流量控制過濾器的方法,範例_ - -```json -"cgroupsPath": "/myRuntime/myContainer", - "resources": { - "memory": { - "limit": 100000, - "reservation": 200000 - }, - "devices": [ - { - "allow": false, - "access": "rwm" - } - ] - } -``` - -_命名空間:限制/抽像你在linux proc可以看到的內容_ - -字體: - -

(back to linux-namespaces)

-

(back to top)

- -## 庫伯內特斯架構 - - - -![Kubernetes Architecture](images/kubernetes-architecture.jpg) - -### 控制平面 - -![Control Plane](images/control-plane.jpg) - -### 節點 - -![Control Plane](images/worker.jpg) - -### Kubernetes 端口 - -![kubernetes control plane ports](images/kubernetes-cp-ports.jpg) - -![kubernetes works ports](images/kubernetes-wk-ports.jpg) - -### RKE2 上 Rancher 伺服器節點的連接埠 - -![RKE2 Ports](images/rke2-ports.png) - -

(back to kubernetes-architecture)

-

(back to top)

- -## 安裝 kubernetes - - - -### 醜陋的 - -```sh -# install -curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 -chmod +x ./minikube -sudo mv ./minikube /usr/local/bin/minikube - -# get version -minikube version - -# set hypervisor -minikube config set driver - -# up without hypervisor -minikube start --driver=hyperkit - -# create cluster -minikube start --nodes 3 -p multinode-cluster - -# get status of cluster -minikube status - -# get ip address -minikube ip - -# access minikube host -minikube ssh - -# dashboard -minikube dashboard - -# logs -minikube logs - -# delete cluster -minikube delete -minikube delete --purge -``` - -### 種類 - -```sh -# Install -curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.14.0/kind-linux-amd64 -chmod +x ./kind -sudo mv ./kind /usr/local/bin/kind - -# create cluster -kind create cluster -kind create cluster --name silvestrini - -# get clusters -kind get clusters - -# delete clusters -kind delete clusters $(kind get clusters) - -## create yaml -cat << EOF > $HOME/kind-3nodes.yaml -kind: Cluster -apiVersion: kind.x-k8s.io/v1alpha4 -nodes: - - role: control-plane - - role: worker - - role: worker -EOF - -# create cluster -kind create cluster --name kind-multinodes --config $HOME/kind-3nodes.yaml -``` - -

(back to install-kubernetes)

-

(back to top)

- -## 精美的 - - - -使用RKE2建立kubernetes集群,請參閱scripts/linux/k8s/install-rke2.sh資料夾中的腳本 - -### rke2棧的一些命令 - -設定您的 PATH 變數: - -```sh -export PATH=$PATH:/opt/rke2/bin:/var/lib/rancher/rke2/bin -``` - -#### CONTAINERD - ctr 指令 - -```zhs -#list containers using ctr -ctr --address /run/k3s/containerd/containerd.sock --namespace k8s.io container ls -``` - -#### CONTAINERD - crictl 指令 - -```zhs -#list containers using crictl - -## example 1 -export CRI_CONFIG_FILE=/var/lib/rancher/rke2/agent/etc/crictl.yaml -crictl ps - -## example 2 -crictl --config /var/lib/rancher/rke2/agent/etc/crictl.yaml ps - -## example 3 -crictl --runtime-endpoint unix:///run/k3s/containerd/containerd.sock ps -a - - -# stats containers -crictl stats -``` - -### 記錄 - -```sh -journalctl -f -u rke2-server -/var/lib/rancher/rke2/agent/containerd/containerd.log -/var/lib/rancher/rke2/agent/logs/kubelet.log -``` - -參考: - -

(back to rke2)

-

(back to top)

- -## 庫貝克特爾 - - - -### 安裝 - -```sh -# install -curl -LO https://storage.googleapis.com/kubernetes-release/release/`curl -s \ -https://storage.googleapis.com/kubernetes-release/release/stable.txt`/bin/linux/amd64/kubectl -chmod +x ./kubectl -mv ./kubectl /usr/local/bin/kubectl - -# get version -kubectl version --output=yaml --client - -# kubectl autocomplete -source <(kubectl completion bash) - -# kubectl alias -alias k=kubectl -complete -F __start_kubectl k -``` - -### 命令-Kubectl - -```bash - -########## resources ############ - -# list all resources -kubectl get all - -########## namespaces ########### - -# get namespaces -kubectl get namespaces - -# describe namespaces -kubectl describe namespaces - -########## nodes ############ - -# list nodes -kubectl get nodes -kubectl get nodes -o wide - -# delete node -kubectl drain --ignore-daemonsets --delete-emptydir-data -kubectl delete node - -# get logs -kubectl logs my-nginx -kubectl logs -f my-nginx -kubectl logs -n kube-system --all-containers=true etcd-control-plane01 -``` - -

(back to kubectl)

-

(back to top)

- -## 貨櫃 - - - -![Containers](images/docker.jpg) - -### 命令 - 容器 - -```sh -# get containers in pod -kubectl -n kube-system describe pods kube-proxy-worker01 | grep -ws -A 10 Containers - -# connect in container -kubectl attach silvestrini -c infra - -# connect in container -kubectl exec -it pod_name -c container_name bash -kubectl exec infra ls -kubectl exec silvestrini -c infra -- ls -kubectl exec silvestrini -c infra -it sh - -# access container in specific namespace -kubectl exec -it -n kube-system kube-proxy-worker01 -c kube-proxy -- bash -``` - -

(back to containers)

-

(back to top)

- -## 豆莢 - - - -![Pod](images/pod.jpg) - -Pod 是 Kubernetes 中最小的執行單元。一個 Pod 封裝了一個或多個應用程式。\\ -Pod 本質上是短暫的,如果 pod(或其執行的節點)失敗,\\ -Kubernetes 可以自動建立該 Pod 的新副本以繼續操作。\\ -Pod 包含一個或多個容器(例如 Docker 容器)。 - -Pod 也提供環境依賴項,包括持久\\ -儲存磁碟區(永久且可供所有 Pod 使用的儲存\\ -在叢集中)以及在 Pod 中運行容器所需的配置資料。 - -### 指令 - Pod - -```sh -# create pods without manifest -kubectl run nginx --image nginx -kubectl run -it --rm debug --image=busybox --restart=Never -- sh - -# create pod with manifest -kubectl apply -f pod-template.yaml -kubectl create -f pod.yaml - -# list pods -kubectl get pods - -# list all pods -kubectl get pods --all-namespaces -kubectl get pods -A -kubectl get pods -A -o wide - -# list pods in specific node -kubectl get pods --all-namespaces -o wide --field-selector spec.nodeName=worker01 - -# list pods in kube-system namespace -kubectl get pod -n kube-system -kubectl get pods -n kube-system -o=jsonpath='{range.items[*]}{"\n"}{.metadata.name}{range.spec.containers}' - -# list pods with specif output -kubectl get pods -n kube-system -o yaml -kubectl get pods -n kube-system -o json - -# list images used in pods -kubectl get pods -o=jsonpath='{range .items[*]}{"\n"}{.metadata.name}{"\t"}{range .spec.containers[*]}{.image}{"\t"}{end}{end}' - -# describe details of pods -kubectl describe pod nginx -kubectl -n kube-system describe pods kube-proxy-worker01 - -# delete pods -kubectl delete pod nginx -kubectl delete -f pod-template.yaml - -# create Service | expose pod -kubectl expose pod my-nginx - -``` - -### 了解 Pod 資源 - -![Pod Resources](images/resources.jpg) - -

(back to pods)

-

(back to top)

- -## 部署 - - - -![Deployment](images/deployment.jpg) - -Deployment 為 Pod 和 ReplicaSet 提供聲明性更新。 -您描述了部署中所需的狀態,並且部署控制器\\ -以受控速率將實際狀態變更為所需狀態。 \\ -您可以定義部署來建立新的副本集,或刪除現有的\\ -部署並透過新部署採用所有資源。 - -### 命令 - 部署 - -```sh -# create manifest|template -kubectl run my-nginx --image nginx --port 80 --dry-run=client -o yaml >pod-template.yaml - -# apply\update deployment -kubectl apply -f deployment.yaml - -# list deployments -kubectl get deployments -A -kubectl -n kube-system get deployments.apps -kubectl get deployments -l app=nginx-deployment - -# get pods management by deployment -kubectl get pods -l app=nginx-deployment - -# describe deployment -kubectl describe deployment nginx-deployment - -# check status of deployment -kubectl rollout status deployment nginx-deployment - -# running rollback deployment -kubectl rollout undo deployment nginx-deployment -kubectl rollout undo deployment nginx-deployment --to-revision=1 - -# get deployment history -kubectl rollout history deployment nginx-deployment -kubectl rollout history deployment nginx-deployment --revision=2 - -# pause deployment(block updates) -kubectl rollout pause deployment nginx-deployment - -# resume deployment(allow updates) -kubectl rollout resume deployment nginx-deployment - -# restart deployment (recreate all pods in deployment) -kubectl rollout restart deployment nginx-deployment - -# delete deployment -kubectl delete deployment nginx-deployment -``` - -

(back to deployment)

-

(back to top)

- -## 副本集 - - - -![ReplicaSet](images/replicaset.jpg) - -ReplicaSet 的目的是維護一組穩定運作的副本 Pod\\ -在任何給定時間。因此,它通常用於保證\\ -指定數量的相同 Pod。 - -### 指令-ReplicaSet - -````sh -# list replicaset -kubectl get replicaset -l app=nginx-deployment - -# describe replicaset -kubectl describe replicaset nginx-replicaset - -# create replicaset - see folder replicaset/ for examples -kubectl apply -f replicaset.yaml - -# delete replicaset -kubectl delete replicas - -

(back to replicaset)

-

(back to top)

- -## Daemonset - -![Daemonset](images/daemonset.png) - -A DaemonSet ensures that all (or some) Nodes run a copy of a Pod.\ -As nodes are added to the cluster, Pods are added to them.\ -As nodes are removed from the cluster, those Pods are garbage collected.\ -Deleting a DaemonSet will clean up the Pods it created. - -### Commands - Daemonset - -```sh -# list daemonset -kubectl get daemonset -A - -#$ describe daemonset -kubectl describe daemonset node-exporter - -# create daemonset - see folder daemonset/ for examples -kubectl apply -f daemonset.yaml - -# delete daemonset -kubectl delete daemonset node-exporter -```` - -## 探頭 - - - -![Probes](images/probes.jpg) - -Kubernetes 探針是健康檢查,用於監控 Kubernetes 叢集中應用程式和服務的健康狀況。\\ -Kubernetes 探針通常使用 Kubernetes API 實現,這允許它們查詢應用程式或服務以獲取資訊。\\ -然後可以使用此資訊來確定應用程式或服務的運行狀況。\\ -Kubernetes 探針還可用於檢測應用程式或服務中的更改,並向 Kubernetes 控制平面發送通知,然後控制平面可以採取糾正措施。 - -### 探頭類型 - -#### 啟動探針 - -啟動探針用於確定容器是否已成功啟動。\\ -這種類型的探針通常用於啟動時間較長的應用程序,\\ -或對於在準備好接收流量之前執行初始化任務的容器。\\ -啟動探針僅在容器建立後運行一次,並且會延遲啟動\\ -的就緒性和活性探測,直到成功。\\ -如果啟動探測失敗,則認為容器啟動失敗\\ -並且 Kubernetes 將嘗試重新啟動容器。 - -#### 就緒探針 - -就緒探針用於確定容器是否準備好接收流量。\\ -這種類型的探針用於確保容器完全啟動並運行並且可以\\ -在將傳入連線新增至服務負載平衡器之前接受傳入連線。\\ -就緒探針可用於檢查應用程式相依性的可用性\\ -或執行任何其他檢查來指示容器已準備好服務流量。\\ -如果就緒偵測失敗,容器將從服務負載平衡器中刪除,直到偵測再次成功。 - -#### 活性探針 - -活性探針用於確定容器是否仍在運作並正常運作。\\ -這種類型的探測器用於檢測容器崩潰或掛起並從中恢復。\\ -活性探針可用於檢查應用程式的反應能力或執行\\ -表明容器仍然存在且健康的任何其他檢查。\\ -如果活性探測失敗,Kubernetes 將嘗試重新啟動容器以恢復其功能。 - -

(back to probes)

-

(back to top)

- -## 卷 - - - -![Volumes](images/volumes01.png) - -### 儲存類別 - -![Storage Class](/images/storageclass.png) - -一些儲存類別提供者 - -- kubernetes.io/aws-ebs:AWS 彈性區塊儲存 (EBS) -- kubernetes.io/azure-disk:Azure 磁碟 -- kubernetes.io/gce-pd:Google 運算引擎 (GCE) 持久性磁碟 -- kubernetes.io/cinder:OpenStack Cinder -- kubernetes.io/vsphere-volume:vSphere -- kubernetes.io/no-provisioner:本地捲 -- kubernetes.io/host-path:本機磁碟區 - -### PV - 持久量 - -![PV](images/pv.png) - -某些類型的光伏發電 - -- 當地的 - - 主機路徑 -- 網路 - - 網路檔案系統 - - iSCSI - - Ceph RBD(RAdos 塊設備) - - GlusterFS - - 雲端供應商(EBS、Google 雲端永久磁碟、Azure 磁碟儲存) - -#### 儲存類型(主機路徑) - -- 主機路徑 -- 網路檔案系統 -- 電腦介面 -- CSI -- 當地的 -- 足球俱樂部 - -### PVC - 持久卷聲明 - -![PVC](/images/pvc.png) - -### 指令 - 卷 - -```bash -# list storage classes -kubectl get storageclass - -# describe storage class -kubectl describe storageclass silvestrini - -# get storage class provisioners -kubectl get storageclasses.storage.k8s.io -o=jsonpath='{range.items[*]}{.provisioner}{"\n"}' - -# list pv in cluster -kubectl get pv -A - -# describe pv -kubectl describe pv my-pv - -# list pvc -kubectl get pvc -o wide - -# delete pvc -kubectl delete pvc my-pvc - -# describe pvc -kubectl describe pvc my-pvc - -# get events -kubectl get events my-pvc.1772cda2d4c7069b -``` - -

(back to volumes)

-

(back to top)

- -## 有狀態集 - - - -![StatefulSet](images/statefulset.png) - -StatefulSet 是用於管理有狀態應用程式的工作負載 API 物件。 - -管理一組 Pod 的部署和擴展,並提供有關這些 Pod 的順序和唯一性的保證。 - -與 Deployment 類似,StatefulSet 管理基於相同容器規範的 Pod。\\ -與 Deployment 不同,StatefulSet 為其每個 Pod 維護粘性身份。\\ - -這些 Pod 是根據相同的規範創建的,但不可互換:每個 Pod 都有一個在任何重新調度過程中都會維護的持久標識符。 - -如果您想使用儲存磁碟區為您的工作負載提供持久性,\\ -您可以使用 StatefulSet 作為解決方案的一部分。雖然個別 Pod 在\\ -StatefulSet 容易故障,持久化的 Pod 識別碼使得\\ -更容易將現有捲與新 Pod 相匹配,以替換任何失敗的 Pod。 - -### StatefulSet 中 Pod 的 DNS - -```sh -...svc.cluster.local -# Example: nginx-0.nginx.default.svc.cluster.local -``` - -### 命令 - StatefulSet - -```bash -# list statefulsets -kubectl get statefulsets - -# describe statefulsets -kubectl describe statefulsets.apps nginx - -# delete statefulset -kubectl delete statefulset nginx - -# test network service -## create container for test -kubectl run -it --rm --image=busybox --restart=Never -- sh - -## test nslookup -nslookup nginx-0.nginx.default.svc.cluster.local - -## test web page -wget -O- http://nginx-0.nginx.default.svc.cluster.local -``` - -

(back to statefulset)

-

(back to top)

- -## 服務 - - - -![Services](images/services.png) - -Kubernetes 服務是叢集中已部署的一組 Pod 的邏輯抽象\\ -(它們都執行相同的功能)。\\ -由於 Pod 是短暫的,因此服務會啟用一組 Pod,這些 Pod 提供特定的\\ -若要指派名稱和唯一 IP 的功能(Web 服務、影像處理等)\\ -位址(集群IP)。 - -### Kubernetes 中的服務類型 - -#### 集群IP服務 - -ClusterIP 是 Kubernetes 中的預設服務類型,它提供應用程式不同元件之間的內部連線。 Kubernetes 為 ClusterIP 服務指派一個虛擬 IP 位址,該服務在建立期間只能從叢集內部存取。該 IP 位址是穩定的,即使服務背後的 Pod 被重新調度或更換,也不會發生變化。 - -ClusterIP 服務是應用程式不同元件之間不需要暴露給外部世界的內部通訊的絕佳選擇。例如,如果我們有一個微服務處理資料並將其發送到另一個微服務進行進一步處理,我們可以使用 ClusterIP 服務來連接它們。 - -要在 Kubernetes 中建立 ClusterIP 服務,我們需要在 YAML 檔案中定義它並將其套用到叢集。以下是簡單 ClusterIP 服務定義的範例: - -```yaml -apiVersion: v1 -kind: Service -metadata: - name: backend -spec: - selector: - app: backend - ports: - - name: http - port: 80 - targetPort: 8080 -``` - -在此範例中,我們定義了一個名為 backend 的服務,其中包含一個選擇器,該選擇器針對標有 app: backend 的 pod。此服務公開連接埠 80(客戶端用於存取該服務的連接埠),並將流量轉送至 Pod 的連接埠 8080(後端應用程式運行的位置)。 - -#### 節點連接埠服務 - -NodePort 服務透過啟用與我們的應用程式的外部連線來擴展 ClusterIP 服務的功能。當我們在叢集內任何符合定義條件的節點上建立 NodePort 服務時,Kubernetes 會開啟一個指定端口,將流量轉送到該節點上執行的對應 ClusterIP 服務。 - -這些服務非常適合需要從叢集外部存取的應用程序,例如 Web 應用程式或 API。透過 NodePort 服務,我們可以使用節點的 IP 位址和分配給服務的連接埠號碼來存取我們的應用程式。 - -讓我們來看一個簡單的 NodePort 服務定義範例: - -```yaml -apiVersion: v1 -kind: Service -metadata: - name: frontend -spec: - selector: - app: frontend - type: NodePort - ports: - - name: http - port: 80 - targetPort: 8080 -``` - -我們定義一個名為 frontend 的服務,透過設定選擇器來定位標示為 app:frontend 的 pod。該服務公開連接埠 80 並將流量轉送到 Pod 的連接埠 8080。我們將服務類型設定為 NodePort,Kubernetes 在叢集內符合條件的節點上的特定連接埠上公開該服務。 - -當我們建立 NodePort 服務時,Kubernetes 會指派預定義範圍 30000-32767 中的連接埠號碼。此外,我們可以透過將 nodePort 欄位新增至服務定義來指定自訂連接埠號碼: - -```yaml - -apiVersion: v1 -kind: Service -metadata: - name: frontend -spec: - selector: - app: frontend - type: NodePort - ports: - - name: http - port: 80 - targetPort: 8080 - nodePort: 30080 -``` - -nodePort 欄位指定為 30080,這告訴 Kubernetes 在叢集中的每個節點上公開連接埠 30080 上的服務。 - -#### 負載平衡器服務 - -LoadBalancer 服務在外部連接我們的應用程序,生產環境在高可用性和可擴展性至關重要的情況下使用它們。當我們建立 LoadBalancer 服務時,Kubernetes 在我們的雲端環境中設定一個負載平衡器,並將流量轉送到執行該服務的節點。 - -LoadBalancer 服務非常適合需要處理高流量的應用程序,例如 Web 應用程式或 API。借助 LoadBalancer 服務,我們可以使用分配給負載平衡器的單一 IP 位址來存取我們的應用程式。 - -以下是一個簡單的 LoadBalancer 服務定義範例: - -```yaml -apiVersion: v1 -kind: Service -metadata: - name: web -spec: - selector: - app: web - type: LoadBalancer - ports: - - name: http - port: 80 - targetPort: 8080 -``` - -我們將服務類型設定為 LoadBalancer 以指示 Kubernetes 配置負載平衡器。在這裡,我們定義了一個名為 web 的服務,並指定了一個針對標有 app: web 的 pod 的選擇器。此外,我們公開連接埠 80 並將流量轉送到 Pod 的連接埠 8080。 - -建立 LoadBalancer 服務後,Kubernetes 在雲端環境中提供一個具有公用 IP 位址的負載平衡器。我們可以使用此 IP 位址從叢集外部存取我們的應用程式。 - -![Services Types](/images/service-types.png) - -參考: - -### 命令 - 服務 - -```sh -# list services -kubectl get services -kubectl get svc -o wide - -# list services in system namespace -kubectl get svc -n kube-system - -# details of services -kubectl describe svc nginx -kubectl describe svc -n kube-system - -# list endpoints -kubectl get endpoints - -# create ClusterIP service -kubectl expose deployment app-silvestrini --port=80 --target-port=8080 - -# create NodePort service -kubectl expose deployment app-silvestrini --type=NodePort --port=80 --target-port=8080 - -# create loadbalance service -kubectl expose deployment app-silvestrini --type=LoadBalancer --port=80 --target-port=8080 - -#create external name service -kubectl create service externalname app-silvestrini --external-name my-db.skynet.com.br - -# delete service -kubectl delete service nginx -``` - -

(back to services)

-

(back to top)

- -## 秘密 - - - -![Secrets](images/secrets.png) - -Secret 是包含少量敏感資料(例如密碼、令牌或金鑰)的物件。此類資訊可能會被放入 Pod 規格或容器鏡像中。使用 Secret 意味著您不需要在應用程式程式碼中包含機密資料。 - -由於 Secret 的創建可以獨立於使用它們的 Pod,因此在創建、檢視和編輯 Pod 的工作流程中 Secret(及其資料)暴露的風險較小。 Kubernetes 以及在叢集中運行的應用程式還可以使用 Secrets 採取額外的預防措施,例如避免將機密資料寫入非揮發性儲存。 - -Secrets 與 ConfigMap 類似,但專門用於保存機密資料。 - -### 秘密的類型 - -- 不透明的秘密 - 這些是最簡單和最常見的秘密。它們儲存任意數據,例如 API 金鑰、密碼和令牌。 Opaque Secrets 儲存在 Kubernetes 中時以 base64 編碼,但未加密。它們可用於儲存敏感數據,但對於資料庫密碼等高度敏感資訊來說不夠安全。 - -- kubernetes.io/service-account-token - 用於儲存服務帳戶存取權杖。這些令牌用於透過 Kubernetes API 對 Pod 進行身份驗證。它們會自動安裝在使用服務帳戶的 Pod 中。 - -- kubernetes.io/dockercfg 和 kubernetes.io/dockerconfigjson - 用於儲存 Docker 註冊表憑證。它們用於透過 Docker 註冊表對 Pod 進行身份驗證。它們安裝在使用私有容器鏡像的 Pod 中。 - -- kubernetes.io/tls、kubernetes.io/ssh-auth 和 kubernetes.io/basic-auth - 分別用於儲存 TLS 憑證、SSH 金鑰和基本驗證憑證。它們用於透過其他服務對 Pod 進行身份驗證。 - -- bootstrap.kubernetes.io/token - 用於儲存叢集引導令牌。它們用於透過 Kubernetes 控制平面對節點進行身份驗證。 - -### 命令 - 秘密 - -```sh -# get secrets -kubectl get secrets -A - -# describe secrets -kubectl describe secret -n cert-manager cert-manager-webhook-ca - -# create opaque secret -kubectl create secret generic silvestrini-secret --from-literal=username=silvestrini --from-literal=password=silvestrini - -# create tls secret -# generate certs -# openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout private-key.key -out cert.crt -kubectl create secret tls my-service-web-tls-secret --cert=cert.crt --key=private-key.key -``` - -

(back to secrets)

-

(back to top)

- -## 配置映射 - - - -![ConfigMap](/images/configmap.png) - -ConfigMap 是一個 API 對象,用於以鍵值對的形式儲存非機密資料。\\ -Pod 可以將 ConfigMap 作為環境變數、命令列參數或磁碟區中的設定檔使用。 - -ConfigMap 可讓您將特定於環境的配置與容器映像解耦,以便您的應用程式易於移植。 - -### 指令 - ConfigMap - -```sh -# create configmap -kubectl create configmap nginx-config --from-file=kubernetes/configmaps/nginx.conf - -# get configmaps -kubectl get configmaps - -# describe configmaps -kubectl describe configmaps nginx-config -``` - -

(back to configmap)

-

(back to top)

- -## 貢獻 - -貢獻使開源社群成為一個令人驚嘆的地方 -學習、啟發和創造。您所做的任何貢獻都是**不勝感激**. - -如果您有更好的建議,請分叉該存儲庫並 -建立拉取請求。您也可以簡單地使用標籤“增強”來開啟問題。 -不要忘記給該項目一顆星!再次感謝! - -1. 分叉項目 -2. 建立您的功能分支(`git checkout -b feature/AmazingFeature`) -3. 提交您的更改(`git commit -m 'Add some AmazingFeature'`) -4. 推送到分支(`git push origin feature/AmazingFeature`) -5. 打開拉取請求 - -## 執照 - -- 該項目已獲得 MIT 許可證 \* 有關詳細信息,請參閱 LICENSE.md 文件 - -## 接觸 - -馬科斯·西爾維斯特里尼 -[marcos.silvestrini@gmail.com](mailto:marcos.silvestrini@gmail.com)\\[![Twitter](https://img.shields.io/twitter/url/https/twitter.com/mrsilvestrini.svg?style=social&label=Follow%20%40mrsilvestrini)](https://twitter.com/mrsilvestrini) - -項目連結: - -

(back to top)

- -## 致謝 - -- [CNCF - 雲端原生運算基金會](https://www.cncf.io/) -- [OCI - 開放容器倡議](https://opencontainers.org/) -- [博格](https://kubernetes.io/blog/2015/04/borg-predecessor-to-kubernetes/) -- [Kubernetes 網站](https://kubernetes.io/) -- [庫伯內特斯架構](https://platform9.com/blog/kubernetes-enterprise-chapter-2-kubernetes-architecture-concepts/) -- [吉圖布](https://github.com/kubernetes/kubernetes/) -- [問題](https://github.com/kubernetes/kubernetes/issues) -- [CKA認證](https://www.cncf.io/certification/cka/) -- [CKAD認證](https://www.cncf.io/certification/ckad/) -- [中科認證](https://www.cncf.io/certification/cks/) -- [種類](https://kind.sigs.k8s.io/docs/user/quick-start) -- [醜陋的](https://github.com/kubernetes/minikube) -- [k0s](https://k0sproject.io/) -- [作為一根棍子](https://k3s.io/) -- [精美的](https://docs.rke2.io/architecture) -- [啟動RKE2集群HA](https://computingforgeeks.com/deploy-kubernetes-on-rocky-using-rke2/?expand_article=1) -- [Kubernetes 工作負載](https://www.suse.com/c/rancher_blog/introduction-to-kubernetes-workloads/) -- [Rancher 本機路徑配置器](https://github.com/rancher/local-path-provisioner) -- [Kubernetes 儀表板](https://upcloud.com/resources/tutorials/deploy-kubernetes-dashboard) -- [OpenLens 叢集管理](https://github.com/MuhammedKalkan/OpenLens) -- [書 Linux Ps](https://livro.descomplicandokubernetes.com.br/pt/) -- [庫伯內特服務](https://cast.ai/blog/kubernetes-load-balancer-expert-guide-with-examples/) - -

(back to top)

- - - - - -[contributors-shield]: https://img.shields.io/github/contributors/marcossilvestrini/learning-kubernetes.svg?style=for-the-badge - -[contributors-url]: https://github.com/marcossilvestrini/learning-kubernetes/graphs/contributors - -[forks-shield]: https://img.shields.io/github/forks/marcossilvestrini/learning-kubernetes.svg?style=for-the-badge - -[forks-url]: https://github.com/marcossilvestrini/learning-kubernetes/network/members - -[stars-shield]: https://img.shields.io/github/stars/marcossilvestrini/learning-kubernetes.svg?style=for-the-badge - -[stars-url]: https://github.com/marcossilvestrini/learning-kubernetes/stargazers - -[issues-shield]: https://img.shields.io/github/issues/marcossilvestrini/learning-kubernetes.svg?style=for-the-badge - -[issues-url]: https://github.com/marcossilvestrini/learning-kubernetes/issues - -[license-shield]: https://img.shields.io/github/license/marcossilvestrini/learning-kubernetes.svg?style=for-the-badge - -[license-url]: https://github.com/marcossilvestrini/learning-kubernetes/blob/master/LICENSE - -[linkedin-shield]: https://img.shields.io/badge/-LinkedIn-black.svg?style=for-the-badge&logo=linkedin&colorB=555 - -[linkedin-url]: https://linkedin.com/in/marcossilvestrini