Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
dz̸ K8s ÍøÂçÄ£ÐÍCNIЭÒé
 
×÷ÕߣºÍõ³É
  2887  次浏览      27
 2022-1-14
 
±à¼­ÍƼö:
±¾ÎÄ·ÖÎö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δÀ´½«³ÉΪÈÝÆ÷ÍøÂçµÄ±ê×¼¡£

   
2887 ´Îä¯ÀÀ       27
×îл¼Æ»®
ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ 12-11[±±¾©]
LLM´óÄ£ÐÍÓëÖÇÄÜÌ忪·¢ÊµÕ½ 12-18[±±¾©]
ǶÈëʽÈí¼þ²âÊÔ 12-25[±±¾©]
AIÔ­ÉúÓ¦ÓõÄ΢·þÎñ¼Ü¹¹ 1-9[±±¾©]
AI´óÄ£Ðͱàд¸ßÖÊÁ¿´úÂë 1-14[±±¾©]
ÐèÇó·ÖÎöÓë¹ÜÀí 1-22[±±¾©]
 
×îÐÂÎÄÕÂ
ÔÆÔ­Éú¼Ü¹¹¸ÅÊö
K8S¸ß¿ÉÓü¯Èº¼Ü¹¹ÊµÏÖ
ÈÝÆ÷ÔÆ¹ÜÀíÖ®K8S¼¯Èº¸ÅÊö
k8s-ÕûÌå¸ÅÊöºÍ¼Ü¹¹
Ê®·ÖÖÓѧ»áÓÃdocker²¿Êð΢·þÎñ
×îпγÌ
ÔÆ¼ÆË㡢΢·þÎñÓë·Ö²¼Ê½¼Ü¹¹
Æóҵ˽ÓÐÔÆÔ­ÀíÓë¹¹½¨
»ùÓÚKubernetesµÄDevOpsʵ¼ù
ÔÆÆ½Ì¨¼Ü¹¹ÓëÓ¦Ó㨰¢ÀïÔÆ£©
Docker²¿Êð±»²âϵͳÓë×Ô¶¯»¯¿ò¼Üʵ¼ù
³É¹¦°¸Àý
±±¾© ÔÆÆ½Ì¨Óë΢·þÎñ¼Ü¹¹Éè¼Æ
ͨÓù«Ë¾GE DockerÔ­ÀíÓëʵ¼ùÅàѵ
ij¾ü¹¤Ñо¿µ¥Î» MDA£¨Ä£ÐÍÇý¶¯¼Ü¹¹£©
ÖªÃûÏû·Ñ½ðÈÚ¹«Ë¾ ÁìÓòÇý¶¯Éè¼Æ
ÉîÛÚijÆû³µÆóÒµ Ä£ÐÍÇý¶¯µÄ·ÖÎöÉè¼Æ
 
 
 
 
 
Ïà¹ØÎÄÕÂ

ÔÆ¼ÆËãµÄ¼Ü¹¹
¶ÔÔÆ¼ÆËã·þÎñÄ£ÐÍ
ÔÆ¼ÆËãºËÐļ¼ÊõÆÊÎö
Á˽âÔÆ¼ÆËãµÄ©¶´
Ïà¹ØÎĵµ

ÔÆ¼ÆËã¼ò½é
ÔÆ¼ÆËã¼ò½éÓëÔÆ°²È«
ÏÂÒ»´úÍøÂç¼ÆËã--ÔÆ¼ÆËã
ÈídzÎöÔÆ¼ÆËã
Ïà¹Ø¿Î³Ì

ÔÆ¼ÆËãÔ­ÀíÓëÓ¦ÓÃ
ÔÆ¼ÆËãÓ¦ÓÃÓ뿪·¢
CMMIÌåϵÓëʵ¼ù
»ùÓÚCMMI±ê×¼µÄÈí¼þÖÊÁ¿±£Ö¤