Ar n-eòlas ag obair le dàta ann an cruinneachadh Kubernetes msaa gu dìreach (às aonais K8s API)

Barrachd is barrachd, tha teachdaichean ag iarraidh oirnn cothrom a thoirt do bhuidheann Kubernetes gus cothrom fhaighinn air seirbheisean taobh a-staigh a’ bhuidheann: a bhith comasach air ceangal dìreach ri stòr-dàta no seirbheis air choireigin, gus tagradh ionadail a cheangal ri tagraidhean taobh a-staigh a’ bhuidheann...

Ar n-eòlas ag obair le dàta ann an cruinneachadh Kubernetes msaa gu dìreach (às aonais K8s API)

Mar eisimpleir, tha feum air ceangal bhon inneal ionadail agad gu seirbheis memcached.staging.svc.cluster.local. Bidh sinn a’ toirt seachad an comas seo le bhith a’ cleachdadh VPN taobh a-staigh a’ bhuidheann ris a bheil an neach-dèiligidh a’ ceangal. Gus seo a dhèanamh, bidh sinn ag ainmeachadh subnets de pods, seirbheisean agus braisle DNS a phutadh chun neach-dèiligidh. Mar sin, nuair a bhios neach-dèiligidh a 'feuchainn ri ceangal ris an t-seirbheis memcached.staging.svc.cluster.local, bidh an t-iarrtas a’ dol chun bhuidheann DNS agus mar fhreagairt gheibh e seòladh na seirbheis seo bhon lìonra seirbheis brabhsair no seòladh a’ pod.

Bidh sinn a’ rèiteachadh cruinneachaidhean K8s a’ cleachdadh kubeadm, far a bheil an subnet seirbheis bunaiteach 192.168.0.0/16, agus tha an lìonra de pods 10.244.0.0/16. Mar as trice bidh a h-uile dad ag obair gu math, ach tha puing no dhà ann:

  • Fo-lìon 192.168.*.* gu tric air a chleachdadh ann an lìonraidhean oifis teachdaiche, agus eadhon nas trice ann an lìonraidhean dachaigh leasaiche. Agus an uairsin gheibh sinn còmhstri: bidh routers dachaigh ag obair air an subnet seo agus bidh an VPN a ’putadh na subnets sin bhon bhuidheann chun neach-dèiligidh.
  • Tha grunn chlàran againn (cinneasachadh, ìre agus/no grunn chlàran leasachaidh). An uairsin, gu gnàthach, bidh na h-aon subnets aig a h-uile gin dhiubh airson pods agus seirbheisean, a chruthaicheas duilgheadasan mòra airson obair aig an aon àm le seirbheisean ann an grunn chlàran.

Tha sinn air gabhail ris a’ chleachdadh o chionn fhada a bhith a’ cleachdadh diofar subnets airson seirbheisean agus pods taobh a-staigh an aon phròiseact - san fharsaingeachd, gus am bi lìonraidhean eadar-dhealaichte aig a h-uile buidheann. Ach, tha àireamh mhòr de chruinneachaidhean ann an gnìomh nach bu mhath leam a thoirt air falbh bhon fhìor thoiseach, leis gu bheil iad a’ ruith mòran sheirbheisean, thagraidhean stàiteil, msaa.

Agus an uairsin dh'fhaighnich sinn dhuinn fhìn: ciamar a dh'atharraicheas sinn an subnet ann am buidheann a tha ann mar-thà?

A ’lorg cho-dhùnaidhean

Is e an cleachdadh as cumanta ath-chruthachadh uile seirbheisean le seòrsa ClusterIP. Mar roghainn, urrainn comhairle agus seo:

Tha duilgheadas aig a’ phròiseas a leanas: às deidh a h-uile càil a rèiteachadh, thig na pods suas leis an t-seann IP mar fhrithealaiche ainm DNS ann an /etc/resolv.conf.
Leis nach do lorg mi am fuasgladh fhathast, bha agam ris a’ bhuidheann gu lèir ath-shuidheachadh le ath-shuidheachadh kubeadm agus a chuir a-steach a-rithist.

