VTRyo Blog

一歩ずつ前に進むブログ

これからKubernetes The Hard Wayする人に役立つかも知れないTips

Kubernetes The Hard WayはいわゆるKubernetesチュートリアル。

今回は以下のドキュメントを参考に実施した。

github.com

Kubernetes The Hard Wayを実施したときやってたこと

Kubernetes The Hard Way

実施中やったこと言ってみ

作業ログ

片っ端からリンクに飛ぶ

ブログにする前提

やるやん

やったぜ

 

このブログを読んでいるということは、これからKubernetes The Hard Wayをやろうとしているのだと思う。

なので、Hard Wayがどんなものかよりも、作業中どんなものを参考・調査しながらやったのか書いておく。

作業ログ

ターミナルじゃなくて、自分が作業しているセクションをGoodNotesに書いておいてある。

たとえばこういう感じ…。あくまで自分メモなのでさすがになぐり書きしている。字が汚い。

f:id:vtryo:20191104015939j:plain
作業ログ

「ここまでやったけど理解できてないかも」というメモは、気づいたら深夜になってて頭の回転が悪くなってたのを観測して翌日に回そうと思ってメモっていたもの。

 

あとは、クラスタの構築なので、自分が今どこの何をしているのか図も書いた。

片っ端からリンクに飛ぶ

ドキュメントは大変親切に翻訳してくれている*1

貼ってくれているリンクもわからないものは面倒くさがらず踏んだ。この場で完全に理解しなくても頭の片隅には残る。

最初からブログにするつもりで実施した

これを書くのもそうだが、この先整理するのも見越してブログにメモを書きながら実施した。

感想

普段の業務ではマネージドサービス(EKS)に甘えているので、実施ラストあたりにようやくkubectl get podsしたときはちょっと嬉しかった。

「おお。ここでようやくいつものやつ」みたいな。

Controll Planeなど普段見えない所まで覗けたのは素直に面白かった。

この辺はまた別途整理して書いておきたいと思う。

Kubernetes The Hard Wayをやる価値は十分にあった。

知らなかったこと調査

02-client-tools

cfssl, cfssljson

CloudFlare製のPKI/TLSツール。

PKI(Public key infrastructure)とは公開鍵基盤 - Wikipediaのこと。

TLS証明書に署名、検証、およびバンドルするためのコマンドラインツール。

github.com

Kubernetesのクラスタ構築に証明書が使用されるため必要となる。

04-certificate-authority

Node Authorizer

kubernetes.io

kubeletによって行われたAPIリクエストを特に認証する特別な目的の認証モード。

07-bootstrapping-etcd

etcd

github.com

Go言語で記述された分散KVSRaftという分散合意アルゴリズムが採用されている。

クラスタ内の全サーバに一貫性のあるステートマシンを提供するためのアルゴリズム

とあるように、etcdを利用してKubernetesはクラスタの状態管理をしている。(Kubernetesのコンポーネントはステートレス)

/etc/systemd/system/kube-apiserver.service

systemdのユニットファイルとして作成。

kubernetes.io

[Unit]
Description=Kubernetes API Server
Documentation=https://github.com/kubernetes/kubernetes

