L-esperjenza tagħna bid-dejta fil-cluster ta’ etcd Kubernetes direttament (mingħajr K8s API)

Dejjem aktar, il-klijenti qed jitolbuna biex nipprovdu aċċess għall-cluster Kubernetes biex ikunu jistgħu jaċċessaw is-servizzi fi ħdan il-cluster: sabiex ikunu jistgħu jgħaqqdu direttament ma 'xi database jew servizz, biex jgħaqqdu applikazzjoni lokali ma' applikazzjonijiet fi ħdan il-cluster...

L-esperjenza tagħna bid-dejta fil-cluster ta’ etcd Kubernetes direttament (mingħajr K8s API)

Pereżempju, hemm bżonn li tikkonnettja mill-magna lokali tiegħek għal servizz memcached.staging.svc.cluster.local. Aħna nipprovdu din il-kapaċità billi tuża VPN fi ħdan il-cluster li miegħu jgħaqqad il-klijent. Biex tagħmel dan, aħna nħabbru subnets ta 'miżwed, servizzi u push cluster DNS lill-klijent. Għalhekk, meta klijent jipprova jgħaqqad mas-servizz memcached.staging.svc.cluster.local, it-talba tmur għand il-cluster DNS u bi tweġiba tirċievi l-indirizz ta’ dan is-servizz min-netwerk tas-servizz tal-cluster jew l-indirizz tal-pod.

Aħna kkonfiguraw clusters K8s billi tuża kubeadm, fejn is-subnet tas-servizz default hija 192.168.0.0/16, u n-netwerk tal-imżiewed huwa 10.244.0.0/16. Normalment kollox jaħdem tajjeb, iżda hemm ftit punti:

  • Subnet 192.168.*.* spiss jintuża fin-netwerks tal-uffiċċju tal-klijenti, u saħansitra aktar spiss fin-netwerks tad-dar tal-iżviluppaturi. U mbagħad ikollna kunflitti: ir-routers tad-dar jaħdmu fuq din is-subnet u l-VPN timbotta dawn is-subnets mill-cluster għall-klijent.
  • Għandna diversi clusters (produzzjoni, stadju u/jew diversi clusters dev). Imbagħad, b'mod awtomatiku, kollha kemm huma se jkollhom l-istess subnets għall-imżiewed u s-servizzi, li joħloq diffikultajiet kbar għal xogħol simultanju ma 'servizzi f'diversi clusters.

Ilna ilu adottaw il-prattika li nużaw subnets differenti għal servizzi u pods fi ħdan l-istess proġett - b'mod ġenerali, sabiex il-clusters kollha jkollhom netwerks differenti. Madankollu, hemm numru kbir ta 'clusters fl-operat li ma nixtieqx ngħaddi mill-bidu, peress li jmexxu ħafna servizzi, applikazzjonijiet stateful, eċċ.

U mbagħad staqsejna lilna nfusna: kif nibdlu s-subnet fi cluster eżistenti?

Tiftix ta' deċiżjonijiet

L-aktar prattika komuni hija li terġa 'tinħoloq kollha servizzi bit-tip ClusterIP. Bħala għażla, jista jagħti parir u dan:

Il-proċess li ġej għandu problema: wara kollox ikkonfigurat, il-miżwed joħorġu bl-IP l-antik bħala nameserver DNS f'/etc/resolv.conf.
Peress li għadni ma sibtx is-soluzzjoni, kelli reset il-cluster kollu b'kubeadm reset u nerġa' nibda.

Iżda dan mhux adattat għal kulħadd... Hawn huma introduzzjonijiet aktar dettaljati għall-każ tagħna:

  • Flanella tintuża;
  • Hemm raggruppamenti kemm fis-sħab kif ukoll fuq il-ħardwer;
  • Nixtieq nevita li skjerament mill-ġdid is-servizzi kollha fil-cluster;
  • Hemm bżonn li ġeneralment isir kollox b'numru minimu ta 'problemi;
  • Il-verżjoni Kubernetes hija 1.16.6 (madankollu, aktar passi se jkunu simili għal verżjonijiet oħra);
  • Il-kompitu ewlieni huwa li jiġi żgurat li fi cluster skjerati bl-użu ta 'kubeadm b'subnet tas-servizz 192.168.0.0/16, ibdelha bi 172.24.0.0/16.

