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
を使用できるよう、各ワーカーノードごとに証明書を作成する
- Kubernetesの機能
-
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
- ファイアーウォールルール
- ルート
- サブネット
- ネットワーク