Ach chan eil seo freagarrach airson a h-uile duine... Seo ro-ràdh nas mionaidiche airson ar cùise:

  • Flannel air a chleachdadh;
  • Tha cnuasaichean an dà chuid anns na neòil agus air bathar-cruaidh;
  • Bu mhath leam a h-uile seirbheis sa bhuidheann ath-shuidheachadh a sheachnadh;
  • Tha feum air a h-uile càil a dhèanamh san fharsaingeachd le àireamh as lugha de dhuilgheadasan;
  • Is e dreach Kubernetes 1.16.6 (ge-tà, bidh ceumannan eile coltach ri dreachan eile);
  • Is e am prìomh obair dèanamh cinnteach gu bheil ann am brabhsair air a chleachdadh le kubeadm le subnet seirbheis 192.168.0.0/16, cuir na àite 172.24.0.0/16.

Agus thachair e dìreach gun robh ùidh air a bhith againn o chionn fhada ann a bhith a’ faicinn dè agus ciamar a tha Kubernetes air a stòradh ann am msaa, dè ghabhas dèanamh leis... Mar sin smaoinich sinn: “Carson nach ùraich thu an dàta ann am msaa, a’ cur feadhainn ùra an àite nan seann sheòlaidhean IP (subnet).? "

Às deidh dhuinn innealan deiseil a lorg airson obrachadh le dàta ann am msaa, cha do lorg sinn dad a dh’ fhuasgail an duilgheadas gu tur. (Co-dhiù, ma tha fios agad mu ghoireasan sam bith airson a bhith ag obair le dàta gu dìreach ann am msaa, bhitheamaid toilichte na ceanglaichean.) Ach, tha deagh thoiseach tòiseachaidh ann etcdhelper bho OpenShift (taing dha na h-ùghdaran aige!).

Faodaidh an goireas seo ceangal ri msaa a’ cleachdadh theisteanasan agus dàta a leughadh às an sin a’ cleachdadh òrdughan ls, get, dump.

Cuir a-steach etcdhelper

Tha an ath bheachd loidsigeach: “Dè a tha gad stad bho bhith a’ cur ris a ’ghoireas seo le bhith a’ cur ris a ’chomas dàta a sgrìobhadh gu msaa?"

Thàinig e gu bhith na dhreach atharraichte de etcdhelper le dà ghnìomh ùr changeServiceCIDR и changePodCIDR. oirre chì thu an còd an seo.

Dè bhios na feartan ùra a’ dèanamh? Algorithm changeServiceCIDR:

  • cruthaich deserializer;
  • cuir ri chèile abairt cunbhalach airson a dhol an àite CIDR;
  • bidh sinn a’ dol tro gach seirbheis leis an t-seòrsa ClusterIP sa bhuidheann:
    • dì-chòdaich an luach bho etcd gu nì Go;
    • a’ cleachdadh abairt àbhaisteach bidh sinn a’ cur a’ chiad dà byte an àite an t-seòlaidh;
    • sònraich seòladh IP don t-seirbheis bhon subnet ùr;
    • cruthaich sreathaiche, tionndaidh an rud Go gu protobuf, sgrìobh dàta ùr gu msaa.

gnìomh changePodCIDR coltach gu bunaiteach changeServiceCIDR - dìreach an àite a bhith a’ deasachadh an t-sònrachadh seirbheis, bidh sinn ga dhèanamh airson an nód agus an atharrachadh .spec.PodCIDR gu subnet ùr.

Cleachdaich

Atharraich seirbheis CIDR

Tha am plana airson a’ ghnìomh a bhuileachadh gu math sìmplidh, ach tha e a’ toirt a-steach ùine downt aig àm ath-chruthachadh a h-uile pod sa bhuidheann. Às deidh dhuinn na prìomh cheumannan a mhìneachadh, bidh sinn cuideachd a’ roinn bheachdan air mar as urrainnear, ann an teòiridh, an ùine downt seo a lughdachadh.

Ceumannan ullachaidh:

  • a' stàladh a' bhathar-bhog a tha a dhìth agus a' cruinneachadh an etcdhelper a tha air a phasgadh;
  • cùl-taic etcd agus /etc/kubernetes.