U ġara li konna ilna interessati li naraw x’u kif fil-Kubernetes jinħażen f’etcd, x’jista’ jsir biha... Allura ħsibna: “Għaliex mhux biss taġġorna d-dejta f'etcd, billi tissostitwixxi l-indirizzi IP qodma (subnet) b'oħrajn ġodda? "

Wara li fittxejna għodod lesti biex naħdmu mad-dejta fl-etcd, ma sibna xejn li solviet kompletament il-problema. (Mill-mod, jekk taf dwar xi utilitajiet biex taħdem bid-dejta direttament fl-etcd, napprezzaw il-links.) Madankollu, punt tat-tluq tajjeb huwa etcdhelper minn OpenShift (grazzi lill-awturi tagħha!).

Din l-utilità tista 'tqabbad ma' etcd billi tuża ċertifikati u taqra d-dejta minn hemm billi tuża kmandi ls, get, dump.

Żid etcdhelper

Il-ħsieb li jmiss huwa loġiku: "X'qed iwaqqafk milli żżid din l-utilità billi żżid il-ħila li tikteb id-dejta fuq etcd?"

Sar verżjoni modifikata ta' etcdhelper b'żewġ funzjonijiet ġodda changeServiceCIDR и changePodCIDR. fuqha tista 'tara l-kodiċi hawn.

X'jagħmlu l-karatteristiċi l-ġodda? Algoritmu changeServiceCIDR:

  • toħloq deserializer;
  • jikkompila espressjoni regolari biex tissostitwixxi s-CIDR;
  • ngħaddu mis-servizzi kollha bit-tip ClusterIP fil-cluster:
    • jiddekowdja l-valur minn etcd f'oġġett Go;
    • billi tuża espressjoni regolari nissostitwixxu l-ewwel żewġ bytes tal-indirizz;
    • tassenja s-servizz indirizz IP mis-subnet il-ġdid;
    • oħloq serializzatur, ikkonverti l-oġġett Go fi protobuf, ikteb data ġdida lil etcd.

Funzjoni changePodCIDR essenzjalment simili changeServiceCIDR - biss minflok ma neditjaw l-ispeċifikazzjoni tas-servizz, nagħmluha għan-node u nbiddlu .spec.PodCIDR għal subnet ġdid.

Prattika

Bidla tas-servizz CIDR

Il-pjan għall-implimentazzjoni tal-kompitu huwa sempliċi ħafna, iżda jinvolvi waqfien fil-ħin tal-ħolqien mill-ġdid tal-imżiewed kollha fil-cluster. Wara li niddeskrivew il-passi ewlenin, se naqsmu wkoll ħsibijiet dwar kif, fit-teorija, dan il-ħin ta 'waqfien jista' jiġi minimizzat.

Passi preparatorji:

  • l-installazzjoni tas-softwer meħtieġ u l-assemblaġġ tal-etcdhelper patched;
  • backup etcd u /etc/kubernetes.

Pjan ta' azzjoni fil-qosor għat-tibdil tas-servizz CIDR:

  • tibdil tal-manifesti tal-apiserver u tal-kontrollur-manager;
  • ħruġ mill-ġdid taċ-ċertifikati;
  • it-tibdil tas-servizzi ClusterIP f'etcd;
  • bidu mill-ġdid tal-imżiewed kollha fil-cluster.

Din li ġejja hija sekwenza sħiħa ta 'azzjonijiet fid-dettall.

1. Installa etcd-client għad-dump tad-data:

apt install etcd-client

