YOKOHEI.COM

YOKOHEI.COM

›Kubernetes Basics

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

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
← Backup & RestoreRBAC →
▼ Codes ▼
LeetCodeGitHub
▼ Profile ▼
LinkedInFlickr
▼ Logo made with DesignEvo ▼
DesignEvo
Copyright © 2020 Kohei Yoshida