Certification
証明書に関連するファイルの参照
kubeadm で構築された Kuber API Server の例
$ cat /etc/kubernetes/manifests/kube-apiserver.yaml
(一部抜粋)
spec:
containers:
- command:
- kube-apiserver
- --authorization-mode=Node,RBAC
- --advertise-address=172.17.0.10
- --allow-privileged=true
- --client-ca-file=/etc/kubernetes/pki/ca.crt
- --disable-admission-plugins=PersistentVolumeLabel
- --enable-admission-plugins=NodeRestriction
- --enable-bootstrap-token-auth=true
- --etcd-cafile=/etc/kubernetes/pki/etcd/ca.crt
- --etcd-certfile=/etc/kubernetes/pki/apiserver-etcd-client.crt
- --etcd-keyfile=/etc/kubernetes/pki/apiserver-etcd-client.key
- --etcd-servers=https://127.0.0.1:2379
- --insecure-port=0
- --kubelet-client-certificate=/etc/kubernetes/pki/apiserver-kubelet-client.crt
- --kubelet-client-key=/etc/kubernetes/pki/apiserver-kubelet-client.key
- --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
- --proxy-client-cert-file=/etc/kubernetes/pki/front-proxy-client.crt
- --proxy-client-key-file=/etc/kubernetes/pki/front-proxy-client.key
- --requestheader-allowed-names=front-proxy-client
- --requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.crt
- --requestheader-extra-headers-prefix=X-Remote-Extra-
- --requestheader-group-headers=X-Remote-Group
- --requestheader-username-headers=X-Remote-User
- --secure-port=6443
- --service-account-key-file=/etc/kubernetes/pki/sa.pub
- --service-cluster-ip-range=10.96.0.0/12
- --tls-cert-file=/etc/kubernetes/pki/apiserver.crt
- --tls-private-key-file=/etc/kubernetes/pki/apiserver.key
...
kubeadm で構築された etcd の例
$ cat /etc/kubernetes/manifests/etcd.yaml
spec:
containers:
- command:
- etcd
- --advertise-client-urls=https://127.0.0.1:2379
- --cert-file=/etc/kubernetes/pki/etcd/server.crt
- --client-cert-auth=true
- --data-dir=/var/lib/etcd
- --initial-advertise-peer-urls=https://127.0.0.1:2380
- --initial-cluster=master=https://127.0.0.1:2380
- --key-file=/etc/kubernetes/pki/etcd/server.key
- --listen-client-urls=https://127.0.0.1:2379
- --listen-peer-urls=https://127.0.0.1:2380
- --name=master
- --peer-cert-file=/etc/kubernetes/pki/etcd/peer.crt
- --peer-client-cert-auth=true
- --peer-key-file=/etc/kubernetes/pki/etcd/peer.key
- --peer-trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt
- --snapshot-count=10000
- --trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt
各証明書の確認
Kube API サーバの証明書の CN 確認
(証明書の場所)
/etc/kubernetes/pki/apiserver.crt
(確認コマンド)
openssl x509 -in /etc/kubernetes/pki/apiserver.crt -text -noout
etcd サーバ証明書の CN 確認
(証明書の場所)
/etc/kubernetes/pki/etcd/server.crt
(確認コマンド)
openssl x509 -in /etc/kubernetes/pki/etcd/server.crt -text -noout
Root CA の証明書の確認
(証明書の場所)
/etc/kubernetes/pki/ca.crt
(確認コマンド)
openssl x509 -in /etc/kubernetes/pki/ca.crt -text -noout
期限が 10 年あることに気づく。
他のコンポーネントは 1 年だけど、これだけ長い。
証明書の再発行
例として Kube API Server から etcd に接続できなくなったとする。
このとき、例えば以下の証明書の期限が切れていたとする。
$ openssl x509 -in /etc/kubernetes/pki/apiserver-etcd-client.crt -text -noout
これを再発行しないといけない。
csr や etcd の CA 証明書および秘密鍵などはそのまま利用できる。
以下のコマンドで対応可能。
$ openssl x509 -req -in /etc/kubernetes/pki/apiserver-etcd-client.csr -CA /etc/kubernetes/pki/etcd/ca.crt -CAkey /etc/kubernetes/pki/etcd/ca.key -CAcreateserial -out /etc/kubernetes/pki/apiserver-etcd-client.crt
Certificate API
新たにユーザを追加して証明書を発行するまで
鍵の作成
$ openssl genrsa -out jane.key 2048
Generating RSA private key, 2048 bit long modulus
........................+++
.....................................+++
e is 65537 (0x10001)
CSR の作成
$ openssl req -new -key jane.key -subj "/CN=jane" -out jane.csr
$ cat jane.csr
-----BEGIN CERTIFICATE REQUEST-----
MIICVDCCATwCAQAwDzENMAsGA1UEAwwEamFuZTCCASIwDQYJKoZIhvcNAQEBBQAD
ggEPADCCAQoCggEBALYEwFoQjd/r+rRimA5nXb/KtkTCSyxtRA18bnQXJnoJYNHw
6kvPrKR3eXnXHyQVU14P8Hc4QpLM/k/L9XQkzFaA/irJnTQnSSnY06Uq873WN3E7
NhGQtfV7GXvq2QMUOo1956SDeGaBxXB8HuxMr3P9/EjZK9YZY4kOiPWLYTWwPYkJ
KYPnVVDiY1dEJms2jbO+khCYgHNjs7E5x1PSucfPJ3sKo7axhO858psX7lleIeqg
fCWfSqOoyfGvgewWyPkzPUg+4jMJFhlQLFGYfOB9/a/nmajZ1ALuAMEEEsjjuWop
GfIb5AHYlNinymfKIhJBe9d6DYhXnm4v/Hr72hcCAwEAAaAAMA0GCSqGSIb3DQEB
CwUAA4IBAQBltSYDZNkhdJLgkUXsTLTJQRgh4XhKCLcCTjywmomXr0RYsYMnDVYi
AjnrK4Z4G0mRoyauH0EoCVB+nCaaUzxSrUJ+i/gchcnsKqQh3ZfUEtKIDvxuiX3z
ee5ezBlX0wc8kpzWaF9zdQXWHD2/5F9l9rbQU2XZkCkFwz+/QitwH9sD0g3hn59L
RbXdTCPMaI+mLKSl7CfuB03YowaFFJR7xaxW4MHcYoScDy+kxXI8XZdkYGs7FfYh
9GeAv4hCY93D8DoV5nbty4ahr7CtetOj53/fG/xHdaDMUop/AxgfUSBn0tTB8v3m
1A3MqK1g9kqRIvaJCFS7v+/q6s75oeHi
-----END CERTIFICATE REQUEST-----
Kube API を利用して CSR を実施する
apiVersion: certificates.k8s.io/v1beta1
kind: CertificateSigningRequest
metadata:
name: jane
spec:
groups:
- system:authenticated
usages:
- digital signature
- key encipherment
- server auth
request: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0KTUlJQ...
...
(これは jane.csr を base64 でエンコードしたもの)
base64 エンコードは単純に以下の通りまるっとエンコードしてしまってよい。
$ cat jane.csr | base64
そして、コンソール上でそのままマニフェストに書き込むなら以下のように渡すのが良いのかな。
$ cat jane.csr | base64 | tr -d '\n' >> jane-csr.yaml
CSR を確認する
$ kubectl get csr
CSR を承認する
$ kubectl certificate approve jane
