[转帖]kubernetes 证书合集

kubernetes,证书,合集 · 浏览次数 : 0

小编点评

**生成证书过程** 1. **创建证书文件** * 使用`cfssl gencert -ca -key ca-key.pem -config ca-config.json -profile kubernetes admin-csr.json``创建`admin-csr.pem`证书文件。 2. **创建证书私钥** * 使用`cfssl gencert -ca -key ca-key.pem -config ca-config.json -profile kubernetes admin-csr.json`创建`admin-key.pem`私钥文件。 3. **创建证书签名请求文件** * 使用`cfssl gencert -ca -key ca-key.pem -config ca-config.json -profile kubernetes admin-csr.json`创建`kube-proxy-csr.json`证书签名请求文件。 4. **创建证书私钥** * 使用`cfssl gencert -ca -key ca-key.pem -config ca-config.json -profile kubernetes admin-csr.json`创建`kube-proxy-key.pem`私钥文件。 5. **创建证书文件** * 使用`cfssl gencert -ca -key ca-key.pem -config ca-config.json -profile kubernetes admin-csr.json`创建`ca-key.pem`证书文件。 6. **创建证书文件** * 使用`cfssl gencert -ca -key ca-key.pem -config ca-config.json -profile kubernetes admin-csr.json`创建`ca-csr.pem`证书文件。 7. **创建证书文件** * 使用`cfssl gencert -ca -key ca-key.pem -config ca-config.json -profile kubernetes admin-csr.json`创建`cert.pem`证书文件。 8. **创建证书文件** * 使用`cfssl gencert -ca -key ca-key.pem -config ca-config.json -profile kubernetes admin-csr.json`创建`key.pem`证书文件。 9. **将证书文件分发到集群其他节点机器中** * 使用`cp`命令将证书文件分发到集群其他节点机器中。 10. **设置证书文件** * 在`k8s-config.yaml`文件中设置证书文件路径。 11. **创建k8s集群** * 使用`kubectl create cluster`创建k8s集群。 **证书信息** * 证书文件 `admin-csr.pem` * 私钥文件 `admin-key.pem` * 证书签名请求文件 `kube-proxy-csr.json` * 私钥文件 `kube-proxy-key.pem` *证书文件 `ca-key.pem` * 证书文件 `ca-csr.pem` * 证书文件 `cert.pem` * 证书文件 `key.pem`

正文

https://cloud.tencent.com/developer/article/2020655?areaSource=&traceId=

 

文章目录

PKI 证书

Kubernetes需要PKI证书才能通过TLS进行身份验证。如果使用kubeadm安装Kubernetes,则会自动生成集群所需的证书。还可以生成自己的证书,例如,通过不将私钥存储在API服务器上来保持私钥更安全。 当然,我们目前是在手动安装嘛。

安装出了点故障,说证书不合法,所以想了想,还是先整理一遍证书吧,不然后面还可能再出这种问题,排查又不好排查。

一共有多少证书?

先从Etcd算起:

1、Etcd对外提供服务,要有一套etcd server证书

2、Etcd各节点之间进行通信,要有一套etcd peer证书

3、Kube-APIserver访问Etcd,要有一套etcd client证书

再算kubernetes:

4、Kube-APIserver对外提供服务,要有一套kube-apiserver server证书

5、kube-scheduler、kube-controller-manager、kube-proxy、kubelet和其他可能用到的组件,
  需要访问kube-APIserver,要有一套kube-APIserver client证书

6、kube-controller-manager要生成服务的service account,
  要有一对用来签署service account的证书(CA证书)

7、kubelet对外提供服务,要有一套kubelet server证书

8、kube-APIserver需要访问kubelet,要有一套kubelet client证书

加起来共8套。

同一个套内的证书必须是用同一个CA签署的,签署不同套里的证书的CA可以相同,也可以不同。例如,所有etcd server证书需要是同一个CA签署的,所有的etcd peer证书也需要是同一个CA签署的,而一个etcd server证书和一个etcd peer证书,完全可以是两个CA机构签署的,彼此没有任何关系。这算两套证书。

为什么同一个“套”内的证书必须是同一个CA签署的?

原因在验证这些证书的一端。因为在要验证这些证书的一端,通常只能指定一个Root CA。这样一来,被验证的证书自然都需要是被这同一个Root CA对应的私钥签署,不然不能通过认证。

其实实际上,使用一套证书(都使用一套CA来签署)一样可以搭建出K8S,一样可以上生产,但是理清这些证书的关系,在遇到因为证书错误,请求被拒绝的现象的时候,不至于无从下手,而且如果没有搞清证书之间的关系,在维护或者解决问题的时候,贸然更换了证书,弄不好会把整个系统搞瘫。

TLS bootstrapping

Kubernetes1.4版本引入了一组签署证书用的API。这组API的引入,使我们可以不用提前准备kubelet用到的证书。

每个kubelet用到的证书都是独一无二的,因为它要绑定各自的IP地址,于是需要给每个kubelet单独制作证书,如果业务量很大的情况下,node节点会很多,这样一来kubelet的数量也随之增加,而且还会经常变动(增减Node)kubelet的证书制作就成为一件很麻烦的事情。使用TLS bootstrapping就可以省事儿很多。

工作原理:Kubelet第一次启动的时候,先用同一个bootstrap token作为凭证。这个token已经被提前设置为隶属于用户组system:bootstrappers,并且这个用户组的权限也被限定为只能用来申请证书。 用这个bootstrap token通过认证后,kubelet申请到属于自己的两套证书(kubelet server、kube-apiserver client for kubelet),申请成功后,再用属于自己的证书做认证,从而拥有了kubelet应有的权限。这样一来,就去掉了手动为每个kubelet准备证书的过程,并且kubelet的证书还可以自动轮替更新

官方文档参考:https://kubernetes.io/docs/tasks/tls/certificate-rotation/

kubelet证书为何不同

这样做是一个为了审计,另一个为了安全。 每个kubelet既是服务端(kube-apiserver需要访问kubelet),也是客户端(kubelet需要访问kube-apiserver),所以要有服务端和客户端两组证书。

服务端证书需要与服务器地址绑定,每个kubelet的地址都不相同,即使绑定域名也是绑定不同的域名,故服务端地址不同

客户端证书也不应相同,每个kubelet的认证证书与所在机器的IP绑定后,可以防止一个kubelet的认证证书泄露以后,使从另外的机器上伪造的请求通过验证。

安全方面,如果每个node上保留了用于签署证书的bootstrap token,那么bootstrap token泄漏以后,是不是可以随意签署证书了?安全隐患非常大。所以,kubelet启动成功以后,本地的bootstrap token需要被删除。

正式制作证书

虽然可以用多套证书,但是维护多套CA实在过于繁杂,这里还是用一个CA签署所有证书。

需要准备的证书

admin-key.pem

admin.pem

ca-key.pem

ca.pem

kube-proxy-key.pem

kube-proxy.pem

kubernetes-key.pem

kubernetes.pem

使用证书的组件如下:

etcd:使用 ca.pem、kubernetes-key.pem、kubernetes.pem

kube-apiserver:使用 ca.pem、kubernetes-key.pem、kubernetes.pem

kubelet:使用 ca.pem

kube-proxy:使用 ca.pem、kube-proxy-key.pem、kube-proxy.pem

kubectl:使用 ca.pem、admin-key.pem、admin.pem

kube-controller-manager:使用 ca-key.pem、ca.pem

有这一块儿,后面证书出问题的时候排查也好有个方向嘛。

CFSSL

我们使用CFSSL来制作证书,它是cloudflare开发的一个开源的PKI工具,是一个完备的CA服务系统,可以签署、撤销证书等,覆盖了一个证书的整个生命周期,后面只用到了它的命令行工具

注:一般情况下,K8S中证书只需要创建一次,以后在向集群中添加新节点时只要将/etc/kubernetes/ssl目录下的证书拷贝到新节点上即可。

下载安装cfssl命令行工具

#以下操作只在master上进行
#进入到下载目录
cd /opt/TLS/download
#下载并解压cfssl
wget https://github.com/cloudflare/cfssl/releases/download/v1.6.1/cfssl_1.6.1_linux_amd64
wget https://github.com/cloudflare/cfssl/releases/download/v1.6.1/cfssljson_1.6.1_linux_amd64
wget https://github.com/cloudflare/cfssl/releases/download/v1.6.1/cfssl-certinfo_1.6.1_linux_amd64
chmod +x cfssl*
[root@k8s-master download]# ll
total 40232
-rwxr-xr-x 1 root root 16659824 Dec  7 15:36 cfssl_1.6.1_linux_amd64
-rwxr-xr-x 1 root root 13502544 Dec  7 15:35 cfssl-certinfo_1.6.1_linux_amd64
-rwxr-xr-x 1 root root 11029744 Dec  7 15:35 cfssljson_1.6.1_linux_amd64
#只在master上操作
cd /opt/TLS/download
cp cfssl_1.6.1_linux_amd64 /usr/local/bin/cfssl
cp cfssljson_1.6.1_linux_amd64 /usr/local/bin/cfssljson
cp cfssl-certinfo_1.6.1_linux_amd64 /usr/local/bin/cfssl-certinfo
[root@k8s-master download]# ll /usr/local/bin/cfssl*
-rwxr-xr-x 1 root root 16659824 Apr  4 08:46 /usr/local/bin/cfssl
-rwxr-xr-x 1 root root 13502544 Apr  4 08:46 /usr/local/bin/cfssl-certinfo
-rwxr-xr-x 1 root root 11029744 Apr  4 08:46 /usr/local/bin/cfssljson

创建CA证书

创建存放证书目录

[root@k8s-master bin]# mkdir -p /opt/kubernetes/ssl/
[root@k8s-master bin]# cd /opt/kubernetes/ssl/

创建证书配置文件

[root@k8s-master ssl]# vim ca-config.json
{
  "signing": {
    "default": {
      "expiry": "87600h"
    },
    "profiles": {
      "kubernetes": {
        "usages": [
            "signing",
            "key encipherment",
            "server auth",
            "client auth"
        ],
        "expiry": "87600h"
      }
    }
  }
}

字段说明:

ca-config.json:可以定义多个 profiles,分别指定不同的过期时间、使用场景等参数;后续在签名证书时使用某个 profile;

signing:表示该证书可以签名其他证书;生成的ca.pem证书中 CA=TRUE;

server auth:表示client可以用该 CA 对server提供的证书进行验证;

client auth:表示server可以用该CA对client提供的证书进行验证;

expiry:过期时间

创建CA证书签名请求文件

[root@k8s-master ssl]# vim ca-csr.json
{
  "CN": "kubernetes",
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "BeiJing",
      "L": "BeiJing",
      "O": "k8s",
      "OU": "System"
    }
  ],
    "ca": {
       "expiry": "87600h"
    }
}

字段说明:

CN”:Common Name,kube-apiserver 从证书中提取该字段作为请求的用户名 (User Name);浏览器使用该字段验证网站是否合法;

“O”:Organization,kube-apiserver 从证书中提取该字段作为请求用户所属的组 (Group);

生成CA证书和私钥

[root@k8s-master ssl]# cfssl gencert -initca ca-csr.json | cfssljson -bare ca
[root@k8s-master ssl]# ls | grep ca
ca-config.json
ca.csr
ca-csr.json
ca-key.pem
ca.pem

其中ca-key.pem是ca的私钥,ca.csr是一个签署请求,ca.pem是CA证书,是后面kubernetes组件会用到的RootCA。

创建kubernetes证书

创建kubernetes证书签名请求文件 kubernetes-csr.json

[root@k8s-master ssl]# vim kubernetes-csr.json
{
    "CN": "kubernetes",
    "hosts": [
      "127.0.0.1",
      "192.168.214.88",
      "192.168.214.89",
      "192.168.214.90",
      "192.168.214.200",
      "192.168.214.201",
      "192.168.214.202",
      "10.254.0.1",
      "192.168.214.210",
      "192.168.214.1/24",
      "kubernetes",
      "kube-api.wangk8s-master.com",
      "kubernetes.default",
      "kubernetes.default.svc",
      "kubernetes.default.svc.cluster",
      "kubernetes.default.svc.cluster.local"
    ],
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "ST": "BeiJing",
            "L": "BeiJing",
            "O": "k8s",
            "OU": "System"
        }
    ]
}

如果 hosts 字段不为空则需要指定授权使用该证书的 IP 或域名列表。

由于该证书后续被 etcd 集群和 kubernetes master使用,将etcd、master节点的IP都填上,同时还有service网络的首IP。(一般是 kube-apiserver 指定的 service-cluster-ip-range 网段的第一个IP,如 10.254.0.1)

我这里的设置包括一个私有镜像仓库,三个etcd,三个master,以上物理节点的IP也可以更换为主机名。

生成kubernetes证书和私钥

[root@k8s-master ssl]# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kubernetes-csr.json | cfssljson -bare kubernetes
[root@k8s-master ssl]# ls |grep kubernetes
kubernetes.csr
kubernetes-csr.json
kubernetes-key.pem
kubernetes.pem

创建admin证书签名请求文件admin-csr.json

[root@k8s-master ssl]# admin-csr.json
{
  "CN": "admin",
  "hosts": [],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "BeiJing",
      "L": "BeiJing",
      "O": "system:masters",
      "OU": "System"
    }
  ]
}

说明:

后续 kube-apiserver 使用 RBAC 对客户端(如 kubelet、kube-proxy、Pod)请求进行授权;

kube-apiserver 预定义了一些 RBAC 使用的 RoleBindings,如 cluster-admin 将 Group system:masters 与 Role cluster-admin 绑定,该 Role 授予了调用kube-apiserver 的所有 API的权限;

O指定该证书的 Group 为 system:masters,kubelet 使用该证书访问 kube-apiserver 时 ,由于证书被 CA 签名,所以认证通过,同时由于证书用户组为经过预授权的 system:masters,所以被授予访问所有 API 的权限;

注:这个admin 证书,是将来生成管理员用的kube config 配置文件用的,现在我们一般建议使用RBAC 来对kubernetes 进行角色权限控制, kubernetes 将证书中的CN 字段 作为User, O 字段作为 Group

生成admin证书和私钥

[root@k8s-master ssl]# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes admin-csr.json | cfssljson -bare admin
[root@k8s-master ssl]# ls | grep admin
admin.csr
admin-csr.json
admin-key.pem
admin.pem

创建kube-proxy证书

创建 kube-proxy 证书签名请求文件 kube-proxy-csr.json

[root@k8s-master ssl]# vim kube-proxy-csr.json
{
  "CN": "system:kube-proxy",
  "hosts": [],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "BeiJing",
      "L": "BeiJing",
      "O": "k8s",
      "OU": "System"
    }
  ]
}

CN 指定该证书的 User 为 system:kube-proxy;

kube-apiserver 预定义的 RoleBinding system:node-proxier 将User system:kube-proxy 与 Role system:node-proxier 绑定,该 Role 授予了调用 kube-apiserver Proxy 相关 API 的权限;

生成kube-proxy证书和私钥

[root@k8s-master ssl]# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes  kube-proxy-csr.json | cfssljson -bare kube-proxy
[root@k8s-master ssl]# ls |grep kube-proxy
kube-proxy.csr
kube-proxy-csr.json
kube-proxy-key.pem
kube-proxy.pem

经过上述操作,我们会用到如下文件:

[root@k8s-master ssl]# ls | grep pem
admin-key.pem
admin.pem
ca-key.pem
ca.pem
kube-proxy-key.pem
kube-proxy.pem
kubernetes-key.pem
kubernetes.pem

查看证书信息

[root@master1 ssl]# cfssl-certinfo -cert kubernetes.pem
{
  "subject": {
    "common_name": "kubernetes",
    "country": "CN",
    "organization": "k8s",
    "organizational_unit": "System",
    "locality": "BeiJing",
    "province": "BeiJing",
    "names": [
      "CN",
      "BeiJing",
      "BeiJing",
      "k8s",
      "System",
      "kubernetes"
    ]
  },
  "issuer": {
    "common_name": "kubernetes",
    "country": "CN",
    "organization": "k8s",
    "organizational_unit": "System",
    "locality": "BeiJing",
    "province": "BeiJing",
    "names": [
      "CN",
      "BeiJing",
      "BeiJing",
      "k8s",
      "System",
      "kubernetes"
    ]
  },
  "serial_number": "321233745860282370502438768971300435157761820875",
  "sans": [
    "192.168.214.1/24",
    "kubernetes",
    "kube-api.wangk8s-master.com",
    "kubernetes.default",
    "kubernetes.default.svc",
    "kubernetes.default.svc.cluster",
    "kubernetes.default.svc.cluster.local",
    "127.0.0.1",
    "192.168.214.88",
    "192.168.214.89",
    "192.168.214.90",
    "192.168.214.200",
    "192.168.214.201",
    "192.168.214.202",
    "10.254.0.1",
    "192.168.214.210"
  ],
  "not_before": "2019-03-12T11:26:00Z",
  "not_after": "2029-03-09T11:26:00Z",
  "sigalg": "SHA256WithRSA",
  "authority_key_id": "CB:34:54:33:1F:F4:37:E:E5:94:B7:F5:8A:3D:F4:A4:43:43:E2:7F",
  "subject_key_id": "EC:31:D8:5F:4:E3:6F:C2:7F:DA:A8:F0:BD:A:B9:1F:56:7B:9A:DF",
  "pem": "-----BEGIN CERTIFICATE-----\nM(此处省略)=\n-----END CERTIFICATE-----\n"
}

在搭建k8s集群的时候,将这些文件分发到至此集群中其他节点机器中即可。至此,TLS证书创建完毕。

k8s文档

PKI certificates and requirements

与[转帖]kubernetes 证书合集相似的内容:

[转帖]kubernetes 证书合集

https://cloud.tencent.com/developer/article/2020655?areaSource=&traceId= 文章目录 PKI 证书 一共有多少证书? 为什么同一个“套”内的证书必须是同一个CA签署的? TLS bootstrapping kubelet证书为何不

[转帖]k8s证书永不过期

https://www.cnblogs.com/fengzi7314/p/15909220.html 第一步,在github上下载对应的版本,我的是1.22版本,所以选的是1.22版本 第二步,下载到本地解压 第三步,进入目录编辑文件,修改为100年 cd kubernetes-1.22.0/ vi

[转帖]Kubernetes 蓝绿发布、ABTest、滚动发布、灰度发布、金丝雀发布简介

蓝绿发布: 一些应用程序只需要部署一个新版本,并需要立即切到这个版本。因此,我们需要执行蓝/绿部署。在进行蓝/绿部署时,应用程序的一个新副本(绿)将与现有版本(蓝)一起部署。然后更新应用程序的入口/路由器以切换到新版本(绿)。然后,您需要等待旧(蓝)版本来完成所有发送给它的请求,但是大多数情况下,应

[转帖]kubernetes 资源管理概述

https://cizixs.com/2018/06/25/kubernetes-resource-management/ kubernetes 资源简介 什么是资源? 在 kubernetes 中,有两个基础但是非常重要的概念:node 和 pod。node 翻译成节点,是对集群资源的抽象;pod

[转帖]Kubernetes中的nodePort,targetPort,port的区别和意义(转)

原文https://blog.csdn.net/u013760355/article/details/70162242 https://blog.csdn.net/xinghun_4/article/details/50492041 1. nodePort 外部机器可访问的端口。 比如一个Web应用

[转帖]Kubernetes 集群无损升级实践

https://www.jianshu.com/p/182952a00efc 一、背景 活跃的社区和广大的用户群,使 Kubernetes 仍然保持3个月一个版本的高频发布节奏。高频的版本发布带来了更多的新功能落地和 bug 及时修复,但是线上环境业务长期运行,任何变更出错都可能带来巨大的经济损失,

[转帖]Kubernetes 领进门 | 使用 Ingress-nginx 反向代理外部站点

https://cloud.tencent.com/developer/article/2187041 warning: 这篇文章距离上次修改已过204天,其中的内容可能已经有所变动。 本文旨在展示如何使用 ingress-nginx 作为反向代理加速集群外部服务原理。下文以反向代理 github

[转帖]kubernetes Tcp流量可视化

https://www.cnblogs.com/charlieroro/p/16771739.html 使用k8spacket和grafana的node graph插件可以查看kubernetes pod的TCP相关信息,如connection、bytes、和duration。下面是接收和响应的字节

[转帖]Kubernetes的垂直和水平扩缩容的性能评估

https://www.cnblogs.com/charlieroro/p/17009778.html 译自:Performance evaluation of the autoscaling strategies vertical and horizontal using Kubernetes 可

[转帖]Kubernetes的Nginx Ingress 0.20之前的版本,upstream的keep-alive不生效

https://www.cnblogs.com/lizexiong/p/15358923.html 1说明 Kubernetes使用nginx-ingress-controller代理到集群内服务的请求,nginx所在的机器上上有大量的time-wait连接。 抓包发现nginx发起的到upstre