文章都可以转载、引用,标明转载出处即可。

第一节:创建TLS证书

Kubernetes Mr.c 2200℃ 0评论

  kubernetes 系统的各组件需要使用 TLS 证书对通信进行加密,本文档使用 CloudFlare 的 PKI 工具集 cfssl 来生成 Certificate Authority (CA) 和其它证书文件。
  根据个人实践,创建TLS证书这个环节是最容易出错的,但是刚好又是搭建整个集群的第一个步骤,这个环节出了问题后续的服务部署都会有很大问题,而且很多问题不好排查出来,所以在证书这个步骤要额外注意操作。
本次需要生成8个证书文件:
  admin-key.pem
  admin.pem
  ca-key.pem
  ca.pem
  kube-proxy-key.pem
  kube-proxy.pem
  kubernetes-key.pem
  kubernetes.pem
其中kubernetes 各个组件对应将使用这些证书文件:
  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
证书只需要生成一份,这里我们就在master节点上操作,master上生成后分发到对应的node节点上。
一:安装CFSSL
下载二进制文件,复制到/usr/local/bin 目录下即可。

[root@cnyunwei k8s_soft]# wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
[root@cnyunwei k8s_soft]# wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
[root@cnyunwei k8s_soft]# wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
[root@cnyunwei k8s_soft]# chmod +x cfssl*

[root@cnyunwei k8s_soft]# mv cfssl_linux-amd64 /usr/local/bin/cfssl
[root@cnyunwei k8s_soft]# mv cfssljson_linux-amd64 /usr/local/bin/cfssljson
[root@cnyunwei k8s_soft]# mv cfssl-certinfo_linux-amd64 /usr/local/bin/cfssl-certinfo
[root@cnyunwei k8s_soft]# export PATH=/usr/local/bin:$PATH

二:创建CA证书
1.创建CA证书配置文件

[root@k8s-master cfssl]# mkdir /root/ssl
[root@k8s-master cfssl]# cd /root/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"
      }
    }
  }
}

2.创建CA 证书签名请求

[root@k8s-master ssl]# cat 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);

以上两个文件是根据命令生成模板文件进行调整的:

cfssl print-defaults config > config.json
cfssl print-defaults csr > csr.json

2.生成 CA 证书和私钥

[root@k8s-master ssl]# cfssl gencert -initca ca-csr.json | cfssljson -bare ca

该命令执行后就会生成三个证书文件

[root@k8s-master ssl]# ll
total 20
-rw-r--r-- 1 root root  292 May 24 11:16 ca-config.json
-rw-r--r-- 1 root root 1001 May 24 11:28 ca.csr
-rw-r--r-- 1 root root  253 May 24 11:20 ca-csr.json
-rw------- 1 root root 1675 May 24 11:28 ca-key.pem
-rw-r--r-- 1 root root 1359 May 24 11:28 ca.pem

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

{
   "CN": "kubernetes",
    "hosts": [
      "127.0.0.1",
      "192.168.8.6",
      "192.168.8.7",
      "192.168.8.8",
      "master.cnyunwei.cc",
      "node1.cnyunwei.cc",
      "node2.cnyunwei.cc",
      "10.254.0.1"
    ],
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "ST": "BeiJing",
            "L": "BeiJing",
            "O": "k8s",
            "OU": "System"
        }
    ]
}

说明:  
  这里实际上是在申请一个HTTPS证书,和我们网站用的证书是类似的,只是证书颁发机构是我们自己服务器,所以hosts处实际是需要颁发证书的域名,如果出于方便,可以多添加一些预设后面可能会使用上的域名甚至一个泛域名,由于是内部颁发,可以添加IP地址进行授权,并且由于cluster-ip 也会用到证书,所以需要添加kube-apiserver 指定的 service-cluster-ip-range 网段的第一个IP授权一个证书。

[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

同样的该命令执行后会生成三个证书文件
四:创建 admin 证书
admin 证书 是后续生成管理员用的kube config 配置文件用的,现在我们一般建议使用RBAC 来对kubernetes 进行角色权限控制, kubernetes 将证书中的CN 字段 作为User, O 字段作为 Group。

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

五:创建 kube-proxy 证书

[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"
    }
  ]
}
[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

六:校验并分发证书
1.证书校验可以使用cfssl-certinfo 命令查看下证书信息

[root@k8s-master ssl]# cfssl-certinfo -cert kubernetes.pem
{
  "subject": {
    "common_name": "kubernetes",
    "country": "CN",
    "organization": "k8s",
    "organizational_unit": "System",
    "locality": "BeiJing",
    "province": "BeiJing",
    "names": [
      "CN",
....................

2.分发证书:
为了方便管理,定义kubernetes的证书文件存放路径为/etc/kubernetes/ssl/

[root@k8s-master ssl]# mkdir -p /etc/kubernetes/ssl/
[root@k8s-master ssl]# cp *.pem /etc/kubernetes/ssl/

分发到node节点:

[root@k8s-master ssl]# ssh root@node1.cnyunwei.cc "mkdir -p /etc/kubernetes/ssl/"
[root@k8s-master ssl]# scp kube*.pem root@node1.cnyunwei.cc:/etc/kubernetes/ssl/

其中我们的ca证书和admin证书是不需要下发到node节点的,只分发kube-proxy和kubernetes证书即可。

转载请注明:菜鸟运维 » 第一节:创建TLS证书

喜欢 (1)
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址