准备三台主机:

       192.168.1.71

       192.168.1.72

       192.168.1.73

Step1:

  在第一台  192.168.1.71 签发证书  也可以在其它机器进行签发证书

       创建一个保存证书的目录 最好在 /etc/ 下

  mkdir -pv /etc/ssl/k8s

  cd /etc/ssl/k8s

  创建ca.key

  openssl genrsa -out ca.key  3072

  编辑ca证书签发key给k8s准备的配置文件

  vi ca.cnf

[ req ]
req_extensions = v3_req
distinguished_name = req_distinguished_name
[req_distinguished_name]

[ v3_req ]
keyUsage = critical, cRLSign, keyCertSign, digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth, clientAuth
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
basicConstraints = critical, CA:true, pathlen:2

  使用ca配置文件签发 ca 根证书 ca.pem

  openssl req -x509 -new -nodes -key ca.key -days 1095 -out ca.pem -subj "/CN=kubernetes/OU=System/C=CN/ST=Beijing/L=Beijing/O=k8s" -config ca.cnf -extensions v3_req

  

  签发 API 证书

  vim api-server.cnf  

[ req ]
req_extensions = v3_req
distinguished_name = req_distinguished_name
[req_distinguished_name]
[ v3_req ]
basicConstraints = critical, CA:FALSE
keyUsage = critical, digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth, clientAuth
#subjectKeyIdentifier = hash
#authorityKeyIdentifier = keyid:always,issuer
subjectAltName = @alt_names
[alt_names]
IP.1 = 10.0.0.1
IP.5 = 192.168.1.70
IP.2 = 192.168.1.71
IP.3 = 192.168.1.72
IP.4 = 192.168.1.73
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

  配置文件简单讲解 

  10.0.0.1        是集群使用的ip这个ip地址段可以容纳40多万ip

    192.168.1.70 是后期集群高可用阶段使用的虚拟vip 配合keepalive进行使用

  开始生成api.key

  3072指的是长度

  openssl genrsa -out apiserver.key 3072

  生成api请求证书apiserver.csr

  openssl req -new -key apiserver.key -out apiserver.csr -subj "/CN=kubernetes/OU=System/C=CN/ST=Beijing/L=Beijing/O=k8s" -config api-server.cnf

  签发证书之前 修改 api-server.cnf 配置文件 去掉注释的2行

  

