Kubernetes පොඩ් එකකට IP ලිපිනයක් ලැබෙන්නේ කෙසේද?

සටහන. පරිවර්තනය.: LinkedIn වෙතින් SRE ඉංජිනේරුවෙකු විසින් ලියන ලද මෙම ලිපිය, Kubernetes හි අභ්‍යන්තර මායාව - වඩාත් නිවැරදිව, CRI, CNI සහ kube-apiserver හි අන්තර්ක්‍රියා - එය සිදු වන්නේ ඊළඟ පොඩ් එකට IP ලිපිනයක් පැවරීමට අවශ්‍ය වූ විටය.

මූලික අවශ්යතා වලින් එකක් Kubernetes ජාල ආකෘතිය යනු සෑම පොඩ් එකකටම තමන්ගේම IP ලිපිනයක් තිබිය යුතු අතර පොකුරේ ඇති වෙනත් ඕනෑම පොඩ් එකකට එම ලිපිනයෙන් එය සම්බන්ධ කර ගැනීමට හැකි විය යුතුය. මෙම ජාල ආකෘතිය ක්රියාත්මක කිරීමට උපකාර වන බොහෝ ජාල "සැපයුම්කරුවන්" (Flannel, Calico, Canal, ආදිය) ඇත.

මම මුලින්ම Kubernetes සමඟ වැඩ කිරීමට පටන් ගත් විට, Pods ඔවුන්ගේ IP ලිපින හරියටම ලබා ගන්නේ කෙසේද යන්න මට සම්පූර්ණයෙන්ම පැහැදිලි නැත. එක් එක් සංරචක ක්‍රියා කරන ආකාරය පිළිබඳ අවබෝධයක් තිබියදීත්, ඒවා එකට වැඩ කිරීම සිතීම දුෂ්කර විය. උදාහරණයක් ලෙස, CNI ප්ලගීන යනු කුමක්දැයි මම දැන සිටියෙමි, නමුත් ඒවා හරියටම හඳුන්වන්නේ කෙසේදැයි මම නොදනිමි. එමනිසා, විවිධ ජාල සංරචක සහ ඒවා Kubernetes පොකුරක් තුළ එකට ක්‍රියා කරන ආකාරය පිළිබඳ දැනුම බෙදා ගැනීමට මෙම ලිපිය ලිවීමට මම තීරණය කළෙමි, එමඟින් සෑම පොඩ් එකකටම තමන්ගේම IP ලිපිනය ලබා ගත හැකිය.

බහාලුම් සඳහා විවිධ ධාවන කාල විකල්ප ඇති ආකාරයටම, Kubernetes හි ජාලකරණය සංවිධානය කිරීමට විවිධ ක්‍රම තිබේ. මෙම ප්රකාශනය භාවිතා කරනු ඇත ෆ්ලැනෙල් ජාලයක් පොකුරක් තුළ සංවිධානය කිරීමට සහ ක්‍රියාත්මක කළ හැකි පරිසරයක් ලෙස - බහාලුම්. බහාලුම් අතර ජාලකරණය ක්‍රියා කරන ආකාරය ඔබ දන්නා බව මම උපකල්පනය කරමි, එබැවින් මම එය සන්දර්භය සඳහා පමණක් කෙටියෙන් ස්පර්ශ කරමි.

සමහර මූලික සංකල්ප

බහාලුම් සහ ජාලය: කෙටි දළ විශ්ලේෂණයක්

ජාලය හරහා බහාලුම් එකිනෙකා සමඟ සන්නිවේදනය කරන ආකාරය පැහැදිලි කරන විශිෂ්ට ප්රකාශන අන්තර්ජාලයේ ඕනෑ තරම් තිබේ. එබැවින්, මම මූලික සංකල්ප පිළිබඳ සාමාන්‍ය දළ විශ්ලේෂණයක් පමණක් ලබා දෙන අතර ලිනක්ස් පාලමක් නිර්මාණය කිරීම සහ පැකේජ ඇතුළත් කිරීම ඇතුළත් වන එක් ප්‍රවේශයකට සීමා කරමි. බහාලුම් ජාලකරණය පිළිබඳ මාතෘකාවම වෙනම ලිපියක් ලැබිය යුතු බැවින් විස්තර මඟ හරිනු ලැබේ. විශේෂයෙන් තීක්ෂ්ණ බුද්ධිය සහ අධ්‍යාපනික ප්‍රකාශන සඳහා සබැඳි පහතින් සපයනු ලැබේ.

