Ny traikefanay amin'ny angona ao amin'ny cluster Kubernetes etcd mivantana (tsy misy K8s API)

Mihamaro ny mpanjifa mangataka antsika hanome fidirana amin'ny kluster Kubernetes ahafahana miditra amin'ny serivisy ao anatin'ny kluster: afaka mifandray mivantana amin'ny angon-drakitra na serivisy sasany, mampifandray fampiharana eo an-toerana amin'ny fampiharana ao anatin'ny kluster...

Ny traikefanay amin'ny angona ao amin'ny cluster Kubernetes etcd mivantana (tsy misy K8s API)

Ohatra, ilaina ny mifandray amin'ny milina eo an-toerana amin'ny serivisy memcached.staging.svc.cluster.local. Manome izany fahaiza-manao izany izahay amin'ny fampiasana VPN ao anatin'ny cluster izay ifandraisan'ny mpanjifa. Mba hanaovana izany, dia manambara ny subnets amin'ny pods, serivisy ary manosika DNS cluster amin'ny mpanjifa. Noho izany, rehefa manandrana mifandray amin'ny serivisy ny mpanjifa memcached.staging.svc.cluster.local, mankany amin'ny DNS cluster ny fangatahana ary ho setrin'izany dia mahazo ny adiresin'ity serivisy ity avy amin'ny tambajotra serivisy cluster na ny adiresy pod.

Izahay dia manamboatra cluster K8s amin'ny alΓ lan'ny kubeadm, izay misy ny subnet serivisy default 192.168.0.0/16, ary ny tambajotran'ny pods dia 10.244.0.0/16. Matetika dia mandeha tsara ny zava-drehetra, saingy misy teboka roa:

  • Subnet 192.168.*.* matetika ampiasaina amin'ny tambajotra biraon'ny mpanjifa, ary matetika kokoa amin'ny tambajotra an-trano mpamorona. Ary avy eo dia mahazo fifandirana izahay: miasa amin'ity subnet ity ny router an-trano ary ny VPN dia manosika ireo subnets avy amin'ny cluster mankany amin'ny mpanjifa.
  • Manana cluster maromaro izahay (famokarana, sehatra ary/na vondrona dev maromaro). Avy eo, amin'ny alΓ lan'ny default, izy rehetra dia hanana subnets mitovy ho an'ny pods sy serivisy, izay miteraka fahasahiranana lehibe amin'ny asa miaraka amin'ny serivisy amin'ny cluster maromaro.

Efa ela izahay no nandray ny fomba fampiasana zana-tambajotra samihafa ho an'ny serivisy sy pods ao anatin'ny tetikasa iray ihany - amin'ny ankapobeny, mba hanana tambajotra samihafa ny cluster rehetra. Na izany aza, misy cluster marobe miasa izay tsy tiako hihodina avy hatrany, satria izy ireo dia manao serivisy maro, fampiharana ara-panjakana, sns.

Ary avy eo dia nanontany tena izahay hoe: ahoana no hanovana ny subnet amin'ny cluster efa misy?

Fikarohana fanapahan-kevitra

Ny fanao mahazatra indrindra dia ny mamerina ny rehetra serivisy misy karazana ClusterIP. Ho safidy, afaka manoro hevitra ary ity:

Ity dingana manaraka ity dia manana olana: aorian'ny fametrahana ny zava-drehetra, ny pods dia tonga miaraka amin'ny IP taloha ho DNS nameserver ao amin'ny /etc/resolv.conf.
Koa satria mbola tsy nahita ny vahaolana aho dia tsy maintsy namerina ny cluster manontolo miaraka amin'ny reset kubeadm ary manomboka izany indray.

