CA and TLS
CA Provisioning
マスターノードのうちの一つを CA とする。
CA 用 Private key の作成
$ openssl genrsa -out ca.key 2048
Generating RSA private key, 2048 bit long modulus (2 primes)
...............+++++
...............................+++++
e is 65537 (0x010001)
Private key を利用して CSR の作成
$ openssl req -new -key ca.key -subj "/CN=KUBERNETES-CA" -out ca.csr
※ 補足
もし Can't load /home/ubuntu/.rnd into RNG のエラーが出たら、/etc/ssl/openssl.cnf の以下の行を削除すればよい。
バージョン次第だが、 この issue の影響を受けている可能性がある。
RANDFILE = $ENV::HOME/.rnd
CSR に自己署名
$ openssl x509 -req -in ca.csr -signkey ca.key -CAcreateserial -out ca.crt -days 1000
Signature ok
subject=CN = KUBERNETES-CA
Getting Private key
Client and Server Certificates
手元で作ってあとからマスターノードに配布してもいいし、またはマスターノード上で作っても問題ない。
admin 用 client 証明書
admin ユーザが Kubernetes クラスタに接続するためのキーペアを作成する。
admin ユーザ向けに Private key を作成
$ openssl genrsa -out admin.key 2048
Generating RSA private key, 2048 bit long modulus (2 primes)
........+++++
..................................+++++
e is 65537 (0x010001)
CSR の作成 (CN と O に注意)
$ openssl req -new -key admin.key -subj "/CN=admin/O=system:masters" -out admin.csr
admin ユーザは system:masters group に属する形となり、kubectl を利用して Kubernetes クラスタに admin 権限でアクセスできるようになる。
自己署名
$ openssl x509 -req -in admin.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out admin.crt -days 1000
Signature ok
subject=CN = admin, O = system:masters
Getting CA Private Key
kubelet 用 client 証明書
これについてはワーカーノード上の話になるので一旦後回し。
Controller Manager 用 client 証明書
今まで同様、Private key の作成と CSR の作成と CSR への自己署名を実施する。
$ openssl genrsa -out kube-controller-manager.key 2048
Generating RSA private key, 2048 bit long modulus (2 primes)
...................................................+++++
............+++++
e is 65537 (0x010001)
$ openssl req -new -key kube-controller-manager.key -subj "/CN=system:kube-controller-manager" -out kube-controller-manager.csr
$ openssl x509 -req -in kube-controller-manager.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out kube-controller-manager.crt -days 1000
Signature ok
subject=CN = system:kube-controller-manager
Getting CA Private Key
kube proxy 用 client 証明書
同様。
$ openssl genrsa -out kube-proxy.key 2048
Generating RSA private key, 2048 bit long modulus (2 primes)
............+++++
............................................+++++
e is 65537 (0x010001)
$ openssl req -new -key kube-proxy.key -subj "/CN=system:kube-proxy" -out kube-proxy.csr
$ openssl x509 -req -in kube-proxy.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out kube-proxy.crt -days 1000
Signature ok
subject=CN = system:kube-proxy
Getting CA Private Key
scheduler 用 client 証明書
$ openssl genrsa -out kube-scheduler.key 2048
Generating RSA private key, 2048 bit long modulus (2 primes)
..............................................................................................................................................................................................+++++
................................................................................................+++++
e is 65537 (0x010001)
$ openssl req -new -key kube-scheduler.key -subj "/CN=system:kube-scheduler" -out kube-scheduler.csr
$ openssl x509 -req -in kube-scheduler.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out kube-scheduler.crt -days 1000
Signature ok
subject=CN = system:kube-scheduler
Getting CA Private Key
Kubernetes API Server 用証明書
openssl では CLI で SAN の設定ができないので、別途設定ファイルを用意する。
cat > openssl.cnf <<EOF
[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 = 10.96.0.1
IP.2 = 34.xx.xx.xx
IP.3 = 63.xx.xx.xx
IP.4 = 192.168.0.37
IP.5 = 192.168.1.159
IP.6 = 127.0.0.1
EOF
kupe API server は kube api にアクセスされるすべての名前を考慮しないといけないので SAN を設定している。
各 alt_names については以下。
IP.1 : 後で用意する service-cluster-ip-range のもの
IP.2 : Master node 1 の EIP
IP.3 : Master node 2 の EIP
IP.4 : Master node 1 の Private IP
IP.5 : Master node 2 の Private IP
IP.6 : localhost
コマンドもほぼ同様だが、-config openssl.cnf を渡している。
$ openssl genrsa -out kube-apiserver.key 2048
Generating RSA private key, 2048 bit long modulus (2 primes)
..............................+++++
...............................+++++
e is 65537 (0x010001)
$ openssl req -new -key kube-apiserver.key -subj "/CN=kube-apiserver" -out kube-apiserver.csr -config openssl.cnf
$ openssl x509 -req -in kube-apiserver.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out kube-apiserver.crt -extensions v3_req -extfile openssl.cnf -days 1000
Signature ok
subject=CN = kube-apiserver
Getting CA Private Key
etcd 用 server 証明書
EIP でのアクセスは発生しないはずだが何かしらの操作があるとあれなので念のため EIP も含めた。多分不要。
cat > openssl-etcd.cnf <<EOF
[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]
IP.1 = 34.xx.xx.xx
IP.2 = 63.xx.xx.xx
IP.3 = 192.168.0.37
IP.4 = 192.168.1.159
IP.5 = 127.0.0.1
EOF
コマンドは先程と同様。
$ openssl genrsa -out etcd-server.key 2048
Generating RSA private key, 2048 bit long modulus (2 primes)
......+++++
..............................................................+++++
e is 65537 (0x010001)
$ openssl req -new -key etcd-server.key -subj "/CN=etcd-server" -out etcd-server.csr -config openssl-etcd.cnf
$ openssl x509 -req -in etcd-server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out etcd-server.crt -extensions v3_req -extfile openssl-etcd.cnf -days 1000
Signature ok
subject=CN = etcd-server
Getting CA Private Key
Service Account Key Pair
$ openssl genrsa -out service-account.key 2048
Generating RSA private key, 2048 bit long modulus (2 primes)
............+++++
....................................................................................+++++
e is 65537 (0x010001)
$ openssl req -new -key service-account.key -subj "/CN=service-accounts" -out service-account.csr
$ openssl x509 -req -in service-account.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out service-account.crt -days 1000
Signature ok
subject=CN = service-accounts
Getting CA Private Key
各ファイルをマスターノードに配布
$ scp -i .ssh/hoge.pem ca.crt ca.key kube-apiserver.key kube-apiserver.crt \
> service-account.key service-account.crt \
> etcd-server.key etcd-server.crt \
> ubuntu@192.168.1.159:~/
kube-proxy, kube-controller-manager, kube-scheduler, kubelet 用のファイルは後ほど利用するのでとりあえずこのままで。