2. Ibni etcdhelper:

  • Installa golang:
    GOPATH=/root/golang
    mkdir -p $GOPATH/local
    curl -sSL https://dl.google.com/go/go1.14.1.linux-amd64.tar.gz | tar -xzvC $GOPATH/local
    echo "export GOPATH="$GOPATH"" >> ~/.bashrc
    echo 'export GOROOT="$GOPATH/local/go"' >> ~/.bashrc
    echo 'export PATH="$PATH:$GOPATH/local/go/bin"' >> ~/.bashrc
  • Aħna niffrankaw għalina nfusna etcdhelper.go, niżżel id-dipendenzi, iġbor:
    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

3. Agħmel backup etcd:

backup_dir=/root/backup
mkdir ${backup_dir}
cp -rL /etc/kubernetes ${backup_dir}
ETCDCTL_API=3 etcdctl --cacert=/etc/kubernetes/pki/etcd/ca.crt --key=/etc/kubernetes/pki/etcd/server.key --cert=/etc/kubernetes/pki/etcd/server.crt --endpoints https://192.168.199.100:2379 snapshot save ${backup_dir}/etcd.snapshot

4. Ibdel is-subnet tas-servizz fil-manifesti tal-pjan ta 'kontroll Kubernetes. Fil-fajls /etc/kubernetes/manifests/kube-apiserver.yaml и /etc/kubernetes/manifests/kube-controller-manager.yaml ibdel il-parametru --service-cluster-ip-range għal subnet ġdid: 172.24.0.0/16 minflok 192.168.0.0/16.

5. Peress li qed nibdlu s-subnet tas-servizz li għalih kubeadm joħroġ iċ-ċertifikati għall-apiserver (inkluż), jeħtieġ li jerġgħu jinħarġu:

  1. Ejja naraw għal liema dominji u indirizzi IP inħareġ iċ-ċertifikat attwali:
    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
  2. Ejja nħejju konfigurazzjoni minima għal kubeadm:
    cat kubeadm-config.yaml
    apiVersion: kubeadm.k8s.io/v1beta1
    kind: ClusterConfiguration
    networking:
      podSubnet: "10.244.0.0/16"
      serviceSubnet: "172.24.0.0/16"
    apiServer:
      certSANs:
      - "192.168.199.100" # IP-адрес мастер узла
  3. Ejja nħassru l-crt u ċ-ċavetta qodma, peress li mingħajr dan iċ-ċertifikat il-ġdid ma jinħareġ:
    rm /etc/kubernetes/pki/apiserver.{key,crt}
  4. Ejja nerġgħu noħorġu ċertifikati għas-server API:
    kubeadm init phase certs apiserver --config=kubeadm-config.yaml
  5. Ejja niċċekkjaw li ċ-ċertifikat inħareġ għas-subnet il-ġdid:
    openssl x509 -noout -ext subjectAltName </etc/kubernetes/pki/apiserver.crt
    X509v3 Subject Alternative Name:
        DNS:kube-2-master, DNS:kubernetes, DNS:kubernetes.default, DNS:kubernetes.default.svc, DNS:kubernetes.default.svc.cluster.local, IP Address:172.24.0.1, IP Address:10.0.0.163, IP Address:192.168.199.100
  6. Wara li terġa' toħroġ iċ-ċertifikat tas-server tal-API, ibda mill-ġdid il-kontenitur tiegħu:
    docker ps | grep k8s_kube-apiserver | awk '{print $1}' | xargs docker restart
  7. Ejja nirriġeneraw il-konfigurazzjoni għal admin.conf:
    kubeadm alpha certs renew admin.conf
  8. Ejja neditjaw id-dejta f'etcd:
    ./etcdhelper -cacert /etc/kubernetes/pki/etcd/ca.crt -cert /etc/kubernetes/pki/etcd/server.crt -key /etc/kubernetes/pki/etcd/server.key -endpoint https://127.0.0.1:2379 change-service-cidr 172.24.0.0/16 

    Attenzjoni! F'dan il-mument, ir-riżoluzzjoni tad-dominju tieqaf taħdem fil-cluster, peress li fil-miżwed eżistenti /etc/resolv.conf l-indirizz CoreDNS antik (kube-dns) huwa reġistrat, u kube-proxy jibdel ir-regoli iptables mis-subnet il-qadima għal dik ġdida. Aktar fl-artikolu huwa miktub dwar għażliet possibbli biex jimminimizzaw il-perijodi ta 'waqfien.

  9. Ejja nirranġaw il-ConfigMap fl-ispazju tal-isem kube-system:
    kubectl -n kube-system edit cm kubelet-config-1.16

    - ibdel hawn clusterDNS għall-indirizz IP ġdid tas-servizz kube-dns: kubectl -n kube-system get svc kube-dns.

    kubectl -n kube-system edit cm kubeadm-config

    - aħna ser nirranġawha data.ClusterConfiguration.networking.serviceSubnet għal subnet ġdid.

  10. Peress li l-indirizz tal-kube-dns inbidel, huwa meħtieġ li tiġi aġġornata l-konfigurazzjoni tal-kubelet fuq in-nodi kollha:
    kubeadm upgrade node phase kubelet-config && systemctl restart kubelet
  11. Li jibqa 'huwa li terġa' tibda l-imżiewed kollha fil-cluster:
    kubectl get pods --no-headers=true --all-namespaces |sed -r 's/(S+)s+(S+).*/kubectl --namespace 1 delete pod 2/e'

