GNU/Linux >> Linux の 問題 >  >> Linux

CentOS(およびその他のLinux)でのKubernetesクラスターのデプロイに関する完全なビギナーズガイド

ここでは説明しないので、ノード、サービス、クラスターなどの基本的なKubernetesの用語に精通していることを願っています。

これは、本番環境に対応したKubernetesクラスターをデプロイする方法を示すステップバイステップのチュートリアルです。

生産準備はできていますか?はい、例ではサンプルドメインを使用しているため、ドメインを所有している場合は、公開されているインフラストラクチャで構成できます。ローカルテストにも使用できます。本当にあなた次第です。

例ではCentOSLinuxを使用しましたが、他のLinuxディストリビューションも使用できるはずです。インストールコマンドを除いて、残りの手順はすべてに適用できるはずです。

1つのマスター/コントロールノードと2つのワーカーノードのこの単純なクラスターを使用します:

チュートリアルは2つの主要な部分に分かれています。

最初の部分は基本的に前提条件であり、次のことを実行してマシンを準備することを扱います。

  • すべてのホストでホスト名を正しく構成します
  • すべてのノードでスワップをオフにします
  • ファイアウォールルールを追加する
  • IPtablesを構成する
  • SELinuxを無効にする

2番目の部分は、実際のKubernetesクラスターのデプロイであり、次の手順で構成されています。

  • Kubernetesリポジトリを設定する
  • kubelet、kubeadm、kubectl、dockerをインストールします
  • kubeletおよびdockerサービスを有効にして開始します
  • bashの完了を有効にする
  • kubeadmを使用してクラスターを作成する
  • ポッドネットワークのセットアップ
  • ワーカーノードに参加する
  • テストポッドを作成してクラスターをテストします

パート1:Kubernetesクラスターデプロイ用のシステムの準備

仮想マシン、ベアメタル、またはLinode、DigitalOcean、Azureなどのクラウドプラットフォームで実行されている3台のサーバーが必要です。

次の詳細で3つのCentOSVMを実行しています:

  • Kubernetesマスターノード-172.42.42.230kmaster-centos7.example.com/kmaster-centos7
  • Kubernetesワーカーノード1-172.42.42.231kworker-centos71.example.com/kworker-centos71
  • Kubernetesワーカーノード2-172.42.42.232kworker-centos72.example.com/kworker-centos72

マシンのIPアドレスを確認し、それに応じて変更してください。

ステップ1.すべてのシステムでホスト名を正しく構成します

ドメインのDNSレコードを変更することで、IPおよび対応するサブドメイン情報を追加できます。

DNSにアクセスできない場合は、マスターノードとワーカーノードの/ etc/hostsファイルを次の情報で更新します。

[[email protected] ~]# cat /etc/hosts
127.0.0.1       kmaster-centos7.example.com     kmaster-centos7
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
172.42.42.230 kmaster-centos7.example.com   kmaster-centos7
172.42.42.231 kworker-centos71.example.com  kworker-centos71
172.42.42.232 kworker-centos72.example.com  kworker-centos72
[[email protected] ~]#

ワーカーノードにpingを実行して、hostfileの変更が正常に機能していることを確認します。

ステップ2.(パフォーマンス上の理由で)スワップをオフにします

Kubernetesスケジューラは、新しく作成されたポッドをデプロイするために利用可能な最適なノードを決定します。ホストシステムでメモリスワッピングの発生が許可されている場合、Kubernetes内でパフォーマンスと安定性の問題が発生する可能性があります。

このため、Kubernetesではすべてのノードでスワップを無効にする必要があります:

swapoff -a
ステップ3.ファイアウォールルールを追加する

ノード、コンテナー、およびポッドは、それらの機能を実行するためにクラスター全体で通信できる必要があります。 CentOSではFirewalldがデフォルトで有効になっているため、必要なポートを開くことをお勧めします。

マスターノードでは、次のポートが必要です。

  • 6443:Kubernetes APIサーバー:すべてのユーザーが使用
  • 2379–2380:etcdサーバークライアントAPI:kube-apiserverなどで使用
  • 10250:Kubelet API:セルフ、コントロールプレーンで使用
  • 10251:kube-scheduler:自分で使用
  • 10252:kube-controller-manager:自己使用

ワーカーノードでは、次のポートが必要です:

  • 10250:Kubelet API:セルフ、コントロールプレーンで使用
  • 30000–32767:NodePortサービス:すべてが使用

Firewall-cmdコマンドは、次の方法でポート6443を開きます。

firewall-cmd --permanent --add-port=6443/tcp

マスターノードとワーカーノードで、上記のコマンドを使用して、このセクションで説明した必要なポートを開きます。

ポートの範囲については、ポート番号をfirewall-cmd --permanent --add-port=2379-2380/tcpのような範囲に置き換えることができます。 。

各マシンに新しいファイアウォールルールを追加したら、ファイアウォールをリロードします。

firewall-cmd --reload
ステップ4.iptablesを構成する

