diff --git a/libkpod/container_server.go b/libkpod/container_server.go index c51ea4b5..4a65f903 100644 --- a/libkpod/container_server.go +++ b/libkpod/container_server.go @@ -294,6 +294,8 @@ func (c *ContainerServer) LoadSandbox(id string) error { return err } + ip := m.Annotations[annotations.IP] + processLabel, mountLabel, err := label.InitLabels(label.DupSecOpt(m.Process.SelinuxLabel)) if err != nil { return err @@ -311,6 +313,7 @@ func (c *ContainerServer) LoadSandbox(id string) error { if err != nil { return err } + sb.AddIP(ip) // We add a netNS only if we can load a permanent one. // Otherwise, the sandbox will live in the host namespace. diff --git a/libkpod/sandbox/sandbox.go b/libkpod/sandbox/sandbox.go index a3ba4010..62550762 100644 --- a/libkpod/sandbox/sandbox.go +++ b/libkpod/sandbox/sandbox.go @@ -154,6 +154,8 @@ type Sandbox struct { hostname string portMappings []*hostport.PortMapping stopped bool + // ipv4 or ipv6 cache + ip string } const ( @@ -202,6 +204,16 @@ func New(id, namespace, name, kubeName, logDir string, labels, annotations map[s return sb, nil } +// AddIP stores the ip in the sandbox +func (s *Sandbox) AddIP(ip string) { + s.ip = ip +} + +// IP returns the ip of the sandbox +func (s *Sandbox) IP() string { + return s.ip +} + // ID returns the id of the sandbox func (s *Sandbox) ID() string { return s.id diff --git a/pkg/annotations/annotations.go b/pkg/annotations/annotations.go index 63cc126d..80f943c2 100644 --- a/pkg/annotations/annotations.go +++ b/pkg/annotations/annotations.go @@ -19,6 +19,9 @@ const ( // HostName is the container host name annotation HostName = "io.kubernetes.cri-o.HostName" + // IP is the container ipv4 or ipv6 address + IP = "io.kubernetes.cri-o.IP" + // Image is the container image ID annotation Image = "io.kubernetes.cri-o.Image" diff --git a/server/sandbox_run.go b/server/sandbox_run.go index 815175e2..3f8be488 100644 --- a/server/sandbox_run.go +++ b/server/sandbox_run.go @@ -449,13 +449,6 @@ func (s *Server) RunPodSandbox(ctx context.Context, req *pb.RunPodSandboxRequest } g.AddAnnotation(annotations.MountPoint, mountPoint) g.SetRootPath(mountPoint) - err = g.SaveToFile(filepath.Join(podContainer.Dir, "config.json"), saveOptions) - if err != nil { - return nil, fmt.Errorf("failed to save template configuration for pod sandbox %s(%s): %v", sb.Name(), id, err) - } - if err = g.SaveToFile(filepath.Join(podContainer.RunDir, "config.json"), saveOptions); err != nil { - return nil, fmt.Errorf("failed to write runtime configuration for pod sandbox %s(%s): %v", sb.Name(), id, err) - } container, err := oci.NewContainer(id, containerName, podContainer.RunDir, logPath, sb.NetNs(), labels, kubeAnnotations, "", "", "", nil, id, false, false, false, sb.Privileged(), sb.Trusted(), podContainer.Dir, created, podContainer.Config.Config.StopSignal) if err != nil { @@ -482,6 +475,9 @@ func (s *Server) RunPodSandbox(ctx context.Context, req *pb.RunPodSandboxRequest return nil, fmt.Errorf("failed to get valid ipv4 address for container %s in sandbox %s", containerName, id) } + g.AddAnnotation(annotations.IP, ip) + sb.AddIP(ip) + if err = s.hostportManager.Add(id, &hostport.PodPortMapping{ Name: name, PortMappings: portMappings, @@ -494,6 +490,14 @@ func (s *Server) RunPodSandbox(ctx context.Context, req *pb.RunPodSandboxRequest } } + err = g.SaveToFile(filepath.Join(podContainer.Dir, "config.json"), saveOptions) + if err != nil { + return nil, fmt.Errorf("failed to save template configuration for pod sandbox %s(%s): %v", sb.Name(), id, err) + } + if err = g.SaveToFile(filepath.Join(podContainer.RunDir, "config.json"), saveOptions); err != nil { + return nil, fmt.Errorf("failed to write runtime configuration for pod sandbox %s(%s): %v", sb.Name(), id, err) + } + if err = s.runContainer(container, sb.CgroupParent()); err != nil { return nil, err } diff --git a/server/sandbox_status.go b/server/sandbox_status.go index db95222d..f5b6dd09 100644 --- a/server/sandbox_status.go +++ b/server/sandbox_status.go @@ -18,16 +18,6 @@ func (s *Server) PodSandboxStatus(ctx context.Context, req *pb.PodSandboxStatusR podInfraContainer := sb.InfraContainer() cState := s.Runtime().ContainerStatus(podInfraContainer) - netNsPath, err := podInfraContainer.NetNsPath() - if err != nil { - return nil, err - } - ip, err := s.netPlugin.GetContainerNetworkStatus(netNsPath, sb.Namespace(), sb.KubeName(), sb.ID()) - if err != nil { - // ignore the error on network status - ip = "" - } - rStatus := pb.PodSandboxState_SANDBOX_NOTREADY if cState.Status == oci.ContainerStateRunning { rStatus = pb.PodSandboxState_SANDBOX_READY @@ -38,7 +28,7 @@ func (s *Server) PodSandboxStatus(ctx context.Context, req *pb.PodSandboxStatusR Status: &pb.PodSandboxStatus{ Id: sandboxID, CreatedAt: podInfraContainer.CreatedAt().UnixNano(), - Network: &pb.PodSandboxNetworkStatus{Ip: ip}, + Network: &pb.PodSandboxNetworkStatus{Ip: sb.IP()}, State: rStatus, Labels: sb.Labels(), Annotations: sb.Annotations(),