Eksperyans nou ak done nan gwoup etcd Kubernetes dirèkteman (san API K8s)

De pli zan pli, kliyan ap mande nou pou nou bay aksè nan gwoup Kubernetes pou kapab jwenn aksè nan sèvis nan gwoup la: pou kapab konekte dirèkteman ak kèk baz done oswa sèvis, konekte yon aplikasyon lokal ak aplikasyon ki nan gwoup la...

Eksperyans nou ak done nan gwoup etcd Kubernetes dirèkteman (san API K8s)

Pou egzanp, gen yon bezwen konekte soti nan machin lokal ou a nan yon sèvis memcached.staging.svc.cluster.local. Nou bay kapasite sa a lè l sèvi avèk yon VPN nan gwoup la ak kliyan an konekte. Pou fè sa, nou anonse sous-rezo nan gous, sèvis ak pouse gwoup DNS nan kliyan an. Kidonk, lè yon kliyan eseye konekte ak sèvis la memcached.staging.svc.cluster.local, demann lan ale nan DNS gwoup la epi li resevwa adrès sèvis sa a nan rezo sèvis gwoup la oswa adrès gous la.

Nou konfigirasyon gwoup K8s lè l sèvi avèk kubeadm, kote sous-rezo sèvis default la ye 192.168.0.0/16, ak rezo a nan gous se 10.244.0.0/16. Anjeneral tout bagay ap mache byen, men gen kèk pwen:

  • Sourezo 192.168.*.* souvan itilize nan rezo biwo kliyan, e menm pi souvan nan rezo lakay pwomotè. Lè sa a, nou jwenn konfli: routeurs lakay yo travay sou subnet sa a ak VPN a pouse subnet sa yo soti nan gwoup la nan kliyan an.
  • Nou gen plizyè grap (pwodiksyon, etap ak / oswa plizyè gwoup dev). Lè sa a, pa default, tout nan yo pral gen menm subnets yo pou gous ak sèvis, ki kreye gwo difikilte pou travay similtane ak sèvis nan plizyè grap.

Depi lontan nou te adopte pratik pou itilize sous-rezo diferan pou sèvis ak gous nan menm pwojè a - an jeneral, pou tout gwoup yo gen rezo diferan. Sepandan, gen yon gwo kantite grap nan operasyon ke mwen pa ta renmen woule soti nan grafouyen, paske yo kouri anpil sèvis, aplikasyon pou eta, elatriye.

Lè sa a, nou mande tèt nou: ki jan yo chanje subnet la nan yon gwoup ki deja egziste?

Rechèch desizyon

Pratik ki pi komen se rkree tout sèvis ak kalite ClusterIP. Kòm yon opsyon, ka konseye ak sa a:

Pwosesis sa a gen yon pwoblèm: apre tout bagay configuré, gous yo vini ak ansyen IP a kòm yon sèvè DNS nan /etc/resolv.conf.
Depi mwen toujou pa jwenn solisyon an, mwen te oblije Reyajiste tout gwoup la ak kubeadm reset ak reinitial li ankò.

Men, sa a pa apwopriye pou tout moun... Men entwodiksyon plis detay pou ka nou an:

  • Flanèl yo itilize;
  • Gen grap tou de nan nwaj yo ak sou pyès ki nan konpitè;
  • Mwen ta renmen evite re-deplwaye tout sèvis nan gwoup la;
  • Gen yon bezwen jeneralman fè tout bagay ak yon kantite minimòm pwoblèm;
  • Vèsyon Kubernetes se 1.16.6 (sepandan, lòt etap yo pral sanble pou lòt vèsyon);
  • Travay prensipal la se asire ke nan yon gwoup deplwaye lè l sèvi avèk kubeadm ak yon subnet sèvis 192.168.0.0/16, ranplase li ak 172.24.0.0/16.

Epi li te rive ke nou te gen lontan te enterese nan wè ki sa ak ki jan nan Kubernetes ki estoke nan etcd, ki sa ki ka fè ak li ... Se konsa, nou te panse: "Poukisa nou pa jis mete ajou done yo nan etcd, ranplase ansyen adrès IP yo (sous-rezo) ak nouvo? »

Lè w fin chèche zouti pare pou travay ak done nan etcd, nou pa t jwenn anyen ki rezoud pwoblèm nan nèt. (Bon wout la, si ou konnen nenpòt sèvis piblik pou travay ak done dirèkteman nan etcd, nou ta apresye lyen yo.) Sepandan, yon bon pwen depa se etcdhelper soti nan OpenShift (mèsi a otè li yo!).

