前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Kubebuilder Webhook 开发之创建 TLS 证书

Kubebuilder Webhook 开发之创建 TLS 证书

原创
作者头像
blazehu
发布于 2022-08-16 09:22:47
发布于 2022-08-16 09:22:47
2K0
举报
文章被收录于专栏:小千世界小千世界

在编写一个准入 Webhook 服务时,需要配置相关证书,k8s 提供了 api 用于对用户自主创建的证书进行认证签发。以下部分演示为 Webhook 服务创建 TLS 证书。

创建 TLS 证书

创建你的证书

通过运行以下命令生成私钥:

代码语言:shell
AI代码解释
复制
cat <<EOF | cfssl genkey - | cfssljson -bare server
{
  "hosts": [
    "my-svc.my-namespace.svc.cluster.local",
    "my-pod.my-namespace.pod.cluster.local",
    "192.0.2.24",
    "10.0.34.2"
  ],
  "CN": "my-pod.my-namespace.pod.cluster.local",
  "key": {
    "algo": "ecdsa",
    "size": 256
  }
}
EOF

此命令生成两个文件;它生成包含 PEM 编码 PKCS#10 证书请求的 server.csr, 以及 PEM 编码密钥的 server-key.pem,用于待生成的证书。

创建证书签名请求(CSR)
代码语言:shell
AI代码解释
复制
cat <<EOF | kubectl apply -f -
apiVersion: certificates.k8s.io/v1beta1
kind: CertificateSigningRequest
metadata:
  name: example
spec:
  request: $(cat server.csr | base64 | tr -d '\n')
  usages:
  - digital signature
  - key encipherment
  - server auth
EOF

你能看到的输出类似于:

代码语言:shell
AI代码解释
复制
certificatesigningrequest.certificates.k8s.io/example created

Warning: certificates.k8s.io/v1beta1 CertificateSigningRequest is deprecated in v1.19+, unavailable in v1.22+; use certificates.k8s.io/v1 CertificateSigningRequest

CSR 处于 Pending 状态。执行下面的命令你将可以看到:

代码语言:shell
AI代码解释
复制
kubectl get csr
代码语言:shell
AI代码解释
复制
NAME      AGE   SIGNERNAME                     REQUESTOR                 CONDITION
example   17s   kubernetes.io/legacy-unknown   100015926370-1650441195   Pending
批准证书签名请求(CSR)
代码语言:shell
AI代码解释
复制
kubectl certificate approve example
代码语言:shell
AI代码解释
复制
certificatesigningrequest.certificates.k8s.io/example approved

你现在应该能看到如下输出:

代码语言:shell
AI代码解释
复制
kubectl get csr
代码语言:shell
AI代码解释
复制
NAME      AGE    SIGNERNAME                     REQUESTOR                 CONDITION
example   5m4s   kubernetes.io/legacy-unknown   100015926370-1650441195   Approved,Issued
下载证书并使用它
代码语言:shell
AI代码解释
复制
kubectl get csr example -o jsonpath='{.status.certificate}' | base64 --decode > server.crt

现在你可以将 server.crtserver-key.pem 作为你的服务的 https 认证了。

例如 kubebuilder 中使用 TLS 证书,将 server.crtserver-key.pem 放在 cert 目录中并修改名称为 tls.crttls.key,然后指定证书目录:

代码语言:go
AI代码解释
复制
mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{
		Scheme:                 scheme,
		MetricsBindAddress:     metricsAddr,
		Port:                   9443,
		HealthProbeBindAddress: probeAddr,
		LeaderElection:         enableLeaderElection,
		LeaderElectionID:       "27e1b0af.blazehu.com",
		CertDir:                "./cert/",
	})

从 v1beta1 迁移到 v1