Imminimizza l-waqfien

Ħsibijiet dwar kif timminimizza l-waqfien:

  1. Wara li tbiddel il-manifesti tal-pjan ta 'kontroll, oħloq servizz ġdid ta' kube-dns, pereżempju, bl-isem kube-dns-tmp u indirizz ġdid 172.24.0.10.
  2. Għamla if f'etcdhelper, li mhux se jimmodifika s-servizz kube-dns.
  3. Ibdel l-indirizz fil-kubelets kollha ClusterDNS għal wieħed ġdid, filwaqt li s-servizz l-antik se jkompli jaħdem fl-istess ħin mal-ġdid.
  4. Stenna sakemm il-miżwed bl-applikazzjonijiet jinqalgħu jew waħedhom għal raġunijiet naturali jew fi żmien miftiehem.
  5. Ħassar is-servizz kube-dns-tmp u l-bidla serviceSubnetCIDR għas-servizz kube-dns.

Dan il-pjan jippermettilek timminimizza l-waqfien għal ~ minuta - għat-tul tat-tneħħija tas-servizz kube-dns-tmp u tbiddel is-subnet għas-servizz kube-dns.

Modifika podNetwork

Fl-istess ħin, iddeċidejna li nħarsu lejn kif timmodifika podNetwork billi tuża l-etcdhelper li jirriżulta. Is-sekwenza tal-azzjonijiet hija kif ġej:

  • iffissar tal-konfigurazzjonijiet fil kube-system;
  • l-iffissar tal-manifest kube-controller-manager;
  • jibdlu podCIDR direttament fl-etcd;
  • reboot n-nodi kollha tal-cluster.

Issa aktar dwar dawn l-azzjonijiet:

1. Immodifika l-ConfigMap fl-ispazju tal-isem kube-system:

kubectl -n kube-system edit cm kubeadm-config

- tikkoreġi data.ClusterConfiguration.networking.podSubnet għal subnet ġdid 10.55.0.0/16.

kubectl -n kube-system edit cm kube-proxy

- tikkoreġi data.config.conf.clusterCIDR: 10.55.0.0/16.

2. Immodifika l-manifest tal-kontrollur-maniġer:

vim /etc/kubernetes/manifests/kube-controller-manager.yaml

- tikkoreġi --cluster-cidr=10.55.0.0/16.

3. Ħares lejn il-valuri attwali .spec.podCIDR, .spec.podCIDRs, .InternalIP, .status.addresses għan-nodi kollha tal-cluster:

kubectl get no -o json | jq '[.items[] | {"name": .metadata.name, "podCIDR": .spec.podCIDR, "podCIDRs": .spec.podCIDRs, "InternalIP": (.status.addresses[] | select(.type == "InternalIP") | .address)}]'