Sèvis piblik sa a ka konekte ak etcd lè l sèvi avèk sètifika epi li done ki soti nan la lè l sèvi avèk kòmandman ls, get, dump.

Ajoute etcdhelper

Pwochen panse a se lojik: "Ki sa ki anpeche w ajoute sèvis piblik sa a lè w ajoute kapasite pou ekri done sou etcd?"

Li te vin tounen yon vèsyon modifye nan etcdhelper ak de nouvo fonksyon changeServiceCIDR и changePodCIDR. sou li ou ka wè kòd la isit la.

Kisa nouvo karakteristik yo fè? Algorithm changeServiceCIDR:

  • kreye yon deserializer;
  • konpile yon ekspresyon regilye pou ranplase CIDR;
  • nou ale nan tout sèvis ak kalite ClusterIP nan gwoup la:
    • dekode valè a soti nan etcd nan yon objè Go;
    • lè l sèvi avèk yon ekspresyon regilye nou ranplase de premye byte adrès la;
    • bay sèvis la yon adrès IP ki soti nan nouvo subnet la;
    • kreye yon serilizer, konvèti objè Go a nan protobuf, ekri nouvo done sou elatriye.

Fonksyon changePodCIDR esansyèlman menm jan an changeServiceCIDR - sèlman olye pou yo modifye spesifikasyon sèvis la, nou fè li pou ne ak chanjman .spec.PodCIDR nan yon nouvo sous-rezo.

Pratike

Chanje sèvis CIDR

Plan pou mete ann aplikasyon travay la trè senp, men li enplike D 'nan moman re-kreyasyon tout gous nan gwoup la. Apre nou fin dekri etap prensipal yo, nou pral pataje tou panse sou ki jan, nan teyori, tan sa a ka minimize.

Etap preparasyon:

  • enstale lojisyèl ki nesesè yo ak rasanble patched etcdhelper la;
  • backup etcd ak /etc/kubernetes.

Brèf plan aksyon pou chanje sèvis CIDR:

  • chanje manifeste apiserver ak manadjè kontwolè;
  • reemèt sètifika;
  • chanje sèvis ClusterIP nan etcd;
  • rekòmanse tout gous nan gwoup la.

Sa ki anba la a se yon sekans konplè nan aksyon an detay.

1. Enstale etcd-client pou pil fatra done:

apt install etcd-client

2. Bati etcdhelper:

  • Enstale 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
  • Nou sove pou tèt nou etcdhelper.go, telechaje depandans, kolekte:
    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. Fè yon backup elatriyed:

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. Chanje sous-rezo sèvis la nan manifeste avyon kontwòl Kubernetes yo. Nan dosye /etc/kubernetes/manifests/kube-apiserver.yaml и /etc/kubernetes/manifests/kube-controller-manager.yaml chanje paramèt la --service-cluster-ip-range nan yon nouvo sous-rezo: 172.24.0.0/16 olye pou yo 192.168.0.0/16.

5. Piske n ap chanje sous-rezo sèvis la kote kubeadm bay sètifika pou apiserver (tankou), yo bezwen reemèt yo:

  1. Ann wè pou ki domèn ak adrès IP yo te bay sètifika aktyèl la:
    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. Ann prepare yon konfigirasyon minim pou 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. Ann efase ansyen crt ak kle a, paske san sa a nouvo sètifika a pa pral bay:
    rm /etc/kubernetes/pki/apiserver.{key,crt}
  4. Ann reemèt sètifika pou sèvè API a:
    kubeadm init phase certs apiserver --config=kubeadm-config.yaml
  5. Ann tcheke si sètifika a te bay pou nouvo subnet la:
    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. Apre re-emèt sètifika sèvè API a, rekòmanse veso li a:
    docker ps | grep k8s_kube-apiserver | awk '{print $1}' | xargs docker restart
  7. Ann rejenere konfigirasyon an pou admin.conf:
    kubeadm alpha certs renew admin.conf
  8. Ann edite done yo nan 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 

    Attention! Nan moman sa a, rezolisyon domèn sispann travay nan gwoup la, depi nan gous ki egziste deja /etc/resolv.conf ansyen adrès CoreDNS la (kube-dns) anrejistre, ak kube-proxy chanje règ iptables yo soti nan ansyen sous-rezo a nan nouvo a. Pli lwen nan atik la li ekri sou opsyon posib pou minimize D '.

  9. Ann ranje ConfigMap nan espas non an kube-system:
    kubectl -n kube-system edit cm kubelet-config-1.16

    - ranplase isit la clusterDNS nan nouvo adrès IP sèvis kube-dns la: kubectl -n kube-system get svc kube-dns.

    kubectl -n kube-system edit cm kubeadm-config

    - nou pral ranje li data.ClusterConfiguration.networking.serviceSubnet nan yon nouvo sous-rezo.

  10. Depi adrès kube-dns la chanje, li nesesè pou mete ajou konfigirasyon kubelet la sou tout nœuds yo:
    kubeadm upgrade node phase kubelet-config && systemctl restart kubelet
  11. Tout sa ki rete se rekòmanse tout gous nan gwoup la:
    kubectl get pods --no-headers=true --all-namespaces |sed -r 's/(S+)s+(S+).*/kubectl --namespace 1 delete pod 2/e'

