Eksperyans nou ak done nan gwoup etcd Kubernetes dirèkteman (san API K8s)
De pli zan pli, kliyan ap mande nou pou nou bay aksè nan gwoup Kubernetes pou kapab jwenn aksè nan sèvis nan gwoup la: pou kapab konekte dirèkteman ak kèk baz done oswa sèvis, konekte yon aplikasyon lokal ak aplikasyon ki nan gwoup la...
Pou egzanp, gen yon bezwen konekte soti nan machin lokal ou a nan yon sèvis memcached.staging.svc.cluster.local. Nou bay kapasite sa a lè l sèvi avèk yon VPN nan gwoup la ak kliyan an konekte. Pou fè sa, nou anonse sous-rezo nan gous, sèvis ak pouse gwoup DNS nan kliyan an. Kidonk, lè yon kliyan eseye konekte ak sèvis la memcached.staging.svc.cluster.local, demann lan ale nan DNS gwoup la epi li resevwa adrès sèvis sa a nan rezo sèvis gwoup la oswa adrès gous la.
Nou konfigirasyon gwoup K8s lè l sèvi avèk kubeadm, kote sous-rezo sèvis default la ye 192.168.0.0/16, ak rezo a nan gous se 10.244.0.0/16. Anjeneral tout bagay ap mache byen, men gen kèk pwen:
Sourezo 192.168.*.* souvan itilize nan rezo biwo kliyan, e menm pi souvan nan rezo lakay pwomotè. Lè sa a, nou jwenn konfli: routeurs lakay yo travay sou subnet sa a ak VPN a pouse subnet sa yo soti nan gwoup la nan kliyan an.
Nou gen plizyè grap (pwodiksyon, etap ak / oswa plizyè gwoup dev). Lè sa a, pa default, tout nan yo pral gen menm subnets yo pou gous ak sèvis, ki kreye gwo difikilte pou travay similtane ak sèvis nan plizyè grap.
Depi lontan nou te adopte pratik pou itilize sous-rezo diferan pou sèvis ak gous nan menm pwojè a - an jeneral, pou tout gwoup yo gen rezo diferan. Sepandan, gen yon gwo kantite grap nan operasyon ke mwen pa ta renmen woule soti nan grafouyen, paske yo kouri anpil sèvis, aplikasyon pou eta, elatriye.
Lè sa a, nou mande tèt nou: ki jan yo chanje subnet la nan yon gwoup ki deja egziste?
Rechèch desizyon
Pratik ki pi komen se rkree tout sèvis ak kalite ClusterIP. Kòm yon opsyon, ka konseye ak sa a:
Pwosesis sa a gen yon pwoblèm: apre tout bagay configuré, gous yo vini ak ansyen IP a kòm yon sèvè DNS nan /etc/resolv.conf.
Depi mwen toujou pa jwenn solisyon an, mwen te oblije Reyajiste tout gwoup la ak kubeadm reset ak reinitial li ankò.
Men, sa a pa apwopriye pou tout moun... Men entwodiksyon plis detay pou ka nou an:
Flanèl yo itilize;
Gen grap tou de nan nwaj yo ak sou pyès ki nan konpitè;
Mwen ta renmen evite re-deplwaye tout sèvis nan gwoup la;
Gen yon bezwen jeneralman fè tout bagay ak yon kantite minimòm pwoblèm;
Vèsyon Kubernetes se 1.16.6 (sepandan, lòt etap yo pral sanble pou lòt vèsyon);
Travay prensipal la se asire ke nan yon gwoup deplwaye lè l sèvi avèk kubeadm ak yon subnet sèvis 192.168.0.0/16, ranplase li ak 172.24.0.0/16.
Epi li te rive ke nou te gen lontan te enterese nan wè ki sa ak ki jan nan Kubernetes ki estoke nan etcd, ki sa ki ka fè ak li ... Se konsa, nou te panse: "Poukisa nou pa jis mete ajou done yo nan etcd, ranplase ansyen adrès IP yo (sous-rezo) ak nouvo? »
Lè w fin chèche zouti pare pou travay ak done nan etcd, nou pa t jwenn anyen ki rezoud pwoblèm nan nèt. (Bon wout la, si ou konnen nenpòt sèvis piblik pou travay ak done dirèkteman nan etcd, nou ta apresye lyen yo.) Sepandan, yon bon pwen depa se etcdhelper soti nan OpenShift(mèsi a otè li yo!).
Sèvis piblik sa a ka konekte ak etcd lè l sèvi avèk sètifika epi li done ki soti nan la lè l sèvi avèk kòmandman ls, get, dump.
Ajoute etcdhelper
Pwochen panse a se lojik: "Ki sa ki anpeche w ajoute sèvis piblik sa a lè w ajoute kapasite pou ekri done sou etcd?"
Li te vin tounen yon vèsyon modifye nan etcdhelper ak de nouvo fonksyon changeServiceCIDR и changePodCIDR. sou li ou ka wè kòd la isit la.
Kisa nouvo karakteristik yo fè? Algorithm changeServiceCIDR:
kreye yon deserializer;
konpile yon ekspresyon regilye pou ranplase CIDR;
nou ale nan tout sèvis ak kalite ClusterIP nan gwoup la:
dekode valè a soti nan etcd nan yon objè Go;
lè l sèvi avèk yon ekspresyon regilye nou ranplase de premye byte adrès la;
bay sèvis la yon adrès IP ki soti nan nouvo subnet la;
kreye yon serilizer, konvèti objè Go a nan protobuf, ekri nouvo done sou elatriye.
Fonksyon changePodCIDR esansyèlman menm jan an changeServiceCIDR - sèlman olye pou yo modifye spesifikasyon sèvis la, nou fè li pou ne ak chanjman .spec.PodCIDR nan yon nouvo sous-rezo.
Pratike
Chanje sèvis CIDR
Plan pou mete ann aplikasyon travay la trè senp, men li enplike D 'nan moman re-kreyasyon tout gous nan gwoup la. Apre nou fin dekri etap prensipal yo, nou pral pataje tou panse sou ki jan, nan teyori, tan sa a ka minimize.
Etap preparasyon:
enstale lojisyèl ki nesesè yo ak rasanble patched etcdhelper la;
backup etcd ak /etc/kubernetes.
Brèf plan aksyon pou chanje sèvis CIDR:
chanje manifeste apiserver ak manadjè kontwolè;
reemèt sètifika;
chanje sèvis ClusterIP nan etcd;
rekòmanse tout gous nan gwoup la.
Sa ki anba la a se yon sekans konplè nan aksyon an detay.
Nou sove pou tèt nou etcdhelper.go, telechaje depandans, kolekte:
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. Chanje sous-rezo sèvis la nan manifeste avyon kontwòl Kubernetes yo. Nan dosye /etc/kubernetes/manifests/kube-apiserver.yaml и /etc/kubernetes/manifests/kube-controller-manager.yaml chanje paramèt la --service-cluster-ip-range nan yon nouvo sous-rezo: 172.24.0.0/16 olye pou yo 192.168.0.0/16.
5. Piske n ap chanje sous-rezo sèvis la kote kubeadm bay sètifika pou apiserver (tankou), yo bezwen reemèt yo:
Ann wè pou ki domèn ak adrès IP yo te bay sètifika aktyèl la:
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
Attention! Nan moman sa a, rezolisyon domèn sispann travay nan gwoup la, depi nan gous ki egziste deja /etc/resolv.conf ansyen adrès CoreDNS la (kube-dns) anrejistre, ak kube-proxy chanje règ iptables yo soti nan ansyen sous-rezo a nan nouvo a. Pli lwen nan atik la li ekri sou opsyon posib pou minimize D '.
Ann ranje ConfigMap nan espas non an kube-system:
kubectl -n kube-system edit cm kubelet-config-1.16
- ranplase isit la clusterDNS nan nouvo adrès IP sèvis kube-dns la: kubectl -n kube-system get svc kube-dns.
kubectl -n kube-system edit cm kubeadm-config
- nou pral ranje li data.ClusterConfiguration.networking.serviceSubnet nan yon nouvo sous-rezo.
Depi adrès kube-dns la chanje, li nesesè pou mete ajou konfigirasyon kubelet la sou tout nœuds yo:
7. Si ou kite omwen yon ne ansyen podCIDR, Lè sa a, kube-controller-manager pa pral kapab kòmanse, ak gous nan gwoup la pa pral pwograme.
An reyalite, chanje podCIDR ka fè menm pi senp (pa egzanp, se konsa). Men, nou te vle aprann kijan pou travay ak etcd dirèkteman, paske gen ka lè modifye objè Kubernetes nan etcd - sèl la variant posib. (Pou egzanp, ou pa ka jis chanje jaden Sèvis la san D' spec.clusterIP.)
Total
Atik la diskite posiblite pou travay ak done nan etcd dirèkteman, i.e. kontoune API Kubernetes la. Pafwa apwòch sa a pèmèt ou fè "bagay difisil". Nou teste operasyon yo bay nan tèks la sou grap reyèl K8 yo. Sepandan, estati yo nan preparasyon pou itilize toupatou se PoC (prèv konsèp). Se poutèt sa, si ou vle sèvi ak yon vèsyon modifye nan sèvis piblik etcdhelper sou grap ou yo, fè sa sou pwòp risk ou.