An taithí atá againn ag obair le sonraí i gcnuasach Kubernetes etcd go díreach (gan K8s API)

Níos mó agus níos mó, tá cliaint ag iarraidh orainn rochtain a sholáthar ar bhraisle Kubernetes le bheith in ann rochtain a fháil ar sheirbhísí laistigh den bhraisle: a bheith in ann nascadh go díreach le bunachar sonraí nó seirbhís éigin, feidhmchlár áitiúil a nascadh le feidhmchláir laistigh den bhraisle...

An taithí atá againn ag obair le sonraí i gcnuasach Kubernetes etcd go díreach (gan K8s API)

Mar shampla, tá gá le nascadh ó do mheaisín áitiúil le seirbhís memcached.staging.svc.cluster.local. Cuirimid an cumas seo ar fáil ag baint úsáide as VPN laistigh den bhraisle lena nascann an cliant. Chun seo a dhéanamh, fógraímid subnets de pods, seirbhísí agus braisle DNS a bhrú ar an gcliant. Mar sin, nuair a dhéanann cliant iarracht ceangal leis an tseirbhís memcached.staging.svc.cluster.local, téann an t-iarratas chuig an DNS braisle agus mar fhreagra faigheann sé seoladh na seirbhíse seo ó líonra na seirbhíse braisle nó an seoladh pod.

Déanaimid braislí K8s a chumrú ag baint úsáide as kubeadm, áit a bhfuil an subnet seirbhíse réamhshocraithe 192.168.0.0/16, agus tá an líonra pods 10.244.0.0/16. De ghnáth oibríonn gach rud go maith, ach tá cúpla pointe ann:

  • Subnet 192.168.*.* a úsáidtear go minic i líonraí oifigí cliant, agus fiú níos minice i líonraí baile forbróirí. Agus ansin faigheann muid coinbhleachtaí: oibríonn ródairí baile ar an bhfolíon seo agus brúnn an VPN na subnets seo ón mbraisle chuig an gcliant.
  • Tá roinnt braislí againn (táirgeadh, stáitse agus/nó roinnt braislí forbartha). Ansin, de réir réamhshocraithe, beidh na subnets céanna acu go léir le haghaidh pods agus seirbhísí, rud a chruthaíonn deacrachtaí móra maidir le hobair chomhuaineach le seirbhísí i roinnt braislí.

Táimid tar éis glacadh le fada ó shin leis an gcleachtas subnets éagsúla a úsáid le haghaidh seirbhísí agus pods laistigh den tionscadal céanna - go ginearálta, ionas go mbeidh líonraí éagsúla ag gach braisle. Mar sin féin, tá líon mór braislí i bhfeidhm nár mhaith liom a rolladh anonn ó thús, ós rud é go ritheann siad go leor seirbhísí, feidhmchláir stáit, etc.

Agus ansin d'iarramar orainn féin: conas an subnet a athrú i mbraisle atá ann cheana féin?

Cinntí a chuardach

Is é an cleachtas is coitianta ná athchruthú go léir seirbhísí le cineál ClusterIP. Mar rogha, is féidir comhairle a thabhairt agus seo:

Tá fadhb ag an bpróiseas seo a leanas: tar éis gach rud a chumrú, tagann na pods suas leis an sean IP mar fhreastalaí ainm DNS i /etc/resolv.conf.
Ós rud é nár aimsigh mé an réiteach fós, bhí orm an braisle iomlán a athshocrú le kubeadm a athshocrú agus é a thionscnamh arís.

Ach níl sé seo oiriúnach do chách... Seo réamhrá níos mionsonraithe dár gcás:

  • Úsáidtear flannel;
  • Tá braislí sna scamaill agus ar chrua-earraí;
  • Ba mhaith liom a sheachaint ath-imscaradh na seirbhísí go léir sa bhraisle;
  • Is gá go ginearálta gach rud a dhéanamh le líon íosta fadhbanna;
  • Is é leagan Kubernetes 1.16.6 (mar sin féin, beidh céimeanna breise cosúil le leaganacha eile);
  • Is é an tasc is mó a chinntiú go bhfuil i mbraisle imscaradh ag baint úsáide as kubeadm le subnet seirbhíse 192.168.0.0/16, cuir ina ionad 172.24.0.0/16.

Agus tharla sé go raibh suim againn le fada an lá a fheiceáil cad é agus conas a stóráiltear Kubernetes in etcd, cad is féidir a dhéanamh leis... Mar sin cheapamar: “Cén fáth nach n-uasdátú ach na sonraí in srl., ag cur seoltaí nua in ionad na sean-seoltaí IP (folíon).? "

Tar éis dúinn uirlisí réamhdhéanta a chuardach le haghaidh oibriú le sonraí in etcd, ní bhfuaireamar aon rud a réitigh an fhadhb go hiomlán. (Dála an scéil, má tá eolas agat ar aon fhóntais chun oibriú le sonraí go díreach i srl, bheimis buíoch as na naisc.) Mar sin féin, is pointe tosaigh maith é etcdhelper ó OpenShift (buíochas lena údair!).