එක් සත්කාරකයක් මත බහාලුම්

එකම ධාරකයක ක්‍රියාත්මක වන බහාලුම් අතර IP ලිපින හරහා සන්නිවේදනය සංවිධානය කිරීමේ එක් ක්‍රමයක් වන්නේ Linux පාලමක් නිර්මාණය කිරීමයි. මෙම කාර්යය සඳහා, Kubernetes (සහ Docker) හි අතථ්‍ය උපාංග නිර්මාණය කර ඇත. veth (අථත්‍ය ඊතර්නෙට්). Veth උපාංගයේ එක් කෙළවරක් කන්ටේනරයේ ජාල නාම අවකාශයට සම්බන්ධ කරයි, අනෙක ලිනක්ස් පාලම සත්කාරක ජාලය මත.

එකම ධාරකයේ ඇති සියලුම බහාලුම්වල IP ලිපින හරහා එකිනෙකා සමඟ සන්නිවේදනය කළ හැකි පාලමකට සම්බන්ධ වී ඇති එක් කෙළවරක් ඇත. ලිනක්ස් පාලමට IP ලිපිනයක් ද ඇති අතර අනෙකුත් නෝඩ් සඳහා නියම කර ඇති කරල් වලින් පිටවන ගමනාගමනය සඳහා දොරටුවක් ලෙස ක්‍රියා කරයි.

Kubernetes පොඩ් එකකට IP ලිපිනයක් ලැබෙන්නේ කෙසේද?

විවිධ ධාරක මත බහාලුම්

Packet encapsulation යනු විවිධ නෝඩ් වල ඇති බහාලුම්වලට IP ලිපින භාවිතයෙන් එකිනෙකා සමඟ සන්නිවේදනය කිරීමට ඉඩ සලසන එක් ක්‍රමයකි. Flannel හි, මෙම අවස්ථාව සඳහා තාක්ෂණය වගකිව යුතුය. vxlan, එය මුල් පැකට්ටුව UDP පැකට්ටුවකට "ඇසුරුම්" කර එය ගමනාන්තයට යවයි.

Kubernetes පොකුරක් තුළ, Flannel vxlan උපාංගයක් නිර්මාණය කර ඒ අනුව එක් එක් නෝඩයේ මාර්ග වගුව යාවත්කාලීන කරයි. වෙනස් ධාරකයක බහාලුමක් සඳහා නියම කර ඇති සෑම පැකට්ටුවක්ම vxlan උපාංගය හරහා ගමන් කරන අතර UDP පැකට්ටුවක කොටු කර ඇත. ගමනාන්තයේදී, කූඩු පැකට්ටුව නිස්සාරණය කර අපේක්ෂිත පොඩ් වෙත යවනු ලැබේ.

Kubernetes පොඩ් එකකට IP ලිපිනයක් ලැබෙන්නේ කෙසේද?
සටහන: මෙය බහාලුම් අතර ජාල සන්නිවේදනය සංවිධානය කිරීමට එක් මාර්ගයක් පමණි.

CRI යනු කුමක්ද?

CRI (කන්ටේනර් ධාවන කාල අතුරුමුහුණත) යනු විවිධ බහාලුම් ධාවන කාල පරිසරයන් භාවිතා කිරීමට kubelet හට ඉඩ දෙන ප්ලගිනයකි. CRI API විවිධ ධාවන කාලවලට ගොඩනගා ඇත, එබැවින් පරිශීලකයින්ට තමන් කැමති ධාවන කාලය තෝරාගත හැක.

