<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://tech.uvoo.io/index.php?action=history&amp;feed=atom&amp;title=K8s_monitor_namespace_pd</id>
	<title>K8s monitor namespace pd - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://tech.uvoo.io/index.php?action=history&amp;feed=atom&amp;title=K8s_monitor_namespace_pd"/>
	<link rel="alternate" type="text/html" href="https://tech.uvoo.io/index.php?title=K8s_monitor_namespace_pd&amp;action=history"/>
	<updated>2026-04-19T17:34:25Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.35.2</generator>
	<entry>
		<id>https://tech.uvoo.io/index.php?title=K8s_monitor_namespace_pd&amp;diff=5493&amp;oldid=prev</id>
		<title>Busk: Created page with &quot;``` # Use Golang as the base image FROM golang:1.20 AS builder  # Set working directory WORKDIR /app  # Copy Go modules and download dependencies COPY go.mod go.sum ./ RUN go...&quot;</title>
		<link rel="alternate" type="text/html" href="https://tech.uvoo.io/index.php?title=K8s_monitor_namespace_pd&amp;diff=5493&amp;oldid=prev"/>
		<updated>2025-01-29T10:57:01Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;``` # Use Golang as the base image FROM golang:1.20 AS builder  # Set working directory WORKDIR /app  # Copy Go modules and download dependencies COPY go.mod go.sum ./ RUN go...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;```&lt;br /&gt;
