| ±à¼ÍƼö: |
±¾ÎÄ·ÖÎöK8sÖÐkubeletÆô¶¯¡¢Pod´´½¨/ɾ³ý¡¢Docker˵Ã÷´´½¨/ɾ³ýContainer¡¢CNI
RPCµ÷Óá¢ÈÝÆ÷ÍøÂçÅäÖõȺËÐÄÁ÷³Ì£¬Í¨¹ý¶ÔCNIʵÏÖ»úÖÆ½øÐнâÎö£¬Í¨¹ýÔ´Â롢ͼÎÄ·½Ê½Ïà¹ØÁ÷³ÌÂß¼£¬ÒÔÆÚ¸üºÃµÄÀí½â
K8s CNI ÔËÐÐÁ÷³Ì¡£
±¾ÎÄÀ´×ÔÓÚ΢ÐŹ«ÖÚºÅÌÚѶ¼¼Êõ¹¤³Ì£¬ÓÉLinda±à¼¡¢ÍƼö¡£ |
|
1. ¸ÅÊö
½øÈëK8sµÄÊÀ½ç£¬»á·¢ÏÖÓкܶ෽±ãÀ©Õ¹µÄ½Ó¿Ú£¬°üÀ¨CNI¡¢CSI¡¢CRIµÈ£¬½«½Ó¿Ú³éÏó³öÀ´£¬ÊÇΪÁ˸üºÃµÄÌṩ¿ª·Å¡¢À©Õ¹¡¢¹æ·¶µÈÄÜÁ¦¡£
K8sÍøÂçÄ£ÐͲÉÓÃCNI£¨Container Network Interface£©Ö»ÒªÒ»¸ö±ê×¼µÄÍøÂç½Ó¿Ú£¬ÈÝÆ÷ÍøÂç½Ó¿Ú£¬ÌṩΪͬÑùÂú×ãÐÒéµÄËùÓÐÈÝÆ÷ƽ̨µÄ¹¦ÄÜ¡£
CNI Ìá³öµÄÒ»¸öÈÝÆ÷ÍøÂ磬Ŀǰ±» Apache Mesos¡¢Cloud Foundry¡¢Kubernetes¡¢Kurma¡¢rkt
µÈ OS ¹æ·¶µÄÏîÄ¿Ëù²ÉÓã¬Í¬Ê±Ò²ÊÇÒ»¸ö CNCF(Cloud Native Computing Foundation)
ÏîÄ¿¡£¿ÉÒÔÔ¤¼û£¬CNI ½«ÊµÏÖ³ÉΪδÀ´º¸ÇÍøÂçµÄ±ê×¼¡£
±¾Îĵ÷ÓÃÈÝÆ÷°ü½øÐÐÍøÂçÅäÖÃÆô¶¯¡¢Po´´½¨/ɾ³ý¡¢Docker´´½¨/ɾ³ýÈÝÆ÷CNI RPC ¡¢ CNI
ʵÏÖ»úÖÆµÈºËÐÄ£¬CNI ʵÏÖ»úÖÆÁ˽âÎö¡£
Á÷³Ì¸ÅÀÀÈçÏ£º

