Nostra experientia cum notitia in etcd Kubernetes uvam directe (sine K8s API)

Clientes magis rogant nos ut accessum praebeamus ad botrum Kubernetes ut officia accedere possint intra botrum, ut possint directe coniungere aliquo datorum vel servitiorum, coniungere applicationem localem cum applicationibus intra botrum.

Nostra experientia cum notitia in etcd Kubernetes uvam directe (sine K8s API)

Exempli gratia, opus est connectere ex machina locali tuo ad servitium memcached.staging.svc.cluster.local. Hanc facultatem praebemus utendi VPN intra botrum cum quo client connectit. Ad hoc nuntiamus subnets siliquis, servitiis et dis botri DNS clienti. Unde cum clientelam coniungere conatur ad servitium memcached.staging.svc.cluster.localpetitio pergit ad botrum DNS et respondet inscriptioni huius servitii ex botri servitii retis vel vasculi inscriptionis.

K8s ligaturas configuramus utentes kubeadm, ubi defectus servitii subnet is 192.168.0.0/16ac retis siliquae 10.244.0.0/16. Fere omnia bene operantur, sed duo puncta sunt;

  • Subnet 192.168.*.* saepe usus est in retiaculis officii clientis, et etiam saepius in elit domus ligula. Et tunc certamina obtinemus: iter itineris opus in hoc subnet, et VPN has subnetes a botro ad clientem impellit.
  • Plures ligaturae habemus (productionem, scaenam et/vel plures racemos dev). Dein, defalta, iidem omnes subnetes pro siliquis et servitiis habebunt, quae magnas difficultates pro simultaneo opere cum servitiis in pluribus racemis procreant.

Nos iam pridem usu usi sumus diversis subnets pro servitiis et siliquis intra idem consilium - generatim, ut omnes ligaturae diversae retiacula habeant. Sunt tamen in operatione botri permulta, quae a scabere volvere nolim, cum multa officia, applicationes statusque currunt, etc.

Et tunc ipsi quaesivimus: quomodo subnet in existenti botro mutare?

Searching in decisions

Maxime usu est recreare omnes officia cum type ClusterIP. Velit optio, potest monere et hoc:

Processus sequens quaestionem habet: postquam omnia configurantur, siliquae ascendunt cum IP vetusto ut DNS nominatoris in /etc/resolv.conf.
Cum adhuc solutionem non inveniebam, totum botrum cum kubeadm retexere et iterum init.

Sed hoc non omnibus convenit.

  • Flannel' dicitur;
  • Botri sunt in nubibus et in ferramentis;
  • Nolim re- liquare omnia officia in botro vitare;
  • Opus est generaliter omnia agere cum minimo numero quaestionum;
  • Versio Kubernetes est 1.16.6 (similis tamen erit ulterior gradus in aliis versionibus);
  • Praecipuum opus est ut in botro destruxit usura kubeadm cum servitio subnet 192.168.0.0/16, Repone cum 172.24.0.0/16.

Et ita factum est ut iamdudum curavimus videre quid et quomodo in Kubernetes repositum in etc., quid fieri possit cum eo... Sic cogitavimus: β€œCur non solum renovare notitias in etc., reposuit in inscriptionibus IP antiquis (subnet) novis? Β»

Quaesito instrumentorum praeparatorum ad operandum cum notitia in etcd, nihil invenimus quod problema omnino solvitur. (Per viam, si scis aliquas utilitates ad operandum cum data directe in etc., per nexus bene volumus). Sed bonum principium est etcdhelper ex OpenShift (Auctoribus gratias).

Haec utilitas potest coniungere cum libellorum etcd utendo et lege data inde utendo mandata ls, get, dump.

Adde etcdhelper

Proxima cogitatio logica est: "Quid prohibet te hanc utilitatem addere addendo facultatem scribendi datas etcd?"

Facta est mutatio etchelperi versio cum duabus novis functionibus changeServiceCIDR ΠΈ changePodCIDR. in eam potes videre codice hic.

Quid novi features faciunt? Algorithmus changeServiceCIDR:

  • creare deserializer;
  • compilare a regular expression to repone CIDR;
  • itur per omnia officia cum genere ClusterIP in botro;
    • decode valorem ab etcd in a Go objectum;
    • a regulari locutione duos primos bytes inscriptionis substituimus;
    • munus IP inscriptioni e novo subnet assign;
    • creare serializer, converte Go objectum in protobuf, novas notitias scribe etc.

munus changePodCIDR per se similis changeServiceCIDR - solum pro edendis speciebus servitium, id facimus pro nodi et mutatione .spec.PodCIDR ad novam subnet.

praxi

Mutare ministerium CIDR

Consilium ad munus exsequendi valde simplex est, sed involvit tempus down tempore recreationis omnium leguminarum in botro. Gradibus principalibus perscriptis, cogitationes etiam communicabimus quomodo, in theoria, hoc downtime potest minui.

Gradus praeparatorii:

  • necessariis programmatibus inaugurari et disjicere etcdhelper congregare;
  • tergum etc /etc/kubernetes.

Brevis actio consilium mutandi serviceCIDR:

  • mutato apiseratorem ac moderatorem manifestat;
  • reissue libellorum;
  • de mutandis serviciis ClusterIP in etc.
  • sileo omnium siliquae in botro.

Haec est completa series actionum in speciali.

1. Install etcd-clientem pro notitia TUBER:

apt install etcd-client