上述例子使用 certificates.k8s.io/v1beta1 API 版本的 CertificateSigningRequest 不在 v1.22 版本中继续提供。官方迁移指南点这里。 我们可以使用 certificates.k8s.io/v1 API 版本,此 API 从 v1.19 版本开始可用。

  • certificates.k8s.io/v1 中需要额外注意的变更:
    • 对于请求证书的 API 客户端而言:
      • spec.signerName 现在变成必需字段(参阅 已知的 Kubernetes 签署者), 并且通过 certificates.k8s.io/v1 API 不可以创建签署者为 kubernetes.io/legacy-unknown 的请求
      • spec.usages 现在变成必需字段,其中不可以包含重复的字符串值, 并且只能包含已知的用法字符串
创建你的证书

通过运行以下命令生成私钥:

代码语言:shell
AI代码解释
复制
cat <<EOF | cfssl genkey - | cfssljson -bare server
{
  "hosts": [
    "my-svc.my-namespace.svc.cluster.local",
    "my-pod.my-namespace.pod.cluster.local",
    "192.0.2.24",
    "10.0.34.2"
  ],
  "CN": "my-pod.my-namespace.pod.cluster.local",
  "key": {
    "algo": "ecdsa",
    "size": 256
  }
}
EOF
创建证书签名请求(CSR)

这里 csr signerName 不能是 kubernetes.io/legacy-unknown,演示我们随便指定一个为 example.com/serving,v1beta1 版本默认是 kubernetes.io/legacy-unknown

代码语言:shell
AI代码解释
复制
cat <<EOF | kubectl apply -f -
apiVersion: certificates.k8s.io/v1
kind: CertificateSigningRequest
metadata:
  name: example
spec:
  request: $(cat server.csr | base64 | tr -d '\n')
  signerName: example.com/serving
  usages:
  - digital signature
  - key encipherment
  - server auth
EOF
批准证书签名请求(CSR)
代码语言:shell
AI代码解释
复制
kubectl certificate approve example
代码语言:shell
AI代码解释
复制
certificatesigningrequest.certificates.k8s.io/example approved

你现在应该能看到如下输出:

代码语言:shell
AI代码解释
复制
kubectl get csr
代码语言:shell
AI代码解释
复制
NAME      AGE   SIGNERNAME            REQUESTOR                 CONDITION
example   11s   example.com/serving   100015926370-1650441195   Approved

这里可以看到证书请求已被批准,但是没有自动签名,正在等待请求的签名者对其签名。

签名证书签名请求(CSR)

我们扮演证书签署者的角色,颁发证书并将其上传到 API 服务器。

创建证书颁发机构

通过运行以下命令创建签名证书:

代码语言:shell
AI代码解释
复制
cat <<EOF | cfssl gencert -initca - | cfssljson -bare ca
{
  "CN": "example.com/serving",
  "key": {
    "algo": "rsa",
    "size": 2048
  }
}
EOF

这会产生一个证书颁发机构密钥文件(ca-key.pem)和证书(ca.pem)。

颁发证书

创建文件 server-signing-config.json 内容如下:

代码语言:json
AI代码解释
复制
{
  "signing": {
    "default": {
      "usages": [
        "digital signature",
        "key encipherment",
        "server auth"
      ],
      "expiry": "876000h",
      "ca_constraint": {
        "is_ca": false
      }
    }
  }
}

使用 server-signing-config.json 签名配置、证书颁发机构密钥文件和证书来签署证书请求:

代码语言:shell
AI代码解释
复制
kubectl get csr example -o jsonpath='{.spec.request}' | \
  base64 --decode | \
  cfssl sign -ca ca.pem -ca-key ca-key.pem -config server-signing-config.json - | \
  cfssljson -bare ca-signed-server

这会生成一个签名的服务证书文件,ca-signed-server.pem

上传签名证书
代码语言:shell
AI代码解释
复制
kubectl get csr example -o json | \
  jq '.status.certificate = "'$(base64 ca-signed-server.pem | tr -d '\n')'"' | \
  kubectl replace --raw /apis/certificates.k8s.io/v1/certificatesigningrequests/example/status -f -

批准 CSR 并上传签名证书后,你现在应该能看到如下输出:

