k8s-cert

Posted 芒果牛奶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了k8s-cert相关的知识,希望对你有一定的参考价值。

Kubernetes集群都有一个集群根证书颁发机构(CA) -- 验证API server证书 -- 验证kubelet客户端证书


CA证书包被分发到集群中的每个节点 -- 作为一个secret附加分发到默认service account

让Pod中运行的应用程序信任集群根CA通常需要一些额外的应用程序配置: CA证书包 -- TLS客户端或服务器信任的CA证书列表


=====install cfssl=====

wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
chmod +x cfssl_linux-amd64
mv cfssl_linux-amd64 /usr/local/bin/cfssl

wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
chmod +x cfssljson_linux-amd64
mv cfssljson_linux-amd64 /usr/local/bin/cfssljson

wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
chmod +x cfssl-certinfo_linux-amd64
mv cfssl-certinfo_linux-amd64 /usr/local/bin/cfssl-certinfo


=====create CA=====
mkdir /root/ssl
cd /root/ssl
cfssl print-defaults config > config.json
cfssl print-defaults csr > csr.json
# 根据config.json文件的格式创建如下的ca-config.json文件
# 过期时间设置成了 87600h

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

创建 ca-csr.json 文件
vi ca-csr.json
<code>
{
  "CN": "kubernetes",
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "BeiJing",
      "L": "BeiJing",
      "O": "k8s",
      "OU": "System"
    }
  ],
    "ca": {
       "expiry": "87600h"
    }
}
</code>

生成 CA 证书和私钥
cfssl gencert -initca ca-csr.json | cfssljson -bare ca
ls -lt ca*
-rw-r--r--. 1 root root 1001 4月 15 12:00 ca.csr
-rw-------. 1 root root 1675 4月 15 12:00 ca-key.pem
-rw-r--r--. 1 root root 1359 4月 15 12:00 ca.pem


创建 kubernetes 证书

vi kubernetes-csr.json
<code>
{
    "CN": "kubernetes",
    "hosts": [
      "127.0.0.1",
      "192.168.1.193",
      "192.168.1.194",
      "192.168.1.195",
      "10.254.0.1",
      "kubernetes",
      "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"
        }
    ]
}
</code>

如果 hosts 字段不为空则需要指定授权使用该证书的 IP 或域名列表,由于该证书后续被 etcd 集群和 kubernetes master 集群使用,所以上面分别指定了 etcd 集群、kubernetes master 集群的主机 IP 和 kubernetes 服务的服务 IP(一般是 kube-apiserver 指定的 service-cluster-ip-range 网段的第一个IP,如 10.254.0.1)

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

ll kubernetes*
-rw-r--r--. 1 root root 1261 4月 15 15:24 kubernetes.csr
-rw-r--r--. 1 root root 560 4月 15 15:24 kubernetes-csr.json
-rw-------. 1 root root 1679 4月 15 15:24 kubernetes-key.pem
-rw-r--r--. 1 root root 1627 4月 15 15:24 kubernetes.pem



创建 admin-csr.json 证书

这个admin 证书,是将来生成管理员用的kube config 配置文件用的,现在我们一般建议使用RBAC 来对kubernetes 进行角色权限控制, kubernetes 将证书中的CN 字段 作为User, O 字段作为 Group(具体参考 Kubernetes中的用户与身份认证授权中 X509 Client Certs 一段)。

vi admin-csr.json
<code>
{
  "CN": "admin",
  "hosts": [],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "BeiJing",
      "L": "BeiJing",
      "O": "system:masters",
      "OU": "System"
    }
  ]
}
</code>

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

ll admin*
-rw-r--r--. 1 root root 1009 4月 15 17:23 admin.csr
-rw-r--r--. 1 root root 229 4月 15 17:10 admin-csr.json
-rw-------. 1 root root 1679 4月 15 17:23 admin-key.pem
-rw-r--r--. 1 root root 1399 4月 15 17:23 admin.pem


创建 kube-proxy 证书
vi kube-proxy-csr.json
<code>
{
  "CN": "system:kube-proxy",
  "hosts": [],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "BeiJing",
      "L": "BeiJing",
      "O": "k8s",
      "OU": "System"
    }
  ]
}
</code>

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



========校验证书=========

使用 openssl 命令

openssl x509 -noout -text -in kubernetes.pem


使用 cfssl-certinfo 命令

cfssl-certinfo -cert kubernetes.pem


分发证书

mkdir -p /etc/kubernetes/ssl
cp *.pem /etc/kubernetes/ssl


分发证书给节点
mkdir -p /etc/kubernetes/ssl
scp *.pem root@192.168.1.194:/etc/kubernetes/ssl/
scp *.pem root@192.168.1.195:/etc/kubernetes/ssl/

以上是关于k8s-cert的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段——CSS选择器

谷歌浏览器调试jsp 引入代码片段,如何调试代码片段中的js

片段和活动之间的核心区别是啥?哪些代码可以写成片段?

VSCode自定义代码片段——.vue文件的模板

VSCode自定义代码片段6——CSS选择器

VSCode自定义代码片段——声明函数