[Service]
ExecStart=/usr/local/bin/kube-apiserver \
  --advertise-address=10.240.0.10 \    #INTERNAL_IP
  --allow-privileged=true \
  --apiserver-count=3 \
  --audit-log-maxage=30 \
  --audit-log-maxbackup=3 \
  --audit-log-maxsize=100 \
  --audit-log-path=/var/log/audit.log \
  --authorization-mode=Node,RBAC \
  --bind-address=0.0.0.0 \
  --client-ca-file=/var/lib/kubernetes/ca.pem \
  --enable-admission-plugins=NamespaceLifecycle,NodeRestriction,LimitRanger,ServiceAccount,DefaultStorageClass,ResourceQuota \
  --etcd-cafile=/var/lib/kubernetes/ca.pem \
  --etcd-certfile=/var/lib/kubernetes/kubernetes.pem \
  --etcd-keyfile=/var/lib/kubernetes/kubernetes-key.pem \
  --etcd-servers=https://10.240.0.10:2379,https://10.240.0.11:2379,https://10.240.0.12:2379 \
  --event-ttl=1h \
  --encryption-provider-config=/var/lib/kubernetes/encryption-config.yaml \
  --kubelet-certificate-authority=/var/lib/kubernetes/ca.pem \
  --kubelet-client-certificate=/var/lib/kubernetes/kubernetes.pem \
  --kubelet-client-key=/var/lib/kubernetes/kubernetes-key.pem \
  --kubelet-https=true \
  --runtime-config=api/all \
  --service-account-key-file=/var/lib/kubernetes/service-account.pem \
  --service-cluster-ip-range=10.32.0.0/24 \
  --service-node-port-range=30000-32767 \
  --tls-cert-file=/var/lib/kubernetes/kubernetes.pem \
  --tls-private-key-file=/var/lib/kubernetes/kubernetes-key.pem \
  --v=2
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target
  • advertise-address
    • クラスタのメンバーに伝えるIPアドレス
  • allow-privileged
    • trueの場合、特権コンテナを許可する
  • apiserver-count
    • クラスタで実行されているapiserverの数
  • audit-log-maxage
    • ファイル名にエンコードされたタイムスタンプに基づき、古い監査ログファイルを保持する最大日数
  • audit-log-maxbackup
    • 保持する古い監査ログファイルの最大数
  • audit-log-maxsize
    • ローテートされる前の監査ログファイルの最大サイズ(MB単位)
  • audit-log-path
    • 設定すると、apiserverに送られるすべてのリクエストがこのパスのファイルに記録される
  • authorization-mode
    • 安全なポートで認証を行うためのプラグインの順序付きリスト。カンマ区切り。AlwaysAllow,AlwaysDeny,ABAC,Webhook,RBAC,Node
  • bind-address
    • secure-portをListenするIPアドレス。空白の場合、全てのインターフェイスが使用される(0.0.0.0, ::)
  • client-ca-file
    • 公開鍵証明書認証を利用して認証を行う
  • enable-admission-plugins
    • 有効にするAdmission Plugin
  • etcd-cafile
    • etcdの通信をセキュアにするために使用するSSL認証のファイル
  • etcd-certfile
    • etcdの通信をセキュアにするために使用するSSL証明書ファイル
  • etcd-keyfile
    • etcdの通信をセキュアにするために使用するSSLキーファイル
  • etcd-servers
    • 接続するetcdのサーバリスト
  • event-ttl
    • イベントを保持する時間
  • encryption-provider-config
    • etcdにシークレットを保存するために使用される暗号化プロバイダ構成ファイル
  • kubelet-certificate-authority
    • 認証局の証明書ファイルパス
  • kubelet-client-certificate
    • TLSのクライアント証明書ファイルパス
  • kubelet-client-key
    • TLSのクライアントキーファイルパス
  • kubelet-https
    • kubeletはhttpsを使用する
  • runtime-config
    • apiserverに渡せるランタイム構成。api/allはすべてのapiバージョンを制御する特別なキー。どう設定すればいいかわからないときはfalseを推奨
  • service-account-key-file
    • Service AccountTokenの検証に使われる秘密鍵・公開鍵
  • service-cluster-ip-range
    • サービスクラスタIPを割り当てるIP範囲。CIDR表記。Podのノードに割り当てられるIP範囲と重複できない
  • service-node-port-range
    • NodePortの可視性のあるサービス用に予約するポート範囲
  • tls-cert-file
    • https用の証明書ファイル
  • tls-private-key-file
    • tls-cert-fileに一致する秘密鍵ファイル
  • v
    • ログレベル冗長性の数

Unit, Installについてはこちらが参考になる。

tex2e.github.io

/etc/systemd/system/kube-controller-manager.service

systemdのユニットファイルとして作成。

[Unit]
Description=Kubernetes Controller Manager
Documentation=https://github.com/kubernetes/kubernetes