K8s-CNI
±¾ÎÄvÏà¹ØÎÄÕ¶¼»ùÓÚK8s1.22
2.´ÓÍøÂçÄ£ÐÍ˵Æð
ÈÝÆ÷µÄÍøÂç¼¼ÊõÈÕÐÂÒ죬Àú¾¶àÄê·¢Õ¹µÄ½Ó¿Ú£¬±¸ÊܹØ×¢ Docker Docker CNM(Container
Network Model, Container Network Model) ºÍ CoreOS CNI(Container
Network Interface, Container)¡£
2.1 CNM Ä£ÐÍ
CNM ÊÇÒ»¸ö±» Docker Ìá³öµÄ¹æ·¶¡£ÏÖÔÚÒѾ±» Cisco Contiv¡¢Kuryr¡¢Open
Virtual Networking (OVN)¡¢Project Calico¡¢VMware ºÍ Weave
ÕâЩ¹«Ë¾ºÍÏîÄ¿Ëù²ÉÄÉ¡£
Libnetwork ÊÇ CNM µÄØáʵÏÖ¡£ËüΪÇý¶¯ºÍÍøÂç³ÌÐòÇý¶¯Ö®¼äÌṩÁ˽ӿڡ£ÍøÂçÓÉ Docker
ÊØ»¤½ø³Ì¸ºÔð½øÐÐÍøÂçÇý¶¯ºÍ¶Ô½Ó¡£Ã¿¸ö³ÌÐò¶¼ÓÐËü¸ºÔð¹ÜÀíµÄÍøÂçÒÔ¼°¸ÃÍøÂçÌṩµÄÇý¶¯¸÷ÖÖ·þÎñ£¬ÀýÈç IPAM
µÈ¡£Óɶà¸öÖ§³ÖµÄ¶à¸öÍøÂç¿ÉÒÔͬʱ²¢´æ¡£Çý¶¯°üÀ¨ none¡¢bridge¡¢overlay ÒÔ¼° MACvlan¡£
°üº¬»áÔÚ²»Í¬Çé¿öÏÂʹÓõ½²»Í¬Çé¿öµÄÐÅÏ¢£¬Õâ´øÀ´Á˸´ÔÓÐÔ¡£

CNMÄ£ÐÍ
Network Sandbox£ºÈÝÄÉÄÚ²¿µÄÍøÂçÕ»£¬°üÀ¨ÍøÂç½Ó¿Ú¡¢Â·ÓÉ±í¡¢DNSµÈÅäÖõĹÜÀí¡£Sandbox¿ÉÒÔͨ¹ýLinuxÍøÂçÃüÃû¿Õ¼ä¡¢FreeBSD
JailµÈ»úÖÆ½øÐÐʵÏÖ¡£Ò»¸öSandbox¿ÉÒÔ°üº¬¶à¸öEndpoint¡£
Endpoint£º½«ÈÝÆ÷ÄÚµÄSandboxÓÃÓÚÓëÍâ²¿ÍøÂçµÄÁ¬½ÓÍøÂç½Ó¿Ú¡£¿ÉÒÔʹÓÃveth pair¡¢Open
vSwitch½öÔÚÄÚ²¿¶Ë¿ÚµÈ¼¼Êõ½øÐÐʵÏÖ¡£Ò»¸öEndpointÄܹ»¼ÓÈëÒ»¸öÍøÂç¡£
Network£º¿ÉÒÔÖ±½Ó»¥Á¬µÄEndpointµÄ¼¯ºÏ¡£¿ÉÒÔͨ¹ýLinux bridge¡¢VLANµÈ¼¼Êõ½øÐС£Ò»¸öNetwork°üº¬¶à¸öEndpoint¡£
2.2 CNI Ä£ÐÍ
CNI ÊÇÓÉ CoreOS Ìá³öµÄÒ»¸öÈÝÆ÷ÍøÂç¹æ·¶¡£ÒѲÉÓøĹ淶µÄ Apache Mesos¡¢Cloud
Foundry¡¢Kubernetes¡¢Kurma ºÍ rkt¡£ÁíÍâÏîÄ¿°üÀ¨ Contiv Networking¡¢Project
Calico ºÍ Weave ҲΪ CNI ²å¼þÌṩ¡£
CNI ǰ¶Ë±©Â¶´ÓÒ»¸öÍøÂçÀïÃæÌí¼ÓºÍÅäÖÃÈÝÆ÷µÄ½Ó¿Ú¡£CNI ʹÓñ©Â¶ json ±£´æÅäÖÃÐÅÏ¢¡£ºÍ
CNI ²»Ò»Ñù£¬CNI ²»ÐèÒªÒ»¸ö¶îÍâµÄÅäÖô洢ÒýÇæ¡£
Ò»¸öÈÝÆ÷¿ÉÒÔ±»¼ÓÈëµ½²»Í¬µÄ²å¼þËùÇý¶¯µÄ¶à¸öÍøÂçÖС£Ò»¸öÍøÂçÓÐ×Ô¼ºµÄ²å¼þºÍΨһµÄÃû³Æ¡£CNI ²å¼þÐèÒªÌṩÁ½¸öÃüÁADD
ʹÓý«ÍøÂç½Ó¿Ú¼ÓÈëµ½Ö¸¶¨ÍøÂçÖУ¬DEL½«ÆäÈ¡³ö¡£

