Kubesprayを使用してHAマスターKubernetesクラスターをインストールする





Kubespray (以前のKargo)は、Kubernetesコンテナーオーケストレーションシステムをインストールおよび構成するためのAnsibleロールのセットです。 この場合、AWS、GCE、Azure、OpenStack、または通常の仮想マシンがIaaSとして機能できます。 このプロジェクトはかつてKargoと呼ばれていました。 これはオープンソースプロジェクトであり、オープンな開発モデルであるため、誰でも自由にライフサイクルに影響を与えることができます。



Habréでは、彼らはすでにKubeadmを使用したKubernetesのインストールについて書いていますが、この方法には重大な欠点があります。マルチマスター構成はまだサポートされておらず、時にはあまり柔軟性がありません。 Kubesprayは、Kubeadmを内部で使用しますが、インストール段階でウィザードとetcdの両方に対してすでに高可用性機能を備えています。 https://github.com/kubernetes-incubator/kubespray/blob/master/docs/comparisons.mdで、他の関連するKubernetesインストール方法との比較について読むことができます



この記事では、Ubuntu 16.04 OS上に5つのサーバーを作成します。 私の場合、リストは次のようになります。



192.168.20.10 k8s-m1.me 192.168.20.11 k8s-m2.me 192.168.20.12 k8s-m3.me 192.168.20.13 k8s-s1.me 192.168.20.14 k8s-s2.me
      
      





これらを、ローカルシステムを含むこれらすべてのサーバーの/ etc / hosts 、またはdnsサーバーに追加します。 これらのホストのファイアウォールおよびその他のネットワーク制限を無効にする必要があります。 さらに、 IPv4転送を有効にする必要があり、各ホストは、Dockerイメージをダウンロードするためにインターネットに自由にアクセスできる必要があります。



リストから各サーバーに公開rsa-keyをコピーします。



 $ ssh-copy-id ubuntu@server.me
      
      





ローカルマシンから接続するために必要なユーザーとキーを指定します。



 $ vim ~/.ssh/config ... Host *.me User ubuntu ServerAliveInterval 60 IdentityFile ~/.ssh/id_rsa
      
      





ここで、 ubuntuは、サーバーへの接続が行われるユーザーに代わって、 id_rsaは秘密キーです。 さらに、このユーザーには、 パスワードなしでsudoコマンドを実行する機能が必要です



Kubesprayリポジトリのクローンを作成します。



 $ git clone https://github.com/kubernetes-incubator/kubespray.git
      
      





インベントリディレクトリをコピーして、その内容を編集した後:



 $ cp -r inventory my_inventory $ cd my_inventory
      
      





例として、 inventory.exampleを使用します。



 $ mv inventory.example inventory
      
      





 $ vim inventory k8s-m1.me ip=192.168.20.10 k8s-m2.me ip=192.168.20.11 k8s-m3.me ip=192.168.20.12 k8s-s1.me ip=192.168.20.13 k8s-s2.me ip=192.168.20.14 [kube-master] k8s-m1.me k8s-m2.me k8s-m3.me [etcd] k8s-m1.me k8s-m2.me k8s-m3.me [kube-node] k8s-s1.me k8s-s2.me [k8s-cluster:children] kube-node kube-master
      
      





上記に基づいて、KubernetesのHAインストールをインストールします。etcd、クラスター構成パラメーターリポジトリは、クォーラムの存在のための3つのノード、およびKubernetesマスターサービス(kube-apiserver、controller-manager、schedulerなど)で構成されます。 3回複製されます。 もちろん、etcdサービスを完全に分離することを妨げるものはありません。



