YOKOHEI.COM

YOKOHEI.COM

›Kubernetes the Hard Way

Kubernetes Basics

  • Kubernetes Basics
  • Commands
  • Static Pod
  • Drain & Uncordon
  • Cluster Upgrade
  • Backup & Restore
  • Certification
  • RBAC
  • CNI
  • CoreDNS
  • Ingress

Kubernetes the Hard Way

  • the Hard Way?
  • AWS Prerequisites
  • CA and TLS
  • Configuration Files
  • Data Encryption
  • Bootstrapping etcd
  • Bootstrapping Control Plane
  • Bootstrapping Worker Node
  • kubectl configuraton
  • Pod Network
  • RBAC for Kubelet
  • Coredns Add-On
  • Test
  • TLS Bootstrapping

Amazon EKS

  • EKS Introduction
  • Ingress with ALB
  • PersistentVolume with EBS
  • NetworkPolicy with Calico
  • Secret with KMS
  • EKS Hands-On

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 用のファイルは後ほど利用するのでとりあえずこのままで。

← AWS PrerequisitesConfiguration Files →
▼ Codes ▼
LeetCodeGitHub
▼ Profile ▼
LinkedInFlickr
▼ Logo made with DesignEvo ▼
DesignEvo
Copyright © 2020 Kohei Yoshida