[
  {
    "name": "kube-2-master",
    "podCIDR": "10.244.0.0/24",
    "podCIDRs": [
      "10.244.0.0/24"
    ],
    "InternalIP": "192.168.199.2"
  },
  {
    "name": "kube-2-master",
    "podCIDR": "10.244.0.0/24",
    "podCIDRs": [
      "10.244.0.0/24"
    ],
    "InternalIP": "10.0.1.239"
  },
  {
    "name": "kube-2-worker-01f438cf-579f9fd987-5l657",
    "podCIDR": "10.244.1.0/24",
    "podCIDRs": [
      "10.244.1.0/24"
    ],
    "InternalIP": "192.168.199.222"
  },
  {
    "name": "kube-2-worker-01f438cf-579f9fd987-5l657",
    "podCIDR": "10.244.1.0/24",
    "podCIDRs": [
      "10.244.1.0/24"
    ],
    "InternalIP": "10.0.4.73"
  }
]

4. Ibdel podCIDR billi tagħmel bidliet direttament lill-etcd:

./etcdhelper -cacert /etc/kubernetes/pki/etcd/ca.crt -cert /etc/kubernetes/pki/etcd/server.crt -key /etc/kubernetes/pki/etcd/server.key -endpoint https://127.0.0.1:2379 change-pod-cidr 10.55.0.0/16

5. Ejja niċċekkjaw li podCIDR verament inbidel:

kubectl get no -o json | jq '[.items[] | {"name": .metadata.name, "podCIDR": .spec.podCIDR, "podCIDRs": .spec.podCIDRs, "InternalIP": (.status.addresses[] | select(.type == "InternalIP") | .address)}]'

[
  {
    "name": "kube-2-master",
    "podCIDR": "10.55.0.0/24",
    "podCIDRs": [
      "10.55.0.0/24"
    ],
    "InternalIP": "192.168.199.2"
  },
  {
    "name": "kube-2-master",
    "podCIDR": "10.55.0.0/24",
    "podCIDRs": [
      "10.55.0.0/24"
    ],
    "InternalIP": "10.0.1.239"
  },
  {
    "name": "kube-2-worker-01f438cf-579f9fd987-5l657",
    "podCIDR": "10.55.1.0/24",
    "podCIDRs": [
      "10.55.1.0/24"
    ],
    "InternalIP": "192.168.199.222"
  },
  {
    "name": "kube-2-worker-01f438cf-579f9fd987-5l657",
    "podCIDR": "10.55.1.0/24",
    "podCIDRs": [
      "10.55.1.0/24"
    ],
    "InternalIP": "10.0.4.73"
  }
]

6. Ejja nibdew mill-ġdid in-nodi tal-cluster kollha wieħed wieħed.

7. Jekk tħalli mill-inqas nodu wieħed podCIDR qodma, allura kube-controller-manager ma jkunx jista 'jibda, u l-imżiewed fil-cluster mhux se jkunu skedati.

Fil-fatt, it-tibdil tal-podCIDR jista’ jsir saħansitra aktar sempliċi (pereżempju, hekk). Imma ridna nitgħallmu kif naħdmu bl-etcd direttament, għax hemm każijiet meta teditja oġġetti Kubernetes f'etcd - l-uniku varjant possibbli. (Pereżempju, ma tistax sempliċement tibdel il-qasam tas-Servizz mingħajr waqfien spec.clusterIP.)

Total

L-artiklu jiddiskuti l-possibbiltà li taħdem b'dejta f'etcd direttament, i.e. billi tevita l-API Kubernetes. Xi drabi dan l-approċċ jippermettilek li tagħmel "affarijiet delikati". Aħna ttestjajna l-operazzjonijiet mogħtija fit-test fuq clusters reali K8s. Madankollu, l-istatus tagħhom ta 'prontezza għal użu mifrux huwa PoC (prova tal-kunċett). Għalhekk, jekk trid tuża verżjoni modifikata tal-utilità etcdhelper fuq il-clusters tiegħek, agħmel dan bir-riskju tiegħek.

PS

Aqra wkoll fuq il-blog tagħna:

Sors: www.habr.com

Żid kumment