[ req ]
req_extensions = v3_req
distinguished_name = req_distinguished_name
[req_distinguished_name]
[ v3_req ]
basicConstraints = critical, CA:FALSE
keyUsage = critical, digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth, clientAuth
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
subjectAltName = @alt_names
[alt_names]
IP.1 = 10.0.0.1
IP.5 = 192.168.1.70
IP.2 = 192.168.1.71
IP.3 = 192.168.1.72
IP.4 = 192.168.1.73
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

  开始签发证书 最后 -days 1095 是证书有效期限 如果是企业使用最好 数字设置的大点 避免以后出问题

  openssl x509 -req -in apiserver.csr -CA ca.pem -CAkey ca.key -CAcreateserial -out apiserver.pem -days 1095 -extfile api-server.cnf -extensions v3_req

  查看 apiserver.pem 证书信息

  openssl x509 -noout -text -in apiserver.pem

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            c3:09:20:fd:72:67:da:7a
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: CN=kubernetes, OU=System, C=CN, ST=Beijing, L=Beijing, O=k8s
        Validity
            Not Before: May 18 05:51:47 2019 GMT
            Not After : May 17 05:51:47 2022 GMT
        Subject: CN=kubernetes, OU=System, C=CN, ST=Beijing, L=Beijing, O=k8s
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (3072 bit)
                Modulus:
                    00:cc:65:a0:e6:97:64:51:f7:42:c1:c8:bc:43:89:
                    63:6e:9d:1d:23:9b:a9:0a:e3:e6:a5:0e:7a:1d:a9:
                    3c:dc:5d:0f:c8:99:f5:1b:39:ad:39:f2:f7:d3:c9:
                    66:47:33:01:5d:db:53:5a:23:e2:49:75:d7:4a:61:
                    bb:8b:c3:a3:b2:00:9a:01:6f:98:26:4e:cb:16:b3:
                    38:f7:3b:be:e5:b5:9e:e9:0c:e5:c7:d8:bb:8b:a4:
                    3d:f8:99:e0:34:93:0c:48:d7:c7:c2:72:63:42:2f:
                    ff:94:c8:d0:47:c2:3a:56:fd:ae:79:b7:cb:8e:72:
                    c6:8b:6a:33:be:34:82:bd:6e:1e:b9:23:1b:01:c8:
                    c5:db:11:3e:5f:c6:66:a2:f6:6a:c0:67:0b:b9:8a:
                    36:2a:ce:07:54:08:a9:50:1e:bc:52:cc:9b:af:ee:
                    1d:f4:b8:15:77:a1:4d:75:e4:9d:14:35:8a:58:ed:
                    77:d6:e3:2f:c8:e2:14:9c:9e:75:ea:82:b9:e4:4f:
                    3a:7b:88:d2:93:39:37:b9:c5:74:cd:74:5f:47:0c:
                    4d:fc:a8:c0:af:f5:4c:c9:c5:7f:bb:4e:57:58:36:
                    12:bc:54:54:db:bd:af:3f:8f:e6:8b:ca:34:50:26:
                    6f:d2:8c:b6:ee:cf:2d:d2:62:ae:32:26:8d:da:8a:
                    d0:a3:7c:40:60:97:0c:b4:de:4c:77:9d:28:3e:73:
                    1f:91:23:76:5b:3b:d9:74:85:fd:69:d4:b3:fd:1d:
                    5a:8b:38:35:51:07:5a:09:c8:53:67:89:f8:e6:d1:
                    99:63:7d:d9:7f:a9:ca:49:ab:a6:80:14:68:cb:8d:
                    4c:b5:42:5e:24:f3:2f:54:04:3f:be:a8:9d:65:84:
                    46:ed:6a:85:7d:6a:b6:62:4a:69:05:0d:da:2f:92:
                    85:bd:de:18:b4:48:4b:fc:3f:26:49:92:17:47:91:
                    dd:b5:7a:4d:e3:9e:c5:1f:39:58:bd:52:c3:05:65:
                    0b:4e:f0:2b:2d:b6:af:65:1a:13
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Basic Constraints: critical
                CA:FALSE
            X509v3 Key Usage: critical
                Digital Signature, Key Encipherment
            X509v3 Extended Key Usage: 
                TLS Web Server Authentication, TLS Web Client Authentication
            X509v3 Subject Key Identifier: 
                D8:15:2E:2C:D1:28:59:EC:0C:97:6E:85:5F:3D:8B:90:7F:FD:40:1F
            X509v3 Authority Key Identifier: 
                keyid:B8:73:3B:D4:66:50:67:B9:3C:E1:3C:31:AD:91:CD:4D:94:6E:CA:A5

            X509v3 Subject Alternative Name: 
                IP Address:10.0.0.1, IP Address:192.168.1.70, IP Address:192.168.1.71, IP Address:192.168.1.72, IP Address:192.168.1.73, DNS:kubernetes, DNS:kubernetes.default, DNS:kubernetes.default.svc, DNS:kubernetes.default.svc.cluster, DNS:kubernetes.default.svc.cluster.local
    Signature Algorithm: sha256WithRSAEncryption
         b1:db:2f:81:48:01:83:16:2b:78:0e:ad:25:cd:46:e8:bd:f7:
         ba:5c:7b:a8:74:a9:d3:9c:1b:0b:48:06:68:84:b6:57:99:2f:
         c5:33:5f:5e:15:79:de:74:87:15:bc:54:be:a9:cf:a9:5a:cc:
         b6:3e:61:34:c1:f1:2a:94:c3:89:a1:06:67:4c:d3:84:fa:89:
         1c:df:8d:d5:38:d8:5b:d7:0b:7e:da:aa:fb:7c:64:e2:68:21:
         15:b8:7f:35:7a:58:48:7d:f6:89:4b:f8:84:44:96:45:9d:e8:
         7f:e0:cf:a2:21:ab:29:94:1e:aa:0e:5d:ea:44:69:5c:ff:4a:
         5f:f2:f1:bf:0b:1c:f0:95:c6:9b:1a:20:d5:fb:33:42:0a:fc:
         17:c5:ba:76:fe:bd:12:ac:9a:8c:c7:2b:0e:ae:b1:f1:30:43:
         ea:8d:8b:c8:b3:45:98:f6:d8:3d:71:b3:cd:7e:f7:f6:92:1c:
         1a:c8:69:5e:67:ad:c5:a6:13:1a:e4:cb:50:ca:a6:96:56:4e:
         ed:50:4f:6a:0f:de:c8:3b:b6:e5:15:e2:b6:53:48:ab:9a:c6:
         68:18:2d:ac:1c:90:a9:f2:4d:c0:44:6c:ed:48:9e:d7:72:1c:
         e3:49:f5:3d:33:67:6c:24:ed:6c:6e:07:0d:59:dc:59:ec:fa:
         76:ae:ff:40:ad:ea:b2:d4:aa:42:19:16:67:06:07:05:59:c0:
         1e:e5:5a:b8:03:c5:1c:5c:18:6d:40:41:50:9e:69:fd:90:f4:
         ab:5e:91:2a:6b:a0:64:c9:39:9d:f8:f2:04:1f:f4:35:fb:58:
         08:17:f7:17:4c:41:30:95:98:a7:e3:59:7c:a4:60:56:a0:01:
         e9:d3:6f:93:76:6f:09:38:35:37:4d:15:02:f8:e6:9b:0f:1d:
         f7:1b:7b:bc:4a:e8:ed:44:1a:ba:84:e1:13:da:cb:06:6d:b9:
         96:43:f3:a2:d8:25:20:01:51:83:99:bd:f7:5f:b1:5d:52:9f:
         32:5c:b0:4a:40:1c

  从上面可以看出这个证书对哪些ip是有效的

 

  签发 kubelet 证书

  配置签发 kubelet 证书文件 一台一台进行添加

  vi client.cnf

  从下面可以看出证书只对 192.168.1.71 有效