マスターノードとワーカーノードで、br_netfilterが カーネルモジュールがロードされます。これは、lsmod | grep br_netfilter 。明示的にロードするには、sudo modprobe br_netfilterを呼び出します。 。

net.bridge.bridge-nf-call-iptablesを設定します sysctl構成ファイルで「1」に変更します。これにより、フィルタリングおよびポート転送中にパケットがIPテーブルによって適切に処理されるようになります。

[[email protected] ~]# cat <<EOF > /etc/sysctl.d/k8s.conf
> net.bridge.bridge-nf-call-ip6tables = 1
> net.bridge.bridge-nf-call-iptables = 1
> EOF

このコマンドを実行して、変更を有効にします:

sysctl --system

ステップ5.SELinuxを無効にします(Red HatおよびCentOSの場合)

基盤となるコンテナは、ホストファイルシステムにアクセスするために必要になります。 CentOSには、強制モードで有効になっているSELinux(セキュリティ強化Linux)が付属しています。これにより、ホストファイルシステムへのアクセスがブロックされる可能性があります。

SELinuxを無効にするか、許可モードに設定して、セキュリティ機能を効果的に無効にすることができます。

[[email protected] ~]# setenforce 0
[[email protected] ~]# sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
[[email protected] ~]#

パート2:Kubernetesクラスターのデプロイ

マスターノードとワーカーノードで正しい設定を構成したので、クラスターの展開を開始します。

ステップ1.Kubernetesリポジトリを設定する

Kubernetesパッケージは、CentOS7の公式リポジトリからは入手できません。この手順は、マスターノードと各ワーカーノードで実行する必要があります。

次のように入力し、コンテンツが追加されたら確認します。

[[email protected] ~]# cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF

Kubernetesリポジトリがリポジトリリストに追加されていることを更新して確認します:

[[email protected] ~]# yum update -y
[[email protected] ~]# yum repolist | grep -i kubernetes
!kubernetes                         Kubernetes                               570
ステップ2.kubelet、kubeadm、kubectl、Dockerをインストールします

Kubernetesを使用するには、kubelet、kubeadm、kubectlの3つの基本パッケージとコンテナランタイム(ここではdocker)が必要です。

次のパッケージを各ノードにインストールします:

yum install -y kubelet kubeadm kubectl docker
ステップ3.kubeletおよびdockerサービスを有効にして開始します

必要なパッケージをインストールしたので、各ノードでkubeletとdockerを有効にします(起動するたびに自動的に起動するようにします)。

各ノードでkubeletを有効にします:

[[email protected] ~]# systemctl enable kubelet
Created symlink from /etc/systemd/system/multi-user.target.wants/kubelet.service to /usr/lib/systemd/system/kubelet.service.

各ノードでDockerを有効にします:

[[email protected] ~]# systemctl enable docker.service
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.

また、すぐに使用できるように、これらのサービスを開始する必要があります。


[[email protected] ~]# systemctl start kubelet
[[email protected] ~]# systemctl start docker.service

ステップ4.bashの完了を有効にします(Kubernetesでの生活を楽にするため)

すべてのノードでbash補完を有効にして、すべてのコマンドを手動で完全に入力する必要がないようにします。タブがあなたに代わってそれを行います。

[[email protected] ~]# echo "source <(kubectl completion bash)" >> ~/.bashrc
[[email protected] ~]# echo "source <(kubeadm completion bash)" >> ~/.bashrc
[[email protected] ~]# echo "source <(docker completion bash)" >> ~/.bashrc
ステップ5.kubeadmを使用してクラスターを作成します

次のコマンドを実行して、クラスターを初期化します。

kubeadm init --apiserver-advertise-address=172.42.42.230 --pod-network-cidr=10.244.0.0/16

注: -apiserver-advertise-addressを設定することは常に良いことです 特に、kubeadmを使用してKubernetesクラスターを起動しているとき。 APIサーバーがリッスンしていることをアドバタイズするIPアドレス。設定されていない場合、デフォルトのネットワークインターフェースが使用されます。

-pod-network-cidrと同じです。 ポッドネットワークのIPアドレスの範囲を指定します。設定されている場合、コントロールプレーンはすべてのノードにCIDRを自動的に割り当てます。

その他のオプションについては、このリンクを参照してください。

kube-initコマンドの出力の最後に、クラスターを実行する手順が表示されます。

...
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/
  
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 172.42.42.230:6443 --token 22m8k4.kajx812tg74199x3 \
    --discovery-token-ca-cert-hash sha256:03baa45e2b2bb74afddc5241da8e84d16856f57b151e450bc9d52e6b35ad8d22
```

**Manage cluster as regular user:
**In the above kube-init command output you can clearly see that to start using your cluster, you need to run the following commands as a regular user:

```bash
[[email protected] ~]# mkdir -p $HOME/.kube
[[email protected] ~]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[[email protected] ~]# chown $(id -u):$(id -g) $HOME/.kube/config
[[email protected] ~]#

これらのコマンドを1つずつ実行して、Kubernetesクラスターを起動する必要があります。

[[email protected] ~]# mkdir -p $HOME/.kube
[[email protected] ~]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[[email protected] ~]# chown $(id -u):$(id -g) $HOME/.kube/config
ステップ6.ポッドネットワークをセットアップする

ポッドネットワークは、ワーカーノード間のオーバーレイネットワークです。ポッドネットワークでは、異なるノード上のコンテナが相互に通信します。

利用可能なKubernetesネットワーキングオプションがいくつかあります。次のコマンドを使用して、フランネルポッドネットワークアドオンをインストールします。

[[email protected] ~]# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
podsecuritypolicy.policy/psp.flannel.unprivileged created
Warning: rbac.authorization.k8s.io/v1beta1 ClusterRole is deprecated in v1.17+, unavailable in v1.22+; use rbac.authorization.k8s.io/v1 ClusterRole
clusterrole.rbac.authorization.k8s.io/flannel created
Warning: rbac.authorization.k8s.io/v1beta1 ClusterRoleBinding is deprecated in v1.17+, unavailable in v1.22+; use rbac.authorization.k8s.io/v1 ClusterRoleBinding
clusterrolebinding.rbac.authorization.k8s.io/flannel created
serviceaccount/flannel created
configmap/kube-flannel-cfg created
daemonset.apps/kube-flannel-ds created
[[email protected] ~]#

クラスタのステータスを確認し、マスター(コントロールプレーン)ノードが準備完了状態にあることを確認します。

[[email protected] ~]# kubectl get nodes
NAME                          STATUS   ROLES    AGE   VERSION
kmaster-centos7.example.com   Ready    master   2m    v1.19.2

また、すべての名前空間で実行されているすべてのポッドを確認してください。

kubectl get pods --all-namespaces
ステップ7.ワーカーノードをクラスターに参加させます

手順5で得た出力を参照し、推奨されるコマンドをコピーします。各ワーカーノードで実行して、クラスターに接続します。

kubeadm join 172.42.42.230:6443 --token 22m8k4.kajx812tg74199x3 \
>     --discovery-token-ca-cert-hash sha256:03baa45e2b2bb74afddc5241da8e84d16856f57b151e450bc9d52e6b35ad8d22

クラスターのステータスをもう一度チェックして、すべてのワーカーノードがクラスターに正常に参加し、ワークロードを処理する準備ができていることを確認します。

[[email protected] ~]# kubectl get nodes -o wide
NAME                           STATUS   ROLES    AGE     VERSION   INTERNAL-IP     EXTERNAL-IP   OS-IMAGE                KERNEL-VERSION                CONTAINER-RUNTIME
kmaster-centos7.example.com    Ready    master   9m17s   v1.19.2   172.42.42.230   <none>        CentOS Linux 7 (Core)   3.10.0-1127.19.1.el7.x86_64   docker://1.13.1
kworker-centos71.example.com   Ready    <none>   7m10s   v1.19.2   172.42.42.231   <none>        CentOS Linux 7 (Core)   3.10.0-1127.19.1.el7.x86_64   docker://1.13.1
kworker-centos72.example.com   Ready    <none>   7m8s    v1.19.2   172.42.42.232   <none>        CentOS Linux 7 (Core)   3.10.0-1127.19.1.el7.x86_64   docker://1.13.1

すべての名前空間で実行されているすべてのポッドを確認します:

kubectl get pods -o wide --all-namespaces
ステップ8.テストポッドを作成してクラスターをテストします

すべてが整ったので、次はクラスターをテストします。ポッドを作成する:

[[email protected] ~]# kubectl run mypod1 --image=httpd --namespace=default --port=80 --labels app=fronend
pod/mypod1 created

次に、ポッドのステータスを確認します:

[[email protected] ~]# kubectl get pods  -o wide
NAME     READY   STATUS    RESTARTS   AGE   IP           NODE                           NOMINATED NODE   READINESS GATES
mypod1   1/1     Running   0          29s   10.244.1.2   kworker-centos71.example.com   <none>           <none>
[[email protected] ~]#

これで、CentOS上で完全に機能するKubernetesクラスターが稼働します!

チュートリアルが気に入っていただければ幸いです。ご質問やご提案がございましたら、コメントを残していただければ幸いです。

また、Linuxハンドブックのメンバーになって、メンバー限定のコンテンツをお楽しみください。


Linux
  1. Linuxパーミッションのビギナーズガイド

  2. Linuxでのfirewalldの初心者向けガイド

  3. LinuxでのLVMの完全な初心者向けガイド

  1. Ubuntuおよびその他のLinuxディストリビューションでスナップパッケージを使用するための完全ガイド

  2. Kubernetesとは何ですか?完全ガイド

  3. Manjaro 17.05(GNOME Edition)の完全ガイド、その機能とインストール手順

  1. Linuxで検索および検索コマンドを使用する方法:初心者向けガイド

  2. Linuxコマンド-完全ガイド

  3. ChromebookにLinuxをインストールするための完全ガイド