在 Golang 应用程序中,可以使用以下方法来实现容器健康检查和服务可用性:
- HTTP 接口健康检查
HTTP 接口是最常见的容器健康检查方式之一。您可以在应用程序中添加一个简单的 /healthz 接口来提供健康状态信息。
示例代码如下:
package main
import (
"fmt"
"net/http"
)
func main() {
http.HandleFunc("/healthz", func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)
w.Write([]byte("OK"))
})
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Hello World!"))
})
if err := http.ListenAndServe(":8080", nil); err != nil {
fmt.Println(err)
}
}
在上面的示例中,我们添加了一个 /healthz 接口来返回 200 OK 状态码和 “OK” 字符串表示应用程序正常运行。当 Kubernetes 发现该容器的该接口返回非 200 的 HTTP 状态码时,将会认为该容器不健康并重启该容器或者 Pod。
- TCP Socket 健康检查
除了 HTTP 接口外,还可以通过监听一个 TCP 端口来进行健康检查。这种方式要求 Kubernetes 配置 livenessProbe 和 readinessProbe 分别使用 TCP socket 进行探测。
示例代码如下:
package main
import (
"fmt"
"net"
)
func main() {
l, err := net.Listen("tcp", ":8080")
if err != nil {
fmt.Println(err)
}
defer l.Close()
for {
conn, err := l.Accept()
if err != nil {
fmt.Println(err)
continue
}
go func(c net.Conn) {
c.Write([]byte("OK\n"))
c.Close()
}(conn)
}
}
在上面的示例中,我们监听 8080 端口并返回 “OK” 字符串表示容器健康。当 Kubernetes 发现该容器的 TCP Socket 不可用时,将会认为该容器不健康并重启该容器或者 Pod。
需要注意的是,在使用 TCP Socket 进行健康检查时,需要确保应用程序在启动后尽快开始监听端口,并且能够正确响应连接请求。否则 Kubernetes 将无法正常进行健康检查。




