kubernetes ssl证书梳理
admin
2023-04-07 04:21:21
0

前言

kubernetes 集群安装配置过程中,会使用各种证书,目的是为了加强集群安全性,但是会坑很多入门新手.   
前期如果手动部署集群, 想了解集群组件配合工作原理,各种不通,报很多奇葩的错,很多是证书配置错误导致的。  
推荐报错时多看master节点和调试服务节点的日志.  基本都能发现有用的错误日志,k8s打印的错误日志,指引的错误方向还是靠谱的. 
为了少踩坑,个人简单梳理了一下集群配置过程中使用的证书信息,详细如下:

集群使用证书

etcd:                                使用 ca.pem、server-key.pem、server.pem;
kube-apiserver:         使用 ca.pem、server-key.pem、server.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

注意:

证书生成操作都可以在master节点主机上执行,证书只需要创建一次即可。然后将证书copy到新添加节点,
根据不同服务使用的证书的不同单独配置即可。

其它几个类证书文件

token.csv
该文件为一个用户的描述文件,基本格式为 Token,用户名,UID,用户组;这个文件在 apiserver 启动时被 apiserver 加载,  
然后就相当于在集群内创建了一个这个用户;接下来就可以用 RBAC 给他授权
bootstrap.kubeconfig
该文件中内置了 token.csv 中用户的 Token,以及 apiserver CA 证书;kubelet 首次启动会加载此文件,  
使用 apiserver CA 证书建立与 apiserver 的 TLS 通讯,使用其中的用户 Token 作为身份标识像 apiserver 发起 CSR 请求

生成证书过程简介

安装cfssl

CFSSL是CloudFlare开源的一款PKI/TLS工具。CFSSL 包含一个命令行工具和一个用于 签名,验证并且捆绑TLS证书的 HTTP API 服务.
使用Go语言编写。

CFSSL包括:

一组用于生成自定义 TLS PKI 的工具;
cfssl程序,是CFSSL的命令行工具;
multirootca程序是可以使用多个签名密钥的证书颁发机构服务器;
mkbundle程序用于构建证书池;
cfssljson程序,从cfssl和multirootca程序获取JSON输出,并将证书,密钥,CSR和bundle写入磁盘;

PKI借助数字证书和公钥加密技术提供可信任的网络身份。通常,证书就是一个包含如下身份信息的文件:

证书所有组织的信息
公钥
证书颁发组织的信息
证书颁发组织授予的权限,如证书有效期、适用的主机名、用途等
使用证书颁发组织私钥创建的数字签名

下载

wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64

安装

chmod +x cfssl_linux-amd64 cfssljson_linux-amd64 cfssl-certinfo_linux-amd64
mv cfssl_linux-amd64 /usr/local/bin/cfssl
mv cfssljson_linux-amd64 /usr/local/bin/cfssljson
mv cfssl-certinfo_linux-amd64 /usr/bin/cfssl-certinfo

证书生成过程演示

制作server ca证书

cat << EOF | tee ca-config.json
{
  "signing": {
    "default": {
      "expiry": "87600h"
    },
    "profiles": {
      "server": {
         "expiry": "87600h",
         "usages": [
            "signing",
            "key encipherment",
            "server auth",
            "client auth"
        ]
      }
    }
  }
}
EOF

字段说明:
expiry : 87600h  10 年
ca-config.json:可以定义多个 profiles,分别指定不同的过期时间、使用场景等参数;后续在签名证书时使用某个 profile;
signing:表示该证书可用于签名其它证书;生成的 ca.pem 证书中 CA=TRUE;
server auth:表示client可以用该 CA 对server提供的证书进行验证;
client auth:表示server可以用该CA对client提供的证书进行验证;
cat << EOF | tee ca-csr.json
{
    "CN": "server",
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "L": "Beijing",
            "ST": "Beijing",
            "O": "k8s",
            "OU": "System"
        }
    ]
}
EOF

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

生成CA证书和私钥

cfssl gencert -initca ca-csr.json | cfssljson -bare ca -

验证ca 证书

k8s-ssl]# ls
ca-config.json
ca-csr.json

ca.csr
ca-key.pem
ca.pem

制作server证书

cat << EOF | tee server-csr.json
{
    "CN": "server",
    "hosts": [
      "10.254.0.1",
      "127.0.0.1",
      "172.20.101.157",
      "172.20.101.165",
      "172.20.101.164",
      "172.20.101.160",
      "172.20.101.166",
      "172.20.101.167",
      "server",
      "server.default",
      "server.default.svc",
      "server.default.svc.cluster",
      "server.default.svc.cluster.local"
    ],
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "L": "Beijing",
            "ST": "Beijing",
            "O": "k8s",
            "OU": "System"
        }
    ]
}
EOF