この段階で、ウィザードのHAモードの実装方法についてもう少しお話ししたいと思います。 すべてのKubernetesワーカー(この場合はk8s-s * .me)で、Nginxはバランシングモードでインストールされ、その上流ですべてのKubernetesウィザードについて説明します。



 stream { upstream kube_apiserver { least_conn; server kube-master_ip1:6443; server kube-master_ip2:6443; server kube-master_ip3:6443; } server { listen 127.0.0.1:6443; proxy_pass kube_apiserver; proxy_timeout 10m; proxy_connect_timeout 1s; }
      
      





したがって、マスターの1つがクラッシュした場合、Nginxはアップストリームからマスターを除外し、そのようなサーバーへのリクエストの送信を停止します。







このようなスキームにより、単一障害点を排除できます。ウィザードがクラッシュした場合、別のウィザードがジョブを引き継ぎ、リクエストを転送するNginxが各ワーカーで機能します。



クラスターのインストールの段階で、この内部バランサーを無効にして、すでにすべてを自分で処理することができます。 たとえば、サードパーティのNginxやHAProxyなどがあります。 ただし、高可用性を確保するために、必要に応じて仮想IPのメンバー間でペアを移行する必要があることを忘れないでください。 VIPは、Keepalived、Heartbeat、Pacemakerなどのさまざまなテクノロジーを使用して実装できます。



ウィザードでは、kube-apiserverは2つのポートで同時に動作します。暗号化なしのローカル8080(同じサーバーで実行されるサービス用)と外部HTTPS6443。後者は、前述したように、ワーカーとの通信に使用され、サービスが単一の場合に役立ちますマスター(kubelet、kube-proxyなど)は他のホストに移動する必要があります。



テストクラスターの作成に引き続き取り組みます。 group_vars / all.ymlを編集します



 $ vim group_vars/all.yml ... bootstrap_os: ubuntu ... kubelet_load_modules: true
      
      





Ubuntu 16.04に加えて、Kubesprayは、CoreOS、Debian Jessie、CentOS / RHEL 7を備えたノード、つまり、すべての主要な現在のディストリビューションへのインストールもサポートしています。



必要に応じて、 group_vars / k8s-cluster.ymlも調べて、インストールするKubernetesの必要なバージョンを指定し、オーバーレイネットワークのプラグインを選択します(デフォルトではcalicoですが、 他のオプションも利用可能です)、efkをインストールします(elasticsearch / fluentd / kibana)、helm、istio、netcheckerなど。



また、 roles / kubernetes / preinstall / tasks / verify-settings.ymlを確認することをお勧めします 。 Kubernetesのインストールを開始する前に実行される基本的なチェックは次のとおりです。 たとえば、十分な量のRAMの可用性(現時点では、マスターの場合は1500MB以上 、ノードの場合は1000MB 以上 )、etcdサーバーの数(クォーラムを確保するには奇数個でなければなりません)などを確認します。 Kubesprayの最近のリリースでは、スワップの追加要件が登場しました。クラスターのすべてのノードでスワップをオフにする必要があります。



ローカルシステムにAnsibleがまだない場合は、netaddrモジュールでインストールします。



 # pip install ansible # pip install netaddr
      
      





netaddrモジュールとansibleは同じバージョンのPythonで動作する必要があることに注意することが重要です。



その後、Kubernetesクラスターのインストールを続行できます。



 $ ansible-playbook -i my_inventory/inventory cluster.yml -b -v
      
      





あるいは、接続用のrsa-keyとユーザーを引数で渡すことができます。例:



 $ ansible-playbook -u ubuntu -i my_inventory/inventory cluster.yml -b -v --private-key=~/.ssh/id_rsa
      
      





通常、クラスターのインストールには約15〜20分かかりますが、ハードウェアにも依存します。 その後、すべてが正常に機能するかどうかを確認できます。そのためには、クラスター内の任意のホストに接続し、以下を実行する必要があります。



 root@k8s-m1:~# kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-m1 Ready master 28m v1.8.4+coreos.0 k8s-m2 Ready master 28m v1.8.4+coreos.0 k8s-m3 Ready master 28m v1.8.4+coreos.0 k8s-s1 Ready node 28m v1.8.4+coreos.0 k8s-s2 Ready node 28m v1.8.4+coreos.0
      
      





 root@k8s-m1:~# kubectl get pods --all-namespaces NAMESPACE NAME READY STATUS RESTARTS AGE kube-system calico-node-2z6jz 1/1 Running 0 27m kube-system calico-node-6d6q6 1/1 Running 0 27m kube-system calico-node-96rgg 1/1 Running 0 27m kube-system calico-node-nld9z 1/1 Running 0 27m kube-system calico-node-pjcjs 1/1 Running 0 27m kube-system kube-apiserver-k8s-m1 1/1 Running 0 27m ... kube-system kube-proxy-k8s-s1 1/1 Running 0 26m kube-system kube-proxy-k8s-s2 1/1 Running 0 27m kube-system kube-scheduler-k8s-m1 1/1 Running 0 28m kube-system kube-scheduler-k8s-m2 1/1 Running 0 28m kube-system kube-scheduler-k8s-m3 1/1 Running 0 28m kube-system kubedns-autoscaler-86c47697df-4p7b8 1/1 Running 0 26m kube-system kubernetes-dashboard-85d88b455f-f5dm4 1/1 Running 0 26m kube-system nginx-proxy-k8s-s1 1/1 Running 0 28m kube-system nginx-proxy-k8s-s2 1/1 Running 0 28m
      
      





ご覧のとおり、デフォルトでは、kubernetes-dashboard Webパネルがすぐにインストールされました。 彼女の作品に関する詳細は、次のリンクで見つけることができますhttps://github.com/kubernetes/dashboard



基本的なテスト専用に、2つのコンテナを注ぎます。



 $ vim first-pod.yaml apiVersion: v1 kind: Pod metadata: name: first-pod spec: containers: - name: sise image: mhausenblas/simpleservice:0.5.0 ports: - containerPort: 9876 resources: limits: memory: "64Mi" cpu: "500m" - name: shell image: centos:7 command: - "bin/bash" - "-c" - "sleep 10000"
      
      





 $ kubectl apply -f first-pod.yaml pod "first-pod" created
      
      





 $ kubectl get pods NAME READY STATUS RESTARTS AGE first-pod 2/2 Running 0 16s
      
      





 $ kubectl exec first-pod -c sise -i -t -- bash [root@first-pod /]# curl localhost:9876/info {"host": "localhost:9876", "version": "0.5.0", "from": "127.0.0.1"}
      
      





リソースhttp://kubernetesbyexample.com/からのPythonのテストアプリケーションでした。



奇妙なことに、Docker 17.03.1-ceがコンテナ化システムとしてインストールされましたが、公式ドキュメントではバージョン1.13を使用するのが最適であると述べています。 インストールされるDockerのバージョンはroles / docker / defaults / main.ymlに記述されており、理論的には上記の設定ファイルで上書きするか、引数で値を渡すことができます。



Ansible Kubesprayスクリプトは、クラスターノードのスケーリングもサポートしています。 これを行うには、新しいノード(ワーカー)を追加するインベントリを更新します。



 $ vim my_inventory/inventory k8s-m1.me ip=192.168.20.10 k8s-m2.me ip=192.168.20.11 k8s-m3.me ip=192.168.20.12 k8s-s1.me ip=192.168.20.13 k8s-s2.me ip=192.168.20.14 k8s-s3.me ip=192.168.20.15 [kube-master] k8s-m1.me k8s-m2.me k8s-m3.me [etcd] k8s-m1.me k8s-m2.me k8s-m3.me [kube-node] k8s-s1.me k8s-s2.me k8s-s3.me [k8s-cluster:children] kube-node kube-master
      
      





もちろん、以前のノードと同様に、 k8s-s3.meノードもそれに応じて構成する必要があります。 これでクラスターのスケーリングを実行できます。



 $ ansible-playbook -i my_inventory/inventory scale.yml -b -v
      
      





Kubesprayのドキュメントによれば、これにはcluster.ymlを使用した予備手順を使用できますが、scale.ymlを使用すると時間がかかりません。 その結果、kubectlで新しいノードを確認できるようになりました。



 $ kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-m1 Ready master 6h v1.8.4+coreos.0 k8s-m2 Ready master 6h v1.8.4+coreos.0 k8s-m3 Ready master 6h v1.8.4+coreos.0 k8s-s1 Ready node 6h v1.8.4+coreos.0 k8s-s2 Ready node 6h v1.8.4+coreos.0 k8s-s3 Ready node 19m v1.8.4+coreos.0
      
      





以上です。 この記事はウクライナ語のhttp://blog.ipeacocks.info/2017/12/kubernetes-part-iv-setup-ha-cluster.htmlでも読むことができます。



PS。 すべてのエラーについては、すぐにプライベートで記述するほうがよいでしょう。すぐに修正します。



参照資料
kubespray.io

github.com/kubernetes-incubator/kubespray

github.com/kubernetes-incubator/kubespray/blob/master/docs/getting-started.md

github.com/kubernetes-incubator/kubespray/blob/master/docs/ansible.md

github.com/kubernetes-incubator/kubespray/blob/master/docs/ha-mode.md

dickingwithdocker.com/2017/08/deploying-kubernetes-vms-kubespray

medium.com/@olegsmetanin/how-to-setup-baremetal-kubernetes-cluster-with-kubespray-and-deploy-ingress-controller-with-170cdb5ac50d



All Articles