代码语言:shell
AI代码解释
复制
kubectl get csr
代码语言:shell
AI代码解释
复制
NAME      AGE   SIGNERNAME            REQUESTOR                 CONDITION
example   10m   example.com/serving   100015926370-1650441195   Approved,Issued

这是你可以正常下载证书并使用它了。

参考文档

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Kubernetes关于CSR
引子: 今天一个小伙伴问我kuberntes集群中kubectl get csr怎么没有输出呢? 我试了一下我集群内确实没有csr的。what is csr?为什么kubectl get csr一定要
对你无可奈何
2022/04/12
1.7K0
02-创建 TLS CA证书及密钥
本文档记录自己的学习历程! 创建 TLS CA证书及密钥 kubernetes 系统的各组件需要使用 TLS 证书对通信进行加密,本文档使用 CloudFlare 的 PKI 工具集 cfssl 来生成 Certificate Authority (CA) 和其它证书; 生成的 CA 证书和秘钥文件如下: ca-key.pem ca.pem kubernetes-key.pem kubernetes.pem kube-proxy.pem kube-proxy-key.pem admin.pem admin-
程序员同行者
2018/07/03
1.4K0
K8s Pod 创建埋点处理(Mutating Admission Webhook)
对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停息。所有其它的路都是不完整的,是人的逃避方式,是对大众理想的懦弱回归,是随波逐流,是对内心的恐惧 ——赫尔曼·黑塞《德米安》
山河已无恙
2023/11/27
6350
K8s Pod 创建埋点处理(Mutating  Admission Webhook)
19-Kubernetes进阶之学习企业实践扩充记录
描述: 通常在集群安装完成后,我们需要对其设置持久卷、网络存储等插件, 除此之外我们还需安装metrics-server以便于获取Node与Pod相关资源消耗等信息,否则你在执行kubectl top命令时会提示error: Metrics API not available, 所以本小节将针对Metrics-server的安装进行讲解。
全栈工程师修炼指南
2022/09/29
1.1K0
19-Kubernetes进阶之学习企业实践扩充记录
第五篇(二进制部署k8s集群---node节点部署)
本文在以下主机上操作部署k8s node k8s-node1:192.168.206.41 k8s-node2:192.168.206.42 k8s-node3:192.168.206.43
@凌晨
2020/11/23
9960
k8s如何加入TLS安全访问,技术发烧友为你探路
作者简介 以前外部访问k8s里的服务,都是直接以http方式进行的,缺少TLS安全,今天给大家详细分析一下怎么为k8s加TLS安全访问。 生成并信任自签名证书 首先这里生成自签名的服务器证书,官方介绍了 easyrsa, openssl 、 cfssl三个工具,这里使用 cfssl。 brew install -y cfssl# 生成默认配置文件cfssl print-defaults config > config.jsoncfssl print-defaults csr > csr.json#
腾讯云TStack
2018/08/30
3.4K0
k8s如何加入TLS安全访问,技术发烧友为你探路
03 . 二进制部署kubernetes1.18.4
简介 目前生产部署kubernetes集群主要两种方式 kubeadm Kubeadm是一个K8s部署工具,提供kubeadm init和kubeadm join,用于快速部署Kubernetes集群。 二进制包 从github下载发行版的二进制包,手动部署每个组件,组成Kubernetes集群。 Kubeadm降低部署门槛,但屏蔽了很多细节,遇到问题很难排查。如果想更容易可控,推荐使用二进制包部署Kubernetes集群,虽然手动部署麻烦点,期间可以学习很多工作原理,也利于后期维护。 二进制
iginkgo18
2020/09/27
5400
03 . 二进制部署kubernetes1.18.4
编写一个k8s的webhook来实现deployment的拦截
Admission Webhook Admission Webhook 是 api-server 对外提供的一个扩展能力,api-server 作为 kub
机械视角
2022/03/26
6.6K1
编写一个k8s的webhook来实现deployment的拦截
Kubernetes 1.8.6 集群部署–创建证书(二)
以下操作都在 master 节点即 192.168.161.161 上执行,证书只需要创建一次即可,以后在向集群中添加新节点时只要将 /etc/kubernetes/ 目录下的证书拷贝到新节点上即可
老七Linux
2018/05/13
1.9K1
Kubernetes 1.8.6 集群部署–创建证书(二)
二进制部署k8s教程16 - 部署kubelet[TLS引导方式]
(https://kubernetes.io/zh-cn/docs/reference/access-authn-authz/bootstrap-tokens/)
janrs.com
2023/03/08
5480
kubernetes(七) 二进制部署k8s(1.18.4版本)
Etcd 是一个分布式键值存储系统,Kubernetes使用Etcd进行数据存储,所以先准备一个Etcd数据库, 为解决Etcd单点故障,应采用集群方式部署,这里使用3台组建集群,可容忍1台机器故障,当然,你也 可以使用5台组建集群,可容忍2台机器故障。
alexhuiwang
2020/09/23
8720
kubernetes(七) 二进制部署k8s(1.18.4版本)
SSL与TLS协议原理与证书签名多种生成方式实践指南
原文地址: SSL与TLS协议原理与证书签名多种生成方式实践指南 (https://mp.weixin.qq.com/s/g-X8UPNwIkuR_Qd2MDvVQw)
全栈工程师修炼指南
2022/09/29
1.7K0
SSL与TLS协议原理与证书签名多种生成方式实践指南
IT苦工指南 | Kubernetes v1.8.x全手动安装
觉得Rainbond提供的既简洁、又易用、而且生产就绪的Kubernets体验不过瘾……
Rainbond开源
2018/05/28
1.2K3
Kubernetes集群搭建之Master配置篇
本次系列使用的所需部署包版本都使用的目前最新的或最新稳定版,安装包地址请到公众号内回复【K8s实战】获取
程序员同行者
2019/03/19
1K0
Kubernetes集群搭建之Master配置篇
4.最新实践基于Containerd安装部署高可用Kubernetes集群
[TOC] 0x00 前言简述 描述: 在我博客以及前面的文章之中讲解Kubernetes相关集群环境的搭建, 随着K8S及其相关组件的迭代, 与读者当前接触的版本有所不同,所以在当前【2022年4月26日 10:08:29】时间节点,博主使用ubuntu 20.04 、haproxy、keepalive、containerd、etcd、kubeadm、kubectl 等相关工具插件【最新或者稳定的版本】进行实践高可用的kubernetes集群的搭建,这里不再对k8s等相关基础知识做介绍,如有新入门的童鞋
全栈工程师修炼指南
2022/09/29
3.9K0
4.最新实践基于Containerd安装部署高可用Kubernetes集群
kubernetes 证书合集
Kubernetes需要PKI证书才能通过TLS进行身份验证。如果使用kubeadm安装Kubernetes,则会自动生成集群所需的证书。还可以生成自己的证书,例如,通过不将私钥存储在API服务器上来保持私钥更安全。 当然,我们目前是在手动安装嘛。
看、未来
2022/06/11
6000
K8S集群安装
主要参考 https://github.com/opsnull/follow-me-install-kubernetes-cluster
JadePeng
2018/12/12
4.2K0
K8S二进制部署过程-v1.17.0
到 https://github.com/coreos/etcd/releases 页面下载最新版本的发布包:
cuijianzhe
2022/06/14
7350
K8S二进制部署过程-v1.17.0
29 Dec 2021 kubernetes静态token认证和kubeconfig认证
可以看到,用户能正常访问集群,并设置了正确的权限,下面例子创建kubeconfig访问集群。
俊采
2023/10/17
2120
Cluster Hardening - RBAC
注:通过RBAC对集群进行加固 CVM CDN https://cloud.tencent.com/act?from=10680 https://cloud.tencent.com/act/seaso
对你无可奈何
2021/03/18
9240
相关推荐
Kubernetes关于CSR
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文