containerd.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. package containers
  2. import (
  3. "context"
  4. "encoding/json"
  5. "fmt"
  6. "github.com/containerd/containerd"
  7. "github.com/containerd/containerd/oci"
  8. "github.com/containerd/containerd/pkg/cri/constants"
  9. "github.com/coroot/coroot-node-agent/common"
  10. "github.com/coroot/coroot-node-agent/proc"
  11. "github.com/coroot/logparser"
  12. "k8s.io/klog/v2"
  13. "strings"
  14. "time"
  15. )
  16. const containerdTimeout = 30 * time.Second
  17. var (
  18. containerdClient *containerd.Client
  19. )
  20. func ContainerdInit() error {
  21. sockets := []string{
  22. "/var/snap/microk8s/common/run/containerd.sock",
  23. "/run/k0s/containerd.sock",
  24. "/run/k3s/containerd/containerd.sock",
  25. "/run/containerd/containerd.sock",
  26. }
  27. var err error
  28. for _, socket := range sockets {
  29. containerdClient, err = containerd.New(proc.HostPath(socket),
  30. containerd.WithDefaultNamespace(constants.K8sContainerdNamespace),
  31. containerd.WithTimeout(time.Second))
  32. if err == nil {
  33. klog.Infoln("using", socket)
  34. break
  35. }
  36. }
  37. if containerdClient == nil {
  38. return fmt.Errorf(
  39. "couldn't connect to containerd through the following UNIX sockets [%s]: %s",
  40. strings.Join(sockets, ","), err,
  41. )
  42. }
  43. return nil
  44. }
  45. func ContainerdInspect(containerID string) (*ContainerMetadata, error) {
  46. if containerdClient == nil {
  47. return nil, fmt.Errorf("containerd client not initialized")
  48. }
  49. ctx, cancel := context.WithTimeout(context.Background(), containerdTimeout)
  50. defer cancel()
  51. c, err := containerdClient.ContainerService().Get(ctx, containerID)
  52. if err != nil {
  53. return nil, err
  54. }
  55. res := &ContainerMetadata{
  56. labels: c.Labels,
  57. image: c.Image,
  58. volumes: map[string]string{},
  59. }
  60. var spec oci.Spec
  61. if err := json.Unmarshal(c.Spec.Value, &spec); err != nil {
  62. klog.Warningln(err)
  63. } else {
  64. for _, m := range spec.Mounts {
  65. res.volumes[m.Destination] = common.ParseKubernetesVolumeSource(m.Source)
  66. }
  67. }
  68. if data, ok := c.Extensions["io.cri-containerd.container.metadata"]; ok {
  69. var md = struct { // from data.TypeUrl
  70. Metadata struct {
  71. LogPath string
  72. }
  73. }{}
  74. if err := json.Unmarshal(data.Value, &md); err != nil {
  75. klog.Warningln(err)
  76. } else {
  77. res.logPath = md.Metadata.LogPath
  78. res.logDecoder = logparser.CriDecoder{}
  79. }
  80. }
  81. return res, nil
  82. }