Kubernetesを構築しながら理解を深めてみる
あえてツールを使わない
久々に来たらボードに何か書いてある!?
Kubernetesをインストールツール使わずに構築するチュートリアルのことみたいだね…
便利なツールとかクラウドサービスとかあるのに〜
まぁ、構成を理解するために結構オススメらしいし、やってみるか…できるか不安だけど
この記事の目的
kubernetes-the-hard-wayを実施しながら、Kubernetesの構成要素を理解する。
勉強中のため、記載した内容については後日訂正する可能性もあります。
Hard Wayのゴール
最終的に↓の構成を作ることになるらしいよ
サーバ6台も立てるの!?
Masterサーバを冗長化させて、Nodeも3つに分散する感じだね
そして最後にkubectlからリソースを登録して、Pod作成と外部からアクセスできることを確認するよ
なるほど…でもドキュメントが英語で読むの時間かかりそー…
和訳してくれてるサイトとか結構あるみたい
たすかる!
ハンズオン!
準備するもの
ここでは構築に使うGoogleCloudPlatformのCLIと、複数台のサーバに同時にコマンドを打てたりするtmuxのインストールが紹介されてるね
無料トライアルで約3万円分もクレジットもらえてお得ね!
今回のハンズオンでだいたい↓くらい使いました。
作業PCで使うツールを準備
Kubernetesのクラスタ内のセキュリティを強化するために、公開鍵基盤を作るツールと、kubectlを作業PCにインストールするよ
公開鍵…なんとなーくわかるけど、すぐ忘れちゃう…
あとでまた出てくるから、そこで整理しよう
クラウドでVMとか作成
Provisioning Compute Resources
クラウド内に閉じたネットワーク(VPC)を作って、そこにVMを6台立てるよ。あとはファイアーウォールの設定したり、外部公開用のIPを取得したり。
Node用のVMにpod-cidrっていうメタデータ?が設定されてるの何!?
あとで使うらしいけど、Podを割り当てるためのサブネットなんだって
あ、そーいえばPodにもIPが振られるんだっけ
TLS証明書を作りまくる
Provisioning a CA and Generating TLS Certificates
きた…
Kubernetesのコンポーネント間で認証/認可を行うために、それぞれのコンポーネント用にTLS証明書を作成するよ
配置ミスったらアウトだねー…今回はコマンド通り打てば問題ないけど!
Kubeconfigファイルを作成
Generating Kubernetes Configuration Files for Authentication
ここもひたすらコンポーネント毎に設定ファイルを作ります
また…
この設定で、各コンポーネントが接続する先のクラスタと、使用する認証情報の組み合わせ(Context)を定義するんだ
データの暗号化設定
Generating the Data Encryption Config and Key
Kubernetesはデータ扱うためのConfig & Strageリソースがあって、その中で暗号化機能を提供しているSecretのための暗号化鍵を作成するよ
Config & Strage系は(このブログで)まだやってなかったんで、一応マニフェスト貼りますか…
kind: EncryptionConfig apiVersion: v1 resources: - resources: - secrets providers: - aescbc: keys: - name: key1 secret: ${ENCRYPTION_KEY} - identity: {}
secretリソースに対する暗号化の設定…ってカンジかな?
この設定をした上でSecretリソースを作成すると↓のようにデータが暗号化される
$ kubectl create secret generic kubernetes-the-hard-way --from-literal="mykey=mydata" -o yaml --dry-run apiVersion: v1 data: mykey: bXlkYXRh #暗号化されたデータ kind: Secret metadata: creationTimestamp: null name: kubernetes-the-hard-way
ちなみにdry-runオプションと-o yamlを組み合わせると、作成されるマニフェストを標準出力できて便利!
etcdを起動
Bootstrapping the etcd Cluster
APIサーバに送られた各リソースは、このetcdっていうデータストアに登録されるんだ
Master3台で冗長化するから、3台分のインストール作業がいるね
Masterのコンポーネントを起動
Bootstrapping the Kubernetes Control Plane
Kubernetes API Server、Scheduler、ControllManagerをインストールしていくよ
作っておいた各設定ファイルを移動して、バイナリをDL、systemdのユニットファイルを作る、という流れだね
ユニットファイルの起動コマンドのオプションがえげつない…
細かい内容はリファレンス見るしかない…
あとはロードバランサーのヘルスチェックを有効にするためにnginxを設定してるのと、APIサーバから各Nodeのkubeletへのアクセス認可設定をしているね
ClusterRoleリソースで権限を作成して、ClusterRoleBindingリソースで権限を付与する対象を決めてるよ
apiVersion: rbac.authorization.k8s.io/v1beta1 kind: ClusterRole metadata: annotations: rbac.authorization.kubernetes.io/autoupdate: "true" labels: kubernetes.io/bootstrapping: rbac-defaults name: system:kube-apiserver-to-kubelet rules: - apiGroups: - "" resources: - nodes/proxy - nodes/stats - nodes/log - nodes/spec - nodes/metrics verbs: - "*"
このresourcesに対して、verbsに指定した操作が可能になる…と
「*」だから全ての処理を実行できるってワケね!
apiVersion: rbac.authorization.k8s.io/v1beta1 kind: ClusterRoleBinding metadata: name: system:kube-apiserver namespace: "" roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: system:kube-apiserver-to-kubelet subjects: - apiGroup: rbac.authorization.k8s.io kind: User name: kubernetes
これで権限が「kubernetes」ユーザに紐づく。APIサーバはこのユーザでkubeletに対して認証できるようになるよ
Nodeのコンポーネントを起動
Bootstrapping the Kubernetes Worker Nodes
KubeletとKubeproxyのインストールだね。KubeletはAPIサーバからの要求でContainerdっていうサービスを介してPodを作成するみたい。Docker的なやつだね
もっと厳密に言うと、Containerdが指示を出してruncってやつがPodを作ってるらしい…
深すぎてわけわからんですね…ググりましょう…
クライアントからkubectlできるようにする
Configuring kubectl for Remote Access
クライアントにkubeconfigの設定をして、Contextをセット〜♪
Podへのルーティングを設定する
Provisioning Pod Network Routes
この時点だとPodから他ノードPodへの通信ができないから、ルートを設定するよ
DNSを立てる
Deploying the DNS Cluster Add-on
Pod名でアクセスできるよう、DNSを構築するよ
このアプリはPodで動くんだー!なんかやっとkubernetesっぽくなってきた
テストして環境削除
色々動作確認して、終了です!!
やっと動いたのに〜!?
おわり