Kubernetes The Hard Way やってみた

Date: 2020/03/08
Tags: K8s Gcp

Kubernetes を仕事で使っているにも関わらず、やったことがなかったためやってみた。 手順については本家のページに詳細に記載されているので、個人用メモとして残しておく。

kubernetes-the-hard-way

GitHub - kelseyhightower/kubernetes-the-hard-way: Bootstrap Kubernetes the hard way on Google Cloud Platform. No scripts.

GCP の利用開始

kubernetes-the-hard-way/01-prerequisites.md at master · kelseyhightower/kubernetes-the-hard-way · GitHub

Google Cloud SDK のインストール

kubernetes-the-hard-way/01-prerequisites.md at master · kelseyhightower/kubernetes-the-hard-way · GitHub

クライアントツールのインストール

kubernetes-the-hard-way/02-client-tools.md at master · kelseyhightower/kubernetes-the-hard-way · GitHub

Compute リソースの作成

kubernetes-the-hard-way/03-compute-resources.md at master · kelseyhightower/kubernetes-the-hard-way · GitHub

やっていること

  1. VPC 用の Network を作成

    • 色々設定するっぽいので —subnet-mode=custom が使われている。
  2. k8s クラスタ用の subnet を作成

    • CIDR は 10.240.0.0/24 (254 台分の IP レンジを確保)
  3. firewall の作成

    • —networkで指定したネットワーク内の設定ができるっぽい。
    • —source-rangesで IP レンジを指定
    • internal (controller-worker 間) - tcp,udp,icmp
    • external (外部に公開されるもの) - SSH、kube-apiserver 用のポート、ICMP
  4. external loadbalancer (kube-apiserver 用) の外部アドレスを作成

  5. controller 用、worker 用インスタンスの作成

    • インスタンス作成スピードはやい。GCP すごい。
    • やっている設定内容 (controller, master 共通)
    for i in 0 1 2; do # 3台作るからforループ
      gcloud compute instances create controller-${i} \
        —async \ # 非同期で作成させる。コマンドの終了を待たない
        —boot-disk-size 200GB \ # ディスクのサイズ
        —can-ip-forward \ # インスタンスのIPフォワーディングを有効化。忘れると作り直しらしい
        —image-family ubuntu-1804-lts \ # imageの指定。Ubuntu 18.04 LTS なのは以外
        —image-project ubuntu-os-cloud \ # imageのプロジェクトを指定
        —machine-type n1-standard-1 \ # OpenStackやAWSのFlavor的なもの
        —private-network-ip 10.240.0.1${i} \ # IPは固定
        —scopes compute-rw,storage-ro,service-management,service-control,logging-write,monitoring \ # インスタンスの権限のようなもの
        —subnet kubernetes \ # 作成したsubnetを設定
        —tags kubernetes-the-hard-way,controller # tagを設定
    done
    

CA のプロビジョニングと TLS 証明書の作成

kubernetes-the-hard-way/04-certificate-authority.md at master · kelseyhightower/kubernetes-the-hard-way · GitHub

やっていること

  1. 証明書を作成
    1. cfssl コマンドで作成
      • CA 証明書は -initca オプションを付けて作成。
      • 他の証明書については、作成した CA 証明書の keypair を-ca, -ca-key オプションで指定。
    2. 作成した証明書
      • CA 証明書の作成 (ca.pem, ca-key.pem)
      • admin 用クライアント証明書を作成 (admin.pem, admin-key.pem)
      • kubelet 用クライアント証明書の作成 (worker-X.pem, worker-X-key.pem)
      • kube-controller-manager 用クライアント証明書の作成 (kube-controller-manager.pem, kube-controller-manager-key.pem)
      • kube-proxy 用クライアント証明書の作成 (kube-proxy.pem, kube-proxy-key.pem)
      • kube-scheduler 用クライアント証明書 (kube-scheduler.pem, kube-scheduler-key.pem)
      • kube-apiserver 用クライアント証明書の作成 (kuberentes.pem, kubernetes-key.pem)
      • ServiceAccout 用の keypair 作成 (service-account.pem, service-account-key.pem)
  2. 証明書をインスタンスに送信
    • gcloud compute scpコマンドを使用して送信。便利
    • worker に転送
      • CA 証明書
      • kubelet 用クライアント証明書
    • controller に転送
      • CA 証明書
      • kube-apiserver 用クライアント証明書 - ServiceAccount 用 keypair

認証のための k8s 設定ファイルの作成

kubernetes-the-hard-way/05-kubernetes-configuration-files.md at master · kelseyhightower/kubernetes-the-hard-way · GitHub

各コンポーネントが kube-apiserver とのクライアント認証のための kubeconfig を作成する。

やっていること

  1. kube-apiserver で公開する IP アドレスを kubeconfig に設定するための KUBERNETES_PUBLIC_ADDRESS 変数を作成
  2. 各コンポーネント用の kubeconfig を作成
    • kubelet
    • kube-proxy
    • kube-controller-manager
    • kube-scheduler
    • admin
  3. kubeconfig をインスタンスに転送
    • worker
      • kubelet
      • kube-proxy
    • controller
      • kube-controller-manager
      • kube-scheduler - admin

k8s クラスタのデータ暗号化鍵を作成

