ここでは説明しないので、ノード、サービス、クラスターなどの基本的な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アドレスを確認し、それに応じて変更してください。
ドメインの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
ノード、コンテナー、およびポッドは、それらの機能を実行するためにクラスター全体で通信できる必要があります。 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
マスターノードとワーカーノードで、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クラスターのデプロイ
マスターノードとワーカーノードで正しい設定を構成したので、クラスターの展開を開始します。
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
Kubernetesを使用するには、kubelet、kubeadm、kubectlの3つの基本パッケージとコンテナランタイム(ここではdocker)が必要です。
次のパッケージを各ノードにインストールします:
yum install -y kubelet kubeadm kubectl 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
次のコマンドを実行して、クラスターを初期化します。
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
ポッドネットワークは、ワーカーノード間のオーバーレイネットワークです。ポッドネットワークでは、異なるノード上のコンテナが相互に通信します。
利用可能な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
手順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
すべてが整ったので、次はクラスターをテストします。ポッドを作成する:
[[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ハンドブックのメンバーになって、メンバー限定のコンテンツをお楽しみください。