Minimize D'

Panse sou kòman pou minimize tan D ':

  1. Apre chanje manifeste avyon kontwòl yo, kreye yon nouvo sèvis kube-dns, pou egzanp, ak non an kube-dns-tmp ak nouvo adrès 172.24.0.10.
  2. if nan etcdhelper, ki pa pral modifye sèvis kube-dns la.
  3. Ranplase adrès la nan tout kubelets ClusterDNS nan yon nouvo, pandan y ap ansyen sèvis la ap kontinye travay ansanm ak yon nouvo.
  4. Rete tann jiskaske gous yo ak aplikasyon yo woule swa poukont yo pou rezon natirèl oswa nan yon lè yo dakò.
  5. Efase sèvis kube-dns-tmp ak chanjman serviceSubnetCIDR pou sèvis kube-dns la.

Plan sa a pral pèmèt ou minimize tan D 'a ~ yon minit - pou dire a nan retire sèvis la kube-dns-tmp epi chanje sous-rezo a pou sèvis la kube-dns.

Modifikasyon podNetwork

An menm tan an, nou deside gade ki jan yo modifye podNetwork lè l sèvi avèk etcdhelper ki lakòz. Sekans aksyon yo se jan sa a:

  • ranje konfigirasyon nan kube-system;
  • ranje manifest kube-controller-manager;
  • chanje podCIDR dirèkteman nan etcd;
  • rdemare tout nœuds gwoup yo.

Kounye a plis sou aksyon sa yo:

1. Modifye ConfigMap nan espas non an kube-system:

kubectl -n kube-system edit cm kubeadm-config

- korije data.ClusterConfiguration.networking.podSubnet nan yon nouvo sous-rezo 10.55.0.0/16.

kubectl -n kube-system edit cm kube-proxy

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

2. Modifye manifest kontwolè-manadjè a:

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

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

3. Gade nan valè aktyèl yo .spec.podCIDR, .spec.podCIDRs, .InternalIP, .status.addresses pou tout nœuds gwoup:

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. Ranplase podCIDR lè w fè chanjman dirèkteman nan 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. Ann tcheke si podCIDR vrèman chanje:

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. Ann rdemare tout nœuds gwoup youn pa youn.

7. Si ou kite omwen yon ne ansyen podCIDR, Lè sa a, kube-controller-manager pa pral kapab kòmanse, ak gous nan gwoup la pa pral pwograme.

An reyalite, chanje podCIDR ka fè menm pi senp (pa egzanp, se konsa). Men, nou te vle aprann kijan pou travay ak etcd dirèkteman, paske gen ka lè modifye objè Kubernetes nan etcd - sèl la variant posib. (Pou egzanp, ou pa ka jis chanje jaden Sèvis la san D' spec.clusterIP.)

Total

Atik la diskite posiblite pou travay ak done nan etcd dirèkteman, i.e. kontoune API Kubernetes la. Pafwa apwòch sa a pèmèt ou fè "bagay difisil". Nou teste operasyon yo bay nan tèks la sou grap reyèl K8 yo. Sepandan, estati yo nan preparasyon pou itilize toupatou se PoC (prèv konsèp). Se poutèt sa, si ou vle sèvi ak yon vèsyon modifye nan sèvis piblik etcdhelper sou grap ou yo, fè sa sou pwòp risk ou.

PS

Li tou sou blog nou an:

Sous: www.habr.com

Add nouvo kòmantè