Is féidir leis an bhfóntas seo nascadh le etcd ag baint úsáide as teastais agus sonraí a léamh as sin ag baint úsáide as orduithe ls, get, dump.

Cuir etcdhelper leis

Tá an chéad smaoineamh eile loighciúil: “Cad é atá ag cur bac ort an áirgiúlacht seo a chur leis tríd an gcumas sonraí a scríobh chuig etcd a chur leis?”

Rinneadh leagan modhnaithe de etcdhelper de le dhá fheidhm nua changeServiceCIDR и changePodCIDR. ar sise is féidir leat an cód a fheiceáil anseo.

Cad a dhéanann na gnéithe nua? Algartam changeServiceCIDR:

  • díserializer a chruthú;
  • slonn rialta a thiomsú le cur in ionad CIDR;
  • téimid trí gach seirbhís leis an gcineál ClusterIP sa bhraisle:
    • díchódaigh an luach ó srl go réad Téigh;
    • ag baint úsáide as slonn rialta cuirimid an chéad dá bheart den seoladh in ionad;
    • sannfaidh an tseirbhís seoladh IP ón bhfolíon nua;
    • srathach a chruthú, an réad Téigh a thiontú ina phrotobuf, scríobh sonraí nua chuig etcd.

Feidhm changePodCIDR go bunúsach cosúil changeServiceCIDR - ach amháin in ionad eagarthóireacht a dhéanamh ar an tsonraíocht seirbhíse, a dhéanaimid é le haghaidh an nód agus athrú .spec.PodCIDR chuig fo-líon nua.

Cleachtais

Athraigh seirbhís CIDR

Tá an plean chun an tasc a chur i bhfeidhm an-simplí, ach baineann sé le downtime ag an am a athchruthú na pods go léir sa bhraisle. Tar éis cur síos a dhéanamh ar na príomhchéimeanna, roinnfimid smaointe maidir le conas, go teoiriciúil, is féidir an t-am aga neamhfhónaimh seo a íoslaghdú.

Céimeanna ullmhúcháin:

  • na bogearraí riachtanacha a shuiteáil agus an etcdhelper paisteáilte a chur le chéile;
  • cúltaca etcd agus /etc/kubernetes.

Plean gníomhaíochta gairid chun seirbhísCIDR a athrú:

  • athrú ar an apiserver agus manifests rialtóir-bainisteoir;
  • atheisiúint deimhnithe;
  • ag athrú seirbhísí ClusterIP in srl;
  • atosú ar gach pods sa bhraisle.

Seo a leanas seicheamh iomlán gníomhartha go mion.

1. Suiteáil etcd-cliant le haghaidh dumpála sonraí:

apt install etcd-client

2. Tógáil etcdhelper:

  • Suiteáil 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
  • Sábhálann muid dúinn féin etcdhelper.go, spleáchais a íoslódáil, a bhailiú:
    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 cúltaca srld:

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. Athraigh an subnet seirbhíse i manifests eitleán rialaithe Kubernetes. I gcomhaid /etc/kubernetes/manifests/kube-apiserver.yaml и /etc/kubernetes/manifests/kube-controller-manager.yaml athraigh an paraiméadar --service-cluster-ip-range chuig folíon nua: 172.24.0.0/16 in ionad 192.168.0.0/16.

5. Ós rud é go bhfuilimid ag athrú an fholíon seirbhíse dá n-eisíonn kubeadm deimhnithe le haghaidh apiserver (lena n-áirítear), ní mór iad a atheisiúint:

  1. Feicfimid cé na fearainn agus na seoltaí IP ar eisíodh an deimhniú reatha dóibh:
    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. Déanaimis cumraíocht íosta a ullmhú le haghaidh 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. Scriosaimis an seanchrt agus an eochair, mar gan é seo ní eiseofar an teastas nua:
    rm /etc/kubernetes/pki/apiserver.{key,crt}
  4. Déanaimis teastais don fhreastalaí API a atheisiúint:
    kubeadm init phase certs apiserver --config=kubeadm-config.yaml
  5. Déanaimis seiceáil ar eisíodh an teastas don fholíon nua:
    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. Tar éis duit an teastas freastalaí API a atheisiúint, atosaigh an coimeádán:
    docker ps | grep k8s_kube-apiserver | awk '{print $1}' | xargs docker restart
  7. A ligean ar athghiniúint an config le haghaidh admin.conf:
    kubeadm alpha certs renew admin.conf
  8. Cuirimis na sonraí in eagar in srld:
    ./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 

    Rabhadh! Ag an nóiméad seo, stopann réiteach fearainn ag obair sa bhraisle, ós rud é i pods atá ann cheana féin /etc/resolv.conf tá an seanseoladh CoreDNS (kube-dns) cláraithe, agus athraíonn kube-proxy na rialacha iptables ón sean-fholíon go dtí an ceann nua. Tuilleadh san alt tá sé scríofa faoi roghanna féideartha chun downtime a íoslaghdú.

  9. Ceartaimis ConfigMap san ainmspás kube-system:
    kubectl -n kube-system edit cm kubelet-config-1.16

    - ionad anseo clusterDNS chuig seoladh IP nua na seirbhíse kube-dns: kubectl -n kube-system get svc kube-dns.

    kubectl -n kube-system edit cm kubeadm-config

    - déanfaimid é a shocrú data.ClusterConfiguration.networking.serviceSubnet chuig fo-líon nua.

  10. Ós rud é gur athraíodh an seoladh kube-dns, is gá an chumraíocht kubelet ar gach nód a nuashonrú:
    kubeadm upgrade node phase kubelet-config && systemctl restart kubelet
  11. Níl fágtha ach na pods go léir a atosú sa bhraisle:
    kubectl get pods --no-headers=true --all-namespaces |sed -r 's/(S+)s+(S+).*/kubectl --namespace 1 delete pod 2/e'

