记录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
相关推荐
梦梦代码精4 小时前
开源AI应用平台BuildingAI解析:插件化架构、应用市场与热门案例
人工智能·机器学习·docker·开源
南大白6 小时前
Consul 与 Nacos 核心差异总结
consul
IT瑞先生6 小时前
Docker快速部署Mysql的三种方法——实操篇
mysql·adb·docker
梦远青城7 小时前
Docker 部署python的paddle进行OCR文字识别身份证
python·docker·ocr·paddle·身份证识别
java_logo8 小时前
ELK Docker Compose 部署指南:轻松搭建日志检索平台
elk·elasticsearch·docker·容器·kibana·logstash·轩辕镜像
ShallWeL8 小时前
Orin 上用 Docker 跑通目标检测功能
人工智能·目标检测·docker·容器
辰同学ovo9 小时前
用“舞台换景”讲清 Docker 的 Restart 与 Recreate
运维·docker·容器
看-是灰机10 小时前
使用go语言实现对接
linux·开发语言·后端·docker·语言模型·golang·飞书
关关长语1 天前
Wsl解决MySQL容器跨域权限问题
mysql·docker·容器
IT小辉同学1 天前
# Milvus v3.0-beta docker-compose 启动失败完整排错教程
docker·eureka·milvus