Kubernetes the hard way 要約

# Kubernetes the hard way 要約

## 前準備

### `gcloud` コマンドインストール

### プロジェクト作成

### リージョン/ゾーン設定

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

### CFSSLのインストール

Cloudflare's PKI and TLS toolkit 
TLS証明書の署名、検証、バンドルのためのコマンドラインツール + HTTP API server

### kubectlのインストール

Kubernetes API serverとやり取りするためのコマンドラインツール

## コンピュートリソースの設定

### VPCの設定

- VPC作成
- サブネットの作成

### ファイアーウォールのルール設定

- 内部ネットワークの通信許可
- 外部からのSSH/Kubernets API server/icmpの通信許可

### APIサーバの前に置くロードバランサに割り当てるstatic IPの確保

### コントローラノード用のcomputeインスタンス3台作成

### ワーカーノード用のcomputeインスタンス3台作成

### コンピュートインスタンスへsshで入るための設定

## 認証局(CA: Certification Authority)の設定とTLS証明書の作成

CloudFlareの `PKI toolkit` を使って公開鍵基盤 (PKI: Public Key Infrastructure) を準備する章

CAの準備と、 etcd/kube-apiserver/kube-controller-manager/kube-scheduler/kubelet/kube-proxy用のTLS証明書を作成する。

### CAの準備

- `ca-config.json` CA設定ファイルの作成
- `ca-csr.json` 証明書署名要求(CSR: Certificate Signing Request) の詳細を記載する(?)jsonファイルの作成
- 証明書と秘密鍵の作成

### クライアントとサーバ証明書

- `admin` クライアントの証明書と秘密鍵の作成
- `kubelet` クライアントの証明書と秘密鍵の作成
  - Kubernetesの機能 `Node Authorizer` を使用できるよう、各ワーカーノードごとに証明書を作成する
- `kube-controller-manager` クライアントの証明書と秘密鍵を作成
- `kube-proxy` クライアントの証明書と秘密鍵を作成
- `kube-scheduler` クライアントの証明書と秘密鍵を作成
- `kube-apiserver` の証明書と秘密鍵を作成

### サービスアカウントキーペア

サービスアカウントの証明書と秘密鍵を作成

### 各証明書と秘密鍵を配布


## 認証のため、Kubernetes 設定ファイルを作成

KubernetesクライアントがAPIサーバを見つけて認証できるようにする。
接続設定ファイル(kubeconfigs)を作成する。

controller manager/kubelet/kube-proxy/schedulerとadminユーザのためにkubeconfigを作成する。

### kubeletのkubeconfigファイルを作成

### kube-proxyのkubeconfigファイルを作成

### kube-controller-managerのkubeconfigファイルを作成

### kube-schedulerのkubeconfigファイルを作成

### adminユーザのkubeconfigファイルを作成

### 各ワーカーに `kubelet` `kubeproxy` のkubeconfigを配布

### 各コントローラに `kube-controller-manager` `kube-scheduler` のkubeconfigを配布

## データ暗号化コンフィグと鍵の作成成

kubernetesはクラスタ情報、アプリケーション設定、機密など様々な情報を保持いる。加えてそれらデータを暗号化する機能をサポートしている。

暗号化鍵と暗号化コンフィグを作成する。

### 暗号化鍵の作成

### 暗号化コンフィグファイルの作成・各コントローラノードへ配布

## etcdクラスタの起動

(以下コントローラノード3台全てに対して作業)

- githubのcoreos/etcdをwgetなどでダウンロード
- 展開してPATH以下に配置
- ディレクトリ作成 `/etc/etcd/` `/var/lib/etcd`
- `/etc/etcd/` 以下に `ca.pem kubernetes-key.pem kubernetes.pem` を配置
- etcdを立ち上げるsystemdのserviceファイルを記述
- systemctlで有効化してスタート


## コントローラプレーンの起動

(以下コントローラノード3台全てに対して作業)

- ディレクトリ作成 `/etc/kubernetes/config`
- バイナリのダウンロード・インストール
  - kube-apiserver
  - kube-controller-manager
  - kube-scheduler
  - kubectl
- 実行権限与えてPATH以下に配置
- APIサーバの設定
  - ディレクトリ作成 `/var/lib/kubernets/`
  - 証明書・鍵・設定ファイルを上記ディレクトリに配置
    - ca.pem
    - ca-key.pem
    - kubernetes-key.pem
    - kubernetes.pem
    - service-account-key.pem
    - service-account.pem
    - encryption-config.yaml
  - kube-apiserverを立ち上げるsystemdのserviceファイルを記述
