Table of Contents
「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が開発している。 似たようなツールにPuppetやChefがあるが、最近はAnsibleが最も支持されている気がする。
構成管理ツールと紹介されることが多い気がするが、2014年末位からはIT自動化ツールを自称していて、構成管理は実現するユースケースの一つという位置づけになっているので、そろそろ認識を改めてあげたい。
ユースケースは以下のようなもの。
- プロビジョニング (ベアメタル、VM、クラウドインスタンス)
- 構成管理
- アプリケーションデプロイメント
- CI/CD
- セキュリティ・コンプライアンス管理
- オーケストレーション
以下のような特徴を持つ。
- Python(とPowerShell)で作られてる。
- 昔はPython 2じゃないと動かなかったけど、2.2からPython 3でも動くようになった。
- YAMLで書いた定義(Playbook)に従って処理を実行する。
- シンプルで簡便であることを売りにしている。
- 多数のモジュールがビルトインされていて、様々な操作を簡潔な定義で宣言的に実行できる。
- エージェントレスで、SSH(等)で対象のサーバにつないで処理を実行する。
- 処理を冪等にできるような仕組みが備わっていて、特にビルトインモジュールを活用すると簡単に冪等性を持たせられる。
Pythonで書かれているのでどこでも動くかと思いきや、fcntlとかgrpやらUnix特有のモジュールを使っているため、WindowsのPythonでは動かない。
MSYS2とかWSLでは動く模様。 (Git Bashでは動かない…)
今回使ったのは最新版の2.5.3。
Ansibleインストール
AnsibleはYUMとかpipとかでインストールできる。
今回はOracle Linux 7.4で動かすため、以下のようにインストールした。
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
依存するPythonパッケージのYUMリポジトリを有効化
/etc/yum.repos.d/public-yum-ol7.repo
を編集して、ol7_openstack30
セクションのenabled
を1にする。インストール
# 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有効。
- KubeletConfiguration、KubeProxyConfiguration、KubeSchedulerConfigurationを使用。
- 開発ツール付き
- kube-prompt
- dry
- etc.
Ansibleの変数をいじればある程度違う構成もできる。 複数ノードや、マスターコンポーネントの冗長化や、etcdが別サーバの構成もできそうな感じにはRoleを分けて書いたけど、試してはいない。
kubespray
一通り作った後で、kubesprayというものを知った。 これ使うと、Ansibleでマルチノードのk8sクラスタ作れて、ネットワークプロバイダ切り替えたり、istioとかHelmとかDocker Registryとか簡単にデプロイできたり、AWSやAzureにクラスタ作れたり、すごい。
あ、いや、けどこれOracle Linuxサポートしてないし…