• k8s创建CA证书


    https://github.com/easzlab/kubeasz/blob/master/docs/setup/01-CA_and_prerequisite.md

    参考上下文如下:

    env
       
      kubectl config set-credentials ${USER_NAME} --token=${USER_TOKEN}
      kubectl config set-cluster kubernetes --server=${APISERVER} --insecure-skip-tls-verify=true
      kubectl config set-context kubernetes \
      --cluster=kubernetes \
      --user=${USER_NAME} \
      --namespace=${NAMESPACE}
      kubectl config use-context kubernetes
       
      cat ~/.kube/config
       
      # ttyd -p 8080 bash
      ttyd -p 8080 zsh

     

    本步骤主要完成:

    • (optional) role:os-harden,可选系统加固,符合linux安全基线,详见upstream
    • (optional) role:chrony,可选集群节点时间同步
    • role:deploy,创建CA证书、集群组件访问apiserver所需的各种kubeconfig
    • role:prepare,系统基础环境配置、分发CA证书、kubectl客户端安装

    deploy 角色

    主要任务讲解:roles/deploy/tasks/main.yml

    创建 CA 证书

    kubernetes 系统各组件需要使用 TLS 证书对通信进行加密,使用 CloudFlare 的 PKI 工具集生成自签名的 CA 证书,用来签名后续创建的其它 TLS 证书。参考阅读

    根据认证对象可以将证书分成三类:服务器证书server cert,客户端证书client cert,对等证书peer cert(既是server cert又是client cert),在kubernetes 集群中需要的证书种类如下:

    • etcd 节点需要标识自己服务的server cert,也需要client certetcd集群其他节点交互,当然可以分别指定2个证书,为方便这里使用一个对等证书
    • master 节点需要标识 apiserver服务的server cert,也需要client cert连接etcd集群,这里也使用一个对等证书
    • kubectl calico kube-proxy 只需要client cert,因此证书请求中 hosts 字段可以为空
    • kubelet 需要标识自己服务的server cert,也需要client cert请求apiserver,也使用一个对等证书

    整个集群要使用统一的CA 证书,只需要在ansible控制端创建,然后分发给其他节点;为了保证安装的幂等性,如果已经存在CA 证书,就跳过创建CA 步骤

    创建 CA 配置文件 ca-config.json.j2

    {
      "signing": {
        "default": {
          "expiry": "{{ CERT_EXPIRY }}"
        },
        "profiles": {
          "kubernetes": {
            "usages": [
                "signing",
                "key encipherment",
                "server auth",
                "client auth"
            ],
            "expiry": "{{ CERT_EXPIRY }}"
          }
        },
        "profiles": {
          "kcfg": {
            "usages": [
                "signing",
                "key encipherment",
                "client auth"
            ],
            "expiry": "{{ CUSTOM_EXPIRY }}"
          }
        }
      }
    }
    • signing:表示该证书可用于签名其它证书;生成的 ca.pem 证书中 CA=TRUE
    • server auth:表示可以用该 CA 对 server 提供的证书进行验证;
    • client auth:表示可以用该 CA 对 client 提供的证书进行验证;
    • profile kubernetes 包含了server authclient auth,所以可以签发三种不同类型证书;expiry 证书有效期,默认50年
    • profile kcfg 在后面客户端kubeconfig证书管理中用到

    创建 CA 证书签名请求 ca-csr.json.j2

    {
      "CN": "kubernetes",
      "key": {
        "algo": "rsa",
        "size": 2048
      },
      "names": [
        {
          "C": "CN",
          "ST": "HangZhou",
          "L": "XS",
          "O": "k8s",
          "OU": "System"
        }
      ],
      "ca": {
        "expiry": "876000h"
      }
    }
    • ca expiry 指定ca证书的有效期,默认100年

    生成CA 证书和私钥

    cfssl gencert -initca ca-csr.json | cfssljson -bare ca

    生成 kubeconfig 配置文件

    kubectl使用~/.kube/config 配置文件与kube-apiserver进行交互,且拥有管理 K8S集群的完全权限,

    准备kubectl使用的admin 证书签名请求 admin-csr.json.j2

    {
      "CN": "admin",
      "hosts": [],
      "key": {
        "algo": "rsa",
        "size": 2048
      },
      "names": [
        {
          "C": "CN",
          "ST": "HangZhou",
          "L": "XS",
          "O": "system:masters",
          "OU": "System"
        }
      ]
    }
    
    • kubectl 使用客户端证书可以不指定hosts 字段
    • 证书请求中 O 指定该证书的 Group 为 system:masters,而 RBAC 预定义的 ClusterRoleBinding 将 Group system:masters 与 ClusterRole cluster-admin 绑定,这就赋予了kubectl所有集群权限
    $ kubectl describe clusterrolebinding cluster-admin
    Name:         cluster-admin
    Labels:       kubernetes.io/bootstrapping=rbac-defaults
    Annotations:  rbac.authorization.kubernetes.io/autoupdate=true
    Role:
      Kind:  ClusterRole
      Name:  cluster-admin
    Subjects:
      Kind   Name            Namespace
      ----   ----            ---------
      Group  system:masters  

    生成 admin 用户证书

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

    生成 ~/.kube/config 配置文件

    使用kubectl config 生成kubeconfig 自动保存到 ~/.kube/config,生成后 cat ~/.kube/config可以验证配置文件包含 kube-apiserver 地址、证书、用户名等信息。

    kubectl config set-cluster kubernetes --certificate-authority=ca.pem --embed-certs=true --server=127.0.0.1:8443
    kubectl config set-credentials admin --client-certificate=admin.pem --embed-certs=true --client-key=admin-key.pem
    kubectl config set-context kubernetes --cluster=kubernetes --user=admin
    kubectl config use-context kubernetes
    

    生成 kube-proxy.kubeconfig 配置文件

    创建 kube-proxy 证书请求

    {
      "CN": "system:kube-proxy",
      "hosts": [],
      "key": {
        "algo": "rsa",
        "size": 2048
      },
      "names": [
        {
          "C": "CN",
          "ST": "HangZhou",
          "L": "XS",
          "O": "k8s",
          "OU": "System"
        }
      ]
    }
    • kube-proxy 使用客户端证书可以不指定hosts 字段
    • CN 指定该证书的 User 为 system:kube-proxy,预定义的 ClusterRoleBinding system:node-proxier 将User system:kube-proxy 与 Role system:node-proxier 绑定,授予了调用 kube-apiserver Proxy 相关 API 的权限;
    $ kubectl describe clusterrolebinding system:node-proxier
    Name:         system:node-proxier
    Labels:       kubernetes.io/bootstrapping=rbac-defaults
    Annotations:  rbac.authorization.kubernetes.io/autoupdate=true
    Role:
      Kind:  ClusterRole
      Name:  system:node-proxier
    Subjects:
      Kind  Name               Namespace
      ----  ----               ---------
      User  system:kube-proxy  

    生成 system:kube-proxy 用户证书

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

    生成 kube-proxy.kubeconfig

    使用kubectl config 生成kubeconfig 自动保存到 kube-proxy.kubeconfig

    kubectl config set-cluster kubernetes --certificate-authority=ca.pem --embed-certs=true --server=127.0.0.1:8443 --kubeconfig=kube-proxy.kubeconfig
    kubectl config set-credentials kube-proxy --client-certificate=kube-proxy.pem --embed-certs=true --client-key=kube-proxy-key.pem --kubeconfig=kube-proxy.kubeconfig
    kubectl config set-context default --cluster=kubernetes --user=kube-proxy --kubeconfig=kube-proxy.kubeconfig
    kubectl config use-context default --kubeconfig=kube-proxy.kubeconfig
    

    prepare 角色

    请在另外窗口打开roles/prepare/tasks/main.yml 文件,比较简单直观

    1. 设置基础操作系统软件和系统参数,请阅读脚本中的注释内容
    2. 创建一些基础文件目录
    3. 分发kubeconfig配置文件
  • 相关阅读:
    hdu 2444(二分图) The Accomodation of Students
    hdu 5532 (LIS) Almost Sorted Array
    hdu 1059 (多重背包) Dividing
    poj 2184(Cow Exhibition)
    hdu 2571 (命运) 那个配图女神
    poj 3624 && hdu 2955(背包入门)
    hdu 1257 && hdu 1789(简单DP或贪心)
    BBS(第一天)项目之 注册功能实现通过forms验证与 前端ajax请求触发查询数据库判断用户是否存在的功能实现
    Django之form模板的使用
    Django之Auth模块 实现登录,退出,自带session 与认证功能的一个重要的模块
  • 原文地址:https://www.cnblogs.com/cheyunhua/p/16221223.html
Copyright © 2020-2023  润新知