podman play kube --network가 네트워크에 올바르게 연결되지 않습니다.

podman play kube --network가 네트워크에 올바르게 연결되지 않습니다.

저는 RHEL8.6에서 podman을 사용하여 두 개의 컨테이너(zabbix-server 및 postgres-server)로 구성된 Pod를 배포합니다. 컨테이너를 배포하려면 podman play kube.yaml 파일에서 이를 사용하여 포드 구성을 가져오고 실행합니다. 이것은 뿌리가 없는 설정입니다.

컨테이너는 내부 네트워크를 통해 통신하려면 DNS를 사용해야 합니다. 저는 podman create network monDNS를 활성화하여 "mon"이라는 브리지 네트워크를 만들곤 했습니다 .

사용하면 podman play kube monitoring.yaml --network mon컨테이너는 DNS를 통해 서로 통신할 수 없습니다. Podman play kube를 사용하지 않고 수동으로 Pod와 컨테이너를 생성하여 설정을 테스트했습니다. 수동 설정에서는 포드의 컨테이너가 DNS를 사용하여 서로를 찾을 수 있습니다.

수동설정:

podman pod create --name monitoring
podman network create mon
podman run -d --rm --network=mon --pod=monitoring --name postgres-server docker.io/timescale/timescaledb:latest-pg14
podman run -d --rm --network=mon --pod=monitoring --name zabbix-server docker.io/zabbix/zabbix-server-pgsql

월요일에네트워크 구성:

[
    {
        "cniVersion": "0.4.0",
        "name": "mon",
        "plugins": [
            {
                "bridge": "cni-podman1",
                "hairpinMode": true,
                "ipMasq": true,
                "ipam": {
                    "ranges": [
                        [
                            {
                                "gateway": "10.89.0.1",
                                "subnet": "10.89.0.0/24"
                            }
                        ]
                    ],
                    "routes": [
                        {
                            "dst": "0.0.0.0/0"
                        }
                    ],
                    "type": "host-local"
                },
                "isGateway": true,
                "type": "bridge"
            },
            {
                "capabilities": {
                    "portMappings": true
                },
                "type": "portmap"
            },
            {
                "backend": "",
                "type": "firewall"
            },
            {
                "type": "tuning"
            },
            {
                "capabilities": {
                    "aliases": true
                },
                "domainName": "dns.podman",
                "type": "dnsname"
            }
        ]
    }
]

모니터링.yaml문서:

# Save the output of this file and use kubectl create -f to import
# it into Kubernetes.
#
# Created with podman-3.4.7
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: "2022-05-24T13:40:30Z"
  labels:
    app: monitoring
  name: monitoring
spec:
  containers:
  - args:
    - postgres
    image: docker.io/timescale/timescaledb:latest-pg14
    name: postgres-server
    resources: {}
    securityContext:
      capabilities:
        drop:
        - CAP_MKNOD
        - CAP_NET_RAW
        - CAP_AUDIT_WRITE
  - args:
    - /usr/sbin/zabbix_server
    - --foreground
    - -c
    - /etc/zabbix/zabbix_server.conf
    image: docker.io/zabbix/zabbix-server-pgsql:latest
    name: zabbix-server
    resources: {}
    securityContext:
      capabilities:
        drop:
        - CAP_MKNOD
        - CAP_NET_RAW
        - CAP_AUDIT_WRITE
    volumeMounts:
    - mountPath: /var/lib/zabbix/export
      name: bdc06ccb2b092148bb78c353fccc104255a81a8735eb3a14974f6ede0e6516e8-pvc
    - mountPath: /var/lib/zabbix/snmptraps
      name: 196d7983e1b62995bae07beb7942e18ac46dcf6d3346e43fff2604c9a7bc30ec-pvc
  restartPolicy: Never
  volumes:
  - name: bdc06ccb2b092148bb78c353fccc104255a81a8735eb3a14974f6ede0e6516e8-pvc
    persistentVolumeClaim:
      claimName: bdc06ccb2b092148bb78c353fccc104255a81a8735eb3a14974f6ede0e6516e8
  - name: 196d7983e1b62995bae07beb7942e18ac46dcf6d3346e43fff2604c9a7bc30ec-pvc
    persistentVolumeClaim:
      claimName: 196d7983e1b62995bae07beb7942e18ac46dcf6d3346e43fff2604c9a7bc30ec