[ req ]
req_extensions = v3_req
distinguished_name = req_distinguished_name
[req_distinguished_name]
[ v3_req ]
basicConstraints = critical, CA:FALSE
keyUsage = critical, digitalSignature, keyEncipherment
subjectAltName = @alt_names
[alt_names]
IP.1 = 192.168.1.71

  首先设置一个变量 方便点 证书主要以 ip 地址后 2 段记名称

  fn=1-71

  生成 kubelet-$fn.key 

  openssl genrsa -out kubelet-$fn.key 3072

  生成证书请求

  openssl req -new -key kubelet-$fn.key -out kubelet-$fn.csr -subj "/CN=admin/OU=System/C=CN/ST=Beijing/L=Beijing/O=system:masters" -config client.cnf

  签发证书

  openssl x509 -req -in kubelet-$fn.csr -CA ca.pem -CAkey ca.key -CAcreateserial -out kubelet-$fn.pem -days 1095 -extfile client.cnf -extensions v3_req

  

  使用同样的方法给 以下 2 台主机进行签发证书

  192.168.1.72

  192.168.1.73

  修改 client.cnf 配置文件 ip 地址

  vi client.cnf

[ req ]
req_extensions = v3_req
distinguished_name = req_distinguished_name
[req_distinguished_name]
[ v3_req ]
basicConstraints = critical, CA:FALSE
keyUsage = critical, digitalSignature, keyEncipherment
subjectAltName = @alt_names
[alt_names]
IP.1 = 192.168.1.72

  修改 fn 变量标签

  fn=1-72

  同样执行以下命令

  openssl genrsa -out kubelet-$fn.key 3072

  openssl req -new -key kubelet-$fn.key -out kubelet-$fn.csr -subj "/CN=admin/OU=System/C=CN/ST=Beijing/L=Beijing/O=system:masters" -config client.cnf

  openssl x509 -req -in kubelet-$fn.csr -CA ca.pem -CAkey ca.key -CAcreateserial -out kubelet-$fn.pem -days 1095 -extfile client.cnf -extensions v3_req

  

  使用同样的方法修改 client.cnf 配置文件 fn 变量 签发 192.168.1.73 证书

  vi client.cnf