CNIÄ£ÐÍ
NI Ö§³ÖÓë¶à¸ö CNI ¿ÉÓÃÓÚ´ÓÈκΠIPAM ÈÝÆ÷Öм¯³É£¬CNM µÄÔËÐÐʱ֧³Ö¡£CNM µÄ Docker¡£¼òµ¥¼òµ¥µÄÉè¼Æ£¬²å¼þÈËÈÏΪд
CNI »á±Èд CN ²å¼þÀ´µÃµÃÐÄÓ¦ÊÖ¡£
3. CNI ²å¼þ
CNI²å¼þÊÇÅäÖÃkubeletÎļþ£¬»áµ÷Óá£Æô¶¯ÅäÖÃ--network-plugin=cni£¬Ä¬ÈÏÖ¸¶¨Â·¾¶ÊÇ£º/etc/cni/net.d¡£ÁíÍ⣬-
-cni-bin-dir Ö¸¶¨²å¼þÔËÐÐÎļþ·¾¶£¬Ä¬ÈÏ·¾¶ÊÇ£º/cni/bin¡£
¿´Ò»¸ö CNI Demo£ºÔÚĬÈÏÍøÂçÅäÖÃĿ¼£¬ÅäÖÃÁ½¸ö xxx.conf£ºÒ»¸öÀàÐÍ£º¡°bridge¡±ÍøÇÅ£¬ÁíÒ»¸öÀàÐÍ£º¡°loopback¡±»Ø»·Íø¿¨¡£
| $
mkdir -p /etc/cni/net.d
$ cat >/etc/cni/net.d/10-mynet.conf
<<EOF
{
"cniVersion": "0.2.0",
// CNI Spec °æ±¾
"name": "mynet",
// ×Ô¶¨ÒåÃû³Æ
"type": "bridge",
// ²å¼þÀàÐÍ bridge
"bridge": "cni0",
// ÍøÇÅÃû³Æ
"isGateway": true,
// ÊÇ·ñ×÷ÎªÍø¹Ø
"ipMasq": true, //
ÊÇ·ñÉèÖà IP αװ
"ipam": {
"type": "host-local",
// IPAM ÀàÐÍ host-local
"subnet": "10.22.0.0/16",
// ×ÓÍø¶Î
"routes": [
{ "dst": "0.0.0.0/0"
} // Ä¿±ê·ÓɶÎ
]
}
}
EOF
$ cat >/etc/cni/net.d/99-loopback.conf
<<EOF
{
"cniVersion": "0.2.0",
// CNI Spec °æ±¾
"name": "lo",
// ×Ô¶¨ÒåÃû³Æ
"type": "loopback"
// ²å¼þÀàÐÍ loopback
}
EOF |
CNI ²å¼þ¿É·ÖΪÈýÀࣺ
Ö÷ҪʹÓô´½¨¾ßÌåÍøÂçÉ豸¡¢²å¼þµÄip¡¢vlanÎļþ¡£vlan¡¢ptp(point-to-point
Pair É豸)£¬ÒÔ¼°vlanÈ翪ԴµÄFlannel¡¢WeaveµÈ£¬¶¼ÊôÓÚvlan¡¢vlanÎļþ¡£
bridge ÀàÐ굀 CNI £¬ÔÚ¾ßÌåµÄ»áµ÷ÓÃÇŽÓʵÏÖÕâ¸ö²å¼þÎļþ¡£
Ôª²å¼þ CNI ²å¼þͨ¹ý¹¹½¨ CNI ¶ÀÁ¢²å¼þµÄʹÓòå¼þÀ´µ÷Õû£¬ÐèÒªÊǵ÷ÓÃÍøÂçÉ豸²ÎÊý£¬²»ÄÜͨ¹ýÒ»¸öÎļþÀ´Ö´ÐУ»
£»´ø¿í¹ýÂËÆ÷£¨À´½øÐÐÏÞÁ÷µÄTBF£© Bucket Îļþ¡£
IPËüÊDzå¼þIPµØÖ·£¬IPµØÖ·£¬DHCPÎļþµÄIPµØÖ·£ºÅäÖÃÎļþ¡£±ÈÈ磬dhÊÇÕâ¸öÎļþÏò·þÎñÆ÷ÇëÇó¹ÜÀíµÄ£»Ö÷»ú±¾µØµØÖ·£¬ÊǸºÔðʹÓøÃÅäÖõÄIPµØÖ·¶ÎÀ´½øÐеġ£

