美文网首页kubernetes以及运维开发系列
kubernetes v1.11 二进制部署(二)之Opens

kubernetes v1.11 二进制部署(二)之Opens

作者: Devops海洋的渔夫 | 来源:发表于2018-09-02 08:41 被阅读157次

    原创内容,转载请注明出处

    博主地址:https://aronligithub.github.io/

    闲言乱语

    在前段日子编写了kubernetes部署全过程之后,好友告诉我,你写得太长啦。能不能拆分章节一下。但是由于各种工作上和学习自研上的计划以及任务太多了,这个篇章的修改以及新篇章的编写给延迟了下来,但是为了更加方便各位读者们阅读,我以下对内容做了四个篇章的拆分

    kubernetes v1.11 二进制部署篇章目录

    前言

    在经过上一篇章关于kubernetes 基本技术概述铺垫,在部署etcd集群之后,就可以开始部署kubernetes的集群服务了。


    使用openssl创建CA证书

    部署kubernetes服务使用的所需证书如下

    名称 公钥与私钥
    根证书公钥与私钥 ca.pem与ca.key
    API Server公钥与私钥 apiserver.pem与apiserver.key
    集群管理员公钥与私钥 admin.pem与admin.key
    节点proxy公钥与私钥 proxy.pem与proxy.key

    节点kubelet的公钥与私钥:是通过boostrap响应的方式,在启动kubelet自动会产生, 然后在master通过csr请求,就会产生。
    那么知道这些基本概念之后,下面就开始创建证书的步骤说明。
    再次之前可以先看看生成之后的结果图:

    证书生成的结果图
    kubelet证书自动生成结果图

    创建根证书

    # Generate the root CA. 
      #生成RSA私钥(无加密)
      openssl genrsa -out ca.key 2048 
      #生成 RSA 私钥和自签名证书
      openssl req -x509 -new -nodes -key ca.key -days 10000 -out ca.pem -subj "/CN=kubernetes/O=k8s"
    
    # 参数说明:
    -new 指生成证书请求
    -x509 表示直接输出证书
    -key 指定私钥文件
    -days 指定证书过期时间为10000天
    -out 导出结束后证书文件
    -subj 输入证书拥有者信息,这里指定 CN 以及 O 的值
    
    # 重要的CN以及0关键参数:
    -subj 设置CN以及0的值很重要,kubernetes会从证书这两个值对应获取相关的用户名以及用户租的值,如下:
    "CN":Common Name,kube-apiserver 从证书中提取该字段作为请求的用户名 (User Name);浏览器使用该字段验证网站是否合法;
    "O":Organization,kube-apiserver 从证书中提取该字段作为请求用户所属的组 (Group);
    

    apiserver证书生成

    master中需要证书如下:
    根证书公钥(root CA public key, ca.key)、根证书(ca.pem);
    apiserver证书:apiserver.pem与其私钥apiserver-key.pem

    1.创建openssl.cnf

    openssl示例

    [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
    IP.1 = ${K8S_SERVICE_IP}
    IP.2 = ${MASTER_IPV4}
    
    [^_^]:
    使用有API被访问的Master的IP地址替换${MASTER_IPV4},使用自己规划作为kubernetes service IP端的首IP替换${K8S_SERVICE_IP}如:一般以10.100.0.0/16作为service的服务IP端,则此处以10.100.0.1替换${K8S_SERVICE_IP}
    如果在高可用配置中部署多个Master节点,需要添加更多的TLS subjectAltNames (SANs)。每个证书合适的SANs配置依赖于从节点与kubectl用户是怎样与Master节点通讯的:直接通过IP地址、通过负载均衡、或者通过解析DNS名称。
    DNS.5 = ${MASTER_DNS_NAME}
    IP.3 = ${MASTER_IP}
    IP.4 = ${MASTER_LOADBALANCER_IP}
    从节点将通过${MASTER_DNS_NAME}访问到Loadbalancer。
    

    根据上面的示例,下面则以server81作为master服务器,创建openssl的cnf文件。


    创建openssl.cnf文件

    [root@server81 openssl]# vim openssl.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
    DNS.5 = kubernetes.default.svc.cluster.local
    DNS.6 = k8s_master
    IP.1 = 10.0.6.1              # ClusterServiceIP 地址
    IP.2 = 172.16.5.81           # master IP地址
    IP.3 = 10.1.0.1              # docker IP地址
    IP.4 = 10.0.6.200            # kubernetes DNS IP地址
    

    2.生成apiserver 证书对

    # Generate the API server keypair.
    openssl genrsa -out apiserver.key 2048
    
    openssl req -new -key apiserver.key -out apiserver.csr -subj "/CN=kubernetes/O=k8s" -config openssl.cnf
    
    openssl x509 -req -in apiserver.csr -CA ca.pem -CAkey ca.key -CAcreateserial -out apiserver.pem -days 3650 -extensions v3_req -extfile openssl.cnf
    

    一般生成的根证书(ca.key, ca.pem)与apiserver证书(apiserver.key,apiserver.pem)放置在Master节点的/etc/kubernetes/kubernetesTLS/路径下(这个路径是可以自定义修改的,不一定要用我这个)


    3.证书配置相关说明

    apiserver的配置中需要指定如下参数:

    ## Kubernetes的访问证书配置:
    --token-auth-file=/etc/kubernetes/token.csv   
    --tls-cert-file=/etc/kubernetes/kubernetesTLS/apiserver.pem 
    --tls-private-key-file=/etc/kubernetes/kubernetesTLS/apiserver.key  
    --client-ca-file=/etc/kubernetes/kubernetesTLS/ca.pem  
    --service-account-key-file=/etc/kubernetes/kubernetesTLS/ca.key  
    
    ## Etcd的访问证书配置:
    --storage-backend=etcd3  
    --etcd-cafile=/etc/etcd/etcdSSL/ca.pem  
    --etcd-certfile=/etc/etcd/etcdSSL/etcd.pem  
    --etcd-keyfile=/etc/etcd/etcdSSL/etcd-key.pem  
    

    controller-manager的配置中需要指定如下参数:

    ## Kubernetes的访问证书配置:
    --cluster-name=kubernetes  
    --cluster-signing-cert-file=/etc/kubernetes/kubernetesTLS/ca.pem  
    --cluster-signing-key-file=/etc/kubernetes/kubernetesTLS/ca.key  
    --service-account-private-key-file=/etc/kubernetes/kubernetesTLS/ca.key  
    --root-ca-file=/etc/kubernetes/kubernetesTLS/ca.pem
    

    admin集群管理员证书生成

    ## 此证书用于kubectl,设置方式如下:
    openssl genrsa -out admin.key 2048
    openssl req -new -key admin.key -out admin.csr -subj "/CN=admin/O=system:masters/OU=System"
    openssl x509 -req -in admin.csr -CA ca.pem -CAkey ca.key -CAcreateserial -out admin.pem -days 3650
    

    说明:

    由于后续 kube-apiserver 在启用RBAC模式之后, 客户端(如 kubelet、kube-proxy、Pod)请求进行授权的时候会需要认证用户名、以及用户组
    那么所谓的用户名用户组哪里来定义呢?
    我们来看看上面openssl创建证书的语句:

    openssl req -new -key admin.key -out admin.csr -subj "/CN=admin/O=system:masters/OU=System"
    

    其中这里的/CN=admin/O=system:masters/OU=System就是在CN定义用户为adminO定义用户组为system:mastersOU 指定该证书的 Group 为 system:masters

    那么定义好之后,在kubernetes中是怎么使用的呢?

    kube-apiserver 预定义了一些 RBAC 使用的 RoleBindings(角色),如 cluster-admin (角色)Group(组) system:mastersRole(角色) cluster-admin 绑定,该 Role 授予了调用kube-apiserver 的所有 API的权限;
    那么当然的,我们创建admin的证书的时候,就要按照该上面的说明定义好证书的组、用户

    另外当kubelet使用该证书访问kube-apiserver是什么样的过程呢?

    在证书的签名中,OU 指定该证书的 Group 为 system:masterskubelet 使用该证书访问 kube-apiserver 时 ,由于证书被 CA 签名,所以认证通过,同时由于证书用户组为经过预授权的 system:masters,所以被授予访问所有 API 的权限
    同理,如果你是使用CFSSL来签名证书也需要这样去配置好用户和用户组。在这里就不单独写CFSSL签kubernetes的相关证书了。
    重要的是要好好理解证书签名kubernetesRBAC角色绑定的关系。


    节点proxy证书生成

    openssl genrsa -out proxy.key 2048
    openssl req -new -key proxy.key -out proxy.csr -subj "/CN=system:kube-proxy"
    openssl x509 -req -in proxy.csr -CA ca.pem -CAkey ca.key -CAcreateserial -out proxy.pem -days 3650
    

    说明:

    从上面解析说明admin的CN签名与kubernetes角色绑定的关系中,这里简单一眼就看出CN是拿来定义proxy的用户的。

    CN 指定该证书的请求 User(用户)system:kube-proxy
    kubernetesRABC默认角色绑定中,kube-apiserver 预定义的 RoleBinding cluster-adminUser system:kube-proxyRole system:node-proxier 绑定,该 Role 授予了调用 kube-apiserver Proxy 相关 API 的权限;


    将生成的ca证书拷贝至准备部署的指定目录


    以上就是部署master节点所需要的证书文件了。

    在这个过程CA产生的过程,大家肯定会角色笔者为什么要这么啰嗦详详细细去写那么多注释和说明。而且看了那么多内容之后,内心肯定觉得步骤好多呀,好烦躁。
    不着急,步骤说明详细可以让读者的你更加好去理解;步骤多而烦躁我已经写好了自动化签订证书的脚本了。
    在这里附上源码:

    • 第一步,创建openssl的cnf文件
    [root@server81 openssl]# cat create_openssl_cnf.sh 
    #!/bin/bash
    basedir=$(cd `dirname $0`;pwd)
    
    ################## Set PARAMS ######################
    
    MASTER_IP=`python -c "import socket;print([(s.connect(('8.8.8.8', 53)), s.getsockname()[0], s.close()) for s in [socket.socket(socket.AF_INET, socket.SOCK_DGRAM)]][0][1])"`
    DockerServiceIP="10.1.0.1"  ## 10.1.0.0/16
    ClusterServiceIP="10.0.6.1" ## 10.0.6.0/24
    kubeDnsIP="10.0.6.200"
    
    ## function
    function create_openssl_cnf(){
    cat <<EOF > $basedir/openssl.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
    DNS.5 = kubernetes.default.svc.cluster.local
    DNS.6 = k8s_master
    IP.1 = $ClusterServiceIP              # ClusterServiceIP 地址
    IP.2 = $MASTER_IP                     # master IP地址
    IP.3 = $DockerServiceIP               # docker IP地址
    IP.4 = $kubeDnsIP                     # kubernetes DNS IP地址
    EOF
    }
    
    create_openssl_cnf
    [root@server81 openssl]# 
    

    - 第二步,创建master所需的TLS证书

    [root@server81 install_k8s_master]# ls
    configDir     Step1_create_CA.sh  Step2_create_token.sh       Step4_install_controller.sh  Step6_create_kubeconfig_file.sh
    Implement.sh  Step1_file          Step3_install_apiserver.sh  Step5_install_scheduler.sh   Step7_set_master_info.sh
    [root@server81 install_k8s_master]# 
    [root@server81 install_k8s_master]# vim Step1_create_CA.sh 
    [root@server81 install_k8s_master]# cat Step1_create_CA.sh 
    #!/bin/bash
    basedir=$(cd `dirname $0`;pwd)
    configdir=$basedir/Step1_file
    openssldir=$configdir/openssl
    ssldir=$configdir/kubernetesTLS
    kubernetsDir=/etc/kubernetes
    kubernetsTLSDir=/etc/kubernetes/kubernetesTLS
    
    ################## Set PARAMS ######################
    MASTER_IP=`python -c "import socket;print([(s.connect(('8.8.8.8', 53)), s.getsockname()[0], s.close()) for s in [socket.socket(socket.AF_INET, socket.SOCK_DGRAM)]][0][1])"`
    
    
    ## function and implments
    function check_firewalld_selinux(){
      systemctl status firewalld
      /usr/sbin/sestatus -v
      swapoff -a
    }
    
    check_firewalld_selinux
    
    function create_ssl(){
      cd $configdir && rm -rf $ssldir && mkdir -p $ssldir
      cd $ssldir && \
      # Generate the root CA. 
      openssl genrsa -out ca.key 2048 
      openssl req -x509 -new -nodes -key ca.key -days 10000 -out ca.pem -subj "/CN=kubernetes/O=k8s"
      ls $ssldir
    }
    
    create_ssl 
    
    function create_openssl_cnf(){
      sh $openssldir/create_openssl_cnf.sh 
      cat $openssldir/openssl.cnf > $ssldir/openssl.cnf
    }
    
    create_openssl_cnf
    
    function create_apiserver_key_pem(){
      cd $ssldir && \
      openssl genrsa -out apiserver.key 2048
      openssl req -new -key apiserver.key -out apiserver.csr -subj "/CN=kubernetes/O=k8s" -config openssl.cnf
      openssl x509 -req -in apiserver.csr -CA ca.pem -CAkey ca.key -CAcreateserial -out apiserver.pem -days 3650 -extensions v3_req -extfile openssl.cnf
      ls $ssldir
    }
    
    create_apiserver_key_pem
    
    function create_admin_key_pem(){
      cd $ssldir && \
      openssl genrsa -out admin.key 2048 
      openssl req -new -key admin.key -out admin.csr -subj "/CN=admin/O=system:masters/OU=System" 
      openssl x509 -req -in admin.csr -CA ca.pem -CAkey ca.key -CAcreateserial -out admin.pem -days 3650
      ls $ssldir
    }
    
    create_admin_key_pem
    
    function create_proxy_key_pem(){
      cd $ssldir && \
      openssl genrsa -out proxy.key 2048
      openssl req -new -key proxy.key -out proxy.csr -subj "/CN=system:kube-proxy"
      openssl x509 -req -in proxy.csr -CA ca.pem -CAkey ca.key -CAcreateserial -out proxy.pem -days 3650
      ls $ssldir
    }
    
    create_proxy_key_pem
    
    
    function setup_ca(){
      rm -rf $kubernetsDir
      mkdir -p $kubernetsTLSDir
      cat $ssldir/ca.pem > $kubernetsTLSDir/ca.pem
      cat $ssldir/ca.key > $kubernetsTLSDir/ca.key
      cat $ssldir/apiserver.pem > $kubernetsTLSDir/apiserver.pem
      cat $ssldir/apiserver.key > $kubernetsTLSDir/apiserver.key
      cat $ssldir/admin.pem > $kubernetsTLSDir/admin.pem
      cat $ssldir/admin.key > $kubernetsTLSDir/admin.key
      cat $ssldir/proxy.pem > $kubernetsTLSDir/proxy.pem
      cat $ssldir/proxy.key > $kubernetsTLSDir/proxy.key
    
      echo "checking TLS file:"
      ls $kubernetsTLSDir
    }
    
    setup_ca
    [root@server81 install_k8s_master]# 
    

    执行生成证书如下

    [root@server81 install_k8s_master]# ./Step1_create_CA.sh 
    ● firewalld.service - firewalld - dynamic firewall daemon
       Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
       Active: inactive (dead)
         Docs: man:firewalld(1)
    SELinux status:                 disabled
    Generating RSA private key, 2048 bit long modulus
    ................................................+++
    ............................................................................+++
    e is 65537 (0x10001)
    ca.key  ca.pem
    Generating RSA private key, 2048 bit long modulus
    .......................................................................................+++
    .............+++
    e is 65537 (0x10001)
    Signature ok
    subject=/CN=kubernetes/O=k8s
    Getting CA Private Key
    apiserver.csr  apiserver.key  apiserver.pem  ca.key  ca.pem  ca.srl  openssl.cnf
    Generating RSA private key, 2048 bit long modulus
    .......................................+++
    ...........+++
    e is 65537 (0x10001)
    Signature ok
    subject=/CN=admin/O=system:masters/OU=System
    Getting CA Private Key
    admin.csr  admin.key  admin.pem  apiserver.csr  apiserver.key  apiserver.pem  ca.key  ca.pem  ca.srl  openssl.cnf
    Generating RSA private key, 2048 bit long modulus
    ...+++
    ..+++
    e is 65537 (0x10001)
    Signature ok
    subject=/CN=system:kube-proxy
    Getting CA Private Key
    admin.csr  admin.pem      apiserver.key  ca.key  ca.srl       proxy.csr  proxy.pem
    admin.key  apiserver.csr  apiserver.pem  ca.pem  openssl.cnf  proxy.key
    checking TLS file:
    admin.key  admin.pem  apiserver.key  apiserver.pem  ca.key  ca.pem  proxy.key  proxy.pem
    [root@server81 install_k8s_master]#
    [root@server81 install_k8s_master]# ls
    configDir     Step1_create_CA.sh  Step2_create_token.sh       Step4_install_controller.sh  Step6_create_kubeconfig_file.sh
    Implement.sh  Step1_file          Step3_install_apiserver.sh  Step5_install_scheduler.sh   Step7_set_master_info.sh
    [root@server81 install_k8s_master]#
    [root@server81 install_k8s_master]# ls /etc/kubernetes/
    kubernetesTLS
    [root@server81 install_k8s_master]# ls /etc/kubernetes/kubernetesTLS/
    admin.key  admin.pem  apiserver.key  apiserver.pem  ca.key  ca.pem  proxy.key  proxy.pem
    [root@server81 install_k8s_master]# 
    [root@server81 install_k8s_master]# ls -ll /etc/kubernetes/kubernetesTLS/
    total 32
    -rw-r--r-- 1 root root 1675 Aug 19 22:21 admin.key
    -rw-r--r-- 1 root root 1050 Aug 19 22:21 admin.pem
    -rw-r--r-- 1 root root 1675 Aug 19 22:21 apiserver.key
    -rw-r--r-- 1 root root 1302 Aug 19 22:21 apiserver.pem
    -rw-r--r-- 1 root root 1679 Aug 19 22:21 ca.key
    -rw-r--r-- 1 root root 1135 Aug 19 22:21 ca.pem
    -rw-r--r-- 1 root root 1679 Aug 19 22:21 proxy.key
    -rw-r--r-- 1 root root 1009 Aug 19 22:21 proxy.pem
    [root@server81 install_k8s_master]# 
    

    怎么样?有了这个脚本是不是感觉世界都美好了。只要理解清楚详细配置步骤,然后执行一下脚本,你就可以拥有更加多的咖啡时间了。


    kubernetes v1.11 二进制部署篇章目录


    相关文章

      网友评论

        本文标题:kubernetes v1.11 二进制部署(二)之Opens

        本文链接:https://www.haomeiwen.com/subject/tpjwiftx.html