kubernetes-the-hard-way/06-data-encryption-keys.md at master · kelseyhightower/kubernetes-the-hard-way · GitHub

やっていること

  1. 暗号化するためのハッシュ値を作成し、secret として登録するための manifest ファイルを作成
  2. 作成した manifest ファイルを controller に転送

etcd クラスタの構築

kubernetes-the-hard-way/07-bootstrapping-etcd.md at master · kelseyhightower/kubernetes-the-hard-way · GitHub

やっていること

  1. etcd のバイナリをダウンロード、展開して必要なものだけ/usr/local/binmv、実行権限を付与する。

    • etcd
    • etcdctl
  2. etcd 用 systemd の unit ファイル(etcd.service)を作成、/etc/systemd/system/に配置。

    • kube-apiserver 証明書、CA 証明書を設定
    • controller 間でクラスタを構築するために、member 情報を設定
  3. etcd の service を起動する。(unit ファイルを追加したので、daemon-reload と enable を忘れずに。)

    sudo systemctl daemon-reload
    sudo systemctl etcd enable
    sudo systemctl etcd start
    

etcd cluster が構築できているか確認

m1yam0t0@controller-0:~$ sudo ETCDCTL_API=3 etcdctl member list \
>   --endpoints=https://127.0.0.1:2379 \
>   --cacert=/etc/etcd/ca.pem \
>   --cert=/etc/etcd/kubernetes.pem \
>   --key=/etc/etcd/kubernetes-key.pem
3a57933972cb5131, started, controller-2, https://10.240.0.12:2380, https://10.240.0.12:2379, false
f98dc20bce6225a0, started, controller-0, https://10.240.0.10:2380, https://10.240.0.10:2379, false
ffed16798470cab5, started, controller-1, https://10.240.0.11:2380, https://10.240.0.11:2379, false

kubernetes の C-Plane (controller) の設定

kubernetes-the-hard-way/08-bootstrapping-kubernetes-controllers.md at master · kelseyhightower/kubernetes-the-hard-way · GitHub

やっていること

  1. 各種コンポーネントを起動するために必要なバイナリをダウンロード、配置
  2. 起動に必要な設定を追加
    • kube-apiserver
      • CA 証明書、kube-apiserver 用証明書、ServiceAccount 用証明書
      • kubeconfig、データ暗号化鍵であるSecretを設定する manifest ファイル
      • systemd 関連の設定
    • kube-controller-manager
      • kubeconfig
      • systemd 関連の設定
    • kube-scheduler
      • kubeconfig
      • KubeSchedulerConfigurationを設定する manifest ファイル
      • systemd 関連の設定
  3. Systemd unit の起動

controller が機能しているか確認

worker の設定

kubernetes-the-hard-way/09-bootstrapping-kubernetes-workers.md at master · kelseyhightower/kubernetes-the-hard-way · GitHub

worker として必要な各種コンポーネントの設定を追加する。

やっていること

  1. 依存関係となるパッケージを apt-get でインストール
    • socat (kubectl proxy コマンドのため)
    • conntrack
    • ipset
  2. Swap の無効化
    • Swap を有効化していると、デフォルトでは kubelet が起動しない。
    • 無理やり動かすこともできるが非推奨。
  3. 各種コンポーネントを起動するために必要なバイナリをダウンロード、配置
  4. worker として必要なコンポーネントを起動するための設定を追加する。
    • CNI
    • bridge と loopback インターフェースを作成
    • containerd
      • containerd の設定ファイル
      • systemd 関連の設定
    • kubelet
    • kubelet 用証明書
    • kubeconfig
    • KubeletConfigurationを設定する manifest ファイル
    • systemd 関連の設定
      • CoreDNS とsystemd-resolvedで名前解決がループしないようにホストの /etc/systemd/resolve/resolv.conf を設定する
    • kube-proxy
      • kubeconfig
      • KubeProxyConfigurationを設定する manifest ファイル
      • systemd 関連の設定
  5. Systemd unit の起動

worker の動作確認

❯ gcloud compute ssh controller-0 \
  —command “kubectl get nodes --kubeconfig admin.kubeconfig"
NAME       STATUS   ROLES    AGE   VERSION
worker-0   Ready    <none>   31s   v1.15.3
worker-1   Ready    <none>   31s   v1.15.3
worker-2   Ready    <none>   31s   v1.15.3

リモートから kubectl でアクセスできるようにするための設定

kubernetes-the-hard-way/10-configuring-kubectl.md at master · kelseyhightower/kubernetes-the-hard-way · GitHub

やっていること

  1. kubeconfig の設定
    • 事前に用意した admin 用 のクライアント証明書を使う
  2. kubectl で動作確認
    • 普通にできた

Pod Network の設定

kubernetes-the-hard-way/11-pod-network-routes.md at master · kelseyhightower/kubernetes-the-hard-way · GitHub

クラスタ内 DNS (CoreDNS) を Addon としてデプロイ

kubernetes-the-hard-way/12-dns-addon.md at master · kelseyhightower/kubernetes-the-hard-way · GitHub

Smoke Test

kubernetes-the-hard-way/13-smoke-test.md at master · kelseyhightower/kubernetes-the-hard-way · GitHub

確認したこと

さいごに