ПроХостер > блог > Администрација > Наше искуство са подацима у етцд Кубернетес кластеру директно (без К8с АПИ-ја)
Наше искуство са подацима у етцд Кубернетес кластеру директно (без К8с АПИ-ја)
Све чешће клијенти траже од нас да омогућимо приступ Кубернетес кластеру како би могли да приступе услугама у оквиру кластера: тако да могу директно да се повежу на неку базу података или сервис, да повежу локалну апликацију са апликацијама у оквиру кластера...
На пример, постоји потреба да се повежете са ваше локалне машине на услугу memcached.staging.svc.cluster.local. Ову могућност пружамо користећи ВПН унутар кластера на који се клијент повезује. Да бисмо то урадили, најављујемо подмреже подова, услуга и гурамо ДНС кластера клијенту. Дакле, када клијент покуша да се повеже са услугом memcached.staging.svc.cluster.local, захтев иде ка ДНС-у кластера и као одговор добија адресу ове услуге из мреже сервиса кластера или адресу под.
Конфигуришемо К8с кластере користећи кубеадм, где је подразумевана сервисна подмрежа 192.168.0.0/16, а мрежа махуна је 10.244.0.0/16. Обично све функционише добро, али постоји неколико тачака:
Подмрежа 192.168.*.* често се користи у мрежама клијентских канцеларија, а још чешће у кућним мрежама програмера. А онда добијамо конфликте: кућни рутери раде на овој подмрежи и ВПН гура ове подмреже из кластера до клијента.
Имамо неколико кластера (производни, сценски и/или неколико кластера за развој). Тада ће све оне подразумевано имати исте подмреже за подове и сервисе, што ствара велике потешкоће за истовремени рад са сервисима у више кластера.
Одавно смо усвојили праксу коришћења различитих подмрежа за услуге и подове у оквиру истог пројекта – уопштено, тако да сви кластери имају различите мреже. Међутим, постоји велики број кластера у раду које не бих желео да пребацујем од нуле, пошто покрећу многе сервисе, апликације са статусом итд.
А онда смо се запитали: како променити подмрежу у постојећем кластеру?
Тражење одлука
Најчешћа пракса је рекреација све услуге са типом ЦлустерИП. као опција, може саветовати и ово:
Следећи процес има проблем: након што је све конфигурисано, подови добијају стару ИП адресу као ДНС сервер имена у /етц/ресолв.цонф.
Пошто још увек нисам нашао решење, морао сам да ресетујем цео кластер помоћу кубеадм ресетовања и поново га покренем.
Али ово није погодно за све... Ево детаљнијих увода за наш случај:
Користи се фланел;
Постоје кластери и у облацима и на хардверу;
Желео бих да избегнем поновно распоређивање свих услуга у кластеру;
Постоји потреба да се генерално све ради са минималним бројем проблема;
Кубернетес верзија је 1.16.6 (међутим, даљи кораци ће бити слични за друге верзије);
Главни задатак је осигурати да у кластеру распоређеном помоћу кубеадм-а са услужном подмрежом 192.168.0.0/16, замените га са 172.24.0.0/16.
И десило се да смо дуго били заинтересовани да видимо шта се и како у Кубернетесу чува у етцд-у, шта се може урадити са тим... Па смо помислили: „Зашто једноставно не ажурирате податке у етцд-у, замењујући старе ИП адресе (подмрежу) новим? "
Трагајући за готовим алатима за рад са подацима у етцд-у, нисмо нашли ништа што би у потпуности решило проблем. (Успут, ако знате за било какве услужне програме за рад са подацима директно у етцд-у, били бисмо вам захвални на линковима.) Међутим, добра полазна тачка је етцдхелпер из ОпенСхифт(хвала његовим ауторима!).
Овај услужни програм може да се повеже на етцд користећи сертификате и да чита податке одатле помоћу команди ls, get, dump.
Додајте етцдхелпер
Следећа мисао је логична: „Шта вас спречава да додате овај услужни програм додавањем могућности писања података у етцд?“
Постао је модификована верзија етцдхелпера са две нове функције changeServiceCIDR и changePodCIDR. на њу можете видети код овде.
Шта раде нове функције? Алгоритам changeServiceCIDR:
креирајте десеријализатор;
компајлирати регуларни израз да замени ЦИДР;
пролазимо кроз све услуге са типом ЦлустерИП у кластеру:
декодирајте вредност из етцд у Го објекат;
помоћу регуларног израза замењујемо прва два бајта адресе;
доделите сервису ИП адресу из нове подмреже;
креирајте серијализатор, претворите Го објекат у протобуф, напишите нове податке у етцд.
Функција changePodCIDR суштински слични changeServiceCIDR - само уместо да уређујемо спецификацију услуге, ми то радимо за чвор и мењамо .spec.PodCIDR у нову подмрежу.
Пракса
Промените услугу ЦИДР
План за имплементацију задатка је веома једноставан, али укључује застоје у време поновног креирања свих махуна у кластеру. Након што опишемо главне кораке, поделићемо и размишљања о томе како, у теорији, ово време застоја може бити сведено на минимум.
Припремни кораци:
инсталирање потребног софтвера и склапање закрпљеног етцдхелпера;
резервна копија итд. и /etc/kubernetes.
Кратак акциони план за промену услугеЦИДР:
промена манифеста аписервера и контролора-менаџера;
Штедимо за себе etcdhelper.go, преузимање зависности, прикупљање:
wget https://raw.githubusercontent.com/flant/examples/master/2020/04-etcdhelper/etcdhelper.go
go get go.etcd.io/etcd/clientv3 k8s.io/kubectl/pkg/scheme k8s.io/apimachinery/pkg/runtime
go build -o etcdhelper etcdhelper.go
4. Промените подмрежу услуге у манифестима Кубернетес контролне равни. У фајловима /etc/kubernetes/manifests/kube-apiserver.yaml и /etc/kubernetes/manifests/kube-controller-manager.yaml промените параметар --service-cluster-ip-range у нову подмрежу: 172.24.0.0/16 уместо 192.168.0.0/16.
5. Пошто мењамо сервисну подмрежу којој кубеадм издаје сертификате за аписервер (укључујући и њих), потребно их је поново издати:
Хајде да видимо за које домене и ИП адресе је издат тренутни сертификат:
openssl x509 -noout -ext subjectAltName </etc/kubernetes/pki/apiserver.crt
X509v3 Subject Alternative Name:
DNS:dev-1-master, DNS:kubernetes, DNS:kubernetes.default, DNS:kubernetes.default.svc, DNS:kubernetes.default.svc.cluster.local, DNS:apiserver, IP Address:192.168.0.1, IP Address:10.0.0.163, IP Address:192.168.199.100
Хајде да припремимо минималну конфигурацију за кубеадм:
Упозорење! У овом тренутку, резолуција домена престаје да ради у кластеру, јер у постојећим подовима /etc/resolv.conf стара ЦореДНС адреса (кубе-днс) је регистрована, а кубе-проки мења иптаблес правила са старе подмреже на нову. Даље у чланку је написано о могућим опцијама за минимизирање застоја.
Хајде да поправимо ЦонфигМап у именском простору kube-system:
kubectl -n kube-system edit cm kubelet-config-1.16
- замени овде clusterDNS на нову ИП адресу кубе-днс услуге: kubectl -n kube-system get svc kube-dns.
kubectl -n kube-system edit cm kubeadm-config
- ми ћемо то поправити data.ClusterConfiguration.networking.serviceSubnet у нову подмрежу.
Пошто је кубе-днс адреса промењена, потребно је ажурирати кубелет конфигурацију на свим чворовима:
6. Хајде да поново покренемо све чворове кластера један по један.
7. Ако оставите бар један чвор стари подЦИДР, тада кубе-цонтроллер-манагер неће моћи да се покрене, а подови у кластеру неће бити заказани.
У ствари, промена подЦИДР-а може да се уради још једноставније (нпр. тако). Али желели смо да научимо како да радимо директно са етцд-ом, јер постоје случајеви када уређујете Кубернетес објекте у етцд-у - сингл могућа варијанта. (На пример, не можете само да промените поље услуге без прекида рада spec.clusterIP.)
Укупан
У чланку се говори о могућности директног рада са подацима у етцд-у, тј. заобилазећи Кубернетес АПИ. Понекад вам овај приступ омогућава да радите „шкакљиве ствари“. Тестирали смо операције дате у тексту на стварним К8с кластерима. Међутим, њихов статус спремности за широку употребу је ПоЦ (доказ концепта). Стога, ако желите да користите модификовану верзију услужног програма етцдхелпер на својим кластерима, урадите то на сопствени ризик.