多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[TOC] ## **准备条件** 安装好一个k8s集群,这里我们使用kubeadm安装好了一个1.17.0的集群,如下 ``` $ kubectl get node NAME STATUS ROLES AGE VERSION dcos-160 Ready master 19h v1.17.0 ``` ## **X509客户证书** 客户证书认证方式,自然需要一个客户端证书。 首先,我们先生成客户端证书对应的key与csr,(注意:由于kubeadm安装的集群授权默认为RBAC,所以下面证书的O要设置为system:masters,具体原理见后面章节《授权》) 在master节点上执行以下命令 ``` $ openssl genrsa -out client.key 1024 $ openssl req -new -nodes -key client.key -out client.csr -subj "/CN=client/O=system:masters" ``` 接着,我们通过以下命令找到apiserver的`--client-ca-file`文件,发现为`/etc/kubernetes/pki/ca.crt`,那么在目录`/etc/kubernetes/pki/`下还会有一个CA密钥ca.key ``` $ ps -ef | grep apiserver root 24752 24707 8 Jan06 ? 01:43:33 kube-apiserver --advertise-address=10.142.232.160 --allow-privileged=true --authorization-mode=Node,RBAC --client-ca-file=/etc/kubernetes/pki/ca.crt --enable-admission-plugins=NodeRestriction --enable-bootstrap-token-auth=true --etcd-cafile=/etc/kubernetes/pki/etcd/ca.crt --etcd-certfile=/etc/kubernetes/pki/apiserver-etcd-client.crt --etcd-keyfile=/etc/kubernetes/pki/apiserver-etcd-client.key --etcd-servers=https://127.0.0.1:2379 --insecure-port=0 --kubelet-client-certificate=/etc/kubernetes/pki/apiserver-kubelet-client.crt --kubelet-client-key=/etc/kubernetes/pki/apiserver-kubelet-client.key --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname --proxy-client-cert-file=/etc/kubernetes/pki/front-proxy-client.crt --proxy-client-key-file=/etc/kubernetes/pki/front-proxy-client.key --requestheader-allowed-names=front-proxy-client --requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.crt --requestheader-extra-headers-prefix=X-Remote-Extra- --requestheader-group-headers=X-Remote-Group --requestheader-username-headers=X-Remote-User --secure-port=6443 --service-account-key-file=/etc/kubernetes/pki/sa.pub --service-cluster-ip-range=10.96.0.0/12 --tls-cert-file=/etc/kubernetes/pki/apiserver.crt --tls-private-key-file=/etc/kubernetes/pki/apiserver.key ``` 然后,我们使用ca.key与ca.crt签署client.csr,得到客户证书文件client.crt ``` $ openssl x509 -req -days 3650 -in client.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out client.crt ``` 此时,在当前目录下就会有如下三个文件 ``` $ ls client.crt client.csr client.key ``` 然后,使用客户端证书访问apiserver,访问成功 ``` $ curl -k --key ./client.key --cert ./client.crt https://10.142.232.160:6443/api/v1/nodes { "kind": "NodeList", "apiVersion": "v1", "metadata": { "selfLink": "/api/v1/nodes", "resourceVersion": "155586" }, ... ``` 注意,上面的命令在指定client.key与client.crt时一定要写成相对路径或绝对路径,不能写成以下,否则访问会报403 ``` $ curl -k --key client.key --cert client.crt https://10.142.232.160 ```