[ req ]
req_extensions = v3_req
distinguished_name = req_distinguished_name
[req_distinguished_name]
[ v3_req ]
basicConstraints = critical, CA:FALSE
keyUsage = critical, digitalSignature, keyEncipherment
subjectAltName = @alt_names
[alt_names]
IP.1 = 192.168.1.73

  fn=1-73

  重新执行上面的3条命令 签发证书

  查看当前目录 因证书太多 容易整乱 创建相对应目录保存证书文件

  pwd

  /etc/ssl/k8s

  mkdir apiserver

  mkdir kubelet

  mv api-server.cnf apiserver.* apiserver

  mv kubelet-1-7* kubelet

  

  签发kube-proxy证书 基本和上面的操作类似 但是名称变了

  重新设置变量 fn

  fn=1-71

  修改 client.cnf  配置文件

  vi client.cnf

[ req ]
req_extensions = v3_req
distinguished_name = req_distinguished_name
[req_distinguished_name]
[ v3_req ]
basicConstraints = critical, CA:FALSE
keyUsage = critical, digitalSignature, keyEncipherment
subjectAltName = @alt_names
[alt_names]
IP.1 = 192.168.1.71

  生成kube-proxy-$fn.key

  openssl genrsa -out kube-proxy-$fn.key 3072

  生成证书请求

  openssl req -new -key kube-proxy-$fn.key -out kube-proxy-$fn.csr -subj "/CN=system:kube-proxy/OU=System/C=CN/ST=Beijing/L=Beijing/O=k8s" -config client.cnf

  签发证书

  openssl x509 -req -in kube-proxy-$fn.csr -CA ca.pem -CAkey ca.key -CAcreateserial -out kube-proxy-$fn.pem -days 1095 -extfile client.cnf -extensions v3_req

 

修改 client.cnf 配置文件 ip  fn 变量 给 72 73 主机签发kube-proxy证书

  之后创建 kube-proxy 目录保存刚才创建的 kube-proxy 证书

  mkdir kube-proxy

  mv kube-proxy-1-7* kube-proxy

  

  签发etcd证书文件 

  首先签发 192.168.1.71 然后用同样的方法 修改配置文件签发第二台和第三台证书

  编辑 client.cnf 文件  

[ req ]
req_extensions = v3_req
distinguished_name = req_distinguished_name
[req_distinguished_name]
[ v3_req ]
basicConstraints = critical, CA:FALSE
keyUsage = critical, digitalSignature, keyEncipherment
subjectAltName = @alt_names
[alt_names]
IP.1 = 192.168.1.71

  设置 fn 变量

  fn=1-71

  生成etcd-$fn.key

  openssl genrsa -out etcd-$fn.key 3072

  生成证书请求

  openssl req -new -key etcd-$fn.key -out etcd-$fn.csr -subj "/CN=etcd/OU=System/C=CN/ST=Beijing/L=Beijing/O=k8s" -config client.cnf

  签发证书

  openssl x509 -req -in etcd-$fn.csr -out etcd-$fn.pem -CA ca.pem -CAkey ca.key -CAcreateserial -days 1095 -extfile client.cnf -extensions v3_req

  切记使用同样的方法签发其他2台主机的etcd证书

  创建etcd目录保存证书文件

  mkdir etcd

  mv etcd-1-7* etcd

 

  签发 flanneld 证书

  重新设置变量fn

  fn=1-71

  修改 client.cnf 配置文件  

[ req ]
req_extensions = v3_req
distinguished_name = req_distinguished_name
[req_distinguished_name]
[ v3_req ]
basicConstraints = critical, CA:FALSE
keyUsage = critical, digitalSignature, keyEncipherment
subjectAltName = @alt_names
[alt_names]
IP.1 = 192.168.1.71

  生成flanneld-$fn.key

  

openssl genrsa -out flanneld-$fn.key 3072
  生成证书flanneld-$fn.csr请求
  openssl req -new -key flanneld-$fn.key -out flanneld-$fn.csr -subj "/CN=flanneld/OU=System/C=CN/ST=Beijing/L=Beijing/O=k8s" -config client.cnf
  签发证书 flanneld-$fn.pem
  openssl x509 -req -CA ca.pem -CAkey ca.key -CAcreateserial -in flanneld-$fn.csr -out flanneld-$fn.pem -days 1095 -extfile client.cnf -extensions v3_req
  使用同样的方法 修改 client.cnf 配置文件ip fn变量签发其它2台主机的flanneld证书
  最后创建目录保存 flanneld 证书
  mkdir flanneld
  mv flanneld-1-7* flanneld

 

  到此k8s基本所需的证书都已经签发结束了 请看下节 etcd 安装