2. aedifica etcdhelper;

  • Golang install:
    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
  • Nisi ipsi nobis etcdhelper.goclientelas, collecta;
    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. Fac tergum etc.

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. Mutare ministerium subnet in Kubernetes imperium planum manifestat. In files /etc/kubernetes/manifests/kube-apiserver.yaml ΠΈ /etc/kubernetes/manifests/kube-controller-manager.yaml mutare modularis --service-cluster-ip-range ad novam subnet: 172.24.0.0/16 pro 192.168.0.0/16.

5. Cum mutamus servitium subnet ad quod kubeadm quaestiones testimoniales pro apiservore (including), necesse est ut reiciantur:

  1. Videamus quae dominia et IP inscriptiones testimonium pro currenti prolatum est:
    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. Para minimum config pro 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. Deleamus vetus et clavem, quia sine hoc novum libellum non editur;
    rm /etc/kubernetes/pki/apiserver.{key,crt}
  4. Lets reissue libellorum pro servo API:
    kubeadm init phase certs apiserver --config=kubeadm-config.yaml
  5. Sit scriptor reprehendo quod libellum pro novo subnet datum est:
    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. Postquam libellum servo API rursus fiebant, eius vas sileo:
    docker ps | grep k8s_kube-apiserver | awk '{print $1}' | xargs docker restart
  7. Lets aboutconfig regenerare admin.conf:
    kubeadm alpha certs renew admin.conf
  8. Eamus notitias in etc.
    ./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 

    Cautus esto Hoc momento, resolutio regio in botro operatur, cum in legumine existente /etc/resolv.conf Inscriptio vetus CoreDNS (kube-dns) relatus est, et kube-proxy mutat regulas iptables ex veteri subnet ad novam. Praeterea in articulo scriptum est de optionibus possibilibus ad downtime minimize.

  9. Sit scriptor configMap fix in spatio nominali kube-system:
    kubectl -n kube-system edit cm kubelet-config-1.16

    - hic reponere clusterDNS ad novam IP inscriptionem kube-dns servitii: kubectl -n kube-system get svc kube-dns.

    kubectl -n kube-system edit cm kubeadm-config

    - nos figam data.ClusterConfiguration.networking.serviceSubnet ad novam subnet.

  10. Cum inscriptionem kube-dns mutatam esse, necesse est ut kubeletes omnes nodos config mittat;
    kubeadm upgrade node phase kubelet-config && systemctl restart kubelet
  11. Reliquum est ut siliquae omnes in botro silicentur;
    kubectl get pods --no-headers=true --all-namespaces |sed -r 's/(S+)s+(S+).*/kubectl --namespace 1 delete pod 2/e'

Minimize downtime

Cogitationes in quam minimize downtime:

  1. Post imperium planum manifestat mutato, novum servitium kube-dns crea, exempli gratia cum nomine kube-dns-tmp et inscriptionem novam 172.24.0.10.
  2. fac if in etcdhelper, quod kube-dns servicium non mitigabit.
  3. Reponere inscriptione in omnibus kubelets ClusterDNS ad novum unum, dum vetus servicium perseveret simul cum novo.
  4. Expecta donec siliquae cum applicationibus volvantur vel per se ad rationes naturales vel ad tempus condictum.
  5. Delere servitium kube-dns-tmp et mutare serviceSubnetCIDR pro kube-dus servitio.

Hoc consilium sinet te minuere downtime ad minutum - pro duratione servitii remotionis kube-dns-tmp et mutando subnet ad servitium kube-dns.

Modificatio podNetwork

Simul inspicere decrevimus quomodo podNetwork modificaret utens inde etcdhelper. Ordo vero actionum talis est;

  • figens figens in kube-system;
  • quoique kube-sterio-procurator manifestus est;
  • podCIDR directe in etc.
  • reboot omnes lymphaticorum.

Nunc de his plura.

1. ConfigMap Modify est in spatio nominali kube-system:

kubectl -n kube-system edit cm kubeadm-config

- corrigendum data.ClusterConfiguration.networking.podSubnet ad novam subnet 10.55.0.0/16.

kubectl -n kube-system edit cm kube-proxy

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

2. Modify manifest-procurator moderatoris;

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

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

3. respice ad hodiernam values .spec.podCIDR, .spec.podCIDRs, .InternalIP, .status.addresses omnibus nodis botri;

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. PodCIDR repone mutando directe ad etc.

./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. Sit scriptor reprehendo podCIDR quod vere mutatum est;

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. Omnes nodos botri singillatim reboot.

7. Si exeatis saltem unus nodi vetus podCIDRtunc kube moderatoris procurator incipere non poterit, et siliquae in botro non accedant.

Re quidem vera mutatio podCIDR etiam simplicior fieri potest (exem. gr. ita). Sed voluimus scire quomodo laborare cum etc. tantum fieri variant. (Exempli gratia, non potes modo mutare agrum servitii sine tempore down spec.clusterIP.)

exitum

The article discusses De possibilitate operandi cum data in etc. directe, i.e. praeteriens Kubernetes API. Interdum aditus permittit te facere "dolosae res." Operationes in textu de racemis realibus K8s datis probavimus. Status autem promptitudinis ad usum diffundendum est PoC (probationem conceptus). Si ergo vis modificatam versionem utilitatis etc. adiutoris in racemis uti, fac cum periculo tuo.

PS

Lege etiam in nostro diario:

Source: www.habr.com