jittering / traefik-kop

A dynamic docker->redis->traefik discovery agent
MIT License
179 stars 13 forks source link

Bug: Index out of range #24

Closed msengbusch closed 1 year ago

msengbusch commented 1 year ago

Description

A bug is currently occurring under two circumstances in the provided configuration:

1. When publishing multiple ports of a single container.

  1. When using Traefik labels without specifying the port explicitly.

Environment:

Context:

The issue is not caused by using Podman, as Traefik-kop worked flawlessly on an Alpine machine with Podman.

Configuration

  1. Traefik Docker Compose:

    version: 3
    services:
    redis:
    image: docker.io/redis:alpine
    restart: always
    healthcheck:
      test: ["CMD", "redis-cli", "-p", "6379", "ping"]
      interval: 30s
      timeout: 10s
      retries: 3
    ports:
      - 10010:6379
    volumes:
      - redis:/data
    traefik:
    image: docker.io/traefik:latest
    restart: always
    env_file: .env
    stop_grace_period: 30s
    depends_on: redis
    healthcheck:
      test: ["CMD", "traefik", "healthcheck", "--ping"]
      interval: 30s
      timeout: 10s
      retries: 3
    command:
      - "--entrypoints.web.address=:80"
      - "--entrypoints.web.http.redirections.entrypoint.to=websecure"
      - "--entrypoints.web.http.redirections.entrypoint.scheme=https"
      - "--entrypoints.websecure.address=:443"
      - "--entrypoints.websecure.http.tls=true"
      - "--experimental.http3=true"
      - "--log.level=DEBUG"
      - "--ping=true"
      #- "--ping.entrypoint=websecure"
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--providers.redis.endpoints=redis:6379"
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.traefik.rule=Host(`proxy.domain.test`)"
      - "traefik.http.routers.traefik.entrypoints=websecure"
      - "traefik.http.routers.traefik.service=api@internal"
    ports:
      - 80:80
      - 443:443
    volumes:
      - data:/data
      - /run/user/1000/podman/podman.sock:/var/run/docker.sock:ro
    whoami:
    image: docker.io/traefik/whoami:latest
    restart: always
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.whoami.rule=Host(`domain.test`)"
      - "traefik.http.routers.whoami.entrypoints=websecure"
    volumes:
    redis:
    data:
  2. Traefik-Kop Docker Compose:

    version: 3
    services:
    traefik-kop:
    image: ghcr.io/jittering/traefik-kop:latest
    restart: always
    env_file: .env
    command:
      - "--verbose"
    volumes:
      - /run/user/1000/podman/podman.sock:/var/run/docker.sock:ro

4. Service Docker Compose(Case 1):

version: 3
services:
  portainer:
    image: docker.io/portainer/portainer-ee:alpine
    restart: always
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.portainer.rule=Host(`port.domain.test`)"
      - "traefik.http.routers.portainer.entrypoints=websecure"
      - "traefik.http.services.portainer.loadbalancer.server.port=10020"
      - "traefik.tcp.routers.portainer-edge.rule=HostSNI(`edge.port.domain.test`)"
      - "traefik.tcp.routers.portainer-edge.entrypoints=websecure"
      - "trarfik.tcp.services.portainer-edge.loadbalancer.server.port=10022"
    ports:
      - 10020:9000
      - 10022:8000
    volumes:
      - data:/data
  portainer_agent:
    image: docker.io/portainer/agent:alpine
    restart: always
    volumes:
      - /run/user/1000/podman/podman.sock:/var/run/docker.sock
      - /home/debian/.local/share/containers/storage/volumes:/var/lib/docker/volumes
volumes:
  data:
  1. Service Docker Compose (Case 2)
    version: 3
    services:
    portainer:
    image: docker.io/portainer/portainer-ee:alpine
    restart: always
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.portainer.rule=Host(`port.domain.test`)"
      - "traefik.http.routers.portainer.entrypoints=websecure"
    ports:
      - 10020:9000
    volumes:
      - data:/data
    portainer_agent:
    image: docker.io/portainer/agent:alpine
    restart: always
    volumes:
      - /run/user/1000/podman/podman.sock:/var/run/docker.sock
      - /home/debian/.local/share/containers/storage/volumes:/var/lib/docker/volumes
    volumes:
    data:

Logs:

traefik-kop log:

time="2023-08-11T17:54:55Z" level=debug msg="using traefik-kop config: {DockerConfig: DockerHost:unix:///var/run/docker.sock Hostname:7069efcc96de BindIP:cloud-1.int.domain.test Addr:traefik.int.domain.test:10010 Pass: DB:0 PollInterval:60}"
time="2023-08-11T17:54:55Z" level=info msg="creating new redis store at traefik.int.domain.test:10010 for hostname 7069efcc96de"
time="2023-08-11T17:54:55Z" level=info msg="Starting provider aggregator *traefikkop.MultiProvider"
time="2023-08-11T17:54:55Z" level=info msg="starting polling provider with 1m0s interval"
time="2023-08-11T17:54:55Z" level=info msg="Starting provider *docker.Provider"
time="2023-08-11T17:54:55Z" level=debug msg="*docker.Provider provider configuration: {\"watch\":true,\"endpoint\":\"unix:///var/run/docker.sock\",\"swarmModeRefreshSeconds\":\"15s\"}"
time="2023-08-11T17:54:56Z" level=debug msg="Provider connection established with docker 4.3.1 (API 1.41)" providerName=docker
time="2023-08-11T17:54:56Z" level=debug msg="Filtering disabled container" container=portainer-agent-portainer-0cf69d34adede649d8b46445870df8836c8c238763a1e0a13a3e9c0920834e8c providerName=docker
time="2023-08-11T17:54:56Z" level=debug msg="Filtering disabled container" providerName=docker container=traefik-kop-traefik-kop-7069efcc96deefd61e44d4a6665c5724b1c011a5f748d1609cac09ca2797a274
time="2023-08-11T17:54:56Z" level=debug msg="Configuration received: {\"http\":{\"routers\":{\"portainer\":{\"entryPoints\":[\"websecure\"],\"service\":\"portainer\",\"rule\":\"Host(`port.domain.test`)\"}},\"services\":{\"portainer\":{\"loadBalancer\":{\"servers\":[{\"url\":\"http://10.89.0.139:10020\"}],\"passHostHeader\":true}}}},\"tcp\":{\"routers\":{\"portainer-edge\":{\"entryPoints\":[\"websecure\"],\"service\":\"portainer-portainer\",\"rule\":\"HostSNI(`edge.port.domain.test`)\"}},\"services\":{\"portainer-portainer\":{\"loadBalancer\":{\"terminationDelay\":100,\"servers\":[{\"address\":\"10.89.0.139:8000\"}]}}}},\"udp\":{}}" providerName=docker
time="2023-08-11T17:54:56Z" level=info msg="refreshing traefik-kop configuration"
time="2023-08-11T17:54:56Z" level=debug msg="found http service: portainer@docker" service=portainer@docker service-type=http
time="2023-08-11T17:54:56Z" level=debug msg="found router 'portainer@docker' for service portainer"
time="2023-08-11T17:54:56Z" level=debug msg="found container '/portainer_portainer_1' (b73d5d826b41671e438be21ee51b11a415b2a5c5980f8a147f287b65a1eabe35) for service 'portainer'"
time="2023-08-11T17:54:56Z" level=debug msg="found router 'portainer@docker' for service portainer"
time="2023-08-11T17:54:56Z" level=debug msg="found container '/portainer_portainer_1' (b73d5d826b41671e438be21ee51b11a415b2a5c5980f8a147f287b65a1eabe35) for service 'portainer'"
time="2023-08-11T17:54:56Z" level=debug msg="no network label set for portainer@docker"
time="2023-08-11T17:54:56Z" level=debug msg="using load balancer URL for port detection: http://10.89.0.139:10020" service=portainer@docker service-type=http
time="2023-08-11T17:54:56Z" level=debug msg="found router 'portainer@docker' for service portainer"
time="2023-08-11T17:54:56Z" level=debug msg="found container '/portainer_portainer_1' (b73d5d826b41671e438be21ee51b11a415b2a5c5980f8a147f287b65a1eabe35) for service 'portainer'"
time="2023-08-11T17:54:56Z" level=debug msg="using explicitly set port 10020 for portainer@docker" service=portainer@docker service-type=http
time="2023-08-11T17:54:56Z" level=info msg="publishing http://cloud-1.int.domain.test:10020" service=portainer@docker service-type=http
time="2023-08-11T17:54:56Z" level=debug msg="found tcp service: portainer-portainer@docker"
time="2023-08-11T17:54:56Z" level=debug msg="found router 'portainer-edge@docker' for service portainer-portainer"
time="2023-08-11T17:54:56Z" level=debug msg="found container '/portainer_portainer_1' (b73d5d826b41671e438be21ee51b11a415b2a5c5980f8a147f287b65a1eabe35) for service 'portainer-portainer'"
time="2023-08-11T17:54:56Z" level=debug msg="no network label set for portainer-portainer@docker"
time="2023-08-11T17:54:56Z" level=debug msg="found router 'portainer-edge@docker' for service portainer-portainer"
time="2023-08-11T17:54:56Z" level=debug msg="found container '/portainer_portainer_1' (b73d5d826b41671e438be21ee51b11a415b2a5c5980f8a147f287b65a1eabe35) for service 'portainer-portainer'"
time="2023-08-11T17:54:56Z" level=error msg="Error in Go routine: runtime error: index out of range [0] with length 0"
time="2023-08-11T17:54:56Z" level=error msg="Stack: goroutine 15 [running]:\nruntime/debug.Stack()\n\t/opt/hostedtoolcache/go/1.19.2/x64/src/runtime/debug/stack.go:24 +0x65\ngithub.com/traefik/traefik/v2/pkg/safe.defaultRecoverGoroutine({0x26c73c0?, 0xc0007710f8})\n\t/home/runner/go/pkg/mod/github.com/traefik/traefik/v2@v2.8.4/pkg/safe/routine.go:66 +0xa5\ngithub.com/traefik/traefik/v2/pkg/safe.GoWithRecover.func1.1()\n\t/home/runner/go/pkg/mod/github.com/traefik/traefik/v2@v2.8.4/pkg/safe/routine.go:56 +0x36\npanic({0x26c73c0, 0xc0007710f8})\n\t/opt/hostedtoolcache/go/1.19.2/x64/src/runtime/panic.go:884 +0x212\ngithub.com/jittering/traefik-kop.portBindingString(0x41d5c00?)\n\t/home/runner/work/traefik-kop/traefik-kop/docker.go:135 +0x339\ngithub.com/jittering/traefik-kop.getPortBinding({0xc000888840, {0xc00088e960, 0x1, 0x4}, 0xc0003fb2c0, 0xc000892900})\n\t/home/runner/work/traefik-kop/traefik-kop/docker.go:102 +0x236\ngithub.com/jittering/traefik-kop.getContainerPort({0x2e69590, 0xc000422100}, 0x28988dc?, {0x2863c9e, 0x3}, {0xc00071b300, 0x1a}, {0x0, 0x0})\n\t/home/runner/work/traefik-kop/traefik-kop/traefik_kop.go:260 +0x3a5\ngithub.com/jittering/traefik-kop.replaceIPs({0x2e69590, 0xc000422100}, 0xc00021be88, {0xc00005a008, 0x14})\n\t/home/runner/work/traefik-kop/traefik-kop/traefik_kop.go:185 +0x65e\ngithub.com/jittering/traefik-kop.Start.func1({0xc0007cc090, 0xc0007aaa98, 0xc0001ef8e0, 0xc0007cc0c0})\n\t/home/runner/work/traefik-kop/traefik-kop/traefik_kop.go:85 +0xc6\ngithub.com/traefik/traefik/v2/pkg/server.(*ConfigurationWatcher).applyConfigurations(0xc000b5c8c0, {0x2e3cd18, 0xc0001d4180})\n\t/home/runner/go/pkg/mod/github.com/traefik/traefik/v2@v2.8.4/pkg/server/configurationwatcher.go:172 +0x21d\ngithub.com/traefik/traefik/v2/pkg/safe.(*Pool).GoCtx.func1()\n\t/home/runner/go/pkg/mod/github.com/traefik/traefik/v2@v2.8.4/pkg/safe/routine.go:36 +0x66\ngithub.com/traefik/traefik/v2/pkg/safe.GoWithRecover.func1()\n\t/home/runner/go/pkg/mod/github.com/traefik/traefik/v2@v2.8.4/pkg/safe/routine.go:59 +0x5b\ncreated by github.com/traefik/traefik/v2/pkg/safe.GoWithRecover\n\t/home/runner/go/pkg/mod/github.com/traefik/traefik/v2@v2.8.4/pkg/safe/routine.go:53 +0x72\n"

Additional Notes:

Feel free to reach out for further assistance. Please note that my response time might be slower over the next four weeks.

msengbusch commented 1 year ago

Typo in 4. Service Docker Compose (Case 1). This invalidates Case 1 as a circumstance as there aren't any ports which hasn't be set explicitly by label.

chetan commented 1 year ago

Not able to reproduce the second case with the given compose file however I'm going to issue a fix shortly as the stack is clear enough work from. Thanks for the report!