记录docker使用kong consul postgresql配置dns异常解决

docker 部署 postgresql、kong、consul,kong 使用postgresql数据库作为数据存储,使用consul 作为服务发现

1 KONG_DNS_RESOLVER 配置问题

想要通过docker 内置的dns可以不需要配置pgsql的ip 和 consul的ip,通过dns服务发现容器名动态获取这两个容器的ip进行连接,需要解决以下两个问题:

复制代码
1  KONG_DNS_RESOLVER 只能接收ipv4的地址,无法配置dns域名进行服务发现

2 如果KONG_DNS_RESOLVER 配置了consul的dns ip,那么就无法通过dns发现pgsql的地址,出现以下问题: 
 [lua] balancer.lua:540: could not obtain list of upstreams: [postgres] [cosocket] DNS resolution failed: dns server error: 2 server failure. Tried: ["(short)kong-database:(na) - cache-miss","kong-database:33 - cache-miss/scheduled/querying/dns server error: 2 server failure","kong-database:1 - cache-miss/scheduled/querying/dns server error: 2 server failure","kong-database:5 - cache-miss/scheduled/querying/dns server error: 2 server failure"], context: ngx.timer
 并且我们的需要是只配置域名,通过dns进行动态解析ip
2 处理KONG_DNS_RESOLVER 配置

我们可以通过go编写一个可执行程序用来dns获取pgsql的ip和consul的ip配置到环境变量中,然后再进行启动,也可以使用其他方法,只要是在kong启动前将pgsql 和consul的ip配置到环境变量中即可,由于kong容器中缺少一些软件,如dig、ping等,无法直接通过命令行去获取到pgsql 、consul的ip,这里就使用go编译成可执行文件去获取

go 复制代码
package main

import (
	"fmt"
	"net"
	"os"
)

func main() {
	args := os.Args[1:]
	domain := "kong-database"

	if len(args) > 0 {
		domain = args[0]
	}

	// 解析域名获取IP地址
	ips, err := net.LookupIP(domain)
	if err != nil {
		fmt.Fprintf(os.Stderr, "解析域名失败: %v\n", err)
		os.Exit(1)
	}

	// 提取第一个IPv4地址(跳过IPv6)
	var ip string
	for _, addr := range ips {
		if addr.To4() != nil {
			ip = addr.String()
			break
		}
	}

	// 检查是否找到有效IP
	if ip == "" {
		fmt.Fprintf(os.Stderr, "未找到 %s 的IPv4地址\n", domain)
		os.Exit(1)
	}
	fmt.Printf(ip)
}

docker kong容器yml配置

yml 复制代码
version: '3.8'

networks:

  base_service_database-net:
    external: true
    driver: overlay

services:

  consul:
    image: consul:1.15.4
    restart: always
    container_name: consul
    networks:
      - base_service_database-net
    ports:
      - "8500:8500"
      - "8600:8600/udp"
    volumes:
      - /etc/localtime:/etc/localtime
      - /data/docker/consul/data:/consul/data
    environment:
      - TZ=Asia/Shanghai
    deploy:
      placement:
        constraints:
          - node.hostname == manager
          
  kong-database:
    image: postgres:16
    container_name: kong-database
    restart: always
    networks:
      - base_service_database-net
    environment:
      - POSTGRES_USER=kong
      - POSTGRES_DB=kong
      - POSTGRES_PASSWORD=kong
      - TZ=Asia/Shanghai
    volumes:
      - /data/docker/postgresql/data:/var/lib/postgis/data
      - /data/docker/postgresql/data:/var/lib/postgresql/data
    ports:
      - "5348:5432"
    deploy:
      placement:
        constraints:
          - node.hostname == manager  #

   #kong数据库的初始化
  kong-migration:
      container_name: kong-migration
      image: kong:3.9.1-ubuntu
      networks:
        - base_service_database-net
      depends_on:
        - kong-database
      restart: on-failure
      environment:
        - KONG_PG_HOST=kong-database
        - KONG_DATABASE=postgres
        - KONG_PG_USER=kong
        - KONG_PG_PASSWORD=kong
        - KONG_CASSANDRA_CONTACT_POINTS=kong-database
      deploy:
        placement:
          constraints:
            - node.hostname == manager  #
      command: sh -c "kong migrations bootstrap && kong migrations up"

  kong:
      container_name: kong
      image: kong:3.9.1-ubuntu
      restart: always
      networks:
        - base_service_database-net
      volumes:
        - /data/docker/kong/get_consul_ip:/get_consul_ip
        - /data/docker/kong/get_kongdatabase_ip:/get_kongdatabase_ip
      command: sh -c "export KONG_DNS_RESOLVER="$$(./get_consul_ip):8600,127.0.0.11:53" && export KONG_PG_HOST="$$(./get_kongdatabase_ip)" && /docker-entrypoint.sh kong docker-start"
      depends_on:
        - kong-migration
        - consul
      environment:
        - TZ=Asia/Shanghai
        - KONG_DATABASE=postgres
#        - KONG_PG_HOST=kong-database
        - KONG_PG_USER=kong
        - KONG_PG_PASSWORD=kong
        - KONG_CASSANDRA_CONTACT_POINTS=kong-database
        - KONG_PROXY_ACCESS_LOG=/dev/stdout
        - KONG_ADMIN_ACCESS_LOG=/dev/stdout
        - KONG_PROXY_ERROR_LOG=/dev/stderr
        - KONG_ADMIN_ERROR_LOG=/dev/stderr
        - KONG_ADMIN_LISTEN=0.0.0.0:8001, 0.0.0.0:8444 ssl
        - KONG_PROXY_LISTEN=0.0.0.0:8000, 0.0.0.0:8443 ssl
        - KONG_ADMIN_GUI_LISTEN=0.0.0.0:8002, 0.0.0.0:8445 ssl

      ports:
        - "8000:8000" # Proxy
        - "8443:8443" # Proxy SSL
        - "8001:8001" # Admin API
        - "8444:8444" # Admin API SSL
        - "8002:8002" # Kong Manager
        - "8445:8445" # Kong Manager SSL
      deploy:
        placement:
          constraints:
            - node.hostname == manager
相关推荐
九皇叔叔15 小时前
Kubernetes 资源管理方式详解:命令式与声明式管理
docker·容器·k8s
程序猿小郑20 小时前
Docker Compose 构建完整服务实战指南:从入门到最佳实践
docker·容器
行百里er1 天前
5 分钟跑起 Redis(Docker 版)
redis·后端·docker
Mr.朱鹏1 天前
Docker三剑客实战指南:Docker、Dockerfile 和 Docker Compose
python·docker·devops·dockerfile
鬼先生_sir1 天前
Docker 完整教程
docker
java_logo1 天前
Docker 一键部署 Jellyfin:快速搭建私有化媒体服务器
docker·私有化部署·jellyfin·硬件加速·媒体服务器·轩辕镜像·影音库
jianpeng的工程笔记1 天前
WeKnora 搭建研发 EDA 知识库:Docker 部署、RAG 与 Wiki 实践
docker·知识库·eda·rag
ZeroNews内网穿透1 天前
内网部署 Halo 建站,用 ZeroNews 免费内网穿透安全发布到公网(无公网 IP 也能 HTTPS 访问)
docker·https·内网穿透·nas·反向代理·halo·zeronews
九皇叔叔2 天前
K8S 资源菜单
docker·容器·kubernetes·k8s
wdfk_prog2 天前
ROS教程08:从 TransportTCP::connect() 追到 TCPROS Connection Header、序列化与 Socket 数据传输
运维·缓存·docker·容器·ros