zoukankan      html  css  js  c++  java
  • 创建双向 CA x509 验证证书 kube-apiserver

    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
    
  • 相关阅读:
    线程池的实现原理
    log4j 具体解说(不能再具体了)
    MyEclipse中背景颜色的设定
    cacheManager载入问题
    SAP 经常使用T-CODE
    Oracle 版本号说明
    用XMPP实现完整Android聊天项目
    选择如何的系统更能适合App软件开发人员?
    爱国者布局智能硬件,空探系列PM2.5检測仪“嗅霾狗”大曝光
    Innodb引擎状态查看
  • 原文地址:https://www.cnblogs.com/TopGear/p/14549653.html
Copyright © 2011-2022 走看看