字段说明:
如果hosts字段不为空则需要指定授权使用该证书的IP或域名列表,该证书后续被 etcd 集群和 kubernetes master 集群使用,

上面分别指定了 etcd 集群:
      "172.20.101.157",
      "172.20.101.165",
      "172.20.101.164",
kubernetes master 集群的主机 IP:
      "172.20.101.157",
      "172.20.101.165",
      "172.20.101.164",
kubernetes node 节点 IP:
      "172.20.101.160",
      "172.20.101.166",
      "172.20.101.167",

service-cluster-ip-range 网段和第一个IP,
      "10.254.0.1",

也可以写物理节点的主机名。
另外集群配置高可用使用vip的IP地址也填上。

生成 kubernetes 证书和私钥

cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=server server-csr.json | cfssljson -bare server

验证

ll server*

server.csr
server-csr.json
server-key.pem
server.pem

制作kube-proxy证书

cat << EOF | tee kube-proxy-csr.json
{
  "CN": "system:kube-proxy",
  "hosts": [],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "L": "Beijing",
      "ST": "Beijing",
      "O": "k8s",
      "OU": "System"
    }
  ]
}
EOF

字段说明:
CN 指定该证书的Use为system:kube-proxy;
kube-apiserver 预定义的 RoleBinding system:node-proxier 将User system:kube-proxy 与 Role system:node-proxier 绑定,该 Role 授予了调用 kube-apiserver Proxy 相关 API 的权限;

创建 kube-proxy 证书

cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=server kube-proxy-csr.json | cfssljson -bare kube-proxy

验证

kube-*

kube-proxy.csr
kube-proxy-csr.json
kube-proxy-key.pem
kube-proxy.pem

创建 admin 证书

cat >admin-csr.json<

生成 admin ca

cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=server admin-csr.json | cfssljson -bare admin

验证

ll admin*

admin.csr
admin-csr.json
admin-key.pem
admin.pem

清理 csr srl

find . -name "*.csr" -o -name "*.srl"|xargs  rm -f

验证证书:

使用 opsnssl 命令验证key内容

openssl x509  -noout -text -in  server.pem

cfssl-certinfo -cert server.pem

后面的pem可以换成已生成key文件,然后核对key内容。

集群核对key信息

集群搭建完成,通过命令: kubectl get clusterrolebinding cluster-admin -o yaml ,查看 clusterrolebinding cluster-admin 的 subjects 的 kind 是 Group,name 是 system:masters。 roleRef 对象是 ClusterRole cluster-admin。

即:system:masters Group 的 user 或者 serviceAccount 都拥有 cluster-admin 的角色。 因此在使用 kubectl 命令时候,  
才拥有整个集群的管理权限。可以使用 kubectl get clusterrolebinding cluster-admin -o yaml 来查看。

参考文档:

https://blog.51cto.com/lookingdream/2176846
https://jimmysong.io/kubernetes-handbook/practice/create-tls-and-secret-key.html

相关内容

热门资讯

最新引进“网易棋牌可以开挂吗?... 家人们!今天小编来为大家解答网易棋牌透视挂怎么安装这个问题咨询软件客服徽9752949的挂在哪里买很...
【今日要闻】“趣友麻将怎么装挂... 网上科普关于“趣友麻将有没有挂”话题很是火热,小编也是针对趣友麻将作*弊开挂的方法以及开挂对应的知识...
今日重大消息“授权大厅炸/金/... 有 亲,根据资深记者爆料授权大厅炸/金/花是可以开挂的,确实有挂(咨询软...
今日重磅消息“好玩茶楼辅助器?... 有 亲,根据资深记者爆料好玩茶楼是可以开挂的,确实有挂(咨询软件无需打开...
【第一资讯】“福州十八扑真的有... 有 亲,根据资深记者爆料福州十八扑是可以开挂的,确实有挂(咨询软件无需打...
今日重磅消息“攒劲甘肃麻将怎么... 家人们!今天小编来为大家解答攒劲甘肃麻将透视挂怎么安装这个问题咨询软件客服徽4282891的挂在哪里...
终于懂了“讯奇麻将斗牛有挂吗?... 终于懂了“讯奇麻将斗牛有挂吗?”(透视曝光猫腻)您好,讯奇麻将斗牛这个游戏其实有挂的,确实是有挂的,...
齐鲁创新之光!青岛3人摘得“齐...   12月27日,由省委宣传部、省科协、省科技厅、大众报业集团、山东广播电视台联合主办的2025年“...
玩家最新攻略“樱花之盛拼三张怎... 有 亲,根据资深记者爆料樱花之盛拼三张是可以开挂的,确实有挂(咨询软件无...
重磅消息“悟空黑桃A可以开挂吗... 您好:悟空黑桃A这款游戏可以开挂,确实是有挂的,需要了解加客服微信【9784099】很多玩家在这款游...