Кубернетес кластерыг сул зогсолтгүйгээр шинэчлэх

Кубернетес кластерыг сул зогсолтгүйгээр шинэчлэх

Kubernetes кластераа шинэчлэх процесс

Хэзээ нэгэн цагт Kubernetes кластерийг ашиглах үед ажиллаж байгаа зангилааг шинэчлэх шаардлагатай болдог. Үүнд багцын шинэчлэлт, цөмийн шинэчлэлт эсвэл шинэ виртуал машины дүрсийг байршуулах зэрэг багтаж болно. Kubernetes нэр томъёонд үүнийг нэрлэдэг "Сайн дурын эвдрэл".

Энэ нийтлэл нь 4 нийтлэлийн цувралын нэг хэсэг юм:

  1. Энэ бичлэг.
  2. Kubernetes кластер дахь pods-ыг зөв унтраах
  3. Под устгагдсан үед дуусах хугацаа хойшлогдож байна
  4. PodDisruptionBudgets ашиглан Кубернетес кластерын зогсолтоос хэрхэн зайлсхийх вэ

(ойролцоогоор. Цувралын үлдсэн нийтлэлүүдийн орчуулгыг ойрын ирээдүйд хүлээж байна)

Энэ нийтлэлд бид таны кластерт ажиллаж байгаа зангилааны тасалдалгүй байхын тулд Kubernetes-ийн хангадаг бүх хэрэгслийг тайлбарлах болно.

Асуудлыг тодорхойлох

Бид эхлээд гэнэн хандаж, асуудлыг тодорхойлж, энэ аргын болзошгүй эрсдлийг үнэлж, мөчлөгийн туршид тулгардаг бэрхшээл бүрийг шийдвэрлэх мэдлэгийг бий болгоно. Үр дүн нь бидний тэг зогсолтыг хангахын тулд амьдралын мөчлөгийн дэгээ, бэлэн байдлын датчик болон Pod тасалдлын төсвийг ашигладаг тохиргоо юм.

Аяллаа эхлүүлэхийн тулд тодорхой жишээ авъя. Бидэнд хоёр зангилаатай Кубернетес кластер байна гэж бодъё, үүнд програм нь ар талд байрлах хоёр хонхорцогтой ажиллаж байна. Service:

Кубернетес кластерыг сул зогсолтгүйгээр шинэчлэх

Манай хоёр Kubernetes кластер зангилаа дээр ажиллаж байгаа Nginx болон Service бүхий хоёр pod-оос эхэлцгээе.

Бид кластерын хоёр ажилчны зангилааны цөмийн хувилбарыг шинэчлэхийг хүсч байна. Үүнийг бид яаж хийх вэ? Энгийн шийдэл бол шинэчлэгдсэн тохиргоотой шинэ зангилаануудыг ачаалж, дараа нь шинэ зангилааг эхлүүлэхийн зэрэгцээ хуучин зангилааг унтраах явдал юм. Энэ нь ажиллах хэдий ч энэ арга барилтай холбоотой хэд хэдэн асуудал гарна:

  • Хуучин зангилааг унтраах үед тэдгээр дээр ажиллаж байгаа pods мөн унтарна. Гоёмсог унтрахын тулд хонхорцог цэвэрлэх шаардлагатай бол яах вэ? Таны ашиглаж буй виртуалчлалын систем цэвэрлэх үйл явц дуусахыг хүлээхгүй байж магадгүй.
  • Хэрэв та бүх зангилааг нэгэн зэрэг унтраавал яах вэ? Дотор нь шинэ зангилаа руу шилжих үед та хангалттай зогсолт хийх болно.

Бид зангилаанд өөрчлөлт хийх үед манай ажилчдын аль нь ч процесс ажиллахгүй байхын зэрэгцээ хуучин зангилаанаас pods-г хялбархан шилжүүлэх арга хэрэгтэй байна. Эсвэл жишээн дээрх шиг кластерыг бүрэн солих үед (өөрөөр хэлбэл бид VM дүрсийг сольдог) бид ажиллаж байгаа програмуудыг хуучин зангилаанаас шинэ рүү шилжүүлэхийг хүсч байна. Аль ч тохиолдолд бид хуучин зангилаанууд дээр шинэ pods хуваарь гаргахаас сэргийлж, дараа нь тэдгээрээс ажиллаж байгаа бүх pods-ыг гаргахыг хүсэж байна. Эдгээр зорилгод хүрэхийн тулд бид тушаалыг ашиглаж болно kubectl drain.

