【发布时间】:2021-06-06 03:33:35
【问题描述】:
在 minikube 中,API 服务器无法连接到我的审核日志 webhook,我在 api-server 日志中看到以下错误
E0308 08:30:26.457841 1 metrics.go:109] Error in audit plugin 'webhook' affecting 400 audit events: Post "http://ca-audit.armo-system:8888/": dial tcp: lookup ca-audit.armo-system on 10.42.4.254:53: no such host
我不知道为什么 api-server 连接到 10.42.4.254:53,因为我的服务 ip 不同:
$ kubectl -n armo-system get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ca-audit ClusterIP 10.109.132.114 <none> 8888/TCP 8m33s
我不明白我做错了什么,有什么建议吗?
这就是我配置审计策略、webhook 和 minikube 的方式-
我预先配置了我的 minikube 如下:
# Create the webhook config and audit policy
export C_CONTEXT=$(kubectl config current-context)
export C_NAME=$(kubectl config get-contexts ${C_CONTEXT} --no-headers | awk '{print $2}')
export C_CLUSTER=$(kubectl config get-contexts ${C_CONTEXT} --no-headers | awk '{print $3}')
export C_USER=$(kubectl config get-contexts ${C_CONTEXT} --no-headers | awk '{print $4}')
export ARMO_NAMESPACE="armo-system"
export ARMO_AUDIT_SERVICE="ca-audit"
export ARMO_AUDIT_PORT=8888
mkdir -p ~/.minikube/files/etc/ssl/certs
cat <<EOF > ~/.minikube/files/etc/ssl/certs/audit-webhook.yaml
{
"apiVersion": "v1",
"clusters": [
{
"cluster": {
"server": "http://${ARMO_AUDIT_SERVICE}.${ARMO_NAMESPACE}:${ARMO_AUDIT_PORT}/"
},
"name": "${C_NAME}"
}
],
"contexts": [
{
"context": {
"cluster": "${C_CLUSTER}",
"user": "${C_USER}"
},
"name": "${C_NAME}"
}
],
"current-context": "${C_CONTEXT}",
"kind": "Config",
"preferences": {},
"users": []
}
EOF
cat <<EOF > ~/.minikube/files/etc/ssl/certs/audit-policy.yaml
{
"apiVersion": "audit.k8s.io/v1",
"kind": "Policy",
"rules": [
{
"level": "Metadata"
}
]
}
EOF
# Copy the audit policy to `/etc/ssl/certs/.`
sudo cp ~/.minikube/files/etc/ssl/certs/audit-policy.yaml ~/.minikube/files/etc/ssl/certs/audit-webhook.yaml /etc/ssl/certs/.
# Start the minikube, add the flags `--extra-config=apiserver.audit-policy-file=/etc/ssl/certs/audit-policy.yaml`, `--extra-config=apiserver.audit-webhook-config-file=/etc/ssl/certs/audit-webhook.yaml`
sudo -E minikube start --vm-driver=none --extra-config=apiserver.audit-policy-file=/etc/ssl/certs/audit-policy.yaml --extra-config=apiserver.audit-webhook-config-file=/etc/ssl/certs/audit-webhook.yaml
现在我的 minikube 已经启动并运行了,我创建了命名空间、服务和 webhook 部署:
cat <<EOF | kubectl apply -f -
---
apiVersion: v1
kind: Namespace
metadata:
name: ${ARMO_NAMESPACE}
---
kind: Service
apiVersion: v1
metadata:
labels:
app: ${ARMO_AUDIT_SERVICE}
name: ${ARMO_AUDIT_SERVICE}
namespace: ${ARMO_NAMESPACE}
spec:
ports:
- port: ${ARMO_AUDIT_PORT}
targetPort: ${ARMO_AUDIT_PORT}
protocol: TCP
selector:
app: ${ARMO_AUDIT_SERVICE}
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: ${ARMO_AUDIT_SERVICE}
namespace: ${ARMO_NAMESPACE}
labels:
app: ${ARMO_AUDIT_SERVICE}
spec:
selector:
matchLabels:
app: ${ARMO_AUDIT_SERVICE}
replicas: 1
template:
metadata:
labels:
app: ${ARMO_AUDIT_SERVICE}
spec:
containers:
- name: ${ARMO_AUDIT_SERVICE}
image: quay.io/armosec/k8s-ca-auditlog-ubi:dummy
imagePullPolicy: Always
env:
- name: ARMO_AUDIT_PORT
value: "${ARMO_AUDIT_PORT}"
ports:
- containerPort: ${ARMO_AUDIT_PORT}
name: ${ARMO_AUDIT_SERVICE}
EOF
webhook 图片代码(quay.io/armosec/k8s-ca-auditlog-ubi:dummy)如下:
package main
import (
"encoding/json"
"flag"
"fmt"
"net/http"
"os"
"k8s.io/apiserver/pkg/apis/audit"
"github.com/golang/glog"
)
func main() {
flag.Parse()
flag.Set("alsologtostderr", "1") // display logs in stdout
InitServer()
}
// InitServer - Initialize webhook listener
func InitServer() {
port, ok := os.LookupEnv("ARMO_AUDIT_PORT")
if !ok {
port = "8888"
}
glog.Infof("Webhook listening on port: %s, path: %s", port, "/")
http.HandleFunc("/", HandleRequest)
glog.Fatal(http.ListenAndServe(fmt.Sprintf(":%s", port), nil))
}
//HandleRequest -
func HandleRequest(w http.ResponseWriter, req *http.Request) {
eventList := audit.EventList{}
err := json.NewDecoder(req.Body).Decode(&eventList)
if err != nil {
e := fmt.Errorf("failed parsing api-server request, reason: %s", err.Error())
glog.Errorf(e.Error())
http.Error(w, e.Error(), http.StatusBadRequest)
return
}
glog.Infof("webhook received audit list, len: %d", len(eventList.Items))
for _, event := range eventList.Items {
bEvent, _ := json.Marshal(event)
glog.Infof("Received event: %s", string(bEvent))
}
w.WriteHeader(http.StatusOK)
}
【问题讨论】:
-
端口 53 通常用于 DNS。您的错误消息是说它无法通过位于 10.42.4.254:53 的 DNS 找到“ca-audit.armo-system”。检查你的 kube-dns 配置,看看你最后是否需要“.svc”或“.svc.cluster.local”或类似的文件
-
谢谢,我尝试了这两个选项,但都没有帮助。这是一个 DNS 问题,但我不知道什么是正确的解决方案 - 其他开发人员如何设置 auditlog webhook?
标签: kubernetes webhooks audit