k8s 的admission webhook 部署在集群外,如何创建ssl 文件

背景

一般情况下,对于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 有关系。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值