# Use Golang as the base image&lt;br /&gt;
FROM golang:1.20 AS builder&lt;br /&gt;
&lt;br /&gt;
# Set working directory&lt;br /&gt;
WORKDIR /app&lt;br /&gt;
&lt;br /&gt;
# Copy Go modules and download dependencies&lt;br /&gt;
COPY go.mod go.sum ./&lt;br /&gt;
RUN go mod download&lt;br /&gt;
&lt;br /&gt;
# Copy the rest of the application code&lt;br /&gt;
COPY . .&lt;br /&gt;
&lt;br /&gt;
# Build the Go binary&lt;br /&gt;
RUN go build -o health-checker main.go&lt;br /&gt;
&lt;br /&gt;
# Use a minimal base image&lt;br /&gt;
FROM alpine:latest&lt;br /&gt;
&lt;br /&gt;
# Install required dependencies&lt;br /&gt;
RUN apk --no-cache add ca-certificates&lt;br /&gt;
&lt;br /&gt;
# Set working directory&lt;br /&gt;
WORKDIR /root/&lt;br /&gt;
&lt;br /&gt;
# Copy the built binary from the builder stage&lt;br /&gt;
COPY --from=builder /app/health-checker .&lt;br /&gt;
&lt;br /&gt;
# Run the application&lt;br /&gt;
CMD [&amp;quot;./health-checker&amp;quot;]&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
# Go&lt;br /&gt;
```&lt;br /&gt;
package main&lt;br /&gt;
&lt;br /&gt;
import (&lt;br /&gt;
	&amp;quot;context&amp;quot;&lt;br /&gt;
	&amp;quot;encoding/json&amp;quot;&lt;br /&gt;
	&amp;quot;fmt&amp;quot;&lt;br /&gt;
	&amp;quot;log&amp;quot;&lt;br /&gt;
	&amp;quot;net/http&amp;quot;&lt;br /&gt;
	&amp;quot;os&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	&amp;quot;k8s.io/client-go/kubernetes&amp;quot;&lt;br /&gt;
	&amp;quot;k8s.io/client-go/rest&amp;quot;&lt;br /&gt;
	metav1 &amp;quot;k8s.io/apimachinery/pkg/apis/meta/v1&amp;quot;&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
const pagerDutyURL = &amp;quot;https://events.pagerduty.com/v2/enqueue&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// PagerDuty event payload&lt;br /&gt;
type PagerDutyEvent struct {&lt;br /&gt;
	RoutingKey  string `json:&amp;quot;routing_key&amp;quot;`&lt;br /&gt;
	EventAction string `json:&amp;quot;event_action&amp;quot;`&lt;br /&gt;
	Payload     struct {&lt;br /&gt;
		Summary   string `json:&amp;quot;summary&amp;quot;`&lt;br /&gt;
		Severity  string `json:&amp;quot;severity&amp;quot;`&lt;br /&gt;
		Source    string `json:&amp;quot;source&amp;quot;`&lt;br /&gt;
		Component string `json:&amp;quot;component&amp;quot;`&lt;br /&gt;
	} `json:&amp;quot;payload&amp;quot;`&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Send alert to PagerDuty&lt;br /&gt;
func sendPagerDutyAlert(nodeName string) {&lt;br /&gt;
	pdKey := os.Getenv(&amp;quot;PAGERDUTY_KEY&amp;quot;)&lt;br /&gt;
	if pdKey == &amp;quot;&amp;quot; {&lt;br /&gt;
		log.Println(&amp;quot;PagerDuty API key not set&amp;quot;)&lt;br /&gt;
		return&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	event := PagerDutyEvent{&lt;br /&gt;
		RoutingKey:  pdKey,&lt;br /&gt;
		EventAction: &amp;quot;trigger&amp;quot;,&lt;br /&gt;
	}&lt;br /&gt;
	event.Payload.Summary = fmt.Sprintf(&amp;quot;Node %s is unhealthy&amp;quot;, nodeName)&lt;br /&gt;
	event.Payload.Severity = &amp;quot;critical&amp;quot;&lt;br /&gt;
	event.Payload.Source = &amp;quot;Kubernetes&amp;quot;&lt;br /&gt;
	event.Payload.Component = nodeName&lt;br /&gt;
&lt;br /&gt;
	data, err := json.Marshal(event)&lt;br /&gt;
	if err != nil {&lt;br /&gt;
		log.Printf(&amp;quot;Error marshaling JSON: %v\n&amp;quot;, err)&lt;br /&gt;
		return&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	resp, err := http.Post(pagerDutyURL, &amp;quot;application/json&amp;quot;, bytes.NewBuffer(data))&lt;br /&gt;
	if err != nil {&lt;br /&gt;
		log.Printf(&amp;quot;Error sending alert to PagerDuty: %v\n&amp;quot;, err)&lt;br /&gt;
		return&lt;br /&gt;
	}&lt;br /&gt;
	defer resp.Body.Close()&lt;br /&gt;
&lt;br /&gt;
	log.Println(&amp;quot;PagerDuty alert sent successfully&amp;quot;)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Check Kubernetes node health&lt;br /&gt;
func checkNodeHealth() {&lt;br /&gt;
	config, err := rest.InClusterConfig()&lt;br /&gt;
	if err != nil {&lt;br /&gt;
		log.Fatalf(&amp;quot;Error getting Kubernetes config: %v\n&amp;quot;, err)&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	clientset, err := kubernetes.NewForConfig(config)&lt;br /&gt;
	if err != nil {&lt;br /&gt;
		log.Fatalf(&amp;quot;Error creating Kubernetes client: %v\n&amp;quot;, err)&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	nodes, err := clientset.CoreV1().Nodes().List(context.TODO(), metav1.ListOptions{})&lt;br /&gt;
	if err != nil {&lt;br /&gt;
		log.Fatalf(&amp;quot;Error listing nodes: %v\n&amp;quot;, err)&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	for _, node := range nodes.Items {&lt;br /&gt;
		for _, condition := range node.Status.Conditions {&lt;br /&gt;
			if condition.Type == &amp;quot;Ready&amp;quot; &amp;amp;&amp;amp; condition.Status != &amp;quot;True&amp;quot; {&lt;br /&gt;
				log.Printf(&amp;quot;Node %s is unhealthy\n&amp;quot;, node.Name)&lt;br /&gt;
				sendPagerDutyAlert(node.Name)&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
func main() {&lt;br /&gt;
	for {&lt;br /&gt;
		checkNodeHealth()&lt;br /&gt;
		// Sleep before checking again&lt;br /&gt;
		time.Sleep(60 * time.Second)&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
```&lt;/div&gt;</summary>
		<author><name>Busk</name></author>
	</entry>
</feed>