Íoslaghdaigh aga neamhfhónaimh

Smaointe ar conas aga neamhfhónaimh a íoslaghdú:

  1. Tar éis na manifests eitleán rialaithe a athrú, cruthaigh seirbhís nua kube-dns, mar shampla, leis an ainm kube-dns-tmp agus seoladh nua 172.24.0.10.
  2. Déan if in etcdhelper, nach modhnóidh an tseirbhís kube-dns.
  3. Ionadaigh an seoladh i ngach kubelets ClusterDNS go ceann nua, agus leanfaidh an seanseirbhís ag obair go comhuaineach leis an tseirbhís nua.
  4. Fan go dtí go mbeidh na pods a bhfuil feidhmchláir orthu rolladh anonn iontu féin ar chúiseanna nádúrtha nó ag am comhaontaithe.
  5. Scrios an tseirbhís kube-dns-tmp agus athrú serviceSubnetCIDR don tseirbhís kube-dns.

Ligfidh an plean seo duit aga neamhfhónaimh a íoslaghdú go ~ nóiméad - ar feadh ré bhaint na seirbhíse kube-dns-tmp agus an subnet don tseirbhís a athrú kube-dns.

Modhnú podNetwork

Ag an am céanna, shocraigh muid féachaint ar conas podNetwork a mhodhnú ag baint úsáide as an etcdhelper mar thoradh air. Seo a leanas seicheamh na ngníomhartha:

  • cumraíochtaí a shocrú i kube-system;
  • an forléiriú kube-controller-manager a shocrú;
  • athraigh podCIDR go díreach i srl;
  • atosaigh gach nód braisle.

Anois tuilleadh faoi na gníomhartha seo:

1. Athraigh ConfigMap sa spás ainm kube-system:

kubectl -n kube-system edit cm kubeadm-config

- ceartú data.ClusterConfiguration.networking.podSubnet chuig fo-líon nua 10.55.0.0/16.

kubectl -n kube-system edit cm kube-proxy

- ceartú data.config.conf.clusterCIDR: 10.55.0.0/16.

2. Athraigh an léiriú rialtóir-bainisteoir:

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

- ceartú --cluster-cidr=10.55.0.0/16.

3. Féach ar na luachanna reatha .spec.podCIDR, .spec.podCIDRs, .InternalIP, .status.addresses do gach nód braisle:

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 in ionad podCIDR trí athruithe a dhéanamh go díreach ar 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. Déanaimis seiceáil go bhfuil athrú mór tagtha ar podCIDR:

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. Déanaimis na nóid bhraisle go léir a atosú ceann ar cheann.

7. Má fhágann tú nód amháin ar a laghad sean-podCIDR, ansin ní bheidh kube-controller-manager in ann tosú, agus ní bheidh pods sa bhraisle sceidealta.

Go deimhin, is féidir athrú podCIDR a dhéanamh níos simplí fós (mar shampla, mar sin). Ach bhíomar ag iarraidh a fháil amach conas oibriú le etcd go díreach, mar go bhfuil cásanna ann nuair a bhíonn rudaí Kubernetes in eagar srl - an t-aon cheann leagan féideartha. (Mar shampla, ní féidir leat an réimse Seirbhíse a athrú gan aga neamhfhónaimh spec.clusterIP.)

Iomlán na

Pléann an t-alt an fhéidearthacht oibriú le sonraí in etcd go díreach, i.e. ag seachaint API Kubernetes. Uaireanta ligeann an cur chuige seo duit "rudaí deacra" a dhéanamh. Rinneamar tástáil ar na hoibríochtaí a thugtar sa téacs ar bhraislí fíor-K8s. Mar sin féin, tá a stádas ullmhachta le húsáid fhorleathan PoC (cruthúnas coincheapa). Dá bhrí sin, más mian leat leagan modhnaithe den áirgiúlacht etcdhelper a úsáid ar do bhraislí, déan é sin ar do phriacal féin.

PS

Léigh freisin ar ár mblag:

Foinse: will.com

Add a comment