k8s 的admission webhook 部署在集群外,如何创建ssl 文件
背景
一般情况下,对于webhook服务都是部署在k8s的集群内部的,但是我们这边有需要,需要部署在集群外面的物理机上,但是在MutatingWebhookConfiguration 里面只能配置https,所以需要自己签发证书。整个过程还是踩了坑。把过程记录下来。照着做肯定能成功。
安装cfssl
这个就不放具体的方法了,Google搜索一下。安装后执行一下命令 cfssl version 如果能正常显示如下,就代表安装好了
Version: 1.4.1
Runtime: go1.13.4
使用如下命令,照着做
- 创建ca-csr.json 文件, 根据自己的需求改
{
"CN": "webhook",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [{
"C": "CN",
"ST": "SHANGHAI",
"L": "SHANGHAI",
"O": "Kubernetes",
"OU": "Kubernetes-manual"
}]
}
- 创建webhook-csr.json 文件, 根据自己修改,
{
"CN": "webhook",
"hosts": [
"webhook.default.svc",
"test-a13-docker-60-98", # 你需要将webhook服务部署对应的物理机的host 或者ip
"localhost",
"kubernetes",
"kubernetes.default",
"kubernetes.default.svc",
"kubernetes.default.svc.cluster",
"kubernetes.default.svc.cluster.local"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [{
"C": "CN",
"ST": "SHANGHAI",
"L": "SHANGHAI",
"O": "Kubernetes",
"OU": "Kubernetes-manual"
}]
}
- 用cfssl 创建默认ca-config.json,执行命令如下。
cfssl print-defaults config > ca-config.json
- 用如下命令,生成ca ,根证书
cfssl gencert -initca ca-csr.json | cfssljson -bare ca
- 用如下命令,生成webhook 证书
cfssl gencert \
-ca=ca.pem \
-ca-key=ca-key.pem \
-config=ca-config.json \
-profile=www \
webhook-csr.json | cfssljson -bare webhook
- 所有的执行完的结果如下,可以参考一下
如果你发现你创建出来的结果和我的一致,那基本就没问题了,我们接下来讲一下,生成的文件用在什么地方。
TlsConfig 代码里面如果使用
- config.TlsCertFile 就是我们生成的webhook.pem 文件
- config.TlsPrivateKeyFile 就是我们生成的webhook-key.pem
func newWebhookServer(config *config.Config)(*webHookServer,error) {
tlsCertKey, err := tls.LoadX509KeyPair(config.TlsCertFile,config.TlsPrivateKeyFile)
if err != nil {
return nil,err
}
clientSet, err := GetKubernetesClient(config)
ws := &webHookServer{
server: &http.Server{
Addr: fmt.Sprintf(":%v",config.Port),
TLSConfig: &tls.Config{Certificates: []tls.Certificate{tlsCertKey}},
},
}
MutatingWebhookConfiguration 里面如何配置
如何获取caBundle,通过如下命令获取, 将ca.pem 文件进行base64的 encode
cat ca.pem | base64 | tr -d '\n'
kind: MutatingWebhookConfiguration
metadata:
name: mutating-webhook-nickname-cfg
labels:
app: nickname-webhook
webhooks:
- name: nickname.ximalaya.com
clientConfig:
url: "https://host:12105/mutating"
caBundle: "YourBundle"
rules:
- operations: [ "CREATE" ]
apiGroups: ["core",""]
apiVersions: ["v1"]
resources: ["pods"]
类似问题如何处理
理论上按照上面的流程规范执行,应该是准确无误的,一点可以跑起来。如果遇到有问题。可以看看是不是和下面的类似
查看kube-apiserver 的日志
x509: certificate specifies an incompatible key usage
这种问题是执行看第5条。选择profile的时候没选择对。profile对应的权限在default的ca-config.json里面
http: server gave HTTP response to HTTPS client
这种问题是你配置的webhook的端口或者ip有问题导致的
反正apiserver里面返回的x509的问题,都是和ssl 有关系。
版权声明:本文为qq_24210767原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。