Plana gnìomh goirid airson atharrachadh seirbheisCIDR:

  • atharrachadh an apiserver agus an rianadair-smachd manaidsear;
  • ath-fhoillseachadh theisteanasan;
  • ag atharrachadh seirbheisean ClusterIP ann am msaa;
  • ath-thòiseachadh a h-uile pods sa bhuidheann.

Tha na leanas na shreath iomlan de ghnìomhan gu mionaideach.

1. Stàlaich etcd-client airson dumpadh dàta:

apt install etcd-client

2. Tog etcdhelper:

  • Stàlaich 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
  • Bidh sinn a 'sàbhaladh dhuinn fhìn etcdhelper.go, luchdaich sìos eisimeileachd, cruinnich:
    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. Dèan lethbhreac-glèidhidh 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. Atharraich an subnet seirbheis ann am follaiseachd plèana smachd Kubernetes. Ann am faidhlichean /etc/kubernetes/manifests/kube-apiserver.yaml и /etc/kubernetes/manifests/kube-controller-manager.yaml atharraich am paramadair --service-cluster-ip-range gu subnet ùr: 172.24.0.0/16 an àite 192.168.0.0/16.

5. Leis gu bheil sinn ag atharrachadh an subnet seirbheis dha bheil kubeadm a 'toirt seachad teisteanasan airson apiserver (a' gabhail a-steach), feumaidh iad a bhith air an ath-fhoillseachadh:

  1. Chì sinn dè na raointean agus na seòlaidhean IP a chaidh an teisteanas làithreach a thoirt seachad airson:
    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. Nach ullaich sinn config as ìsle airson 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. Sguabaidh sinn às an t-seann chrt agus an iuchair, oir às aonais seo cha tèid an teisteanas ùr a thoirt a-mach:
    rm /etc/kubernetes/pki/apiserver.{key,crt}
  4. Nach cuir sinn a-rithist teisteanasan airson an fhrithealaiche API:
    kubeadm init phase certs apiserver --config=kubeadm-config.yaml
  5. Feuch an dèan sinn cinnteach gun deach an teisteanas a thoirt seachad airson an subnet ùr:
    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. Às deidh dhut an teisteanas frithealaiche API ath-chur a-mach, ath-thòisich an soitheach aige:
    docker ps | grep k8s_kube-apiserver | awk '{print $1}' | xargs docker restart
  7. Feuch an ath-ghin sinn an config airson admin.conf:
    kubeadm alpha certs renew admin.conf
  8. Deasaich sinn an dàta ann am 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 

    Thoir aire! Aig an àm seo, tha fuasgladh fearainn a’ stad a bhith ag obair anns a’ bhuidheann, oir anns na pods a th’ ann mar-thà /etc/resolv.conf tha an seann sheòladh CoreDNS (kube-dns) clàraichte, agus bidh kube-proxy ag atharrachadh riaghailtean iptables bhon t-seann subnet chun an tè ùr. Nas fhaide san artaigil tha e sgrìobhte mu roghainnean a dh’ fhaodadh a bhith ann gus ùine downt a lughdachadh.

  9. Nach socraich sinn ConfigMap anns an àrainn ainmean kube-system:
    kubectl -n kube-system edit cm kubelet-config-1.16

    - cuir an àite an seo clusterDNS gu seòladh IP ùr na seirbheis kube-dns: kubectl -n kube-system get svc kube-dns.

    kubectl -n kube-system edit cm kubeadm-config

    - cuiridh sinn ceart e data.ClusterConfiguration.networking.serviceSubnet gu subnet ùr.

  10. Leis gu bheil an seòladh kube-dns air atharrachadh, feumar an rèiteachadh kubelet ùrachadh air a h-uile nod:
    kubeadm upgrade node phase kubelet-config && systemctl restart kubelet
  11. Chan eil air fhàgail ach na pods uile ath-thòiseachadh sa bhuidheann:
    kubectl get pods --no-headers=true --all-namespaces |sed -r 's/(S+)s+(S+).*/kubectl --namespace 1 delete pod 2/e'

Lùghdaich ùine downt

