記事ディレクトリ
- k8s シングルマスターアーキテクチャのインストールと展開
-
- 環境整備
- 環境宣言
- クラスタアーキテクチャ
- インストール手順
-
- 1. k8s クラスターの実験環境を初期化してインストールします (3 台の k8 を動作させる必要があります。便宜上、1 台の動作のみを記録しました)
-
- 1. クラスタ アーキテクチャに従ってホスト IP とホスト名を構成します。
- 2. すべてのノードでファイアウォールと selinux をオフにします。
- 3. /etc/hosts ファイルを変更し、ホスト名を使用して相互にアクセスします。
- 4. すべてのノードが相互に秘密のないチャネルを確立します
- 5. パフォーマンスを向上させるためにスワップ パーティションをオフにする
- スワップパーティションを完全に閉じる
- 6. マシンのカーネルパラメータを変更する
- 7. Alibaba Cloud のリポジトリソースを構成する
- 8. クラスターに必要なすべての依存関係パッケージをインストールします。
- 9. k8s コンポーネントのインストールに必要な Alibaba Cloud リポジトリ ソースを構成します
- 10. 時刻同期の設定
- 2. docker サービスをインストールします (3 つの k8s ホストすべてで動作します)。
- 3. k8s の初期化に必要なソフトウェア パッケージをインストールします (3 つの k8s ホストすべてで動作します)。
- 4. オフライン イメージ パッケージをインポートして、後続のイメージの取得を高速化します
- 5. Kubeadm は k8s クラスターを初期化します (マスター上でのみ実行されます)。
- 6. k8s クラスターの拡張 - 2 つの稼働ノードを追加
- 7. Kubernetes ネットワーク コンポーネント - Calico をインストールします (マスター上で実行)
k8s シングルマスターアーキテクチャのインストールと展開
環境整備
3 つの新しい centos7.9 システム、4 コア CPU、2G メモリ、200G ディスク
環境宣言
- podSubnet (ポッド ネットワーク セグメント) 10.244.0.0/16
- serviceSubnet (サービス ネットワーク セグメント): 10.96.0.0/16
- 物理マシンのネットワークセグメント: 192.168.31.0/24
クラスタアーキテクチャ
K8S クラスターの役割 | ip | CPU名 | コンポーネントのインストール |
---|---|---|---|
制御ノード | 192.168.31.180 | k8sマスター | APIサーバー、コントロールマネージャー、スケジューラー、etcd、kube-proxy、docker、calico |
作業ノード | 192.168.31.181 | k8s-ノード-1 | kublet、kube-proxy、docker、calico、coredns |
作業ノード | 192.168.31.182 | k8s-ノード-2 | kublet、kube-proxy、docker、calico、coredns |
インストール手順
1. k8s クラスターの実験環境を初期化してインストールします (3 台の k8 を動作させる必要があります。便宜上、1 台の動作のみを記録しました)
1. クラスタ アーキテクチャに従ってホスト IP とホスト名を構成します。
[root@localhost ~]# vi /etc/sysconfig/network-scripts/ifcfg-ens33
BOOTPROTO=static
NAME=ens33
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.31.180
PREFIX=24
GATEWAY=192.168.31.1
DNS1=114.114.114.114
[root@localhost ~]# hostnamectl set-hostname k8s-master
[root@localhost ~]# su
[root@k8s-master ~]#
他の 2 台のマシンの構成も同様で、クラスター アーキテクチャに従って IP とホスト名を構成します。
2. すべてのノードでファイアウォールと selinux をオフにします。
[root@k8s-master ~]# service firewalld stop #临时关闭防火墙
Redirecting to /bin/systemctl stop firewalld.service
[root@k8s-master ~]# systemctl disable firewalld #永久关闭防火墙
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@k8s-master ~]# setenforce 0 #临时关闭selinux
[root@k8s-master ~]# getenforce
Permissive
[root@k8s-master ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config #永久关闭selinux
機能: k8s クラスターホスト間の通信がブロックされるのを防止します。
他の 2 台のマシンは同じように動作します
3. /etc/hosts ファイルを変更し、ホスト名を使用して相互にアクセスします。
すべてのノードの操作
[root@k8s-master ~]# vi /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.31.180 k8s-master
192.168.31.181 k8s-node-1
192.168.31.182 k8s-node-2
4. すべてのノードが相互に秘密のないチャネルを確立します
k8sマスター
[root@k8s-master ~]# ssh-keygen
[root@k8s-master ~]# ssh-copy-id k8s-node-1
[root@k8s-master ~]# ssh-copy-id k8s-node-2
k8s-ノード-1
[root@k8s-node-1 ~]# ssh-keygen
[root@k8s-node-1 ~]# ssh-copy-id k8s-master
[root@k8s-node-1 ~]# ssh-copy-id k8s-node-2
k8s-ノード-2
[root@k8s-node-2 ~]# ssh-keygen
[root@k8s-node-2 ~]# ssh-copy-id k8s-master
[root@k8s-node-2 ~]# ssh-copy-id k8s-node-1
5. パフォーマンスを向上させるためにスワップ パーティションをオフにする
3つすべてを実行してください
[root@k8s-master ~]# swapoff -a
機能: 可能な限りメモリを使用し、ディスク スワップ パーティションを使用せず、パフォーマンスを向上させます。k8s の
設計時、パフォーマンスを向上させるために、デフォルトではスワップ パーティションの使用は許可されていません。Kubeadm が初期化されると、スワップが閉じられているかどうかが検出されます。閉じられていない場合、初期化は失敗します。スワップ パーティションをオフにしたくない場合は、k8s のインストール時に –ignore-preflight-errors=Swap を指定すると問題を解決できます。
スワップパーティションを完全に閉じる
[root@k8s-master ~]# vim /etc/fstab
6. マシンのカーネルパラメータを変更する
3つすべてを実行してください
[root@k8s-master ~]# modprobe br_netfilter #可以解决 sysctl -p /etc/sysctl.d/k8s.conf出现报错:
[root@k8s-master ~]# echo "modprobe br_netfilter" >> /etc/profile #设置开机启动
[root@k8s-master ~]# cat > /etc/sysctl.d/k8s.conf <<EOF
> net.bridge.bridge-nf-call-ip6tables = 1
> net.bridge.bridge-nf-call-iptables = 1
> net.ipv4.ip_forward = 1
> EOF
[root@k8s-master ~]# sysctl -p /etc/sysctl.d/k8s.conf #从指定的文件加载系统参数
7. Alibaba Cloud のリポジトリソースを構成する
[root@k8s-master ~]# yum install -y yum-utils
[root@k8s-master ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
国内の Docker イメージ ソースを構成すると、後続のイメージのプルが大幅に高速化されます。
8. クラスターに必要なすべての依存関係パッケージをインストールします。
[root@k8s-master ~]# yum install -y yum-utils device-mapper-persistent-data lvm2 wget net-tools nfs-utils lrzsz gcc gcc-c++ make cmake libxml2-devel openssl-devel curl curl-devel unzip sudo ntp libaio-devel wget vim ncurses-devel autoconf automake zlib-devel python-devel epel-release openssh-server socat ipvsadm conntrack ntpdate telnet ipvsadm
9. k8s コンポーネントのインストールに必要な Alibaba Cloud リポジトリ ソースを構成します
[root@k8s-master ~]# vim /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
10. 時刻同期の設定
ntpdateコマンドをインストールする
[root@k8s-master ~]# yum install -y ntpdate
ネットワーク時刻を同期する
[root@k8s-master ~]# ntpdate cn.pool.ntp.org
時刻同期をスケジュールされたタスクにする
[root@k8s-master ~]# crontab -e
* */1 * * * /usr/sbin/ntpdate cn.pool.ntp.org
crondサービスを再起動します
[root@k8s-master ~]# service crond restart
2. docker サービスをインストールします (3 つの k8s ホストすべてで動作します)。
1.docker-ceをインストールする
ドッカーをインストールする
[root@k8s-master ~]# yum install docker-ce-20.10.6 -y
自動起動+起動時に自動起動
[root@k8s-master ~]# systemctl start docker && systemctl enable docker.service
2. Docker イメージ アクセラレータとドライバーを構成する
イメージアクセラレータを追加する
[root@k8s-master ~]# vim /etc/docker/daemon.json
{
"registry-mirrors":["https://rsbud4vc.mirror.aliyuncs.com","https://registry.docker-cn.com","https://docker.mirrors.ustc.edu.cn","https://dockerhub.azk8s.cn","http://hub-mirror.c.163.com"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
docker ファイル ドライバーを systemd に変更します。デフォルトは cgroupfs です。Kubeletはデフォルトで systemd を使用します。この 2 つは一貫している必要があります。
systemdを更新してdockerを再起動する
[root@k8s-master ~]# systemctl daemon-reload && systemctl restart docker
Docker の実行ステータスを確認する
[root@k8s-master ~]# systemctl status docker
3. k8s の初期化に必要なソフトウェア パッケージをインストールします (3 つの k8s ホストすべてで動作します)。
1. kubeadm、kubelet、kubectlをインストールします
[root@k8s-master ~]# yum install -y kubelet-1.20.6 kubeadm-1.20.6 kubectl-1.20.6
2. 起動後にkubeletを自動的に起動する
[root@k8s-master ~]# systemctl enable kubelet
ソフトウェア | 効果 |
---|---|
クビーズム | kubeadm は、k8s クラスターを初期化するために使用されるツールです |
キュベレット | クラスター内のすべてのノードにインストールされ、ポッドの起動に使用されます |
クベクトル | kubectl を通じて、アプリケーションのデプロイと管理、さまざまなリソースの表示、さまざまなコンポーネントの作成、削除、更新を行うことができます。 |
4. オフライン イメージ パッケージをインポートして、後続のイメージの取得を高速化します
1. k8s クラスターの初期化に必要なオフライン イメージ パッケージを 3 つの k8s ホストにアップロードします。
画像圧縮パッケージは、xftp 経由で k8s ホストのホーム ディレクトリにアップロードされます。
[root@k8s-master ~]# ls
anaconda-ks.cfg k8simage-1-20-6.tar.gz
他の 2 つのホストへの scp
[root@k8s-master ~]# scp k8simage-1-20-6.tar.gz 192.168.31.181:/root
[root@k8s-master ~]# scp k8simage-1-20-6.tar.gz 192.168.31.182:/root
2.dockerロードインポートイメージ
[root@k8s-master ~]# docker load -i k8simage-1-20-6.tar.gz
5. Kubeadm は k8s クラスターを初期化します (マスター上でのみ実行されます)。
1. kubeadm.yaml ファイルを生成する
[root@k8s-master ~]# kubeadm config print init-defaults > kubeadm.yaml
2. kubeadm.yaml ファイルの関連構成を変更します。
[root@k8s-master ~]# vim kubeadm.yaml
apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: abcdef.0123456789abcdef
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 192.168.31.180
bindPort: 6443
nodeRegistration:
criSocket: /var/run/dockershim.sock
name: k8s-master
taints:
- effect: NoSchedule
key: node-role.kubernetes.io/master
---
apiServer:
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns:
type: CoreDNS
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: v1.20.0
networking:
dnsDomain: cluster.local
serviceSubnet: 10.96.0.0/12
podSubnet: 10.244.0.0/16
scheduler: {}
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs
---
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd
特別な注意: –image-repository registry.aliyuncs.com/google_containers プルされたイメージが海外のサイトからプルされないようにするには、ウェアハウスのアドレスを registry.aliyuncs.com/google_containers として手動で指定します。kubeadm はデフォルトで k8s.gcr.io からイメージをプルします。オフライン イメージをローカルにインポートしたため、ローカル イメージが最初に使用されます。
mode: ipvs は、kube-proxy プロキシ モードが ipvs であることを示します。ipvs が指定されていない場合、デフォルトで iptables が使用されます。ただし、iptables は非効率であるため、運用環境では ipvs を有効にすることをお勧めします。
3. kubeadm.yaml ファイルに基づいて k8s を初期化します。
[root@k8s-master ~]# kubeadm init --config=kubeadm.yaml --ignore-preflight-errors=SystemVerification
4. kubectl 構成ファイル config を構成することは、kubectl コマンドがこの証明書を使用して k8s クラスターを管理できるように kubectl を認証することと同じです。
[root@k8s-master ~]# mkdir -p $HOME/.kube
[root@k8s-master ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@k8s-master ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
ノード情報の表示
[root@k8s-master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master NotReady control-plane,master 177m v1.20.6
他の 2 つのノードがまだマスターに参加していないため、マスターのみが存在することがわかりました。
6. k8s クラスターの拡張 - 2 つの稼働ノードを追加
マスター上のノードに参加するコマンドを確認します。
[root@k8s-master ~]# kubeadm token create --print-join-command
kubeadm join 192.168.31.180:6443 --token bnokqt.324m0mxrhv7z7je3 --discovery-token-ca-cert-hash sha256:7013fd8145494ded4993d3d1d96cde925fe06e14c953841fcdb85fd33a315298
ノード1ノードに参加
[root@k8s-node-1 ~]# kubeadm join 192.168.31.180:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:7013fd8145494ded4993d3d1d96cde925fe06e14c953841fcdb85fd33a315298
ノード2ノードに参加
[root@k8s-node-2 ~]# kubeadm join 192.168.31.180:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:7013fd8145494ded4993d3d1d96cde925fe06e14c953841fcdb85fd33a315298
マスター上のノード情報を表示する
[root@k8s-master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master NotReady control-plane,master 3h4m v1.20.6
k8s-node-1 NotReady <none> 5m4s v1.20.6
k8s-node-2 NotReady <none> 4m55s v1.20.6
無事に参加できました!
k8s-node-1 と k8s-node-2 のロールを仕事に変えることができます
[root@k8s-master ~]# kubectl label node k8s-node-1 node-role.kubernetes.io/worker=worke
node/k8s-node-1 labeled
[root@k8s-master ~]# kubectl label node k8s-node-2 node-role.kubernetes.io/worker=worke
node/k8s-node-2 labeled
[root@k8s-master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master NotReady control-plane,master 3h10m v1.20.6
k8s-node-1 NotReady worker 10m v1.20.6
k8s-node-2 NotReady worker 10m v1.20.6
7. Kubernetes ネットワーク コンポーネント - Calico をインストールします (マスター上で実行)
1. calico.yaml ファイルをホーム ディレクトリにアップロードします。
[root@k8s-master ~]# ls
anaconda-ks.cfg calico.yaml k8simage-1-20-6.tar.gz kubeadm.yaml
2.calico ネットワーク プラグインをインストールするための yaml ファイル
[root@k8s-master ~]# kubectl apply -f calico.yaml
3. ノードのステータスを確認する
[root@k8s-master ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
k8s-master Ready control-plane,master 3h16m v1.20.6
k8s-node-1 Ready worker 16m v1.20.6
k8s-node-2 Ready worker 16m v1.20.6
ステータスが準備完了ステータスに変更されたことがわかります。おめでとうございます。k8s 1 つのマスターと 2 つのスレーブのアーキテクチャが正常に構築されました。