- コントローラマネージャの設定
  - `kube-controller-manager.kubeconfig` を `/var/lib/kubernetes/` に配置
  - kube-controller-managerを立ち上げるsystemdのserviceファイルを記述
- スケジューラの設定
  - `kube-scheduler.kubeconfig` を `/var/lib/kubernetes/` に配置
  - スケジューラの設定ファイル.yamlを記述
  - kube-schedulerを立ち上げるsystemdのserviceファイルを記述
- systemctlで有効化してスタート

### Google network loadbalancerのhttpヘルスチェックへの対応

nginxをインストールして、80に来たヘルスチェックを 6443の `/healthz` にプロキシ

### kubeletのためのRBAC(Roll Based Access Controll) の設定

controller-0で作業

- kubelet APIにアクセスしてpodに関する一般的な操作を行う `system:kube-apiserver-to-kubelet` クラスタロールを作成
- `system:kube-apiserver-to-kubelet` と `kubernetes` ユーザを紐付ける `ClusterRoleBinding` を作成

### Kubernetesのフロントエンドロードバランサ

- http-health-checksを作成
- helth checkを許可するfirewall-rulesを作成
- ロードバランサで割り振る先のアドレスプール(target-pools)を作成
- target-poolにコントローラノード3台追加
- 事前に確保したStatic IPの6443に来たアクセスをtarget-poolに割り振るforwading-rulesを作成

## ワーカーノードの起動

(以下ワーカーノード3台に対して作業)

### ワーカーノードの初期設定

- aptで `socat conntrack ipset` を入れる

###  ワーカーバイナリのダウンロード・インストール

- wgetでダウンロード
  - crictl (CRI(Continer Runtime Interface)互換のコンテナランタイムを操作するためのCLIツール)
  - runsc (gVisorに含まれる、runcよりもホストカーネルよりも隔離して実行されるらしくセキュア？)
  - runc (コンテナの生成・実行を行う、containerdの裏側)
  - cni-plugins (名前のまま、bridge/ipvlan/loopback/etc...を使用できるようになる)
  - containerd (コンテナランタイム、管理監視がメイン)
  - kubectl
  - kube-proxy
  - kubelet
- ディレクトリ作成
  - /etc/cni/net.d
  - /opt/cni/bin
  - /var/lib/kubelet
  - /var/lib/kube-proxy
  - /var/lib/kubernetes
  - /var/run/kubernetes
- ダウンロードしたものをそれぞれリネーム・展開・配置

### CNI (Container Network Interface) の設定

- PodのCIDRレンジを取得 (インスタンス生成時にメタデータで入れたやつ) 
- `/etc/cni/net.d/10-bridge.conf` bridgeネットワークの設定を作成
- `/etc/cni/net.d/99-loopback.conf` ループバックネットワークの設定を作成

### containerdの設定

- ディレクトリ作成 `/etc/containerd/`
- `/etc/containerd/config.toml` containerdの設定作成
- `containerd.service` を作成

### kubeletの設定

- `worker-*-key.pem` を `worker.pem` にリネームして `/var/lib/kubelet/` に配置
- `worker-*.kubeconfig` を `/var/lib/kubelet/kubeconfig` に配置
- `ca.pem` を `/var/lib/kubernetes/` に配置
- `kubelet-config.yaml` を作成して `/var/lib/kubelet/kubelet-config.yaml` に配置
- `kubelet.service` を作成

### kube-proxyの設定

- `kube-proxy.kubeconfig` を `/var/lib/kube-proxy/kubeconfig` に配置
- `kube-proxy-config.yaml` を作成して `/var/lib/kube-proxy/kube-proxy-config.yaml` に配置
- `kube-proxy.service` を作成

systemctlで有効化してスタート

## リモートアクセスするためのkubectlの設定

kubectlコマンド用のkubeconfigファイルを作成する

### Adminユーザ用のKubernetes設定ファイルを作成

## Podネットワークの経路の設定

### gcp coumputeのルートの作成

pod宛のトラフィックを、そのpodが入っている(そのpodのIPアドレスのレンジが割り当てられている)nodeに流すよう設定

### DNSクラスタアドオンのデプロイ

サービスディスカバリのためCoreDNSでサポートされるDNSアドオンをデプロイする。

## クリーンアップ

作ったリソース削除

- インスタンス
- フォワーディングルール
- ターゲットプール
- ヘルスチェック
- 静的IP
- ファイアーウォールルール
- ルート
- サブネット
- ネットワーク