cnych / qikqiak.com

关注 chatgpt、容器、kubernetes、devops、python、golang、微服务等技术 🎉🎉🎉
https://www.qikqiak.com
1.34k stars 347 forks source link

深入理解 Kubernetes Admission Webhook #110

Open cnych opened 5 years ago

cnych commented 5 years ago

https://www.qikqiak.com/post/k8s-admission-webhook/

Kubernetes 提供了需要扩展其内置功能的方法,最常用的可能是自定义资源类型和自定义控制器了,除此之外,Kubernetes 还有一些其他非常有趣的功能,比如 admission webhooks 或者 initializers,这些也可以用于扩展 API,它们可以用于修改某些 Kubernetes 资源的基本行为,接下来我们来看看那些引入了 admission webhooks 的动态准入控制。

XuHaoIgeneral commented 5 years ago

有一个疑问,认证的secret对象是长什么样子呢,没有istio,打算直接使用k8s创建时候的ca证书作为凭证,那么这个挂载secret是长什么样子呢。看官方文档说可以用其他方式进行认证,但是文档看得特别迷,没有见到过实体的demo,只有一个模糊的讲解。

xiongmaodada commented 5 years ago

你好, 文中的https://github.com/cnych/admission-webhook-example这demo怎么在golang中运行呢,依赖加载不通过

cnych commented 5 years ago

@xiongmaodada 这个里面现在是用的 dep 做依赖管理,更新依赖的时候里面有很多 kubernetes 的包,所以比较慢,而且很可能需要挂代理才可以~

Veitor commented 5 years ago

CA 证书应提供给 admission webhook 配置,这样 apiserver 才可以信任 webhook server 提供的 TLS 证书。因为我们上面已经使用 Kubernetes API 签署了证书,所以我们可以使用我们的 kubeconfig 中的 CA 证书来简化操作。

这句话有点看不懂,假设拿平常的浏览器-服务器来看待的话,apiServer作为客户端,apiServer通过TLS请求webhook server,那么apiServer应该会得到webhook server返回的CA证书是吧?所以apiServer需要有一个CA根证书(浏览器操作系统都是预先内置的CA根证书,所以不需要我们去配置)去验证得到的这个证书的真实性和有效性,所以这里的CA_BUNDLE就类似于CA根证书是吗?为了验证webhook server证书的有效性的?

而我们kubeconfig中的CA证书其实也是k8s API签署的,所以同样可以作为apiserver请求webhook server时的CA根证书是这个意思吗?

silenceli commented 5 years ago

创建 sleep.yaml 拦不住,

webhook deployment 的 pod 会报这个错误:

2019/10/25 09:33:01 http: TLS handshake error from 10.244.0.0:10131: remote error: tls: bad certificate
addozhang commented 4 years ago

@silenceli 创建 sleep.yaml 拦不住,

webhook deployment 的 pod 会报这个错误:

2019/10/25 09:33:01 http: TLS handshake error from 10.244.0.0:10131: remote error: tls: bad certificate

这种就是 caBundle 的问题了

Ghostwritten commented 3 years ago
  1. 希望加一步:kubectl create serviceaccount admission-webhook-example-sa,这样才能确认webhook pod正常启动;
  2. export CA_BUNDLE=$(kubectl config view --raw --flatten -o json | jq -r '.clusters[] | select(.name == "'$(kubectl config current-context)'") | .cluster."certificate-authority-data"') ,没有匹配到,可能是我的集群环境不同,kubectl config current-context返回是kubernetes-admin@kubernetes,而不是kubernetes,但是export CA_BUNDLE=$(kubectl config view --raw --flatten -o json | jq -r '.clusters[] | .cluster."certificate-authority-data"')解决了这个问题。
zvier commented 3 years ago

这个博客模版不错,想知道下模版链接?

cnych commented 3 years ago

@Ghostwritten 嗯,这个证书生成脚本在新版本中好像有问题,现在我是直接用 openssl 或者 cfssl 工具生成的,这样也可以,可以参考最新的博客文章哈~

cnych commented 3 years ago

@zvier https://github.com/cnych/qikqiak.com

wxuedong commented 3 years ago

问题:http: TLS handshake error from 10.244.0.0:10131: remote error: tls: bad certificate caBundle 的问题 ,
cat ./deployment/validatingwebhook.yaml | ./deployment/webhook-patch-ca-bundle.sh > ./deployment/validatingwebhook-ca-bundle.yaml 查看生成 ./deployment/validatingwebhook-ca-bundle.yaml./deployment/mutatingwebhook-ca-bundle.yaml 替换的 ${CA_BUNDLE} 为空 解决办法:webhook-patch-ca-bundle.sh 换成以下内容

#!/bin/bash

set -o errexit
set -o nounset
set -o pipefail

CA_BUNDLE=$(kubectl config view --raw --minify --flatten -o jsonpath='{.clusters[].cluster.certificate-authority-data}')

if [ -z "${CA_BUNDLE}" ]; then
    CA_BUNDLE=$(kubectl get secrets -o jsonpath="{.items[?(@.metadata.annotations['kubernetes\.io/service-account\.name']=='default')].data.ca\.crt}")
fi

export CA_BUNDLE

if command -v envsubst >/dev/null 2>&1; then
    envsubst
else
    sed -e "s|\${CA_BUNDLE}|${CA_BUNDLE}|g"
fi

重新执行 cat ./deployment/validatingwebhook.yaml | ./deployment/webhook-patch-ca-bundle.sh > ./deployment/validatingwebhook-ca-bundle.yaml cat ./deployment/mutatingwebhook.yaml | ./deployment/webhook-patch-ca-bundle.sh > ./deployment/mutatingwebhook-ca-bundle.yaml

Wenshiqi222 commented 3 years ago

你好,请问如何利用 admission webhook 来进行容器时钟time zone的配置呢?原先都是用pod presets来配置的

addozhang commented 3 years ago

你好,请问如何利用 admission webhook 来进行容器时钟time zone的配置呢?原先都是用pod presets来配置的

可以拦截 pod 创建,增加时区的环境变量吧?

cnych commented 3 years ago

@addozhang 当然可以

Meteriox commented 3 years ago

问下,我部署了webhook之后,只能在webhook所在的namespace下,相应规则才会生效嘛,还是所有的namespace都会生效?