K8s-CNI-²å¼þ
4. kubelet Æô¶¯
kube ¼à¿Ø½Úµã ¸ºÔðµÄ´´½¨¡¢ÉÏ´«Îļþ¡¢ÊÓÆµ²¥±¨£¬µÈ¼à¿Ø¼à ²â ¼à ²â ¼à ²â ÔÚ ¼à ²â ÉÏ ½Ó
½Ó ÐØÕÖ¡£
Æô¶¯Èë¿ÚÈçÏ£º
| //
kubernetes/cmd/kubelet/kubelet.go
func main() {
command := app.NewKubeletCommand()
// kubelet uses a config file
and does its own special
// parsing of flags and that
config file. It initializes
// logging after it is done
with that. Therefore it does
// not use cli.Run like other,
simpler commands.
code := run(command)
os.Exit(code)
} |
Ö§³Ö£¬Ò»Â·ÍùϽøÐгõʼ»¯£º
| cmd -> ÔËÐÐ
-> PreInitRuntimeService -> RunKubelet ->
createAndInitKubelet -> startKubelet ->
ÔËÐÐ |
ÆäÖÐPreInInService»á½øÒ»²½Æô¶¯dockershim£¬ËüµÄÍøÂçÅäÖã¨Ä¬ÈÏ·¾¶Îª£ºµÈ/ÖеÄÍøÂçÅäÖÃ/netd/*.conf/conflist/.json£©£¬½øÐÐCNIÍøÂçÅäÖã»Æô¶¯niÎļþgRPC
docker server ¼àÌý¿Í»§¶ËÇëÇ󣬽øÐоßÌåµÄ²Ù×÷Èç PodSandbox¡¢Container
´´½¨Óëɾ³ý¡£
µ±¼àÌýµ½ Pod ʼþʱ£¬½øÐÐ Pod µÄ´´½¨»òɾ³ý£¬Á÷³ÌÈçÏ£º
| ÔËÐÐ -> syncLoop
-> SyncPodCreate/Kill -> UpdatePod ->
syncPod/syncTerminatingPod -> dockershim gRPC
-> Pod ÔËÐÐ/ÖÕÖ¹ |
5. Pod ´´½¨/ɾ³ý
K8ÖÐPodµÄ¾ßÌåÓ¦ÓÃÕß²ÉÓÃPLEG(Pod Lifecycle Event Generator)µÄÉúÃüÖÜÆÚʼþ¹ÜÀíʵÏÖÁ˾ßÌåµÄÏû·ÑÕßģʽ¡£
| //
kubernetes/pkg/kubelet/pleg/pleg.go
// ͨ¹ý PLEG ½øÐÐ Pod ÉúÃüÖÜÆÚʼþ¹ÜÀí
type PodLifecycleEventGenerator
interface {
Start() // ͨ¹ý relist »ñÈ¡ËùÓÐ Pods
²¢¼ÆËãʼþÀàÐÍ
Watch() chan *PodLifecycleEvent
// ¼àÌý eventChannel£¬´«µÝ¸øÏÂÓÎÏû·ÑÕß
Healthy() (bool, error)
} |
Pod ʼþÉú²úÕß - Ïà¹Ø´úÂ룺
| //
kubernetes/pkg/kubelet/pleg/generic.go
// Éú²úÕߣº»ñÈ¡ËùÓÐ Pods ÁÐ±í£¬¼ÆËã³ö¶ÔÓ¦µÄʼþÀàÐÍ£¬½øÐÐ
Sync
func (g *GenericPLEG) relist()
{
klog.V(5).InfoS("GenericPLEG:
Relisting")
...
// »ñÈ¡µ±Ç°ËùÓÐ Pods Áбí
podList, err := g.runtime.GetPods(true)
if err != nil {
klog.ErrorS(err, "GenericPLEG:
Unable to retrieve pods")
return
}
for pid := range g.podRecords
{
allContainers := getContainersFromPods(oldPod,
pod)
for _, container := range allContainers
{
// ¼ÆËãʼþÀàÐÍ£ºrunning/exited/unknown/non-existent
events := computeEvents(oldPod,
pod, &container.ID)
for _, e := range events {
updateEvents(eventsByPodID,
e)
}
}
}
// ±éÀúËùÓÐʼþ
for pid, events := range eventsByPodID
{
for i := range events {
// Filter out events that are
not reliable and no other components use yet.
if events[i].Type == ContainerChanged
{
continue
}
select {
case g.eventChannel <- events[i]:
// Éú²úÕߣº·¢Ë͵½Ê¼þ channel£¬¶ÔÓ¦¼àÌýµÄ goroutine »áÏû·Ñ
default:
metrics.PLEGDiscardEvents.Inc()
klog.ErrorS(nil, "Event
channel is full, discard this relist() cycle
event")
}
}
}
...
} |
Pod ʼþÏû·ÑÕß - Ïà¹Ø´úÂ룺
| //
kubernetes/pkg/kubelet/kubelet.go
// Ïû·ÑÕߣº¸ù¾Ý channel »ñÈ¡µÄ¸÷Ààʼþ£¬½øÐÐ
Pod Sync
func (kl *Kubelet) syncLoopIteration(configCh
<-chan kubetypes.PodUpdate, handler SyncHandler,
syncCh <-chan time.Time,
housekeepingCh <-chan time.Time, plegCh <-chan
*pleg.PodLifecycleEvent) bool {
select {
...
// Ïû·ÑÕߣº¼àÌý plegCh µÄʼþ
case e := <-plegCh:
if e.Type == pleg.ContainerStarted
{
// ¸üÐÂÈÝÆ÷µÄ×îºóÆô¶¯Ê±¼ä
kl.lastContainerStartedTime.Add(e.ID,
time.Now())
}
if isSyncPodWorthy(e) {
if pod, ok := kl.podManager.GetPodByUID(e.ID);
ok {
klog.V(2).InfoS("SyncLoop
(PLEG): event for pod", "pod",
klog.KObj(pod), "event", e)
// ½øÐÐÏà¹Ø Pod ʼþµÄ Sync
handler.HandlePodSyncs([]*v1.Pod{pod})
} else {
// If the pod no longer exists,
ignore the event.
klog.V(4).InfoS("SyncLoop
(PLEG): pod does not exist, ignore irrelevant
event", "event", e)
}
}
// ÈÝÆ÷Ïú»Ùʼþ´¦Àí£ºÇå³ý Pod ÄÚÏà¹Ø Container
if e.Type == pleg.ContainerDied
{
if containerID, ok := e.Data.(string);
ok {
kl.cleanUpContainersInPod(e.ID,
containerID)
}
}
...
}
return true
} |
6. Docker æÆðÀ´
ÉÏÒ»²½Éú²úµÄÏû·ÑÉÏ´«£¬PodWorkers Óë Podbox ʼþ´´½¨Ê¼þ·µ»ØÎª gRPC ¿Í»§¶Ë£¬È»ºóµ÷ÓÃËû
gRPC ·þÎñÆ÷£¬½øÐÐ PodSand¡¢infra-container£¨Ò²³ÆÎªÔÝÍ£ÈÝÆ÷£©µÄ¡£
È»ºó£¬»áµ÷Óà CNI ½Ó¿Ú SetUpPod ½øÐÐÏà¹ØÍøÂçÅäÖÃÓëÆô¶¯£¬´Ëʱ´´½¨ÆðÀ´µÄÈÝÆ÷ÍøÂ磬¾Í¿ÉÒÔÖ±½ÓÓÃÓÚ´´½¨Ö®ºóµÄÒµÎñÈÝÆ÷Èç
initContainers¡¢containers ½øÐй²ÏíÍøÂç¡£
Ïà¹Ø´úÂëÈçÏ£º
| //
kubernetes/pkg/kubelet/dockershim/docker_sandbox.go
// Æô¶¯ÔËÐÐ Pod Sandbox
func (ds *dockerService) RunPodSandbox(ctx
context.Context, r *runtimeapi.RunPodSandboxRequest)
(*runtimeapi.RunPodSandboxResponse, error) {
config := r.GetConfig()
// Step 1: ÀÈ¡»ù´¡¾µÏñ(infra-container:
k8s.gcr.io/pause:3.6)
image := defaultSandboxImage
if err := ensureSandboxImageExists(ds.client,
image); err != nil {
return nil, err
}
// Step 2: ´´½¨ Sandbox ÈÝÆ÷
createConfig, err := ds.makeSandboxDockerConfig(config,
image)
if err != nil {
return nil, fmt.Errorf("failed
to make sandbox docker config for pod %q: %v",
config.Metadata.Name, err)
}
createResp, err := ds.client.CreateContainer(*createConfig)
if err != nil {
createResp, err = recoverFromCreationConflictIfNeeded(ds.client,
*createConfig, err)
}
// Step 3: ´´½¨ Sandbox ¼ì²éµã(ÓÃÓڼǼµ±Ç°Ö´Ðе½ÄÄÒ»²½ÁË)
if err = ds.checkpointManager.CreateCheckpoint(createResp.ID,
constructPodSandboxCheckpoint(config)); err
!= nil {
return nil, err
}
// Step 4: Æô¶¯ Sandbox ÈÝÆ÷
err = ds.client.StartContainer(createResp.ID)
if err != nil {
return nil, fmt.Errorf("failed
to start sandbox container for pod %q: %v",
config.Metadata.Name, err)
}
// Step 5: ¶Ô Sandbox ÈÝÆ÷½øÐÐÍøÂçÅäÖÃ
err = ds.network.SetUpPod(config.GetMetadata().Namespace,
config.GetMetadata().Name, cID, config.Annotations,
networkOptions)
if err != nil {
// Èç¹ûÍøÂçÅäÖÃʧ°Ü£¬Ôò»Ø¹ö£ºÉ¾³ý½¨Á¢ÆðÀ´µÄ Pod
ÍøÂç
err = ds.network.TearDownPod(config.GetMetadata().Namespace,
config.GetMetadata().Name, cID)
if err != nil {
errList = append(errList, fmt.Errorf("failed
to clean up sandbox container %q network for
pod %q: %v", createResp.ID, config.Metadata.Name,
err))
}
// Í£Ö¹ÈÝÆ÷ÔËÐÐ
err = ds.client.StopContainer(createResp.ID,
defaultSandboxGracePeriod)
...
}
return resp, nil
} |
С½áÈçÏ£º

K8s-CNI-Á÷³Ì
¿ÉÖªÉçÇøDockershim Deprecation FAQ£¬dockershim Ïà¹Ø´úÂëÔÚ2021Äêµ××óÓÒÒÆ³öK8sÖ÷¸É´úÂ룬֮ºó½«Í³Ò»Ê¹ÓÃCRI(Container
Runtime Interface, ContainerÔËÐÐʱ½Ó¿Ú) ½øÐÐÈÝÆ÷ÉúÃüÖÜÆÚ¹ÜÀí¡£
7. CNI RPC½Ó¿Ú
CNIÌí¼ÓÁË¡¢¡¢¡¢É¾³ýÍøÂç½Ó¿Ú£¬²¢ÌṩÁ˰´»òÿ¸ö½øÐÐÍøÂçÅäÖù淶µÄ½Ó¿ÚµÈ¼ì²é£¬·½±ãÓû§Áé»îʹÓá£
CNI´ÓÕâЩÈÝÆ÷¹ÜÀíϵͳ(dockershim)»ñÈ¡´¦´¦ÔËÐÐʱÐÅÏ¢(Container Runtime)£¬°üÀ¨ÍøÂçÃüÃû¿Õ¼äµÄ·¾¶¡¢ÈÝÆ÷IDÒÔ¼°ÍøÂç½Ó¿ÚÃû³Æ£¬ÔÙ´ÓÈÝÆ÷ÍøÂçµÄÅäÖÃÎļþÖмÓÔØÍøÂçÅäÖÃÐÅÏ¢£¬ÔÙ½«ÐÅÏ¢´«µÝ¸øµÄ²å¼þ£¬Óɲå¼þ¾ßÌåµÄÍøÂçÅäÖ㬲¢½«ÅäÖõĽá¹ûÔÙ·µ»Øµ½ÈÝÆ÷ϵͳÖнøÐйÜÀí¡£

K8s-CNI-RPC
Óû§ÈôÒª±àд×Ô¼ºµÄ CNI ²å¼þ£¬Ôò¿ÉרעÓÚÏÔʾȻºóÕâЩ RPC ½Ó¿ÚÆôÓ㬿ÉÒÔÓë¹Ù·½Î¬»¤µÄÈýÀà»ù´¡×éºÏ£¬ÐγɶàÖÖ°üº¬ÍøÂçµÄ×ÔÓɽâ¾ö·½°¸¡£
8.С½á
±¾ÎÄ·ÖÎöK8sÖÐkubeletÆô¶¯¡¢Pod´´½¨/ɾ³ý¡¢Docker˵Ã÷´´½¨/ɾ³ýContainer¡¢CNI
RPCµ÷Óá¢ÈÝÆ÷ÍøÂçÅäÖõȺËÐÄÁ÷³Ì£¬Í¨¹ý¶ÔCNIʵÏÖ»úÖÆ½øÐнâÎö£¬Í¨¹ýÔ´Â롢ͼÎÄ·½Ê½Ïà¹ØÁ÷³ÌÂß¼£¬ÒÔÆÚ¸üºÃµÄÀí½â
K8s CNI ÔËÐÐÁ÷³Ì¡£
K8sÖ»Òª²ÉÓÃCNI£¨Container Network Interface£©ÐÒéµÄÍøÂç½Ó¿Ú£¬ÒѾÌṩһ¸ö±ê×¼µÄÍøÂç½Ó¿Ú¹¦ÄÜ£¬¼ÈÊÇÂú×ã¸ÃÐÒéµÄËùÓпª·Åƽ̨Ëù²ÉÓõÄÍøÂç½Ó¿Ú£¬Í¬Ê±Ò²ÊÇÌṩµÄ¡£Ò»¸öCNCF(Cloud
Native Computing)ÏîÄ¿¡£¿ÉÒÔÔ¤¼û£¬CNIδÀ´½«³ÉΪÈÝÆ÷ÍøÂçµÄ±ê×¼¡£ |