Saingy tsy mety amin'ny olon-drehetra izany ... Ireto misy fampidirana amin'ny antsipiriany bebe kokoa momba ny raharahantsika:

  • Flannel no ampiasaina;
  • Misy cluster na eny amin'ny rahona na amin'ny fitaovana;
  • Te-hiala amin'ny fametrahana indray ny serivisy rehetra ao amin'ny cluster aho;
  • Ilaina ny manao ny zava-drehetra amin'ny ankapobeny miaraka amin'ny olana kely indrindra;
  • Ny Kubernetes dia 1.16.6 (na izany aza, ny dingana hafa dia hitovy amin'ny dikan-teny hafa);
  • Ny tena asa dia ny miantoka fa ao amin'ny cluster napetraka mampiasa kubeadm miaraka amin'ny serivisy subnet 192.168.0.0/16, soloy amin'ny 172.24.0.0/16.

Ary ny zava-nitranga dia efa ela izahay no liana tamin'ny fahitana hoe inona sy ahoana no fitahirizana ao amin'ny Kubernetes ao amin'ny etcd, inona no azo atao amin'izany... Dia nieritreritra izahay hoe: β€œManinona raha manavao fotsiny ny angon-drakitra ao amin'ny etcd, soloina vaovao ny adiresy IP taloha (subnet).? "

Rehefa nikaroka fitaovana efa vonona hiasa amin'ny angon-drakitra ao amin'ny etcd izahay, dia tsy nahita na inona na inona nahavaha ny olana. (Raha ny tokony ho izy, raha fantatrao momba ny fitaovana ampiasaina amin'ny fiasana amin'ny angon-drakitra mivantana amin'ny etcd, dia mankasitraka ireo rohy izahay.) Na izany aza, ny toerana tsara hanombohana dia etcdhelper avy amin'ny OpenShift (misaotra ny mpanoratra azy!).

Ity fitaovana ity dia afaka mifandray amin'ny etcd mampiasa taratasy fanamarinana ary mamaky angon-drakitra avy any amin'ny fampiasana baiko ls, get, dump.

Ampio etcdhelper

Ny eritreritra manaraka dia lojika: "Inona no manakana anao tsy hampiditra ity fitaovana ity amin'ny fampidirana ny fahafahana manoratra angona amin'ny etcd?"

Lasa kinova novaina amin'ny etcdhelper misy fiasa vaovao roa changeServiceCIDR ΠΈ changePodCIDR. aminy azonao jerena ny code eto.

Inona no ataon'ireo endri-javatra vaovao? Algorithm changeServiceCIDR:

  • mamorona deserializer;
  • manangona fomba fiteny mahazatra hanoloana ny CIDR;
  • mandeha amin'ny serivisy rehetra miaraka amin'ny karazana ClusterIP ao amin'ny cluster izahay:
    • decode ny sanda avy amin'ny etcd ho zavatra Go;
    • amin'ny fampiasana fitenenana mahazatra dia manolo ireo byte roa voalohany amin'ny adiresy;
    • omeo adiresy IP avy amin'ny subnet vaovao ny serivisy;
    • mamorona serializer, manova ny zavatra Go ho protobuf, manoratra angona vaovao ho etcd.

asa changePodCIDR tena mitovy changeServiceCIDR - fa tsy manova ny fanondroana serivisy ihany no ataonay ho an'ny node sy ny fanovana .spec.PodCIDR amin'ny subnet vaovao.

fampiharana

Hanova serivisy CIDR

Ny drafitra amin'ny fanatanterahana ny asa dia tena tsotra, fa izany dia mitaky fotoana fitsaharana amin'ny fotoana fanamboarana indray ny pods rehetra ao amin'ny cluster. Aorian'ny famariparitana ireo dingana lehibe, dia hizara hevitra ihany koa isika amin'ny fomba, amin'ny teoria, ny mety hampihenana io fotoana io.

Dingana fanomanana:

  • fametrahana ny rindrambaiko ilaina sy ny fanangonana ny patched etcdhelper;
  • backup etcd ary /etc/kubernetes.

Drafitra hetsika fohy amin'ny fanovana serviceCIDR:

  • manova ny apiserver sy ny mpitantana-manager manifests;
  • famoahana indray ny taratasy fanamarinana;
  • manova ny serivisy ClusterIP amin'ny etcd;
  • avereno indray ny pods rehetra ao amin'ny cluster.

Ity manaraka ity dia filaharana feno amin'ny antsipiriany.

1. Mametraka etcd-client ho an'ny fanariam-baovao:

apt install etcd-client

2. Manangana snsdhelper:

  • Mametraka 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
  • Mitahiry ho an'ny tenantsika isika etcdhelper.go, misintona miankina, manangona:
    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. Manaova backup sns:

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. Ovay ny subnet serivisy amin'ny fisehoana fiaramanidina fanaraha-maso Kubernetes. Amin'ny rakitra /etc/kubernetes/manifests/kube-apiserver.yaml ΠΈ /etc/kubernetes/manifests/kube-controller-manager.yaml hanova ny parameter --service-cluster-ip-range amin'ny subnet vaovao: 172.24.0.0/16 raha tokony 192.168.0.0/16.

5. Koa satria ovainay ny subnet serivisy izay anomezan'ny kubeadm mari-pankasitrahana ho an'ny apiserver (anisan'izany), dia mila avoaka indray izy ireo:

  1. Andeha hojerentsika izay sehatra sy adiresy IP navoakan'ny taratasy fanamarinana ankehitriny:
    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. Andao hanomana config kely ho an'ny 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. Andeha hofafantsika ny crt sy ny lakile taloha, satria raha tsy misy izany dia tsy hisy ny taratasy fanamarinana vaovao:
    rm /etc/kubernetes/pki/apiserver.{key,crt}
  4. Andao hamoaka mari-pankasitrahana ho an'ny mpizara API:
    kubeadm init phase certs apiserver --config=kubeadm-config.yaml
  5. Andeha hojerentsika fa navoaka ho an'ny subnet vaovao ny taratasy fanamarinana:
    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. Rehefa avy namoaka indray ny taratasy fanamarinana mpizara API dia avereno indray ny fitoerany:
    docker ps | grep k8s_kube-apiserver | awk '{print $1}' | xargs docker restart
  7. Andao havaozina ny config ho an'ny admin.conf:
    kubeadm alpha certs renew admin.conf
  8. Andao hanova ny angona amin'ny 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 

    Miangavy azafady! Amin'izao fotoana izao dia mijanona tsy miasa ao amin'ny cluster ny famaha ny sehatra, satria ao amin'ny pods efa misy /etc/resolv.conf ny adiresy CoreDNS taloha (kube-dns) dia misoratra anarana, ary ny kube-proxy dia manova ny fitsipika iptables avy amin'ny subnet taloha mankany amin'ny vaovao. Ao amin'ny lahatsoratra dia nosoratana momba ny safidy mety hanamaivanana ny fotoana fitsaharana.

  9. Andao amboary ny ConfigMap ao amin'ny namespace kube-system:
    kubectl -n kube-system edit cm kubelet-config-1.16

    - soloy eto clusterDNS mankany amin'ny adiresy IP vaovao an'ny serivisy kube-dns: kubectl -n kube-system get svc kube-dns.

    kubectl -n kube-system edit cm kubeadm-config

    - Hamboarintsika izany data.ClusterConfiguration.networking.serviceSubnet amin'ny subnet vaovao.

  10. Satria niova ny adiresy kube-dns, ilaina ny manavao ny config kubelet amin'ny nodes rehetra:
    kubeadm upgrade node phase kubelet-config && systemctl restart kubelet
  11. Ny hany sisa tavela dia ny mamerina indray ny pods rehetra ao amin'ny cluster:
    kubectl get pods --no-headers=true --all-namespaces |sed -r 's/(S+)s+(S+).*/kubectl --namespace 1 delete pod 2/e'

Ahenao ny fotoana fitsaharana

Hevitra momba ny fomba hampihenana ny fotoana fitsaharana:

  1. Aorian'ny fanovana ny fisehoana fiaramanidina fanaraha-maso, mamorona serivisy kube-dns vaovao, ohatra, miaraka amin'ny anarana kube-dns-tmp ary adiresy vaovao 172.24.0.10.
  2. manao if amin'ny etcdhelper, izay tsy hanova ny serivisy kube-dns.
  3. Soloy ny adiresy amin'ny kubelets rehetra ClusterDNS amin'ny iray vaovao, fa ny serivisy taloha dia mbola hiasa miaraka amin'ny vaovao.
  4. Andraso mandra-pihodina ny pods misy fampiharana na noho ny antony voajanahary na amin'ny fotoana nifanarahana.
  5. Fafao ny serivisy kube-dns-tmp ary miova serviceSubnetCIDR ho an'ny serivisy kube-dns.

Ity drafitra ity dia ahafahanao manamaivana ny fotoana fialan-tsasatra ho ~ iray minitra - mandritra ny faharetan'ny fanesorana serivisy kube-dns-tmp ary manova ny subnet ho an'ny serivisy kube-dns.

Modification podNetwork

Nandritra izany fotoana izany, nanapa-kevitra ny hijery ny fomba hanovana podNetwork amin'ny fampiasana ny etcdhelper vokatra. Ny filaharan'ny hetsika dia toy izao manaraka izao:

  • fanamboarana configs in kube-system;
  • fanamboarana ny kube-controller-manager manifest;
  • manova podCIDR mivantana amin'ny etcd;
  • avereno indray ny node cluster rehetra.

More izao momba ireto hetsika ireto:

1. Ovao ny ConfigMap's ao amin'ny namespace kube-system:

kubectl -n kube-system edit cm kubeadm-config

- fanitsiana data.ClusterConfiguration.networking.podSubnet amin'ny subnet vaovao 10.55.0.0/16.

kubectl -n kube-system edit cm kube-proxy

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

2. Ovay ny fanehoana mpitantana-manara-maso:

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

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

3. Jereo ny soatoavina ankehitriny .spec.podCIDR, .spec.podCIDRs, .InternalIP, .status.addresses ho an'ny node cluster rehetra:

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. Soloy podCIDR amin'ny fanovana mivantana amin'ny 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. Andeha hojerentsika fa tena niova ny 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. Andeha hojerentsika tsirairay ny node cluster rehetra.

7. Raha miala amin'ny node iray farafahakeliny ianao podCIDR taloha, dia tsy afaka manomboka ny kube-controller-manager, ary tsy ho voalahatra ny pods ao amin'ny cluster.

Raha ny marina, ny fanovana podCIDR dia azo atao tsotra kokoa (ohatra, toy izany). Saingy te hianatra ny fomba fiasa mivantana amin'ny etcd izahay, satria misy tranga rehefa manitsy ny zavatra Kubernetes amin'ny etcd - irery ihany variana mety. (Ohatra, tsy azonao atao ny manova fotsiny ny saha serivisy raha tsy misy ny fotoana fialan-tsasatra spec.clusterIP.)

Ny vokany

Ny lahatsoratra dia miresaka momba ny mety hiasa amin'ny angona amin'ny etcd mivantana, i.e. mandingana ny Kubernetes API. Indraindray io fomba fiasa io dia ahafahanao manao "zavatra mamitaka". Nosedrainay ny asa nomena ao amin'ny lahatsoratra amin'ny k8s tena izy. Na izany aza, ny satan'ny fahavononana ho an'ny fampiasana miely patrana dia PoC (porofon'ny hevitra). Noho izany, raha te hampiasa dikan-teny novaina amin'ny utility etcdhelper ianao amin'ny clusters dia ataovy amin'ny risikao manokana izany.

Sal

Vakio ihany koa ao amin'ny bilaoginay:

Source: www.habr.com

Add a comment