status: {}

문제 해결

podman network createPodman 문서는 다음을 사용하여 생성된 네트워크 연결에 대한 지원을 나타냅니다.https://docs.podman.io/en/latest/markdown/podman-play-kube.1.html#network-mode-net

podman exec -it <container> /bin/bash생성된 컨테이너에서 쉘( )을 엽니다.수동, zabbix-server 및 postgres-server에 ping을 보낼 수 있습니다.

$ podman exec -it zabbix-server /bin/bash
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
10.89.0.3       c61fdf070064 zabbix-server
10.89.0.1 host.containers.internal
bash-5.1$ ping postgres-server
PING postgres-server.dns.podman (10.89.0.2) 56(84) bytes of data.
64 bytes from postgres-server.dns.podman (10.89.0.2): icmp_seq=1 ttl=64 time=0.051 ms
64 bytes from postgres-server.dns.podman (10.89.0.2): icmp_seq=2 ttl=64 time=0.062 ms
64 bytes from postgres-server.dns.podman (10.89.0.2): icmp_seq=3 ttl=64 time=0.100 ms
^C
--- postgres-server.dns.podman ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2045ms
rtt min/avg/max/mdev = 0.051/0.071/0.100/0.021 ms

우수한큐브 플레이하기컨테이너, 핑 monitoring-<name>-server또는 <name>-server실패. 수동 및 플레이 kube 설정 모두에서 DNS 확인자를 핑하면 성공적으로 반환됩니다.

bash-5.1$ cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
10.89.0.2       monitoring be3df46ca68d-infra
10.89.0.1 host.containers.internal

bash-5.1$ ping postgres-server
ping: postgres-server: Name does not resolve
bash-5.1$ ping monitoring-postgres-server
ping: monitoring-postgres-server: Name does not resolve
bash-5.1$ cat /etc/resolv.conf
search dns.podman
nameserver 10.89.0.1

수동 및 kube 플레이 설정을 모두 사용하여 podman inspect <container>"mon" 네트워크에 연결되었습니다 . 그러나 관련하여큐브 플레이하기설정 후 네트워크 설정의 출력은 다음과 같습니다.

"NetworkMode": "container:49e7b0bafd4619b9bcb50b1b841aeee3cb910bf3c555a9788dc297e71c948092"

이는 다음과 관련이 있습니다.수동네트워크 설정:

"NetworkMode": "bridge"

"play kube"는 --network 플래그를 무시하고 대신 내부 컨테이너 네트워크를 생성하는 것처럼 보입니다. 컨테이너 네트워크 설정 보기쿠베 플레이, 두 컨테이너의 IP가 동일합니다. 우수한수동설정 시 IP가 다릅니다.

"Networks": {              
                "mon": {            
                    "EndpointID": "",
                    "Gateway": "10.89.0.1",
                    "IPAddress": "10.89.0.3",
                    "IPPrefixLen": 24,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "3e:30:b7:e2:1d:00",
                    "NetworkID": "mon",

Networks": {              
                "mon": {            
                    "EndpointID": "",
                    "Gateway": "10.89.0.1",
                    "IPAddress": "10.89.0.2",
                    "IPPrefixLen": 24,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "fa:1a:6b:f3:02:3a",
                    "NetworkID": "mon",

나는 SELinux를 사용하거나 사용하지 않고 강제 모드에서 podman kube 플레이를 시도했습니다. 또한 이 설정을 루트로 실행해 보았으나 소용이 없었습니다.

다음 버전을 사용하여 이 설정을 테스트했습니다.

  • 팟캐스트: 3.4.7, 4.0.2
  • RHEL: 8.5, 8.6

어떤 도움이라도 대단히 감사하겠습니다!

답변1

해결책을 찾았습니다. 공유 네트워크 네임스페이스를 사용하여 podman play kube생성된 컨테이너입니다 . 따라서 상호 액세스를 사용할 수 있습니다 localhost.

관련 정보