1. 设置 kube-apiserver 的 CA 证书相关的文件和启动参数

使用 OpenSSL 工具在 Master 服务器上创建 CA 证书和私钥相关的文件:

# openssl genrsa -out ca.key  2048
# openssl req -x509 -new -nodes -key ca.key -subj "/CN=k8s-master" -days 5000 -out ca.crt # openssl genrsa -out server.key 2048

注意,在生成 ca.crt 时,-subj 参数中的 "/CN" 的值为 Master 主机名。

准备 master_ssl.cnf 配置文件(用于 openssl 证书签发),该文件用于 x509 v3版本的证书。 在该文件中主要需要 Master 服务器的 hostname(k8s-master)、IP地址(192.168.18.3),以及 Kubernetes Master Service 的虚拟服务名称(kubernetes.default 等)和该虚拟服务器的 ClusterIP 地址(169.169.0.1)。

master_ssl.cnf 文件的示例如下:

[req]
req_extensions = v3_req
distinguished_name = req_distinguished_name [req_distinguished_name]
[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = kubernetes
DNS.2 = kubernetes.default
DNS.3 = kubernetes.default.svc
DNS.4 = kubernetes.default.svc.cluster.local
DNS.5 = k8s-master
IP.1 = 169.169.0.1
IP.2 = 192.168.18.3

基于 master_ssl.cnf 创建 server.csr 和 server.crt 文件。

在生成 server.csr 时,-subj 参数中的 "/CN" 的值需为 Master 的主机名:

# openssl req -new -key server.key -subj "/CN=k8s-master" -config master_ssl.cnf -out server.csr
# openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -days 5000 -extensions v3_req -extfile master_ssl.cnf -out server.crt

全部执行完成后会生成 6 个文件:

  • ca.crt
  • ca.key
  • ca.srl
  • server.crt
  • server.csr
  • server.key

将这些文件复制到一个目录下(例如 /var/run/kubernetes/),然后设置 kube-apiserver 的三个启动参数 "--client-ca-file" "--tls-cert-file" 和 "--tls-private-key-file",分别代表 CA 根证书文件、服务端证书文件 和 服务端私钥文件。

--client-ca-file=/var/run/kubernetes/ca.crt
--tls-private-key-file=/var/run/kubernetes/server.key
--tls-cert-file=/var/run/kubernetes/server.crt

同时,可以关闭非安全端口(设置 --insecure-port=0),设置安全端口为 6443(默认值):

--insecure-port=0
--secure-port=6443

最后重启 kube-apiserver 服务。

2. 设置kube-controller-manager 的客户端证书、私钥和启动参数

代码如下:

$ openssl genrsa -out cs_client.key 2048
$ openssl req -new -key cs_client.key -subj "/CN=k8s-master" -out cs_client.csr
$ openssl x509 -req -in cs_client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out cs_client.crt -days 5000

其中,在生成 cs_client.crt 时,-CA 参数和 -CAkey 参数使用的是 API Server 的 ca.crtca.key 文件。

然后将这些复制到一个目录下(例如/var/run/kubernetes/)。

接下来创建/etc/kubernetes/kubeconfig 文件(kube-controller-managerkube-scheduler共用),配置客户端证书等相关参数,内容如下:

apiVersion: v1
kind: Config
users:
- name: controllermanager
user:
client-certificate: /var/run/kubernertes/cs_client.crt
client-key: /var/run/kubenetes/cs_client.key
clusters:
- name: local
cluster:
certificate-authority: /var/run/kubernetes/ca.crt
server: https://192.168.18.3:6443
contexts:
- context:
cluster: local
user: controllermanager
name: my-context
current-context: my-context

然后设置 kube-controller-manager 服务的启动参数:

--service-account-key-file=/var/run/kubernetes/server.key \
--root-ca-file=/var/run/kubenetes/ca.crt \
--kubeconfig=/etc/kubenetes/kubeconfig

最后重启 kube-controller-manager 服务。

3. 设置 kube-scheduler 启动参数

kube-scheduler 复用上一步 kube-controller-manager 创建的客户端证书,配置启动参数:

--kubeconfig=/etc/kubernetes/kubeconfig

重启 kube-scheduler 服务。

4. 设置每个 Node 上 kubelet 的客户端证书、私钥和启动参数

首先,复制 kube-apiserverca.crtca.key 文件到 Node 上,在生成 kubelet_client.crt 时 -CA 参数和-CAkey参数使用的是 API Server 的 ca.crtca.key 文件;在生成 kubelet_client.csr 时,将 -subj 参数中的 “/CN” 设置为本 Node 的 IP 地址:

$ openssl genrsa -out kubelet_client.key 2048
$ openssl req -new -key kubelet_client.key -subj "/CN=192.168.18.4" -out kubelet_client.csr
$ openssl x509 -req -in kubelet_client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out kubelet_client.crt -days 5000

将这些复制到一个目录下(例如/var/run/kubernetes/)。

接下来创建/etc/kubernetes/kubeconfig 文件(kubelet 和 kube-proxy 进程共用),配置客户端证书等相关参数,内容如下:

apiVersion: v1
kind: Config
users:
- name: kubelet
user:
client-certificate: /etc/kubernetes/ssl_keys/kubelet_client.crt
client-key: /etc/kubernetes/ssl_keys/kubelet_client.key
clusters:
- name: local
cluster:
certificate-authority: /etc/kubernetes/ssl_keys/ca.crt
srver: https://192.168.18.3:6443
contexts:
- context:
cluster: local
user: kubelet
name: my-context
current-context: my-context

然后设置kubelet服务的启动参数:

--kubeconfig=/etc/kubelet/kubeconfig

最后重启 kubelet 服务。

5. 设置 kube-proxy 的启动参数

kube-proxy 复用上一步 kubelet 创建的客户端证书,配置启动参数:

--kubeconfig=/etc/kubernetes/kubeconfig

重启 kube-proxy 服务。

至此,一个基于 CA 的双向数字证书认证的 Kubernetes 集群环境就搭建完成了。

6. 设置 kubelet 客户端使用安全方式访问 API Server

在使用 kubectl 对 Kubernetes 集群进行操作时,默认使用非安全端口 8080 对 API Server 进行访问,也可以设置为安全访问 API Server 的模式,需要设置 3 个证书相关的参数 --certificate-authority--client-certificate--client-key,分别表示用于 CA授权的证书、客户端证书 和 客户端密钥。

  • --certificate-authority:使用 kube-apiservr 生成的 ca.crt 文件。
  • --client-certificate:使用为 kube-controller-manager 生成的 cs_client.crt 文件。
  • --client-key:使用为 kube-controller-manager 生成的 cs_client.key 文件。

同时,指定 API Server 的 URL 地址为 HTTPS 安全地址(例如 https://k8s-master:443),最后输入需要执行的子命令,即可对 API Server 进行安全访问了:

# kubectl --server=https://192.168.18.3:6443 \
--certificate-authority=/etc/kubernetes/ssl_keys/ca.crt \
--client-certificate=/etc/kubernetes/ssl_keys/cs_client.crt \
--client-key=/etc/kubernetes/ssl_keys/cs_client.key get nodes NAME STATUS AGE
k8s-node-1 Ready 1h

创建双向 CA x509 验证证书 kube-apiserver的更多相关文章

  1. 创建私有CA并签发证书

    一.创建私有CA 1.创建所需要的文件 2.创建私有密钥 3.CA自签证书 -new: 生成新证书签署请求:               -x509: 专用于CA生成自签证书:不自签的时候不要加该选项 ...

  2. 使用 OpenSSL 创建私有 CA:1 根证书

    OpenSSL 创建私有 CA 三部曲:使用 OpenSSL 创建私有 CA:1 根证书使用 OpenSSL 创建私有 CA:2 中间证书使用 OpenSSL 创建私有 CA:3 用户证书 OpenS ...

  3. 自签名证书和私有CA签名的证书的区别 创建自签名证书 创建私有CA 证书类型 证书扩展名【转】

    自签名的证书无法被吊销,CA签名的证书可以被吊销 能不能吊销证书的区别在于,如果你的私钥被黑客获取,如果证书不能被吊销,则黑客可以伪装成你与用户进行通信   如果你的规划需要创建多个证书,那么使用私有 ...

  4. 使用 OpenSSL 创建私有 CA:3 用户证书

    OpenSSL 创建私有 CA 三部曲:使用 OpenSSL 创建私有 CA:1 根证书使用 OpenSSL 创建私有 CA:2 中间证书使用 OpenSSL 创建私有 CA:3 用户证书 在前文&l ...

  5. 使用 OpenSSL 创建私有 CA:2 中间证书

    OpenSSL 创建私有 CA 三部曲:使用 OpenSSL 创建私有 CA:1 根证书使用 OpenSSL 创建私有 CA:2 中间证书使用 OpenSSL 创建私有 CA:3 用户证书 本文将在前 ...

  6. 通过Go语言创建CA与签发证书

    本篇文章中,将描述如何使用go创建CA,并使用CA签署证书.在使用openssl创建证书时,遵循的步骤是 创建秘钥 > 创建CA > 生成要颁发证书的秘钥 > 使用CA签发证书.这种 ...

  7. Centos7创建CA和申请证书

    转载:http://rackie386.blog.51cto.com/11279229/1947999 Centos7.3创建CA和申请证书 openssl 的配置文件:/etc/pki/tls/op ...

  8. Centos7创建CA和申请证书 转自https://www.cnblogs.com/mingzhang/p/8949541.html

    Centos7.3创建CA和申请证书 openssl 的配置文件:/etc/pki/tls/openssl.cnf 重要参数配置路径 dir   = /etc/pki/CA               ...

  9. 利用CA私钥和证书创建中间CA

    本文借助实验环境下创建的root CA私钥和证书进一步创建中间CA.为了便于区分,我们将创建中间CA(intermediate CA)的CA称为根CA(root CA). 关于如何使用OpenSSL创 ...

随机推荐

  1. TP6自带的跨域中间件无法使用的个人解决方法

    使用TP6,因为需要跨域上传图片,一直不成功,网上搜了好久,方法都没解决跨域上传文件 比如下面的方式没成功 $this->app = $app; $this->request = $thi ...

  2. jenkins的目录介绍

    jenkins的目录介绍: /etc/init.d/jenkins                #jenkins的启动文件 /etc/logrotate.d/jenkins /etc/sysconf ...

  3. struts2 使用ajax进行图片上传

    第一步:引入一个插件    jquery.form.js /*! * jQuery Form Plugin * version: 3.36.0-2013.06.16 * @requires jQuer ...

  4. django 模版-标签-视图-csrf-token-模版继承-HTML过滤器

    """ ******模版****** --定义模版-- **变量** 视图传递给模版的数据 注意1:要遵守标识符规则 语法:{{var(即变量)}} 如果使用的变量不存在 ...

  5. 分组密码(四)AES算法① — 密码学复习(七)

    介绍完S-PN型结构之后,下面介绍AES算法.由于内容比较多所以将其分为两篇来介绍,本篇主要讲AES的历史时间节点.产生背景.与DES的对比.算法框图(粗略)以及一些数学基础. 7.1 AES的历史时 ...

  6. IdentityServer4[2]:启动一个新的IdentityServer项目

    启动一个新的IdentityServer项目 从头开始,从基础开始,然后变得更加复杂,循序渐进的学习 工具:VS2017 15.9.8 .Net Core2.2 基本过程 创建一个新的ASP.NET ...

  7. css 弹性盒子--“垂直居中”--兼容写法

    使用弹性盒子兼容低端适配有时需要: display:flex 和 display:-webkit-box   display: -webkit-box; -webkit-box-align: cent ...

  8. Java中的引用类型和使用场景

    作者:Grey 原文地址:Java中的引用类型和使用场景 Java中的引用类型有哪几种? Java中的引用类型分成强引用, 软引用, 弱引用, 虚引用. 强引用 没有引用指向这个对象,垃圾回收会回收 ...

  9. 关于web项目中的资源跳转

    1.跳转包括两种方式: 转发 forward 重定向 redirect 2.两种方式的代码: AServlet类: //向request范围中存储数据 request.setAttribute(&qu ...

  10. 如何在前端通过JavaScript创建修改CAD图形

    背景 在之前的博文CAD图DWG解析WebGIS可视化技术分析总结.CAD_DWG图Web可视化一站式解决方案-唯杰地图-vjmap中讲解了如何把CAD的DWG格式的图纸Web可视化的方案,那在Web ...