1. 程式人生 > 其它 >k8s 的admission webhook 部署在叢集外,如何建立ssl 檔案

k8s 的admission webhook 部署在叢集外,如何建立ssl 檔案

技術標籤:k8sk8skubernetesdockerssl

背景

一般情況下,對於webhook服務都是部署在k8s的叢集內部的,但是我們這邊有需要,需要部署在叢集外面的物理機上,但是在MutatingWebhookConfiguration 裡面只能配置https,所以需要自己簽發證書。整個過程還是踩了坑。把過程記錄下來。照著做肯定能成功。

安裝cfssl

這個就不放具體的方法了,Google搜尋一下。安裝後執行一下命令 cfssl version 如果能正常顯示如下,就代表安裝好了

Version: 1.4.1
Runtime: go1.13.4

使用如下命令,照著做

  1. 建立ca-csr.json 檔案, 根據自己的需求改
{
    "CN": "webhook",
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [{
        "C": "CN",
        "ST": "SHANGHAI",
        "L": "SHANGHAI"
, "O": "Kubernetes", "OU": "Kubernetes-manual" }] }
  1. 建立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" }] }
  1. 用cfssl 建立預設ca-config.json,執行命令如下。
 cfssl print-defaults config > ca-config.json
  1. 用如下命令,生成ca ,根證書
cfssl gencert -initca ca-csr.json | cfssljson -bare ca
  1. 用如下命令,生成webhook 證書
cfssl gencert \
  -ca=ca.pem \
  -ca-key=ca-key.pem \
  -config=ca-config.json \
  -profile=www \
  webhook-csr.json | cfssljson -bare webhook
  1. 所有的執行完的結果如下,可以參考一下
    在這裡插入圖片描述
    如果你發現你創建出來的結果和我的一致,那基本就沒問題了,我們接下來講一下,生成的檔案用在什麼地方。

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 有關係。