[Service]
ExecStart=/usr/local/bin/kube-controller-manager \\
  --address=0.0.0.0 \\
  --cluster-cidr=10.200.0.0/16 \\
  --cluster-name=kubernetes \\
  --cluster-signing-cert-file=/var/lib/kubernetes/ca.pem \\
  --cluster-signing-key-file=/var/lib/kubernetes/ca-key.pem \\
  --kubeconfig=/var/lib/kubernetes/kube-controller-manager.kubeconfig \\
  --leader-elect=true \\
  --root-ca-file=/var/lib/kubernetes/ca.pem \\
  --service-account-private-key-file=/var/lib/kubernetes/service-account-key.pem \\
  --service-cluster-ip-range=10.32.0.0/24 \\
  --use-service-account-credentials=true \\
  --v=2
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target
  • cluster-cidr
    • クラスタ内のPodのCIDR範囲
  • cluster-signing-cert-file
    • クラスタスコープの証明書発行に使用されるCA証明書を含むファイル
  • cluster-signing-key-file
    • クラスタスコープの証明書署名用の秘密鍵
  • kubeconfig
    • kubeconfigのパス
  • leader-elect
    • 高可用性のために複製されたコンポーネントを実行する場合にtrue
  • root-ca-file
    • 設定すると、ルート認証局がサービスアカウントのシークレットトークンに含まれる
  • service-account-private-key-file
    • サービスアカウントトークンに署名するためのPem
  • use-service-account-credentials
    • trueの場合は各コントローラーに込めつのサービスアカウント資格情報を使用する

09-bootstrapping-kubernetes-workers

runc

OCI使用に従ってコンテナを生成および実行するためのCLIツール。

github.com

CNI

コンテナネットワークインターフェイス。

コンテナとネットワークを接続する技術。

qiita.com

github.com

socat

www.dest-unreach.org

ソケット通信をサーバ側としてもクライアント側としても 使えるコマンド。

conntrack

netfilterコネクショントラッキングシステムの全機能を提供する

qiita.com

netfilter

Linuxカーネル2.4以降のパケット処理のためのフレームワーク。これの設定を操作するツールがiptables

ja.wikipedia.org

ipset

IPアドレスやポート番号等をひとまとめにして管理するツール。

qiita.com

swapが有効になっているとkubeletは起動失敗する

デフォルトで、無効にしないと起動失敗するようになっている。

「Pod がメモリを消費しすぎて、他の Pod のメモリが swap して遅くなる」状況を回避するため。

そのときのissueはこちら。

github.com

qiita.com

containerd

Dockerのコンテナランタイム。

Docker社がもともと開発していたが、現在はCNCFに寄贈されている。

なお現在もDocker内部のランタイムとして使われているので事実上標準のランタイムと言われている。 実行中のコンテナの管理・監視であったり、コンテナイメージの管理(レジストリへのpush, pullなど)が主な役割。

containerd1.1では、containerdにCRIプラグインが組み込まれ、直接Kubernetesとやり取りが可能になっている。

このKubernetes The Hard Wayでインストールしたcontainerdはv1.2.9だった。

ctr --version
ctr github.com/containerd/containerd v1.2.9

www.publickey1.jp

qiita.com

12-dns-addon

CoreDNS

CoreDNSはGo言語製のDNSサーバ。CNCFのgraduatedプロジェクト。

Kubernetesでは個々のコンテナがDNSを使って名前解決する仕組みを持っている。つまりその部分を担っている。

クラスタで定義されたすべてのサービス(DNSサーバ自身も含め)にDNS名が割り当てられる。

kubernetes.io

13-smoke-test

kubectl port-forward

Podに対してポートフォワードを行う。

ローカルで実行するkubectlとPod間でポートフォワードを作成してくれる。

Pod内のエンドポイントにアクセスして動作を確認したいとかに使うと効率が良さそう。

kubernetes.io

cstoku.dev

qiita.com

その他参考

*1:原文でできるのが一番いいのはわかっているけど、英語に躓いてHard WayがExtra Hard Wayになってもなーと言うことで