31年目のRealize

技術に関する詳しい記事や分かりやすい記事は世の中にたくさんあるので、自分なりのアウトプットを試行錯誤。

Kubernetesを構築しながら理解を深めてみる

あえてツールを使わない

f:id:altrlz:20200310005749p:plain

久々に来たらボードに何か書いてある!?

Kubernetesをインストールツール使わずに構築するチュートリアルのことみたいだね…

github.com

便利なツールとかクラウドサービスとかあるのに〜

まぁ、構成を理解するために結構オススメらしいし、やってみるか…できるか不安だけど

この記事の目的

kubernetes-the-hard-wayを実施しながら、Kubernetesの構成要素を理解する。
勉強中のため、記載した内容については後日訂正する可能性もあります。

Hard Wayのゴール

最終的に↓の構成を作ることになるらしいよ

f:id:altrlz:20200312233056p:plain

サーバ6台も立てるの!?

Masterサーバを冗長化させて、Nodeも3つに分散する感じだね

そして最後にkubectlからリソースを登録して、Pod作成と外部からアクセスできることを確認するよ

なるほど…でもドキュメントが英語で読むの時間かかりそー…

和訳してくれてるサイトとか結構あるみたい

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

たすかる!

ハンズオン!

準備するもの

Prerequisites

ここでは構築に使うGoogleCloudPlatformのCLIと、複数台のサーバに同時にコマンドを打てたりするtmuxのインストールが紹介されてるね

無料トライアルで約3万円分もクレジットもらえてお得ね!

今回のハンズオンでだいたい↓くらい使いました。

f:id:altrlz:20200313000608p:plain

作業PCで使うツールを準備

Installing the Client Tools

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を組み合わせると、作成されるマニフェストを標準出力できて便利!

yamlの雛形作成がラクちんだ!

etcdを起動

Bootstrapping the etcd Cluster

APIサーバに送られた各リソースは、このetcdっていうデータストアに登録されるんだ

Master3台で冗長化するから、3台分のインストール作業がいるね

Masterのコンポーネントを起動

Bootstrapping the Kubernetes Control Plane

Kubernetes API Server、Scheduler、ControllManagerをインストールしていくよ

作っておいた各設定ファイルを移動して、バイナリをDL、systemdのユニットファイルを作る、という流れだね

ユニットファイルの起動コマンドのオプションがえげつない…

細かい内容はリファレンス見るしかない…

リファレンス | Kubernetes

あとはロードバランサーのヘルスチェックを有効にするために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を作ってるらしい…

深すぎてわけわからんですね…ググりましょう…

コンテナユーザなら誰もが使っているランタイム「runc」を俯瞰する[Container Runtime Meetup #1発表レポート] | by Kohei Tokunaga | nttlabs | Medium

クライアントから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っぽくなってきた

テストして環境削除

Smoke Test Cleaning Up

色々動作確認して、終了です!!

やっと動いたのに〜!?

おわり