Зангилаанаас бүх хонхорцог дахин хуваарилж байна

Ус зайлуулах ажиллагаа нь зангилаанаас бүх хонхорцог дахин хуваарилах боломжийг олгодог. Ус зайлуулах ажлыг гүйцэтгэх явцад зангилааг төлөвлөөгүй гэж тэмдэглэсэн (туг NoSchedule). Энэ нь үүн дээр шинэ хонхорцог гарч ирэхээс сэргийлнэ. Дараа нь drain нь зангилаанаас хонхорхойг гаргаж эхэлдэг бөгөөд дохио илгээж, зангилаа дээр ажиллаж байгаа савыг хаадаг. TERM саванд байгаа савнууд.

Хэдийгээр kubectl drain хонхорцог зайлуулах ажлыг маш сайн хийх болно, ус зайлуулах ажиллагааг доголдуулах өөр хоёр хүчин зүйл байдаг:

  • Өргөдөл гаргасны дараагаар таны өргөдлийг бүрэн дуусгах боломжтой байх ёстой TERM дохио. Хоногуудыг хөөхөд Кубернетес дохио илгээдэг TERM чингэлэгт суулгаж, тодорхой хугацаанд зогсохыг хүлээдэг бөгөөд үүний дараа зогсохгүй бол албадан зогсоодог. Ямар ч тохиолдолд, хэрэв таны контейнер дохиог зөв хүлээн авахгүй бол, хэрэв тэдгээр нь одоо ажиллаж байгаа бол (жишээ нь, мэдээллийн сангийн гүйлгээ хийгдэж байгаа) та тэдгээрийг буруу унтрааж болно.
  • Та өөрийн програмыг агуулсан бүх pods-ыг алддаг. Шинэ зангилаанууд дээр шинэ контейнер ажиллуулах үед энэ нь ажиллахгүй байж магадгүй, эсвэл таны подкуудыг хянагчгүйгээр байрлуулсан бол огт дахин эхлүүлэхгүй байж магадгүй.

Сул зогсолтоос зайлсхийх

Зангилааны ус зайлуулах ажиллагаа гэх мэт сайн дурын тасалдлаас үүсэх сул зогсолтыг багасгахын тулд Кубернетес дараах алдааг засах сонголтыг санал болгодог.

Цувралын үлдсэн хэсэгт бид шилжин суурьшсан савны нөлөөллийг багасгахын тулд эдгээр Кубернетес функцуудыг ашиглах болно. Үндсэн санааг дагахад хялбар болгохын тулд бид дээрх жишээн дээр дараах нөөцийн тохиргоог ашиглана.

---
apiVersion: apps/v1
kind: Deployment
metadata:
 name: nginx-deployment
 labels:
   app: nginx
spec:
 replicas: 2
 selector:
   matchLabels:
     app: nginx
 template:
   metadata:
     labels:
       app: nginx
   spec:
     containers:
     - name: nginx
       image: nginx:1.15
       ports:
       - containerPort: 80
---
kind: Service
apiVersion: v1
metadata:
 name: nginx-service
spec:
 selector:
   app: nginx
 ports:
 - protocol: TCP
   targetPort: 80
   port: 80

Энэ тохиргоо нь хамгийн бага жишээ юм Deployment, энэ нь кластер дахь nginx pods-ийг удирддаг. Үүнээс гадна, тохиргоо нь нөөцийг тодорхойлдог Service, үүнийг кластер дахь nginx pod-д хандахад ашиглаж болно.

Циклийн туршид бид энэ тохиргоог дараалан өргөжүүлэх бөгөөд ингэснээр Кубернетесийн сул зогсолтыг багасгах бүх боломжуудыг багтаана.

AWS болон түүнээс хойшхи хугацаанд тэг зогсолт хийх Kubernetes кластер шинэчлэлтийн бүрэн хэрэгжиж, туршсан хувилбарыг үзэхийг хүсвэл зочилно уу. Gruntwork.io.

Мөн манай блог дээрх бусад нийтлэлүүдийг уншина уу:

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх