Ubuntu 16.04でゼロからKubernetesで完全なクラスターを起動する

Kubernetesのインストールと実行に関する記事はすでにかなり多く書かれていますが、すべてがスムーズではありません(クラスターの起動に数日かかりました)。



この記事は、k8sのインストールに関する包括的な情報を提供するだけでなく、各ステップを説明することも目的としています:書かれているとおりに行う理由と理由(これは起動を成功させるために非常に重要です)。



知っておくべきこと



サーバー:

クラスターは、リソースが分散される複数の物理サーバーがあることを意味します。 サーバーはノードと呼ばれます。



ディスク:

k8の通常のハードはサポートされていません。 ディスクの操作は、分散ファイルストレージ機能を使用して行われます。 これは、k8sがデータ(ファイル)を失うことなく、必要に応じてドッカーコンテナーを他のノードに「移動」できるようにするために必要です。



クラスターの作成を開始するには、独自の分散ファイルストレージを作成する必要があります。 ディスクが不要になることが確実な場合は、この手順をスキップできます。

私はCephを選びました 。 この素晴らしい記事を読むこともお勧めします



Cephのサーバーの合理的な最小数は3です(1つで構築できますが、データを失う可能性が高いため、これはほとんど意味がありません)。



ネットワーク:

フランネルが必要です。これにより、ソフトウェア定義ネットワーク(Software Defined Network、SDN)を編成できます。 すべてのコンテナがクラスタ内で相互に通信できるようにするのはSDNです(フランネルのインストールはk8と一緒に実行され、以下で説明します)。



サーバーの準備



この例では、3台の物理サーバーを使用します。 すべてのサーバーにUbuntu 16.04をインストールします。 スワップパーティションを作成しないでください(k8s要件)。



各サーバーのCephに少なくとも1つのディスク(またはパーティション)を提供します。



SELinuxサポートを有効にしないでください(Ubuntu 16.04では、デフォルトでオフになっています)。



サーバーの名前は、kub01 kub02 kub03のようにしました。 各サーバーのsda2パーティションはCeph用に作成されます(フォーマットはオプションです)。



Cephのインストールと構成



Cephのインストール簡単に説明します。 オンラインには多くの例があり、 Cephサイト自体にはかなり優れたドキュメントがあります。



すべての操作は、特権rootユーザーの下で実行されます。



一時ディレクトリを作成します。



mkdir ~/ceph-admin cd ~/ceph-admin
      
      





Cephをインストールします。



 apt install ceph-deploy ceph-common
      
      





キーを作成し、すべてのサーバーで分解する必要があります。 これはceph-deployユーティリティに必要です。



 ssh-keygen ssh-copy-id kub01 ssh-copy-id kub02 ssh-copy-id kub03
      
      







(rootとしてログインできるようにssh構成を修正する必要がある場合があります)。



/ ub / 01にkub01が127.0.0.1として登録されていないことを確認します(登録されている場合は、この行を削除します)。



ディスククラスターを作成し、初期化します。



 ceph-deploy new kub01 kub02 kub03 ceph-deploy install kub01 kub02 kub03 ceph-deploy mon create-initial ceph-deploy osd prepare kub01:sda2 kub02:sda2 kub03:sda2 ceph-deploy osd activate kub01:sda2 kub02:sda2 kub03:sda2
      
      





ディスククラスターの確認:



 ceph -s cluster 363a4cd8-4cb3-4955-96b2-73da72b63cf5 health HEALTH_OK
      
      





次の便利なコマンドを採用できます。



 ceph -s ceph df ceph osd tree
      
      





Cephが機能していることを確認したので、k8s用に別のプールを作成します。



 ceph osd pool create kube 100 100
      
      





(コマンド:ceph dfを使用すると、既存のすべてのプールを表示できます)



ここで、 kubeプール用に別のユーザーを作成し、キーを保存します。



 ceph auth get-or-create client.kube mon 'allow r' osd 'allow rwx pool=kube' ceph auth get-key client.admin > /etc/ceph/client.admin ceph auth get-key client.kube > /etc/ceph/client.kube
      
      





(k8sにリポジトリにアクセスするにはキーが必要です)



Kubernetesをインストールする



システムにk8sリポジトリを追加します。



 curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add - cat <<EOF >/etc/apt/sources.list.d/kubernetes.list deb http://apt.kubernetes.io/ kubernetes-xenial main EOF
      
      





次に、メインパッケージをインストールします。



 apt update apt install -y docker.io kubelet kubeadm kubernetes-cni
      
      





k8sを初期化して実行する



 kubeadm init --pod-network-cidr=10.244.0.0/16
      
      





(このようなネットワーク10.244.0.0/16は、フランネルが機能するために必要です-変更しないでください)



スクリプトによって出力されたコマンドを保存して、ノードをクラスターに参加させます。



別の非特権ユーザーを使用してk8sを操作すると便利です。 それを作成し、k8s構成ファイルをそこにコピーします。



 useradd -s /bin/bash -m kube mkdir ~kube/.kube cp /etc/kubernetes/admin.conf ~kube/.kube/config chown kube: ~kube/.kube/config
      
      





k8sを使用するには、ユーティリティkubectlが使用されます。 ユーザーkubeの下からのみ使用します。 ユーザーの下に移動するには:



 su - kube
      
      





ウィザードでコンテナーの起動を許可します。



 kubectl taint nodes --all node-role.kubernetes.io/master-
      
      





権限を構成します。



 kubectl create clusterrolebinding add-on-cluster-admin --clusterrole=cluster-admin --serviceaccount=kube-system:default
      
      





flannel(ネットワークサブシステム)をインストールします。



 kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
      
      





すべてが機能することを確認する方法
コマンドを実行します:



 kubectl -n kube-system get pods
      
      





出力は次のようになります。



 NAME READY STATUS RESTARTS AGE etcd-kub01.domain.com 1/1 Running 1 4d kube-apiserver-kub01.domain.com 1/1 Running 1 4d kube-controller-manager-kub01.domain.com 1/1 Running 0 4d kube-dns-7c6d8859cb-dmqrn 3/3 Running 0 1d kube-flannel-ds-j948h 1/1 Running 0 1d kube-proxy-rmbqq 1/1 Running 0 1d kube-scheduler-kub01.domain.com 1/1 Running 1 4d
      
      







Webインターフェイスをインストールして構成する



 kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml
      
      





Webインターフェースにアクセスするユーザーを作成します。

 cat << EOF > account.yaml apiVersion: v1 kind: ServiceAccount metadata: name: admin-user namespace: kube-system --- apiVersion: rbac.authorization.k8s.io/v1beta1 kind: ClusterRoleBinding metadata: name: admin-user roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: - kind: ServiceAccount name: admin-user namespace: kube-system EOF kubectl -n kube-system create -f account.yaml
      
      





kube-proxyを実行すると、次のように実行できます。



 kubectl proxy &
      
      





そして、作業マシンからポート8001をkub01サーバーに転送します。



 ssh -L 8001:127.0.0.1:8001 -N kub01 &
      
      





これで、次の作業マシンからWebインターフェースに入ることができます。



http://127.0.0.1:8001/ui

(トークンを指定する必要がある場所でWebインターフェイスが開きます)



次のように、Webインターフェースにアクセスするためのトークンを取得できます。



 kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')
      
      





KubernetesとCephをカスタマイズする



現在のコントローラーkube-controller-manager-amd64:v1.9.2にはCephを操作するために必要なrbdバイナリないため、独自のkube -controller-manager-managerを作成します。



RBDとは何ですか、なぜ必要なのですか、なぜ欠落しているのですか?
RBD (Rados Block Device)は、k8sがDockerコンテナーのパーティションを作成およびマウントするために使用するブロックデバイスです。 この場合、これはパッケージに含まれるバイナリceph-commonです。



k8sは、使用しているオペレーティングシステムのディストリビューションに依存するため、明らかにこのパッケージをコントローラーに含めません。 したがって、コントローラーを組み立てるときは、RBDを最新の状態に保つためにディストリビューションを指定してください。



kube-controller-managerを作成するには、次の手順を実行します。

(すべてのコマンドはルートとして実行されます)



 mkdir docker cat << EOF > docker/Dockerfile FROM ubuntu:16.04 ARG KUBERNETES_VERSION=v1.9.2 ENV DEBIAN_FRONTEND=noninteractive \ container=docker \ KUBERNETES_DOWNLOAD_ROOT=https://storage.googleapis.com/kubernetes-release/release/${KUBERNETES_VERSION}/bin/linux/amd64 \ KUBERNETES_COMPONENT=kube-controller-manager RUN set -x \ && apt-get update \ && apt-get install -y \ ceph-common \ curl \ && curl -L ${KUBERNETES_DOWNLOAD_ROOT}/${KUBERNETES_COMPONENT} -o /usr/bin/${KUBERNETES_COMPONENT} \ && chmod +x /usr/bin/${KUBERNETES_COMPONENT} \ && apt-get purge -y --auto-remove \ curl \ && rm -rf /var/lib/apt/lists/* EOF docker build -t "my-kube-controller-manager:v1.9.2" docker/
      
      





(k8sの現在のバージョンとOSディストリビューションを必ず指定してください)



コントローラーが正常に作成されたことを確認します。



 docker images | grep my-kube-controller-manager
      
      





イメージにrbdがあることを確認します。



 docker run my-kube-controller-manager:v1.9.2 whereis rbd
      
      





次のように表示されます:rbd:/ usr / bin / rbd /usr/share/man/man8/rbd.8.gz



標準コントローラを私たちのものに置き換えます。このため、ファイルを編集します。

/etc/kubernetes/manifests/kube-controller-manager.yaml



次の行を置き換えます。

画像:gcr.io/google_containers/kube-controller-manager-amd64:v1.9.2

に:

画像:my-kube-controller-manager:v1.9.2

imagePullPolicy:IfNotPresent

(k8sがインターネットからこのイメージをダウンロードしようとしないように 、必ずimagePullPolicyディレクティブを追加してください)



ユーザーkubeの下を通り、コントローラーが起動するまで待ちます(何もする必要はありません)。



 kubectl -n kube-system describe pods | grep kube-controller
      
      





画像が使用されていることを確認してください。

画像:my-kube-controller-manager:v1.9.2



RBD対応コントローラーが開始されたので、k8sとCephのバンドルの構成を開始できます。



多数のディスクサブシステムの構成(k8s + Ceph)



キーをk8sに追加してCephにアクセスします。



 kubectl create secret generic ceph-secret --type="kubernetes.io/rbd" --from-file=/etc/ceph/client.admin --namespace=kube-system kubectl create secret generic ceph-secret-kube --type="kubernetes.io/rbd" --from-file=/etc/ceph/client.kube --namespace=default
      
      





StorageClassを作成します(デフォルト):



 cat << EOF > ceph_storage.yaml apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: ceph-rbd annotations: {"storageclass.kubernetes.io/is-default-class":"true"} provisioner: kubernetes.io/rbd parameters: monitors: kub01:6789,kub02:6789,kub03:6789 pool: kube adminId: admin adminSecretName: ceph-secret adminSecretNamespace: "kube-system" userId: kube userSecretName: ceph-secret-kube fsType: ext4 imageFormat: "2" imageFeatures: "layering" EOF kubectl create -f ceph_storage.yaml
      
      





ディスクサブシステムの動作を確認する方法は?
StorageClassの存在の確認:



 kube@kub01:~$ kubectl get storageclass NAME PROVISIONER AGE ceph-rbd (default) kubernetes.io/rbd 4d
      
      





ディスクを使用してテストポッドを作成します。



 cat << EOF > test_pod.yaml apiVersion: v1 kind: PersistentVolumeClaim metadata: name: claim1 spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi --- apiVersion: v1 kind: Pod metadata: name: test-pod-with-pvc spec: volumes: - name: test-pvc-storage persistentVolumeClaim: claimName: claim1 containers: - name: test-container image: kubernetes/pause volumeMounts: - name: test-pvc-storage mountPath: /var/lib/www/html EOF kubectl create -f test_pod.yaml
      
      





ポッドが作成されていることを確認します(作成と起動を待つ必要があります):



 kube@kub01:~$ kubectl get pods NAME READY STATUS RESTARTS AGE test-pod-with-pvc 1/1 Running 0 15m
      
      





クレームが作成されたことを確認します(ドライブのリクエスト):



 kube@kub01:~$ kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE claim1 Bound pvc-076df6ee-0ce9-11e8-8b93-901b0e8fc39b 1Gi RWO ceph-rbd 12m
      
      





ディスク自体が作成されたことを確認します。



 kube@kub01:~$ kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE pvc-076df6ee-0ce9-11e8-8b93-901b0e8fc39b 1Gi RWO Delete Bound default/claim1 ceph-rbd
      
      





最後に、ディスクがシステムにマウントされていることを確認します。



 root@kub01:~$ mount | grep pvc-076df6ee-0ce9-11e8-8b93-901b0e8fc39b /dev/rbd0 on /var/lib/kubelet/pods/076fff13-0ce9-11e8-8b93-901b0e8fc39b/volumes/kubernetes.io~rbd/pvc-076df6ee-0ce9-11e8-8b93-901b0e8fc39b type ext4 (rw,relatime,stripe=1024,data=ordered)
      
      







新しい(追加の)ノードをk8sクラスターに追加する



新しいサーバーで、次のコマンドを実行します。



 curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add - cat <<EOF >/etc/apt/sources.list.d/kubernetes.list deb http://apt.kubernetes.io/ kubernetes-xenial main EOF apt update apt install -y docker.io kubelet kubeadm kubernetes-cni ceph-common python
      
      





ノードをマスターに接続します。

キーが必要です。 次のコマンドを実行して、ウィザードで取得できます。



 kubeadm token list
      
      





または、作成します:

 kubeadm token create --print-join-command
      
      







参加するコマンドの例(新しいノードで実行):



 kubeadm join --token cb9141.6a912d1dd7f66ff5 8.8.8.8:6443 --discovery-token-ca-cert-hash sha256:f0ec6d8f9699169089c89112e0e6b5905b4e1b42db22815186240777970dc6fd
      
      





Helmをインストールして構成する



k8sにアプリケーションをすばやく簡単にインストールするために、Helmが発明されました。



利用可能なアプリケーションのリストはここにあります



Helmのインストールと初期化:



 curl https://storage.googleapis.com/kubernetes-helm/helm-v2.8.0-linux-amd64.tar.gz | tar -xz ./linux-amd64/helm init
      
      





PS:この記事を書くのに6時間かかりました。 どこかにタイプミスがあるかどうかを厳密に判断しないでください。 質問をしてください。私は喜んで答えて助けます。



All Articles