Sun, Jun 3, 2018

Kubernetes 1.10のクラスタを全手動で構築するのをAnsibleで全自動化した

Kubernetes 1.10のクラスタを全手動で構築するのをAnsibleで全自動化した

Kubernetes 1.10をスクラッチから全手動で構築」、「Kubernetes 1.10のクラスタにWeave Netをデプロイする」、「Kubernetes 1.10のkubeletの起動オプションをKubelet ConfigファイルとPodSecurityPolicyで置き換える」のまとめとして、Kubernetes 1.10のクラスタを構築するAnsible Playbookを書いた。

書いたものはGitHubに置いた。

Ansibleとは

Ansibleは、Ansible社が開発したOSSのIT自動化ツール。 Ansible社は2015年10月にRedHatが買収したので、現在はRedHatが開発している。 似たようなツールにPuppetChefがあるが、最近はAnsibleが最も支持されている気がする。

構成管理ツールと紹介されることが多い気がするが、2014年末位からはIT自動化ツールを自称していて、構成管理は実現するユースケースの一つという位置づけになっているので、そろそろ認識を改めてあげたい。

ユースケースは以下のようなもの。


以下のような特徴を持つ。

  • Python(とPowerShell)で作られてる。
  • YAMLで書いた定義(Playbook)に従って処理を実行する。
  • シンプルで簡便であることを売りにしている。
    • 多数のモジュールがビルトインされていて、様々な操作を簡潔な定義で宣言的に実行できる。
  • エージェントレスで、SSH(等)で対象のサーバにつないで処理を実行する。
  • 処理を冪等にできるような仕組みが備わっていて、特にビルトインモジュールを活用すると簡単に冪等性を持たせられる。


Pythonで書かれているのでどこでも動くかと思いきや、fcntlとかgrpやらUnix特有のモジュールを使っているため、WindowsのPythonでは動かない。

MSYS2とかWSLでは動く模様。 (Git Bashでは動かない…)


今回使ったのは最新版の2.5.3。

Ansibleインストール

AnsibleはYUMとかpipとかでインストールできる。

今回はOracle Linux 7.4で動かすため、以下のようにインストールした。

  1. AnsibleのYUMリポジトリ追加

    以下の内容を/etc/yum.repos.d/の適当な.repoファイルに書く。

    [ansible]
    name=Ansible
    baseurl=http://releases.ansible.com/ansible/rpm/release/epel-7-x86_64/
    gpgcheck=0
    enabled=1
    
  2. 依存するPythonパッケージのYUMリポジトリを有効化

    /etc/yum.repos.d/public-yum-ol7.repoを編集して、ol7_openstack30セクションのenabledを1にする。

  3. インストール

    # yum install -y ansible
    

Playbookの書き方

Playbookの書き方は他にたくさん情報があるし、どうせすぐに陳腐化するのでここには書かない。

以下を参照して書いた。


一つ他にあまりなかった情報を書く:

タスクをループするとき、with_itemsプロパティを書くのはもう古くて、バージョン2.5以降ではloopプロパティを使う。


書いたPlaybookで構築できるのは以下のようなKubernetesクラスタ。

  • Kubernetes: バージョン1.10.1
    • 単一ノード
    • 全コンポーネント(kubelet、kube-proxy、kube-apiserver、kube-controller-manager、kube-scheduler、etcd)をsystemdで起動 (i.e. 非コンテナ)
      • kubeletとkube-proxy以外は非rootユーザ
    • コンポーネント間通信とkubectlの通信をTLSで暗号化
    • コンポーネント間通信とkubectlの通信の認証はx509クライアント証明書
    • TLS Bootstrapping
      • Bootstrap token使用
      • CSR自動承認
    • Certificate Rotation有効
    • etcd 3.1.12
    • Weave Net 2.3.0
    • CoreDNS 1.1.3
    • SERVICE_CLUSTER_IP_RANGE (Serviceに割り当てるIPの範囲) は10.0.0.0/16
    • CLUSTER_CIDR (Podに割り当てるIPの範囲) は10.32.0.0/16
    • Proxyモードはiptables。
    • PodSecurityPolicy有効。
    • KubeletConfigurationKubeProxyConfigurationKubeSchedulerConfigurationを使用。
  • 開発ツール付き

Ansibleの変数をいじればある程度違う構成もできる。 複数ノードや、マスターコンポーネントの冗長化や、etcdが別サーバの構成もできそうな感じにはRoleを分けて書いたけど、試してはいない。

kubespray

一通り作った後で、kubesprayというものを知った。 これ使うと、Ansibleでマルチノードのk8sクラスタ作れて、ネットワークプロバイダ切り替えたり、istioとかHelmとかDocker Registryとか簡単にデプロイできたり、AWSやAzureにクラスタ作れたり、すごい。

あ、いや、けどこれOracle Linuxサポートしてないし…