CNI යනු කුමක්ද?

ව්යාපෘතිය CNI ඒ කියන්නේ පිරිවිතර Linux බහාලුම් සඳහා විශ්වීය ජාල විසඳුමක් සංවිධානය කිරීමට. ඊට අමතරව, එය ඇතුළත් වේ ප්ලගින, පොඩ් ජාලයක් සැකසීමේදී විවිධ කාර්යයන් සඳහා වගකිව යුතුය. CNI ප්ලගිනය යනු පිරිවිතරයන්ට අනුකූල වන ක්‍රියාත්මක කළ හැකි ගොනුවකි (අපි පහත ප්ලගීන කිහිපයක් සාකච්ඡා කරමු).

Pods වලට IP ලිපින ලබා දීම සඳහා නෝඩ් වලට අනුජාල වෙන් කිරීම

පොකුරක ඇති සෑම පොඩ් එකකටම IP ලිපිනයක් තිබිය යුතු බැවින්, මෙම ලිපිනය අද්විතීය බව සහතික කිරීම වැදගත් වේ. මෙය සාක්ෂාත් කරගනු ලබන්නේ සෑම නෝඩයකටම අනන්‍ය උපජාලයක් පැවරීමෙනි, එයින් එම නෝඩයේ ඇති පොඩ් වලට IP ලිපින පවරනු ලැබේ.

සත්කාරක IPAM පාලකය

කවදාද? nodeipam ධජ පරාමිතියක් ලෙස සම්මත විය --controllers kube-controller-manager, එය පොකුරු CIDR (එනම්, පොකුරු ජාලය සඳහා IP ලිපින පරාසය) සිට එක් එක් නෝඩය සඳහා වෙනම උපජාලයක් (podCIDR) වෙන් කරයි. මෙම podCIDRs අතිච්ඡාදනය නොවන බැවින්, සෑම පොඩ් එකකටම අනන්‍ය IP ලිපිනයක් වෙන් කිරීමට හැකි වේ.

Kubernetes node එකක් මුලින් පොකුර සමඟ ලියාපදිංචි වූ විට එය podCIDR පවරනු ලැබේ. නෝඩ් වල podCIDR වෙනස් කිරීමට, ඔබ ඒවා ලියාපදිංචි කිරීම ඉවත් කර නැවත ලියාපදිංචි කළ යුතු අතර, ඒ අතර ඇති Kubernetes පාලන ස්ථර වින්‍යාසයට සුදුසු වෙනස්කම් සිදු කළ යුතුය. පහත දැක්වෙන විධානය භාවිතයෙන් ඔබට නෝඩයක podCIDR පෙන්විය හැක:

$ kubectl get no <nodeName> -o json | jq '.spec.podCIDR'
10.244.0.0/24

Kubelet, බහාලුම් ධාවන කාලය සහ CNI ප්ලගීන: ඒ සියල්ල ක්‍රියා කරන ආකාරය

නෝඩයකට පොඩ් එකක් උපලේඛනගත කිරීම සඳහා සූදානම් වීමේ පියවර රාශියක් ඇතුළත් වේ. මෙම කොටසේදී, මම අවධානය යොමු කරන්නේ පොඩ් ජාලයක් සැකසීමට සෘජුවම සම්බන්ධ ඒවා පමණි.

යම් නෝඩයකට පොඩ් එකක් උපලේඛනගත කිරීම පහත සිදුවීම් දාමය අවුලුවයි:

Kubernetes පොඩ් එකකට IP ලිපිනයක් ලැබෙන්නේ කෙසේද?

උදවු: Containerd CRI ප්ලගීන ගෘහ නිර්මාණ ශිල්පය.

බහාලුම් ධාවන කාලය සහ CNI ප්ලගීන අතර අන්තර්ක්‍රියා

