美文网首页云原生
46-k8s-高可用集群-证书

46-k8s-高可用集群-证书

作者: 紫荆秋雪_文 | 来源:发表于2022-03-14 11:24 被阅读0次

    一、k8s集群中的证书

    在k8s集群中各个组件之间通信时为了安全起见都是需要安全认证的(通过公、私钥)

    1、证书

    • 信任的证书颁发机构:CA机构(私钥+公钥)
    • Client Certificate:用于服务端认证客户端,例如:ETCD、ETCD Proxy、Fleetctl、docker客户端
    • Server Certificate:服务端使用,客户端以此验证服务端身份,例如docker服务端
    • Peer Certificate: 双向证书,用于ETCD集群成员间通信

    2、在kubernetes集群中需要的证书种类如下

    • ETCD:节点需要标识自己服务的Server Cert,与需要Client Cert与ETCD集群其他节点交互,当然可以分别制定2个证书,也可以使用一个对等证书
    • Master 节点需要标识 apiserver服务的server cert,也需要Client Cert连接ETCD集群,这里也使用一个对等证书
    • kubectl、calico、kube-Proxy 只需要 client cert,因此证书请求中 hosts 字段可以为空
    • kubelet 证书比较特殊,不是手动生成,它由node节点 TLS BootStrap向apiserver请求,由master节点的controller-manager 自动签收,包含一个 client cert 和一个 server cert

    3、CFSSL

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

    二、安装证书工具CFSSL

    1、去官网下载cfssl-certinfo_linux-amd64 cfssljson_linux-amd64 cfssl_linux-amd64这三个组件

    • 下载核心组件

    wget https://github.com/cloudflare/cfssl/releases/download/v1.5.0/cfssl-certinfo_1.5.0_linux_amd64
    wget https://github.com/cloudflare/cfssl/releases/download/v1.5.0/cfssl_1.5.0_linux_amd64
    wget https://github.com/cloudflare/cfssl/releases/download/v1.5.0/cfssljson_1.5.0_linux_amd64
    
    • 授予执行权限

    chmod +x cfssl*
    
    • 批量重命名

    for name in `ls cfssl*`; do mv $name ${name%_1.5.0_linux_amd64};  done
    
    • 移动到文件

    mv cfssl* /usr/bin
    

    三、证书生成

    1、创建ca配置文件(ca-config.json)

    • 相当于证书颁发机构的工作规章制度
    • ca-config.json:可以定义多个profiles,分别制定不同的过期时间、使用场景等参数;后续在签名证书时可以使用某个 profile
    • signing:表示该证书可用于签名其它证书;生成的ca.pem证书中CA=TRUE
    • server auth:表示Client可以用该CA对server提供的证书进行验证
    • lient auth:表示server可以用该CA对Client提供的证书进行验证

    2、 ca-config.json配置文件

    vi ca-config.json
    
    {
        "signing": {
            "default": {
                "expiry": "43800h"
            },
            "profiles": {
                "server": {
                    "expiry": "43800h",
                    "usages": [
                        "signing",
                        "key encipherment",
                        "server auth"
                    ]
                },
                "client": {
                    "expiry": "43800h",
                    "usages": [
                        "signing",
                        "key encipherment",
                        "client auth"
                    ]
                },
                "peer": {
                    "expiry": "43800h",
                    "usages": [
                        "signing",
                        "key encipherment",
                        "server auth",
                        "client auth"
                    ]
                },
                "kubernetes": {
                    "expiry": "43800h",
                    "usages": [
                        "signing",
                        "key encipherment",
                        "server auth",
                        "client auth"
                    ]
                },
                "etcd": {
                    "expiry": "43800h",
                    "usages": [
                        "signing",
                        "key encipherment",
                        "server auth",
                        "client auth"
                    ]
                }
            }
        }
    }
    

    3、csr.json:证书申请请求书。证书机构就会根据我们请求签发证书

    cfssl print-defaults
    cfssl print-defaults csr  #使用这个命令打印模板
    
    {
        "CN": "example.net", //浏览器验证该字段是否合法,一般写域名,非常重要.
        "hosts": [
            "example.net",
            "www.example.net"
        ],
        "key": {
            "algo": "ecdsa",
            "size": 256
        },
        "names": [
            {
                "C": "US",
                "ST": "CA",
                "L": "San Francisco"
            }
        ]
    }
    

    4、创建ca证书签名(ca-csr.json)

    • CN

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

      • Organization,从证书中提取该字段作为请求用户所属的组(Group);这两个参数在后面的kubernetes启用RBAC模式中很重要,因为需要设置kubelet、admin等角色权限,那么在配置证书的时候就必须配置对,
      • 在etcd这两个参数没太大的重要意义
    • ca-csr.json

    vi ca-csr.json
    {
        "CN": "SelfSignedCa",
        "key": {
            "algo": "rsa",
            "size": 2048
        },
        "names": [
            {
                "C": "CN",
                "L": "shanghai",
                "O": "cfssl",
                "ST": "shanghai",
                "OU": "System"
            }
        ]
    }
    

    5、生成ca证书和私钥

    cfssl gencert -initca ca-csr.json | cfssljson -bare ca -
    # ca.csr ca.pem(ca公钥) ca-key.pem(ca私钥,妥善保管)
    

    6、创建etcd证书签名(etcd-csr.json)

    • etcd-csr.json
    {
        "CN": "etcd",
        "key": {
            "algo": "rsa",
            "size": 2048
        },
        "names": [
            {
                "C": "CN",
                "L": "shanghai",
                "O": "etcd",
                "ST": "shanghai",
                "OU": "System"
            }
        ]
    }
    

    7、生成etcd证书

    cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=etcd etcd-csr.json | cfssljson -bare etcd
    #etcd.csr  etcd-csr.json  etcd-key.pem(etcd私钥)  etcd.pem(etcd公钥)
    

    8、创建kubernetes证书签名

    • kubernetes-csr.json
    {
        "CN": "kubernetes",
        "key": {
            "algo": "rsa",
            "size": 2048
        },
        "names": [
            {
                "C": "CN",
                "L": "shanghai",
                "O": "kubernetes",
                "ST": "shanghai",
                "OU": "System"
            }
        ]
    }
    

    9、生成k8s证书

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

    10、校验证书是否合法

    openssl x509 -in ca.pem -text -noout 
    openssl x509 -in etcd.pem -text -noout 
    openssl x509 -in kubernetes.pem -text -noout
    

    相关文章

      网友评论

        本文标题:46-k8s-高可用集群-证书

        本文链接:https://www.haomeiwen.com/subject/ihyjdrtx.html