k8s 的admission webhook 部署在叢集外,如何建立ssl 檔案
阿新 • • 發佈:2021-01-19
技術標籤:k8sk8skubernetesdockerssl
背景
一般情況下,對於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有問題導致的