• kubernetes 1.6 集群实践 (一)


    环境

    hostname ip
    192.168.19.101 etcd-1,mater
    192.168.19.102 etcd-2,node
    192.168.19.103 etcd-3,node
    192.168.19.104 node

    配置tls认证证书及密钥

    安装cfssl 工具

    $ wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
    $ chmod +x cfssl_linux-amd64
    $ sudo mv cfssl_linux-amd64 /usr/local/bin/cfssl
    $ wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
    $ chmod +x cfssljson_linux-amd64
    $ sudo mv cfssljson_linux-amd64 /usr/local/bin/cfssljson
    $ wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
    $ chmod +x cfssl-certinfo_linux-amd64
    $ sudo mv cfssl-certinfo_linux-amd64 /usr/local/bin/cfssl-certinfo
    

    创建CA证书

    $ mkdir /root/ssl
    $ cd /root/ssl
    $ cfssl print-defaults csr > ca-csr.json
    #对CA证书签名请求修改为下
    $ tee  ca-csr.json  <<-'EOF'               
    {
    "CN": "panjb-k8s",
    "key": {
        "algo": "rsa",
        "size": 2048
        },
    "names": [
        {
        "C": "CN",
        "ST": "SiChuan",
        "L": "chengdu",
        "O": "k8s",
        "OU": "System"
        }
            ]
    }
    EOF
    $ cfssl gencert -initca ca-csr.json | cfssljson -bare ca   #生产CA证书和私钥
    $ ls
    ca.csr  ca-csr.json  ca-key.pem  ca.pem
    

    “CN”:Common Name,kube-apiserver 从证书中提取该字段作为请求的用户名 (User Name);浏览器使用该字段验证网站是否合法;
    “O”:Organization,kube-apiserver 从证书中提取该字段作为请求用户所属的组 (Group);Group)

    创建其他证书申请的CA配置文件

    
    $ cfssl print-defaults config >ca-config.json
    tee ca-config.json <<-'EOF'
    {
      "signing": {
        "default": {
          "expiry": "87600h"
        },
        "profiles": {
          "panjb-k8s": {
            "usages": [
                "signing",
                "key encipherment",
                "server auth",
                "client auth"
            ],
            "expiry": "87600h"
          }
        }
      }
    }
    EOF
    

    ca-config.json:可以定义多个 profiles,分别指定不同的过期时间、使用场景等参数;后续在签名证书时使用某个 profile;
    signing:表示该证书可用于签名其它证书;生成的 ca.pem 证书中 CA=TRUE;
    server auth:表示client可以用该 CA 对server提供的证书进行验证;
    client auth:表示server可以用该CA对client提供的证书进行验证;

    创建 kubernetes 证书

    创建 kubernetes 证书签名请求

    tee kubernetes-csr.json <<-'EOF'
    {
        "CN": "panjb-k8s",
        "hosts": [
          "127.0.0.1",
          "192.168.19.101",
          "192.168.19.102",
          "192.168.19.103",
          "192.168.19.104",
          "10.254.0.1",
          "kubernetes",
          "kubernetes.default",
          "kubernetes.default.svc",
          "kubernetes.default.svc.cluster",
          "kubernetes.default.svc.cluster.local"
        ],
        "key": {
            "algo": "rsa",
            "size": 2048
        },
        "names": [
        {
        "C": "CN",
        "ST": "SiChuan",
        "L": "chengdu",
        "O": "k8s",
        "OU": "System"
        }
        ]
    }
    EOF
    

    如果 hosts 字段不为空则需要指定授权使用该证书的 IP 或域名列表,由于该证书后续被 etcd 集群和 kubernetes master集群使用,所以上面分别指定了 etcd 集群、kubernetes master 集群的主机 IP 和 kubernetes 服务的服务 IP(一般是kue-apiserver 指定的 service-cluster-ip-range 网段的第一个IP,如 10.254.0.1。

    生成 kubernetes 证书和私钥

    $ cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=panjb-k8s kubernetes-csr.json | cfssljson -bare kubernetes
    $ ls kubernetes*
    kubernetes.csr  kubernetes-csr.json  kubernetes-key.pem  kubernetes.pem
    

    创建 admin 证书

    创建 admin 证书签名请求

    $ tee admin-csr.json <<-'EOF'
    {
      "CN": "admin",
      "hosts": [],
      "key": {
        "algo": "rsa",
        "size": 2048
      },
      "names": [
        {
        "C": "CN",
        "ST": "SiChuan",
        "L": "chengdu",
        "O": "system:masters",
        "OU": "System"
        }
      ]
    }
    EOF
    

    后续 kube-apiserver 使用 RBAC 对客户端(如 kubelet、kube-proxy、Pod)请求进行授权;
    kube-apiserver 预定义了一些 RBAC 使用的 RoleBindings,如 cluster-admin 将 Group system:masters 与 Rolecluster-admin 绑定,该 Role 授予了调用kube-apiserver 的所有 API的权限;
    OU 指定该证书的 Group 为 system:masters,kubelet 使用该证书访问 kube-apiserver 时 ,由于证书被 CA 签名,所以认证通过,同时由于证书用户组为经过预授权的 system:masters,所以被授予访问所有 API 的权限;

    生成 admin 证书和私钥

    $ cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=panjb-k8s admin-csr.json | cfssljson -bare admin
    $ ls admin*
    admin.csr  admin-csr.json  admin-key.pem  admin.pem
    

    创建 kube-proxy 证书

    创建 kube-proxy 证书签名请求

    $ tee kube-proxy-csr.json <<-'EOF'
    {
      "CN": "system:kube-proxy",
      "hosts": [],
      "key": {
        "algo": "rsa",
        "size": 2048
      },
      "names": [
        {
        "C": "CN",
        "ST": "SiChuan",
        "L": "chengdu",
        "O": "k8s",
        "OU": "System"
        }
      ]
    }
    EOF
    

    CN 指定该证书的 User 为 system:kube-proxy;
    kube-apiserver 预定义的 RoleBinding cluster-admin 将User system:kube-proxy 与 Role system:node-proxier 绑定,该 Role 授予了调用 kube-apiserver Proxy 相关 API 的权限;

    生成 kube-proxy 客户端证书和私钥

    $ cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=panjb-k8s  kube-proxy-csr.json | cfssljson -bare kube-proxy
    $ ls kube-proxy*
    kube-proxy.csr  kube-proxy-csr.json  kube-proxy-key.pem  kube-proxy.pem
    

    校验证书

    以 kubernetes 证书为例

    使用 opsnssl 命令

    [root@etcd-1 ssl]#  openssl x509  -noout -text -in  kubernetes.pem
    Certificate:
        Data:
            Version: 3 (0x2)
            Serial Number:
                74:81:e7:d1:0f:8b:2b:f4:ac:72:2a:9f:b4:d7:ec:ce:65:10:c6:cf
        Signature Algorithm: sha256WithRSAEncryption
            Issuer: C=CN, ST=SiChuan, L=chengdu, O=k8s, OU=System, CN=panjb-k8s
            Validity
                Not Before: Oct 11 18:07:00 2017 GMT
                Not After : Oct  9 18:07:00 2027 GMT
            Subject: C=CN, ST=SiChuan, L=chengdu, O=k8s, OU=System, CN=panjb-k8s
            Subject Public Key Info:
                Public Key Algorithm: rsaEncryption
                    Public-Key: (2048 bit)
                    Modulus:
                        00:c0:98:5d:fb:d1:67:ee:af:11:33:02:51:4c:7c:
                        e2:be:c6:8f:5c:a6:e3:3d:e6:b1:e1:46:eb:3b:84:
                        7b:1a:fe:a5:49:df:9e:34:67:0f:00:c1:c1:06:d6:
                        6e:63:7e:9a:9e:14:0c:be:58:ca:90:f3:30:8e:e4:
                        c0:07:49:66:f0:65:4d:e7:2d:3b:67:60:88:e9:6d:
                        1c:02:b3:6f:4d:c1:63:8f:85:d3:f0:d1:b5:0e:ac:
                        5a:94:9c:da:2f:dc:1f:e8:bd:be:49:59:ef:b0:24:
                        ae:84:da:d8:b6:8e:f1:52:5c:ce:87:b8:ce:77:20:
                        bf:f5:a2:1b:1f:a5:43:2d:18:43:d1:14:30:06:06:
                        ed:c8:4c:1f:f0:e0:20:be:87:ac:dd:3e:2c:2c:c6:
                        63:32:0a:0b:84:a5:1e:8d:cc:a2:59:77:4d:09:8c:
                        b1:0a:c0:56:50:6e:69:59:cf:e0:fd:33:cf:44:4c:
                        9c:7e:d0:9c:d8:58:23:9e:ae:41:ae:6e:7d:51:d4:
                        60:f7:9f:66:00:77:04:45:5e:78:f4:0f:72:bd:da:
                        f2:76:57:34:6a:c2:33:39:01:51:b3:eb:ed:89:c9:
                        f8:be:a0:f6:10:18:16:17:ce:f4:be:98:90:30:6e:
                        fb:05:39:81:17:a3:18:de:36:d6:ac:a9:cf:d7:44:
                        e2:2b
                    Exponent: 65537 (0x10001)
            X509v3 extensions:
                X509v3 Key Usage: critical
                    Digital Signature, Key Encipherment
                X509v3 Extended Key Usage: 
                    TLS Web Server Authentication, TLS Web Client Authentication
                X509v3 Basic Constraints: critical
                    CA:FALSE
                X509v3 Subject Key Identifier: 
                    96:FD:84:03:18:8C:D2:D8:99:28:25:08:94:5F:80:F8:64:BC:02:74
                X509v3 Authority Key Identifier: 
                    keyid:A1:98:B3:41:BB:16:75:15:AC:CA:BB:39:5A:A2:55:57:F8:31:51:27
    
                X509v3 Subject Alternative Name: 
                    DNS:kubernetes, DNS:kubernetes.default, DNS:kubernetes.default.svc, DNS:kubernetes.default.svc.cluster, DNS:kubernetes.default.svc.cluster.local, IP Address:127.0.0.1, IP Address:192.168.19.101, IP Address:192.168.19.102, IP Address:192.168.19.103, IP Address:192.168.19.104, IP Address:10.254.0.1
        Signature Algorithm: sha256WithRSAEncryption
             5a:21:75:06:0b:6b:bf:cc:c7:49:3a:c2:1b:7c:d4:e5:8d:80:
             c3:af:e1:a0:c3:ae:46:ad:c3:a6:45:af:ba:be:82:e8:ec:3c:
             4f:03:f9:89:66:24:ad:f1:c9:cd:01:d8:0b:46:f4:a0:50:00:
             36:b5:a5:11:6b:fd:b9:99:3a:b9:cb:be:71:05:b1:0c:09:75:
             7c:e9:46:2e:8d:29:61:45:40:23:dd:e6:3d:fa:e7:86:a7:f2:
             36:ed:c0:41:48:4c:51:74:c7:47:2b:9d:af:00:08:a1:fd:4d:
             d5:e4:57:64:9d:f1:55:1a:78:16:5f:c9:22:d3:26:27:cc:fa:
             a7:12:ae:1c:22:a0:e0:d3:8e:03:8d:82:9b:93:7d:c0:c2:71:
             fd:8c:6c:c2:54:4c:af:06:4b:70:82:21:a1:d1:5c:48:1c:32:
             b5:bc:8c:77:fd:6b:9e:04:a0:34:3f:23:c1:13:6f:ac:f7:12:
             7e:3c:6b:ed:99:9e:bc:0c:58:42:bd:f1:7f:ea:8b:1e:93:9c:
             e8:b6:e5:03:38:3e:da:a7:1e:19:1c:67:4a:98:6b:e0:e4:45:
             bf:91:32:4b:6e:1b:4a:d9:80:ef:72:65:0a:91:ff:af:ed:68:
             dc:ea:de:0c:12:61:ff:95:6d:46:14:73:f4:5e:b1:81:51:f2:
             96:3b:47:a8
    

    确认 Issuer 字段的内容和 ca-csr.json 一致

    确认 Subject 字段的内容和 kubernetes-csr.json 一致;

    确认 X509v3 Subject Alternative Name 字段的内容和 kubernetes-csr.json 一致;

    确认 X509v3 Key Usage、Extended Key Usage 字段的内容和 ca-config.json 中 kubernetes profile 一致;

    使用 cfssl-certinfo 命令

    $  cfssl-certinfo -cert kubernetes.pem
    {
      "subject": {
        "common_name": "panjb-k8s",
        "country": "CN",
        "organization": "k8s",
        "organizational_unit": "System",
        "locality": "chengdu",
        "province": "SiChuan",
        "names": [
          "CN",
          "SiChuan",
          "chengdu",
          "k8s",
          "System",
          "panjb-k8s"
        ]
      },
      "issuer": {
        "common_name": "panjb-k8s",
        "country": "CN",
        "organization": "k8s",
        "organizational_unit": "System",
        "locality": "chengdu",
        "province": "SiChuan",
        "names": [
          "CN",
          "SiChuan",
          "chengdu",
          "k8s",
          "System",
          "panjb-k8s"
        ]
      },
      "serial_number": "665139919623901799018181161602228019860390069967",
      "sans": [
        "kubernetes",
        "kubernetes.default",
        "kubernetes.default.svc",
        "kubernetes.default.svc.cluster",
        "kubernetes.default.svc.cluster.local",
        "127.0.0.1",
        "192.168.19.101",
        "192.168.19.102",
        "192.168.19.103",
        "192.168.19.104",
        "10.254.0.1"
      ],
      "not_before": "2017-10-11T18:07:00Z",
      "not_after": "2027-10-09T18:07:00Z",
      "sigalg": "SHA256WithRSA",
      "authority_key_id": "A1:98:B3:41:BB:16:75:15:AC:CA:BB:39:5A:A2:55:57:F8:31:51:27",
      "subject_key_id": "96:FD:84:3:18:8C:D2:D8:99:28:25:8:94:5F:80:F8:64:BC:2:74",
      "pem": "-----BEGIN CERTIFICATE-----
    MIIEiTCCA3GgAwIBAgIUdIHn0Q+LK/SsciqftNfszmUQxs8wDQYJKoZIhvcNAQEL
    BQAwZDELMAkGA1UEBhMCQ04xEDAOBgNVBAgTB1NpQ2h1YW4xEDAOBgNVBAcTB2No
    ZW5nZHUxDDAKBgNVBAoTA2s4czEPMA0GA1UECxMGU3lzdGVtMRIwEAYDVQQDEwlw
    YW5qYi1rOHMwHhcNMTcxMDExMTgwNzAwWhcNMjcxMDA5MTgwNzAwWjBkMQswCQYD
    VQQGEwJDTjEQMA4GA1UECBMHU2lDaHVhbjEQMA4GA1UEBxMHY2hlbmdkdTEMMAoG
    A1UEChMDazhzMQ8wDQYDVQQLEwZTeXN0ZW0xEjAQBgNVBAMTCXBhbmpiLWs4czCC
    ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMCYXfvRZ+6vETMCUUx84r7G
    j1ym4z3mseFG6zuEexr+pUnfnjRnDwDBwQbWbmN+mp4UDL5YypDzMI7kwAdJZvBl
    TectO2dgiOltHAKzb03BY4+F0/DRtQ6sWpSc2i/cH+i9vklZ77AkroTa2LaO8VJc
    zoe4zncgv/WiGx+lQy0YQ9EUMAYG7chMH/DgIL6HrN0+LCzGYzIKC4SlHo3Moll3
    TQmMsQrAVlBuaVnP4P0zz0RMnH7QnNhYI56uQa5ufVHUYPefZgB3BEVeePQPcr3a
    8nZXNGrCMzkBUbPr7YnJ+L6g9hAYFhfO9L6YkDBu+wU5gRejGN421qypz9dE4isC
    AwEAAaOCATEwggEtMA4GA1UdDwEB/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcD
    AQYIKwYBBQUHAwIwDAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQUlv2EAxiM0tiZKCUI
    lF+A+GS8AnQwHwYDVR0jBBgwFoAUoZizQbsWdRWsyrs5WqJVV/gxUScwga0GA1Ud
    EQSBpTCBooIKa3ViZXJuZXRlc4ISa3ViZXJuZXRlcy5kZWZhdWx0ghZrdWJlcm5l
    dGVzLmRlZmF1bHQuc3Zjgh5rdWJlcm5ldGVzLmRlZmF1bHQuc3ZjLmNsdXN0ZXKC
    JGt1YmVybmV0ZXMuZGVmYXVsdC5zdmMuY2x1c3Rlci5sb2NhbIcEfwAAAYcEwKgT
    ZYcEwKgTZocEwKgTZ4cEwKgTaIcECv4AATANBgkqhkiG9w0BAQsFAAOCAQEAWiF1
    Bgtrv8zHSTrCG3zU5Y2Aw6/hoMOuRq3DpkWvur6C6Ow8TwP5iWYkrfHJzQHYC0b0
    oFAANrWlEWv9uZk6ucu+cQWxDAl1fOlGLo0pYUVAI93mPfrnhqfyNu3AQUhMUXTH
    RyudrwAIof1N1eRXZJ3xVRp4Fl/JItMmJ8z6pxKuHCKg4NOOA42Cm5N9wMJx/Yxs
    wlRMrwZLcIIhodFcSBwytbyMd/1rngSgND8jwRNvrPcSfjxr7ZmevAxYQr3xf+qL
    HpOc6LblAzg+2qceGRxnSphr4ORFv5EyS24bStmA73JlCpH/r+1o3OreDBJh/5Vt
    RhRz9F6xgVHyljtHqA==
    -----END CERTIFICATE-----
    "
    }
    

    将证书拷贝到全部服务器

    创建目录

    $ mkdir -p  /etc/kubernetes/ssl
    $ cp ./*pem  /etc/kubernetes/ssl
    

    参考资料

    http://www.cnblogs.com/lykops/p/7465016.html

  • 相关阅读:
    VIM常用操作
    计算机之二进制基础
    交换机安全学习笔记 第六章 IPV4 ARP攻击
    交换机安全学习笔记 第八章 针对POE的攻击
    交换机安全学习笔记 第九~十章 HSRP VRRP
    CSRF-DVWA_1.9-笔记
    命令注入-笔记
    暴力破解-H3C路由器-MSR900
    暴力破解-DVWA_1.9-笔记
    DVWA、 DSVM 环境搭建简述
  • 原文地址:https://www.cnblogs.com/panjunbai/p/8325766.html
Copyright © 2020-2023  润新知