LoginSignup
1
2

More than 3 years have passed since last update.

Kubernetes the hard way 要約

Posted at

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-kubeletkubernetes ユーザを紐付ける 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.pemworker.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
  • ファイアーウォールルール
  • ルート
  • サブネット
  • ネットワーク
1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2