Beachdan air mar as urrainn dhut ùine downt a lughdachadh:

  1. Às deidh dhut am plèana smachd atharrachadh, cruthaich seirbheis kube-dns ùr, mar eisimpleir, leis an ainm kube-dns-tmp agus seòladh ùr 172.24.0.10.
  2. Dèan if ann an etcdhelper, nach atharraich an t-seirbheis kube-dns.
  3. Cuir an àite an seòladh anns a h-uile kubelets ClusterDNS gu seirbheis ùr, fhad ‘s a chumas an t-seann sheirbheis ag obair aig an aon àm ris an fhear ùr.
  4. Fuirich gus am bi na pods le tagraidhean a’ dol thairis leotha fhèin airson adhbharan nàdarra no aig àm aontaichte.
  5. Sguab às seirbheis kube-dns-tmp agus atharrachadh serviceSubnetCIDR airson an t-seirbheis kube-dns.

Leigidh am plana seo leat an ùine downt gu ~ mionaid a lughdachadh - fhad ‘s a bheir thu air falbh seirbheis kube-dns-tmp agus ag atharrachadh an subnet airson na seirbheis kube-dns.

Mion-atharrachadh podNetwork

Aig an aon àm, chuir sinn romhainn coimhead air mar a dh’ atharraicheas sinn podNetwork a’ cleachdadh an etcdhelper a thàinig às. Tha an sreath de ghnìomhan mar a leanas:

  • rèiteachadh configs a-steach kube-system;
  • a 'càradh an kube-controller-manaidsear follaiseachd;
  • atharraich podCIDR gu dìreach ann am msaa;
  • ath-thòisich a h-uile nod brabhsair.

A-nis barrachd mu na gnìomhan seo:

1. Atharraich ConfigMap san namespace kube-system:

kubectl -n kube-system edit cm kubeadm-config

- ceartachadh data.ClusterConfiguration.networking.podSubnet gu subnet ùr 10.55.0.0/16.

kubectl -n kube-system edit cm kube-proxy

- ceartachadh data.config.conf.clusterCIDR: 10.55.0.0/16.

2. Mion-atharraich am follaiseachd rianadair-stiùiridh:

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

- ceartachadh --cluster-cidr=10.55.0.0/16.

3. Thoir sùil air na luachan làithreach .spec.podCIDR, .spec.podCIDRs, .InternalIP, .status.addresses airson a h-uile nodan cnuasachaidh:

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. Cuir an àite podCIDR le bhith a' dèanamh atharrachaidhean dìreach gu 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. Feuch an dèan sinn cinnteach gu bheil podCIDR air atharrachadh gu mòr:

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. Ath-thòisich sinn a h-uile nod cnuasachaidh aon às deidh aon.

7. Ma dh'fhàgas tu co-dhiù aon nód seann podCIDR, an uairsin cha bhith e comasach dha kube-controller-manaidsear tòiseachadh, agus cha bhith pods anns a’ bhraisle clàraichte.

Gu dearbh, faodar atharrachadh podCIDR a dhèanamh eadhon nas sìmplidh (mar eisimpleir, mar sin). Ach bha sinn airson ionnsachadh mar a bhith ag obair le msaa gu dìreach, oir tha cùisean ann nuair a bhios tu a’ deasachadh stuthan Kubernetes ann am msaa - an aon fhear a-mhàin caochladh comasach. (Mar eisimpleir, chan urrainn dhut dìreach an raon Seirbheis atharrachadh gun ùine downt spec.clusterIP.)

An toradh

Tha an artaigil a’ beachdachadh air comasachd obrachadh le dàta ann am msaa gu dìreach, i.e. a’ dol seachad air an Kubernetes API. Aig amannan leigidh an dòigh-obrach seo leat “rudan duilich” a dhèanamh. Rinn sinn deuchainn air na h-obraichean a chaidh a thoirt seachad san teacsa air cruinneachaidhean fìor K8s. Ach, tha an inbhe aca deiseil airson cleachdadh farsaing PoC (dearbhadh air bun-bheachd). Mar sin, ma tha thu airson dreach atharraichte den ghoireas etcdhelper a chleachdadh air na cruinneachaidhean agad, dèan sin air do chunnart fhèin.

PS

Leugh cuideachd air ar blog:

Source: www.habr.com

Cuir beachd ann