ããŒãã 翻蚳ã: LinkedIn ã® SRE ãšã³ãžãã¢ã«ãã£ãŠæžããããã®èšäºã§ã¯ã次ã®ãããã« IP ã¢ãã¬ã¹ãå²ãåœãŠãå¿ èŠããããšãã«çºçãããKubernetes ã®å éšã®éæ³ãããæ£ç¢ºã«ã¯ CRIãCNIãããã³ kube-apiserver ã®çžäºäœçšã«ã€ããŠè©³ãã説æããŠããŸãã
åºæ¬çãªèŠä»¶ã® XNUMX ã€
ç§ãæåã« Kubernetes ã䜿ãå§ãããšãããããã IP ã¢ãã¬ã¹ãæ£ç¢ºã«ã©ã®ããã«ååŸããã®ãã¯å®å
šã«ã¯ããããŸããã§ããã åã
ã®ã³ã³ããŒãã³ããã©ã®ããã«æ©èœããããç解ããŠããŠããããããé£æºããŠåäœããããšãæ³åããã®ã¯å°é£ã§ããã ããšãã°ãCNI ãã©ã°ã€ã³ãäœã§ãããã¯ç¥ã£ãŠããŸããããæ£ç¢ºã«ã©ã®ããã«åŒã°ãããã¯ããããŸããã§ããã ãããã£ãŠãããŸããŸãªãããã¯ãŒã¯ ã³ã³ããŒãã³ããšãåããããç¬èªã®äžæã® IP ã¢ãã¬ã¹ãååŸã§ããããã«ãã Kubernetes ã¯ã©ã¹ã¿ãŒå
ã§ããããã©ã®ããã«é£æºãããã«ã€ããŠã®ç¥èãå
±æããããã«ããã®èšäºãæžãããšã«ããŸããã
ã³ã³ãããŒã«ããŸããŸãªã©ã³ã¿ã€ã ãªãã·ã§ã³ãããã®ãšåãããã«ãKubernetes ã§ãããã¯ãŒã¯ãæ§æããã«ã¯ããŸããŸãªæ¹æ³ããããŸãã ãã®åºçç©ã§ã¯ã
ããã€ãã®åºæ¬æŠå¿µ
ã³ã³ãããšãããã¯ãŒã¯: æŠèŠ
ã€ã³ã¿ãŒãããäžã«ã¯ãã³ã³ããããããã¯ãŒã¯äžã§ã©ã®ããã«éä¿¡ãããã説æããåªããåºçç©ããããããããŸãã ãããã£ãŠãããã§ã¯åºæ¬æŠå¿µã®æŠèŠã®ã¿ã説æããLinux ããªããžã®äœæãšããã±ãŒãžã®ã«ãã»ã«åãå«ã XNUMX ã€ã®ã¢ãããŒãã«éå®ããŸãã ã³ã³ãã ãããã¯ãŒã¯èªäœã®ãããã¯ã¯å¥ã®èšäºã«å€ããããã詳现ã¯çç¥ããŸãã ç¹ã«æŽå¯åã«å¯ãã æè²çãªåºçç©ãžã®ãªã³ã¯ã以äžã«ç€ºããŸãã
XNUMX ã€ã®ãã¹ãäžã®ã³ã³ãã
åããã¹ãäžã§å®è¡ãããŠããã³ã³ããé㧠IP ã¢ãã¬ã¹ãä»ããéä¿¡ãçµç¹ãã XNUMX ã€ã®æ¹æ³ã«ã¯ãLinux ããªããžãäœæããããšãå«ãŸããŸãã ãã®ç®çã®ããã«ãä»®æ³ããã€ã¹ã Kubernetes (ããã³ Docker) ã§äœæãããŸãã
åããã¹ãäžã®ãã¹ãŠã®ã³ã³ããã¯ãVETH ã®äžç«¯ãããªããžã«æ¥ç¶ãããŠããããããä»ã㊠IP ã¢ãã¬ã¹ãä»ããŠçžäºã«éä¿¡ã§ããŸãã Linux ããªããžã«ã¯ IP ã¢ãã¬ã¹ãããããããããä»ã®ããŒãã«åããéä¿¡ãã©ãã£ãã¯ã®ã²ãŒããŠã§ã€ãšããŠæ©èœããŸãã
ç°ãªããã¹ãäžã®ã³ã³ãã
ãã±ããã®ã«ãã»ã«åã¯ãç°ãªãããŒãäžã®ã³ã³ããã IP ã¢ãã¬ã¹ã䜿çšããŠçžäºã«éä¿¡ã§ããããã«ãã XNUMX ã€ã®æ¹æ³ã§ãã Flannel ã§ã¯ããã¯ãããžãŒããã®æ©äŒãæ
ã£ãŠããŸãã
Kubernetes ã¯ã©ã¹ã¿ãŒã§ã¯ãFlannel ã vxlan ããã€ã¹ãäœæããããã«å¿ããŠåããŒãã®ã«ãŒã ããŒãã«ãæŽæ°ããŸãã ç°ãªããã¹ãäžã®ã³ã³ãããå®å ãšããåãã±ããã¯ãvxlan ããã€ã¹ãééããUDP ãã±ããã«ã«ãã»ã«åãããŸãã å®å ã§ã¯ããã¹ãããããã±ãããæœåºãããç®çã®ãããã«è»¢éãããŸãã
泚: ããã¯ãã³ã³ããéã®ãããã¯ãŒã¯éä¿¡ãæ§æãã XNUMX ã€ã®æ¹æ³ã«ãããŸããã
CRIãšã¯äœã§ããïŒ
CNIãšã¯äœã§ãã?
ãããã« IP ã¢ãã¬ã¹ãå²ãåœãŠãããã®ããŒããžã®ãµããããã®å²ãåœãŠ
ã¯ã©ã¹ã¿ãŒå ã®åãããã«ã¯ IP ã¢ãã¬ã¹ãå¿ èŠãªããããã®ã¢ãã¬ã¹ãäžæã§ããããšã確èªããããšãéèŠã§ãã ããã¯ãåããŒãã«äžæã®ãµãããããå²ãåœãŠãããšã§å®çŸããããããããã®ããŒãäžã®ãããã« IP ã¢ãã¬ã¹ãå²ãåœãŠãããŸãã
ããŒãIPAMã³ã³ãããŒã©
æ nodeipam
ãã©ã°ãã©ã¡ãŒã¿ãšããŠæž¡ããã --controllers
Kubernetes ããŒãã«ã¯ãæåã«ã¯ã©ã¹ã¿ãŒã«ç»é²ãããšãã« podCIDR ãå²ãåœãŠãããŸãã ããŒãã® podCIDR ãå€æŽããã«ã¯ãããŒããç»é²è§£é€ããŠããåç»é²ãããã®éã« Kubernetes å¶åŸ¡å±€æ§æã«é©åãªå€æŽãå ããå¿ èŠããããŸãã 次ã®ã³ãã³ãã䜿çšããŠãããŒãã® podCIDR ã衚瀺ã§ããŸãã
$ kubectl get no <nodeName> -o json | jq '.spec.podCIDR'
10.244.0.0/24
Kubeletãã³ã³ãã ã©ã³ã¿ã€ã ãCNI ãã©ã°ã€ã³: ãã¹ãŠã®ä»çµã¿
ããŒãããšã«ããããã¹ã±ãžã¥ãŒã«ããã«ã¯ãå€ãã®æºåæé ãå¿ èŠã§ãã ãã®ã»ã¯ã·ã§ã³ã§ã¯ãããã ãããã¯ãŒã¯ã®ã»ããã¢ããã«çŽæ¥é¢é£ãããã®ã ãã«çŠç¹ãåœãŠãŸãã
ããããç¹å®ã®ããŒãã«ã¹ã±ãžã¥ãŒã«ãããšã次ã®äžé£ã®ã€ãã³ããããªã¬ãŒãããŸãã
ãã«ãïŒ
ã³ã³ãã㌠ã©ã³ã¿ã€ã ãš CNI ãã©ã°ã€ã³éã®çžäºäœçš
åãããã¯ãŒã¯ ãããã€ããŒã«ã¯ç¬èªã® CNI ãã©ã°ã€ã³ããããŸãã ã³ã³ãããŒã®ã©ã³ã¿ã€ã ã¯ãããå®è¡ããŠããããã®èµ·åæã«ãããã¯ãŒã¯ãæ§æããŸãã Containerd ã®å ŽåãCNI ãã©ã°ã€ã³ã¯ãã©ã°ã€ã³ã«ãã£ãŠèµ·åãããŸãã
ããã«ãåãããã€ããŒã«ã¯ç¬èªã®ãšãŒãžã§ã³ããååšããŸãã ããã¯ãã¹ãŠã® Kubernetes ããŒãã«ã€ã³ã¹ããŒã«ããããããã®ãããã¯ãŒã¯æ§æãæ åœããŸãã ãã®ãšãŒãžã§ã³ã㯠CNI æ§æã«å«ãŸããŠããããããŒãäžã«åå¥ã«äœæãããŸãã ãã®èšå®ã¯ãCRI ãã©ã°ã€ã³ãåŒã³åºã CNI ãã©ã°ã€ã³ãèšå®ããã®ã«åœ¹ç«ã¡ãŸãã
CNI æ§æã®å Žæã¯ã«ã¹ã¿ãã€ãºã§ããŸãã ããã©ã«ãã§ã¯å
¥ã£ãŠããŸã /etc/cni/net.d/<config-file>
ã ã¯ã©ã¹ã¿ãŒç®¡çè
ã¯ãåã¯ã©ã¹ã¿ãŒ ããŒãã« CNI ãã©ã°ã€ã³ãã€ã³ã¹ããŒã«ãã責任ããããŸãã ãããã®å Žæãã«ã¹ã¿ãã€ãºå¯èœã§ãã ããã©ã«ãã®ãã£ã¬ã¯ã㪠- /opt/cni/bin
.
Containerd ã䜿çšããå Žåããã©ã°ã€ã³æ§æãšãã€ããªã®ãã¹ã¯ã»ã¯ã·ã§ã³ã§èšå®ã§ããŸãã [plugins.«io.containerd.grpc.v1.cri».cni]
в
ãããã¯ãŒã¯ãããã€ããŒãšã㊠Flannel ã䜿çšããŠããã®ã§ããã®èšå®ã«ã€ããŠå°ã説æããŸãããã
- Flanneld (Flannel ã®ããŒã¢ã³) ã¯éåžžã次ã®ãã㪠DaemonSet ãšããŠã¯ã©ã¹ã¿ãŒã«ã€ã³ã¹ããŒã«ãããŸãã
install-cni
ãšããŠã³ã³ããã®åæå . Install-cni
äœæããŸãCNIèšå®ãã¡ã€ã« (/etc/cni/net.d/10-flannel.conflist
) åããŒãäžã§ã- Flanneld 㯠vxlan ããã€ã¹ãäœæããAPI ãµãŒããŒãããããã¯ãŒã¯ ã¡ã¿ããŒã¿ãååŸãããããã®æŽæ°ãç£èŠããŸãã ããããäœæããããšãã¯ã©ã¹ã¿ãŒå šäœã®ãã¹ãŠã®ãããã«ã«ãŒããé åžãããŸãã
- ãããã®ã«ãŒãã«ãããããã㯠IP ã¢ãã¬ã¹ãä»ããŠçžäºã«éä¿¡ã§ããããã«ãªããŸãã
Flannel ã®äœåã«ã€ããŠããã«è©³ããç¥ãããå Žåã¯ãèšäºã®æåŸã«ãããªã³ã¯ã䜿çšããããšããå§ãããŸãã
以äžã¯ãContainerd CRI ãã©ã°ã€ã³ãš CNI ãã©ã°ã€ã³éã®çžäºäœçšã®å³ã§ãã
äžã§èŠãããããã«ãkubelet 㯠Containerd CRI ãã©ã°ã€ã³ãåŒã³åºããŠããããäœæãã次㫠CNI ãã©ã°ã€ã³ãåŒã³åºããŠãããã®ãããã¯ãŒã¯ãæ§æããŸãã ãã®éããããã¯ãŒã¯ ãããã€ããŒã® CNI ãã©ã°ã€ã³ã¯ä»ã®ã³ã¢ CNI ãã©ã°ã€ã³ãåŒã³åºããŠããããã¯ãŒã¯ã®ããŸããŸãªåŽé¢ãæ§æããŸãã
CNI ãã©ã°ã€ã³éã®çžäºäœçš
ãã¹ãäžã®ã³ã³ããéã®ãããã¯ãŒã¯éä¿¡ã®ã»ããã¢ãããæ¯æŽããããŸããŸãª CNI ãã©ã°ã€ã³ããããŸãã ãã®èšäºã§ã¯ãã®ãã¡ã® XNUMX ã€ã«ã€ããŠèª¬æããŸãã
CNI ãã©ã°ã€ã³ ãã©ã³ãã«
Flannel ããããã¯ãŒã¯ ãããã€ããŒãšããŠäœ¿çšããå ŽåãContainerd CRI ã³ã³ããŒãã³ã㯠/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 㯠podCIDR ããã³ãã®ä»ã®ãããã¯ãŒã¯é¢é£ã®è©³çŽ°ã API ãµãŒããŒããååŸãããã¡ã€ã«ã«ä¿åããŸãã /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"
}
}
åããŠåŒã³åºããããšãã次㮠Linux ããªããžãäœæãããŸãã «name»: «cni0»
ãããã¯èšå®ã«ç€ºãããŠããŸãã 次ã«ããããããšã« veth ãã¢ãäœæãããŸãã ãã®äžç«¯ã¯ã³ã³ããã®ãããã¯ãŒã¯åå空éã«æ¥ç¶ãããããäžç«¯ã¯ãã¹ã ãããã¯ãŒã¯äžã® Linux ããªããžã«å«ãŸããŸãã
veth ãã¢ã®ã»ããã¢ãããå®äºãããšãBridge ãã©ã°ã€ã³ã¯ãã¹ãããŒã«ã« IPAM CNI ãã©ã°ã€ã³ãåŒã³åºããŸãã IPAM ãã©ã°ã€ã³ ã¿ã€ãã¯ãCRI ãã©ã°ã€ã³ã Flannel CNI ãã©ã°ã€ã³ãåŒã³åºãããã«äœ¿çšãã CNI èšå®ã§èšå®ã§ããŸãã
ãã¹ãããŒã«ã« IPAM CNI ãã©ã°ã€ã³
CNI ã³ãŒã«ãããªããžãã
{
"name": "cni0",
"ipam": {
"type": "host-local",
"subnet": "10.244.0.0/24",
"dataDir": "/var/lib/cni/networks"
}
}
ãã¹ãããŒã«ã« IPAM ãã©ã°ã€ã³ (IP Address 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 ã¯ãåããŒãã« podCIDR ãå²ãåœãŠãŸãã åããŒãã®ãããã¯ãå²ãåœãŠããã podCIDR ç¯å²å ã®ã¢ãã¬ã¹ç©ºéãã IP ã¢ãã¬ã¹ãåãåããŸãã ããŒãã® podCIDR ã¯éè€ããªãããããã¹ãŠã®ãããã¯äžæã® IP ã¢ãã¬ã¹ãåãåããŸãã
Kubernetes ã¯ã©ã¹ã¿ãŒç®¡çè ã¯ãkubeletãã³ã³ãã㌠ã©ã³ã¿ã€ã ããããã¯ãŒã¯ ãããã€ã㌠ãšãŒãžã§ã³ããæ§æããŠã€ã³ã¹ããŒã«ããCNI ãã©ã°ã€ã³ãåããŒãã«ã³ããŒããŸãã èµ·åæã«ããããã¯ãŒã¯ ãããã€ã㌠ãšãŒãžã§ã³ã㯠CNI æ§æãçæããŸãã ããããããŒãã«ã¹ã±ãžã¥ãŒã«ããããšãkubelet 㯠CRI ãã©ã°ã€ã³ãåŒã³åºããŠããããäœæããŸãã 次ã«ãcontainerd ã䜿çšãããŠããå ŽåãContainerd CRI ãã©ã°ã€ã³ã¯ CNI æ§æã§æå®ããã CNI ãã©ã°ã€ã³ãåŒã³åºããŠããããã®ãããã¯ãŒã¯ãæ§æããŸãã ãã®çµæãããã㯠IP ã¢ãã¬ã¹ãåãåããŸãã
ããããã¹ãŠã®ããåãã®åŸ®åŠãªç¹ããã¥ã¢ã³ã¹ãç解ããã®ã«æéãããããŸããã ãã®çµéšã Kubernetes ã®ä»çµã¿ãããæ·±ãç解ããã®ã«åœ¹ç«ã€ããšãé¡ã£ãŠããŸãã äœãééã£ãŠããå Žåã¯ã次ã®ã¢ãã¬ã¹ãŸã§ãé£çµ¡ãã ããã
ãªãã¡ã¬ã³ã¹
ã³ã³ãããšãããã¯ãŒã¯
ã³ã³ãã ãããã¯ãŒãã³ã°ã®æŠèŠ ã³ã³ãã ãããã¯ãŒãã³ã°ããããããã説æãã
ãã©ã³ãã«ã¯ã©ã®ããã«æ©èœããŸãã?
ãã©ã³ãã« ãããã¯ãŒãã³ã°ããããããã解説 Flannel ã䜿çšãã Kubernetes - ãããã¯ãŒãã³ã°ãç解ãã
CRIãšCNI
翻蚳è ããã®è¿œäŒž
ç§ãã¡ã®ããã°ããèªã¿ãã ãã:
- «
Kubernetes ã§ã®ãããã¯ãŒãã³ã°ã®ããã® Calico: æŠèŠãšå°ãã®çµéš "; - ãKubernetes ã§ã®ãããã¯ãŒã¯ã®å³è§£ã¬ã€ãã:
ããŒã 1 ããã³ 2 (ãããã¯ãŒã¯ ã¢ãã«ããªãŒããŒã¬ã€ ãããã¯ãŒã¯) ,ããŒã 3 (ãµãŒãã¹ãšãã©ãã£ãã¯åŠç) ; - «
Container Networking Interface (CNI) - Linux ã³ã³ããã®ãããã¯ãŒã¯ ã€ã³ã¿ãŒãã§ã€ã¹ããã³æšæº 'ã
åºæïŒ habr.com