TRA-3903 better health endpoint for daemon mode (#471)

* Update main.go, status_controller.go, and 2 more files...

* Update status_controller.go and mizuTapperSyncer.go
This commit is contained in:
RamiBerm 2021-11-16 15:44:27 +02:00 committed by GitHub
parent 763f72a640
commit 89836d8d75
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 29 additions and 17 deletions

View File

@ -459,7 +459,7 @@ func startMizuTapperSyncer(ctx context.Context) (*kubernetes.MizuTapperSyncer, e
return return
} }
logger.Log.Fatalf("fatal tap syncer error: %v", syncerErr) logger.Log.Fatalf("fatal tap syncer error: %v", syncerErr)
case _, ok := <-tapperSyncer.TapPodChangesOut: case tapPodChangeEvent, ok := <-tapperSyncer.TapPodChangesOut:
if !ok { if !ok {
logger.Log.Debug("mizuTapperSyncer pod changes channel closed, ending listener loop") logger.Log.Debug("mizuTapperSyncer pod changes channel closed, ending listener loop")
return return
@ -472,6 +472,7 @@ func startMizuTapperSyncer(ctx context.Context) (*kubernetes.MizuTapperSyncer, e
} }
api.BroadcastToBrowserClients(serializedTapStatus) api.BroadcastToBrowserClients(serializedTapStatus)
providers.TapStatus.Pods = tapStatus.Pods providers.TapStatus.Pods = tapStatus.Pods
providers.ExpectedTapperAmount = tapPodChangeEvent.ExpectedTapperAmount
case <-ctx.Done(): case <-ctx.Done():
logger.Log.Debug("mizuTapperSyncer event listener loop exiting due to context done") logger.Log.Debug("mizuTapperSyncer event listener loop exiting due to context done")
return return

View File

@ -2,7 +2,9 @@ package controllers
import ( import (
"encoding/json" "encoding/json"
"fmt"
"mizuserver/pkg/api" "mizuserver/pkg/api"
"mizuserver/pkg/config"
"mizuserver/pkg/holder" "mizuserver/pkg/holder"
"mizuserver/pkg/providers" "mizuserver/pkg/providers"
"mizuserver/pkg/up9" "mizuserver/pkg/up9"
@ -15,6 +17,13 @@ import (
) )
func HealthCheck(c *gin.Context) { func HealthCheck(c *gin.Context) {
if config.Config.DaemonMode {
if providers.ExpectedTapperAmount != providers.TappersCount {
c.JSON(http.StatusInternalServerError, fmt.Sprintf("expecting more tappers than are actually connected (%d expected, %d connected)", providers.ExpectedTapperAmount, providers.TappersCount))
return
}
}
response := shared.HealthResponse{ response := shared.HealthResponse{
TapStatus: providers.TapStatus, TapStatus: providers.TapStatus,
TappersCount: providers.TappersCount, TappersCount: providers.TappersCount,

View File

@ -19,7 +19,7 @@ var (
TapStatus shared.TapStatus TapStatus shared.TapStatus
authStatus *models.AuthStatus authStatus *models.AuthStatus
RecentTLSLinks = cache.New(tlsLinkRetainmentTime, tlsLinkRetainmentTime) RecentTLSLinks = cache.New(tlsLinkRetainmentTime, tlsLinkRetainmentTime)
ExpectedTapperAmount = -1 //only relevant in daemon mode as cli manages tappers otherwise
tappersCountLock = sync.Mutex{} tappersCountLock = sync.Mutex{}
) )

View File

@ -16,18 +16,20 @@ import (
const updateTappersDelay = 5 * time.Second const updateTappersDelay = 5 * time.Second
type TappedPodChangeEvent struct { type TappedPodChangeEvent struct {
Added []core.Pod Added []core.Pod
Removed []core.Pod Removed []core.Pod
ExpectedTapperAmount int
} }
// MizuTapperSyncer uses a k8s pod watch to update tapper daemonsets when targeted pods are removed or created // MizuTapperSyncer uses a k8s pod watch to update tapper daemonsets when targeted pods are removed or created
type MizuTapperSyncer struct { type MizuTapperSyncer struct {
context context.Context context context.Context
CurrentlyTappedPods []core.Pod CurrentlyTappedPods []core.Pod
config TapperSyncerConfig config TapperSyncerConfig
kubernetesProvider *Provider kubernetesProvider *Provider
TapPodChangesOut chan TappedPodChangeEvent TapPodChangesOut chan TappedPodChangeEvent
ErrorOut chan K8sTapManagerError ErrorOut chan K8sTapManagerError
nodeToTappedPodIPMap map[string][]string
} }
type TapperSyncerConfig struct { type TapperSyncerConfig struct {
@ -160,9 +162,11 @@ func (tapperSyncer *MizuTapperSyncer) updateCurrentlyTappedPods() (err error, ch
} }
if len(addedPods) > 0 || len(removedPods) > 0 { if len(addedPods) > 0 || len(removedPods) > 0 {
tapperSyncer.CurrentlyTappedPods = podsToTap tapperSyncer.CurrentlyTappedPods = podsToTap
tapperSyncer.nodeToTappedPodIPMap = GetNodeHostToTappedPodIpsMap(tapperSyncer.CurrentlyTappedPods)
tapperSyncer.TapPodChangesOut <- TappedPodChangeEvent{ tapperSyncer.TapPodChangesOut <- TappedPodChangeEvent{
Added: addedPods, Added: addedPods,
Removed: removedPods, Removed: removedPods,
ExpectedTapperAmount: len(tapperSyncer.nodeToTappedPodIPMap),
} }
return nil, true return nil, true
} }
@ -171,9 +175,7 @@ func (tapperSyncer *MizuTapperSyncer) updateCurrentlyTappedPods() (err error, ch
} }
func (tapperSyncer *MizuTapperSyncer) updateMizuTappers() error { func (tapperSyncer *MizuTapperSyncer) updateMizuTappers() error {
nodeToTappedPodIPMap := GetNodeHostToTappedPodIpsMap(tapperSyncer.CurrentlyTappedPods) if len(tapperSyncer.nodeToTappedPodIPMap) > 0 {
if len(nodeToTappedPodIPMap) > 0 {
var serviceAccountName string var serviceAccountName string
if tapperSyncer.config.MizuServiceAccountExists { if tapperSyncer.config.MizuServiceAccountExists {
serviceAccountName = ServiceAccountName serviceAccountName = ServiceAccountName
@ -188,7 +190,7 @@ func (tapperSyncer *MizuTapperSyncer) updateMizuTappers() error {
tapperSyncer.config.AgentImage, tapperSyncer.config.AgentImage,
TapperPodName, TapperPodName,
fmt.Sprintf("%s.%s.svc.cluster.local", ApiServerPodName, tapperSyncer.config.MizuResourcesNamespace), fmt.Sprintf("%s.%s.svc.cluster.local", ApiServerPodName, tapperSyncer.config.MizuResourcesNamespace),
nodeToTappedPodIPMap, tapperSyncer.nodeToTappedPodIPMap,
serviceAccountName, serviceAccountName,
tapperSyncer.config.TapperResources, tapperSyncer.config.TapperResources,
tapperSyncer.config.ImagePullPolicy, tapperSyncer.config.ImagePullPolicy,
@ -197,7 +199,7 @@ func (tapperSyncer *MizuTapperSyncer) updateMizuTappers() error {
); err != nil { ); err != nil {
return err return err
} }
logger.Log.Debugf("Successfully created %v tappers", len(nodeToTappedPodIPMap)) logger.Log.Debugf("Successfully created %v tappers", len(tapperSyncer.nodeToTappedPodIPMap))
} else { } else {
if err := tapperSyncer.kubernetesProvider.RemoveDaemonSet(tapperSyncer.context, tapperSyncer.config.MizuResourcesNamespace, TapperDaemonSetName); err != nil { if err := tapperSyncer.kubernetesProvider.RemoveDaemonSet(tapperSyncer.context, tapperSyncer.config.MizuResourcesNamespace, TapperDaemonSetName); err != nil {
return err return err