සෑම ජාල සැපයුම්කරුවෙකුටම තමන්ගේම CNI ප්ලගිනයක් ඇත. කන්ටේනරයේ ධාවන කාලය එය ආරම්භ වන විට පොඩ් සඳහා ජාලය වින්‍යාස කිරීමට එය ක්‍රියාත්මක කරයි. බහාලුම් සම්බන්ධයෙන්, CNI ප්ලගිනය ප්ලගිනය මගින් දියත් කෙරේ බහාලුම් CRI.

එපමණක් නොව, සෑම සැපයුම්කරුවෙකුටම තමන්ගේම නියෝජිතයෙකු සිටී. එය සියලුම Kubernetes නෝඩ් මත ස්ථාපනය කර ඇති අතර කරල් වල ජාල වින්‍යාසය සඳහා වගකිව යුතුය. මෙම නියෝජිතයා CNI වින්‍යාසය සමඟ ඇතුළත් කර ඇත, නැතහොත් ස්වාධීනව එය නෝඩය මත නිර්මාණය කරයි. CRI ප්ලගිනය ඇමතීමට කුමන CNI ප්ලගිනයටද වින්‍යාසය උදවු කරයි.

CNI වින්‍යාසයේ පිහිටීම අභිරුචිකරණය කළ හැකිය; පෙරනිමියෙන් එය ඇත /etc/cni/net.d/<config-file>. එක් එක් පොකුරු නෝඩය මත CNI ප්ලගීන ස්ථාපනය කිරීම සඳහා පොකුරු පරිපාලකයින් ද වගකිව යුතුය. ඔවුන්ගේ පිහිටීම ද අභිරුචිකරණය කළ හැකිය; පෙරනිමි නාමාවලිය - /opt/cni/bin.

බහාලුම් භාවිතා කරන විට, ප්ලගින වින්‍යාසය සහ ද්විමය සඳහා මාර්ග කොටසෙහි සැකසිය හැක [plugins.«io.containerd.grpc.v1.cri».cni] в කන්ටේනර් වින්‍යාස ගොනුව.

