Compare commits

...

2 Commits

Author SHA1 Message Date
eball
5ca9b7f358 fix(watcher): correct condition for verifying AdGuard DNS pod health 2025-12-12 16:39:05 +08:00
eball
7a9095ff7d daemon: fix intranet server restarting bug 2025-12-12 16:30:53 +08:00
2 changed files with 65 additions and 10 deletions

View File

@@ -30,7 +30,6 @@ type proxyServer struct {
func NewProxyServer() (*proxyServer, error) { func NewProxyServer() (*proxyServer, error) {
p := &proxyServer{ p := &proxyServer{
proxy: echo.New(),
dnsServer: "10.233.0.3:53", // default k8s dns service dnsServer: "10.233.0.3:53", // default k8s dns service
} }
return p, nil return p, nil
@@ -38,6 +37,18 @@ func NewProxyServer() (*proxyServer, error) {
func (p *proxyServer) Start() error { func (p *proxyServer) Start() error {
klog.Info("Starting intranet proxy server...") klog.Info("Starting intranet proxy server...")
if p.proxy != nil {
err := p.proxy.Close()
if err != nil {
klog.Error("close intranet proxy server error, ", err)
return err
}
p.proxy = nil
}
// closed echo proxy server cannot be restarted, so create a new one
p.proxy = echo.New()
config := middleware.DefaultProxyConfig config := middleware.DefaultProxyConfig
config.Balancer = p config.Balancer = p
config.Transport = p.initTransport() config.Transport = p.initTransport()
@@ -109,8 +120,12 @@ func (p *proxyServer) Start() error {
func (p *proxyServer) Close() error { func (p *proxyServer) Close() error {
if p.proxy != nil { if p.proxy != nil {
return p.proxy.Close() err := p.proxy.Close()
if err != nil {
klog.Error("close intranet proxy server error, ", err)
} }
}
p.proxy = nil
p.stopped = true p.stopped = true
return nil return nil
} }

View File

@@ -5,12 +5,14 @@ import (
"fmt" "fmt"
"os/exec" "os/exec"
"strings" "strings"
"time"
"github.com/beclab/Olares/daemon/internel/intranet" "github.com/beclab/Olares/daemon/internel/intranet"
"github.com/beclab/Olares/daemon/internel/watcher" "github.com/beclab/Olares/daemon/internel/watcher"
"github.com/beclab/Olares/daemon/pkg/cluster/state" "github.com/beclab/Olares/daemon/pkg/cluster/state"
"github.com/beclab/Olares/daemon/pkg/nets" "github.com/beclab/Olares/daemon/pkg/nets"
"github.com/beclab/Olares/daemon/pkg/utils" "github.com/beclab/Olares/daemon/pkg/utils"
"github.com/miekg/dns"
"github.com/vishvananda/netlink" "github.com/vishvananda/netlink"
"golang.org/x/sys/unix" "golang.org/x/sys/unix"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -181,6 +183,9 @@ func (w *applicationWatcher) loadServerConfig(ctx context.Context, nodeIp string
return options, nil return options, nil
} }
var adguardDnsPodIp string
var adguardHealth bool
func (w *applicationWatcher) loadDnsPodConfig(ctx context.Context, o *intranet.ServerOptions) error { func (w *applicationWatcher) loadDnsPodConfig(ctx context.Context, o *intranet.ServerOptions) error {
// try to find adguard dns pod ip and mac // try to find adguard dns pod ip and mac
k8sClient, err := utils.GetKubeClient() k8sClient, err := utils.GetKubeClient()
@@ -199,7 +204,36 @@ func (w *applicationWatcher) loadDnsPodConfig(ctx context.Context, o *intranet.S
const adguardDnsAppLabel = "applications.app.bytetrade.io/name" const adguardDnsAppLabel = "applications.app.bytetrade.io/name"
for _, pod := range dnsPods.Items { for _, pod := range dnsPods.Items {
switch { switch {
case pod.Labels[adguardDnsAppLabel] == "adguardhome", pod.Labels["k8s-app"] == "kube-dns": case pod.Labels[adguardDnsAppLabel] == "adguardhome":
dnsPodIp = pod.Status.PodIP
// try to connect adguard dns pod port 53 to verify it's running
if adguardDnsPodIp != dnsPodIp || !adguardHealth {
adguardDnsPodIp = dnsPodIp
err := checkHealth(dnsPodIp)
if err != nil {
klog.Warning("dial adguard dns pod tcp 53 error, ", err)
adguardHealth = false
} else {
adguardHealth = true
}
}
if adguardHealth {
dnsPodMac, calicoRouteIface, err = getPodNeighborInfo(dnsPodIp)
if err != nil {
klog.Error("get adguard dns pod mac by ip error, ", err)
return err
}
// found adguard dns pod
o.DnsPodIp = dnsPodIp
o.DnsPodMac = dnsPodMac
o.DnsPodCalicoIface = calicoRouteIface
return nil
}
case pod.Labels["k8s-app"] == "kube-dns":
dnsPodIp = pod.Status.PodIP dnsPodIp = pod.Status.PodIP
dnsPodMac, calicoRouteIface, err = getPodNeighborInfo(dnsPodIp) dnsPodMac, calicoRouteIface, err = getPodNeighborInfo(dnsPodIp)
if err != nil { if err != nil {
@@ -208,13 +242,7 @@ func (w *applicationWatcher) loadDnsPodConfig(ctx context.Context, o *intranet.S
} }
} }
if pod.Labels[adguardDnsAppLabel] == "adguardhome" { } // end for pods
o.DnsPodIp = dnsPodIp
o.DnsPodMac = dnsPodMac
o.DnsPodCalicoIface = calicoRouteIface
return nil
}
}
// not found adguard dns pod, but core dns pod exists // not found adguard dns pod, but core dns pod exists
if dnsPodIp != "" { if dnsPodIp != "" {
@@ -261,3 +289,15 @@ func getPodNeighborInfo(podIp string) (mac, iface string, err error) {
return "", "", fmt.Errorf("not found pod neighbor info for ip %s", podIp) return "", "", fmt.Errorf("not found pod neighbor info for ip %s", podIp)
} }
func checkHealth(server string) error {
c := new(dns.Client)
c.Timeout = time.Second
msg := new(dns.Msg)
msg.SetQuestion(dns.Fqdn("coredns.kube-system.svc.cluster.local."), dns.TypeA)
msg.RecursionDesired = true
_, _, err := c.Exchange(msg, server+":53")
return err
}