අපි අපගේ ජාල සැපයුම්කරු ලෙස Flannel භාවිතා කරන බැවින්, එය පිහිටුවීම ගැන ටිකක් කතා කරමු:

  • Flanneld (Flannel's daemon) සාමාන්‍යයෙන් පොකුරක් තුළ DaemonSet ලෙස ස්ථාපනය කර ඇත. install-cni ලෙස init කන්ටේනරය.
  • Install-cni නිර්මාණය කරයි CNI වින්‍යාස ගොනුව (/etc/cni/net.d/10-flannel.conflist) එක් එක් නෝඩය මත.
  • Flanneld vxlan උපාංගයක් නිර්මාණය කරයි, API සේවාදායකයෙන් ජාල පාරදත්ත ලබා ගනී, සහ පොඩ් යාවත්කාලීන නිරීක්ෂණය කරයි. ඒවා නිර්මාණය කරන විට, එය පොකුර පුරා ඇති සියලුම කරල් සඳහා මාර්ග බෙදා හරිනු ලැබේ.
  • මෙම මාර්ග IP ලිපින හරහා පොඩ්ඩට එකිනෙකා සමඟ සන්නිවේදනය කිරීමට ඉඩ සලසයි.

Flannel හි වැඩ පිළිබඳ වඩාත් සවිස්තරාත්මක තොරතුරු සඳහා, ලිපියේ අවසානයේ ඇති සබැඳි භාවිතා කිරීමට මම නිර්දේශ කරමි.

Containerd CRI ප්ලගිනය සහ CNI ප්ලගීන අතර අන්තර්ක්‍රියා පිළිබඳ රූප සටහනක් මෙන්න:

Kubernetes පොඩ් එකකට IP ලිපිනයක් ලැබෙන්නේ කෙසේද?

ඔබට ඉහත දැකිය හැකි පරිදි, kubelet විසින් Pod එක නිර්මාණය කිරීම සඳහා Containerd CRI ප්ලගිනය අමතයි, පසුව එය CNI ප්ලගිනය අමතා පොඩ් ජාලය වින්‍යාස කරයි. එසේ කිරීමේදී, ජාල සැපයුම්කරුගේ CNI ප්ලගිනය ජාලයේ විවිධ පැතිකඩයන් වින්‍යාස කිරීම සඳහා අනෙකුත් මූලික CNI ප්ලගීන අමතයි.

CNI ප්ලගීන අතර අන්තර්ක්‍රියා

විවිධ CNI ප්ලගීන ඇත, එහි කාර්යය වන්නේ සත්කාරකයේ ඇති බහාලුම් අතර ජාල සන්නිවේදනය සැකසීමට උපකාර කිරීමයි. මෙම ලිපියෙන් ඒවායින් තුනක් සාකච්ඡා කරනු ඇත.

CNI ප්ලගිනය Flannel

ජාල සපයන්නෙකු ලෙස Flannel භාවිතා කරන විට, Containerd CRI සංරචකය අමතන්න CNI ප්ලගිනය FlannelCNI වින්‍යාස ගොනුව භාවිතා කරමින් /etc/cni/net.d/10-flannel.conflist.

$ cat /etc/cni/net.d/10-flannel.conflist
{
  "name": "cni0",
  "plugins": [
    {
      "type": "flannel",
      "delegate": {
         "ipMasq": false,
        "hairpinMode": true,
        "isDefaultGateway": true
      }
    }
  ]
}

Flannel CNI ප්ලගිනය Flanneld සමඟ එක්ව ක්‍රියා කරයි. ආරම්භයේදී, Flanneld API සේවාදායකයෙන් podCIDR සහ අනෙකුත් ජාල සම්බන්ධ තොරතුරු ලබාගෙන ඒවා ගොනුවකට සුරකියි. /run/flannel/subnet.env.

FLANNEL_NETWORK=10.244.0.0/16 
FLANNEL_SUBNET=10.244.0.1/24
FLANNEL_MTU=1450 
FLANNEL_IPMASQ=false

Flannel CNI ප්ලගිනය දත්ත භාවිතා කරයි /run/flannel/subnet.env CNI පාලම ප්ලගිනය වින්‍යාස කිරීමට සහ ඇමතීමට.

CNI ප්ලගින පාලම

මෙම ප්ලගිනය පහත වින්‍යාසය සමඟ හැඳින්වේ:

{
  "name": "cni0",
  "type": "bridge",
  "mtu": 1450,
  "ipMasq": false,
  "isGateway": true,
  "ipam": {
    "type": "host-local",
    "subnet": "10.244.0.0/24"
  }
}

පළමු වරට ඇමතූ විට, එය සමඟ ලිනක්ස් පාලමක් නිර්මාණය කරයි «name»: «cni0», එය වින්‍යාසයෙහි දක්වා ඇත. එවිට සෑම පොඩ් එකකටම වෙත් යුගලයක් නිර්මාණය වේ. එහි එක් කෙළවරක් බහාලුම් ජාල නාම අවකාශයට සම්බන්ධ කර ඇත, අනෙක සත්කාරක ජාලයේ ලිනක්ස් පාලමෙහි ඇතුළත් වේ. CNI ප්ලගින පාලම සියලුම ධාරක බහාලුම් ධාරක ජාලයේ ලිනක්ස් පාලමකට සම්බන්ධ කරයි.

veth යුගලය පිහිටුවීම අවසන් වූ පසු, Bridge ප්ලගිනය සත්කාරක-දේශීය IPAM CNI ප්ලගිනය අමතයි. IPAM ප්ලගින වර්ගය Flannel CNI ප්ලගිනය ඇමතීමට CRI ප්ලගිනය භාවිතා කරන CNI වින්‍යාසය තුළ වින්‍යාසගත කළ හැක.

සත්කාරක-දේශීය IPAM CNI ප්ලගීන

පාලම CNI ඇමතුම් සත්කාරක-දේශීය IPAM ප්ලගිනය CNI පහත වින්‍යාසය සමඟ:

{
  "name": "cni0",
  "ipam": {
    "type": "host-local",
    "subnet": "10.244.0.0/24",
    "dataDir": "/var/lib/cni/networks"
  }
}

සත්කාරක-දේශීය IPAM ප්ලගිනය (IP Aඇඳුම් පැළඳුම් Mකළමනාකරණය - IP ලිපින කළමනාකරණය) උපජාලයෙන් කන්ටේනරය සඳහා IP ලිපිනය ආපසු ලබා දෙන අතර කොටසෙහි සඳහන් කර ඇති නාමාවලියෙහි ධාරකයෙහි වෙන් කළ IP ගබඩා කරයි dataDir - /var/lib/cni/networks/<network-name=cni0>/<ip>. මෙම ගොනුවේ මෙම IP ලිපිනය පවරන ලද බහාලුම් ID අඩංගු වේ.

සත්කාරක-දේශීය IPAM ප්ලගිනය ඇමතීමේදී, එය පහත දත්ත ලබා දෙයි:

{
  "ip4": {
    "ip": "10.244.4.2",
    "gateway": "10.244.4.3"
  },
  "dns": {}
}

සාරාංශය

Kube-controller-manager විසින් එක් එක් node එකට podCIDR එකක් පවරයි. එක් එක් නෝඩයේ කරල් වලට වෙන් කර ඇති podCIDR පරාසයේ ලිපින අවකාශයෙන් IP ලිපින ලැබේ. නෝඩ් වල podCIDR අතිච්ඡාදනය නොවන බැවින්, සියලුම කරල් වලට අනන්‍ය IP ලිපින ලැබේ.

Kubernetes පොකුරු පරිපාලක විසින් kubelet, බහාලුම් ධාවන කාලය, ජාල සැපයුම් නියෝජිතයා වින්‍යාස කර ස්ථාපනය කරයි, සහ CNI ප්ලගීන එක් එක් නෝඩයට පිටපත් කරයි. ආරම්භයේදී, ජාල සැපයුම් නියෝජිතයා CNI වින්‍යාසයක් ජනනය කරයි. පොඩ් එකක් නෝඩයකට සැලසුම් කර ඇති විට, එය සෑදීමට kubelet CRI ප්ලගිනය අමතයි. මීළඟට, කන්ටේනර්ඩ් භාවිතා කරන්නේ නම්, Containerd CRI ප්ලගිනය CNI වින්‍යාසයෙහි දක්වා ඇති CNI ප්ලගිනයට පොඩ් ජාලය වින්‍යාස කිරීමට අමතයි. එහි ප්‍රතිඵලයක් ලෙස පොඩ් එකට IP ලිපිනයක් ලැබේ.

මෙම සියලු අන්තර්ක්‍රියාවල සියුම් හා සූක්ෂ්මතා තේරුම් ගැනීමට මට යම් කාලයක් ගත විය. Kubernetes ක්‍රියා කරන ආකාරය වඩාත් හොඳින් තේරුම් ගැනීමට මෙම අත්දැකීම ඔබට උපකාර වනු ඇතැයි මම බලාපොරොත්තු වෙමි. මම යමක් වැරදියි නම්, කරුණාකර මාව සම්බන්ධ කරගන්න ට්විටර් හෝ ලිපිනයෙහි [විද්‍යුත් ආරක්‍ෂිත]. ඔබ මෙම ලිපියේ පැති හෝ වෙනත් යමක් සාකච්ඡා කිරීමට කැමති නම් සම්බන්ධ වීමට නිදහස් වන්න. මම ඔබ සමඟ කතාබස් කිරීමට කැමතියි!

යොමු

බහාලුම් සහ ජාලය

Flannel වැඩ කරන්නේ කෙසේද?

CRI සහ CNI

පරිවර්තකගෙන් PS

අපගේ බ්ලොග් අඩවියේ ද කියවන්න:

මූලාශ්රය: www.habr.com

අදහස් එක් කරන්න