1. 環境準備
1. マシン環境の前提条件
今回のデモでは、3 台の仮想マシン環境、つまり 3 台の Alibaba Cloud サーバーを用意
します k8s-master01: k8s-master の動作環境をインストールするマシン
k8s-node01: 本マシン 使用環境k8s ノードをインストールするノード
k8s-node02: このマシンは、k8s ノードノードの環境をインストールするために使用されます。
ネットワーク構成を変更して仮想マシン ネットワークが接続されていることを確認し、Xshell 接続ノードの CPU コア数が
2 コア以上である必要があります。そうでない場合、k8s は
DNS ネットワークを開始できません。DNS に設定するのが最善です。ローカルネットワークに接続されている場合、ネットワークがブロックされ、一部のミラーイメージがダウンロードできません
カーネル: Linux カーネルはバージョン 4 以降である必要があるため、Linux カーネルをアップグレードする必要があります
事前環境の準備が完了しました
2. 依存環境のインストールと構成
注: 各マシンにこの依存環境をインストールする必要があります。
1. 各マシンのホスト名を設定します。
hostnamectl set-hostname k8s-master01
hostnamectl set-hostname k8s-node01
hostnamectl set-hostname k8s-node02
ホスト名を表示する
ホスト名
IPホストマッピング関係を構成する
vi /etc/hosts
192.168.66.10 k8s-master01
192.168.66.11 k8s-node01
192.168.66.12 k8s-node02
2. インストールは環境に依存します
yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptablescurl sysstat
libseccomp wget vim net-tools git iproute lrzsz bash-completion Tree Bridge-
utils unzip binding-utils gcc
3. iptables をインストールし、iptables を開始し、ブートを自動的に設定し、iptables ルールをクリアし、現在のルールをデフォルトのルールに保存し、ファイアウォールを閉じ、ファイアウォールを無効にするようにブートを設定します。
systemctl ファイアウォールを停止 && systemctl ファイアウォールを無効にする
空のiptables
yum -y install iptables-services && systemctl start iptables && systemctlenable
iptables && iptables -F && service iptables save
4. selinux を閉じ、
スワップ パーティション [仮想メモリ] を閉じ、仮想メモリを完全に閉じます。
swapoff -a && sed -i '/ swap / s/^(.*)$/#\1/g' /etc/fstab
セリナックスを閉じる
setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
5. Linux カーネルをバージョン 4.44 にアップグレードします。
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-4.el7.elrepo.noarch.rpm
カーネルをインストールする
yum --enablerepo=elrepo-kernel install -y kernel-lt
インストールされているカーネルをクエリする
rpm -qa | grep カーネル
デフォルトの起動項目を表示する
awk -F' '$1=="メニューエントリ " {print $2}' /etc/grub2.cfg
上記のコマンドで新しいカーネルの名前を見つけ、置換後に次のコマンドを実行すると、新しいカーネルからブートが開始されます。
grub2-set-default 'CentOS Linux (4.4.230-1.el7.elrepo.x86_64) 7 (コア)'
マシンを再起動します。 注: カーネルの設定後、有効にするためにサーバーを再起動する必要があります。
リブート
再起動後にカーネルに問い合わせる
uname -r
6. k8s のカーネルパラメータを調整します。
cat > kubernetes.conf <<EOF
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
net.ipv4.tcp_tw_recycle=0
vm。 swappiness=0
vm.overcommit_memory=1
vm.panic_on_oom=0
fs.inotify.max_user_instances=8192
fs.inotify.max_user_watches=1048576
fs.file-max=52706963
fs.nr_open=52706963
net.ipv6.conf.all.disable_ipv6=1
net.netfilter.nf_conntrack_max=2310720
EOF
最適化されたカーネル ファイルを /etc/sysctl.d/ フォルダーにコピーして、起動時に最適化されたファイルを呼び出せるようにします。
cp kubernetes.conf /etc/sysctl.d/kubernetes.conf
手動で更新して、最適化されたファイルをすぐに有効にします
sysctl -p /etc/sysctl.d/kubernetes.conf
上記の手動更新ではこの例外が発生しますが、コンポーネントがロードされていないため無視してください。
sysctl: /proc/sys/net/netfilter/nf_conntrack_max を統計できません: そのようなファイルまたは
ディレクトリはありません
7. システムの一時領域を調整し (設定されている場合はスキップ)
、システムのタイムゾーンを中国/上海に設定します。
timedatectl set-timezone アジア/上海
現在の UTC 時間をハードウェア クロックに書き込みます
timedatectl set-local-rtc 0
システム時間に依存するサービスを再起動する
systemctl 再起動 rsyslog
systemctl 再起動 crond
8. システムの不要なサービスをオフにする
systemctl ポストフィックスを停止 && systemctl ポストフィックスを無効にする
9. ログの保存方法の設定
とログを保存するディレクトリの作成
mkdir /var/log/journal
設定ファイル格納ディレクトリを作成する
mkdir /etc/systemd/journald.conf.d
設定ファイルを作成する
cat > /etc/systemd/journald.conf.d/99-prophet.conf <<EOF
[ジャーナル]
Storage=persistent
Compress=yes
SyncIntervalSec=5m
RateLimitInterval=30s
RateLimitBurst=1000
SystemMaxUse=10G
SystemMaxFileSize=200M
MaxRetentionSec=2week
ForwardToSyslog=
EOFなし
systemdjournaldの構成を再起動します。
systemctl 再起動 systemd-journald
10. 開いているファイルの数を調整します (無視しても実行されません)
echo “* ソフト nofile 65536” >> /etc/security/limits.conf
echo “* ハード nofile 65536” >> /etc/security/limits.conf
11. kube-proxy が ipvs 前提条件を開きます
modprobe br_netfilter
cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe – ip_vs
modprobe – ip_vs_rr
modprobe – ip_vs_wrr
modprobe – ip_vs_sh
modprobe – nf_conntrack_ipv4
EOF
lsmod コマンドを使用して、これらのファイルがブートされているかどうかを確認します。
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash
/etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e
nf_conntrack_ipv4
3. Docker のデプロイメント
1. インストールの依存関係
yum install -y yum-utils device-mapper-persistent-data lvm2
yum ソフトウェア ソースを追加し
(安定した (安定した) ウェアハウスを構成します。ウェアハウス構成は /etc/yum.repos.d/docker-ce.repo ファイルに保持されます)、次の 2 つのいずれかを選択します。
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum- config -manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
Yum によってインストールされた関連する Docke パッケージを更新し、Docker CE をインストールします
yum update -y && yum install docker-ce
インストールが成功したかどうかをテストする
docker -v
yum ダウンロード失敗解決例
以下のようなダウンロード失敗問題がある場合
パッケージのダウンロード中にエラーが発生しました:
3:docker-ce-19.03.12-3.el7.x86_64: [Errno 256] これ以上試せるミラーはありません。
containerd.io-1.2.13-3.2.el7.x86_64: [Errno 256] これ以上試せるミラーはありません
yumキャッシュをクリアする
うーん、全部きれいにして
上記のコマンドを実行して yum ソフトウェア ソースを追加し、ソースを切り替えて
ウェアハウス構成が変更されて有効になっているかどうかを確認します。
vi /etc/yum.repos.d/docker-ce.repo
次のアップデートダウンロードコマンドを再実行します。
yum update -y && yum install docker-ce
2. docker デーモン ファイルをセットアップし
、/etc/docker ディレクトリを作成します。
mkdir /etc/docker
daemon.json ファイルを更新し、Alibaba Cloud Container Mirroring Service を構成します。
cat > /etc/docker/daemon.json <<EOF
{ “exec-opts”: [“native.cgroupdriver=systemd”], “registry-mirrors”: [“https://tda5gnvq.mirror.aliyuncs.com” ]、"log-driver": "json-file"、"log-opts": {"max-size": "100m"} } EOF
注: エラーがある場合は、必ずエンコードの問題に注意してください。journalctl -amu docker コマンドを確認してエラーを見つけます。
docker 構成ファイルを作成して保存します。
mkdir -p /etc/systemd/system/docker.service.d
3. docker サービスを再起動し、起動時に docker が自動的に起動するように設定します。
systemctl daemon-reload && systemctl restart docker && systemctl Enable docker
docker イメージを使用してテストします。注: 起動に失敗した場合は、構成ファイルに問題があります。
4. kubeadm [ワンクリックインストール k8s]
kubernetes をインストールする場合、kubelet、kubeadm などのパッケージをインストールする必要がありますが、k8s 公式 Web サイトで提供される yum ソースは
package.cloud.google.com であり、国内ではアクセスできません。現時点では、Alibaba Cloud の yum ウェアハウス ミラーを使用できます。
1. Alibaba Cloud の yum ウェアハウス イメージを構成する
cat < /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
Baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
Enabled=1
gpgcheck=0
repo_gpgcheck =0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
2. kubeadm、kubelet、kubectlをインストールする
yum install -y kubeadm-1.15.1 kubelet-1.15.1 kubectl-1.15.1
起動時にkubeletが自動的に起動するように設定し、kubeletを起動します
systemctl kubelet を有効にする && systemctl kubelet を開始する
2. クラスターのインストール
1. 各ノードに基本イメージをインストールします
。 k8s のインストールに必要な基本イメージを表示します。
kubeadm config イメージのリスト
kubeadm が k8s クラスターを初期化すると、対応するイメージが gce Google クラウドからダウンロード (プル) されます。
もちろん、docker pull を実行することも選択できます。上記のコマンドで表示されたイメージに従って、イメージが 1 つずつプルされますただし、
イメージが比較的大きいため、ダウンロードが失敗する可能性があります。そのため、ダウンロードしたイメージ パッケージをローカルの Docker イメージ ウェアハウスにインポートします。 注: 次の手順は、マスター ホスト 1 で実行できます。rz アップロードは、
解凍する
イメージ tar パッケージに依存します。
画像
tar -zxvf kubeadm-basic.images.tar.gz
もちろん、解凍後、図に示すように、 dockerload -i xxx.tar を使用して、tar パッケージのイメージを 1 つずつローカル ウェアハウスにインポートすることもできます
。ローカルの Docker ミラーウェアハウスにコピーし、
任意のディレクトリに sh スクリプト ファイルを作成します。
touch image-load.sh
vi image-load.sh は、次のスクリプト コードをインポートします。
/root/kubeadm-basic.images は、ローカル イメージが解凍されるディレクトリの場所であることに注意してください。
#!/bin/bash
ls /root/kubeadm-basic.images > /tmp/images-list.txt
cd /root/kubeadm-basic.images
for i in $(cat /tmp/images-list.txt)
do
docker load -i $i
done
rm -rf /tmp/images-list.txt
権限の変更、実行可能権限
chmod 755 イメージロード.sh
スクリプト ファイルを実行して画像のインポートを開始します
./image-load.sh
ローカル倉庫の画像を見る
ドッカーイメージ
3. ファイルとミラーイメージを他のノードノードに転送します
。 注: 他のマシンにも K8S 環境をインストールする必要があるため、ミラー tar パッケージとスクリプトファイルを他のノードノードに転送します。 注
: 現在のマスターホストで実行し、
node01 ノードに転送します。
scp -r image-load.sh kubeadm-basic.images root@k8s-node01:/root/
node02ノードに渡す
scp -r image-load.sh kubeadm-basic.images root@k8s-node02:/root/
他のノードは sh スクリプトを順番に実行してイメージをインポートします
./image-load.sh
2. Kubernetes のデプロイ
yaml ファイルをデプロイすることによるワンクリック デプロイ
注: 次の手順はマスター ホストで実行できます。
1. yaml リソース構成ファイルを取得します。
kubeadm config print init-defaults > kubeadm-config.yaml
2. yamlリソースファイルの変更
注: 変更が必要な部分は以下の図に示されています
localAPIEndpoint:
advertiseAddress: 192.168.52.105 # 注意:修改配置文件的IP地址
kubernetesVersion: v1.15.1 #注意:修改版本号,必须和kubectl版本保持一致
networking:
# 指定flannel模型通信 pod网段地址,此网段和flannel网段一致,不用变
podSubnet: "10.244.0.0/16"
serviceSubnet: "10.96.0.0/12"
#添加如下内容指定使用ipvs网络进行通信,注意缩进
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: kubeProxyConfiguration
featureGates:
SupportIPVSProxyMode: true
mode: ipvs
3. マスターノードを初期化してデプロイメントを開始します
kubeadm init --config=kubeadm-config.yaml --experimental-upload-certs | kubeadm init --config=kubeadm-config.yaml --experimental-upload-certs |
kubeadm-init.log を参照してください。
注: このコマンドを実行するには、CPU コアの数が 1 コアより大きい必要があります。そうでない場合、正常に実行できません
。kubernetes マスター ノードが正常に初期化されると、次のようになります。
4. K8S プロンプトに従って次のコマンドを実行して
、ディレクトリを作成し、接続構成キャッシュを保存し、ファイルを認証します
mkdir -p $HOME/.kube
クラスター管理構成ファイルをコピーする
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
プロファイリングを許可する
chown ( id − u ) : (id -u):(私は−う): (id -g) $HOME/.kube/config
クエリノード ノード
kubectl ノードの取得
ノード情報は正常に照会できますが、ノードのステータスが NotReady であり、Running ではないことがわかります。その理由は、現時点ではネットワーク通信に ipvs+flannel を使用していますが、flannel ネットワーク プラグインがデプロイされていないため、現時点ではノードのステータスが NotReady になっているためです。
3. フランネル ネットワーク プラグインをデプロイします
。同様に、外部ミラーのプルは時間がかかり、失敗しやすいため、ローカルにダウンロードしたフランネル ミラーを使用し、flannel.tar パッケージをアップロードします。 注
: マスター ノードとスレーブ ノードの両方がアップロードして後続のインポートを実行する必要があります。そしてタグ付けが動作します
ミラー tar パッケージをローカル ミラー ライブラリにインポートします。
dockerload -i flannel.tar
イメージにタグを付けて、ローカル ウェアハウスに新しい v1 バージョンのイメージを生成します
docker タグ quay-mirror.qiniu.com/coreos/flannel:v0.12.0-amd64 flannel:v1
注: Docker イメージにはマスター マシンとスレーブ マシンが表示されます
注: 次の手順をマスター ホストで実行して、
ローカル yml ファイル (flannel:v1 バージョンに変更) を渡すことができます。
yml デプロイメント フランネル
kubectl create -f kube-flannel.yml
実行が成功した後、kubectl get ノードで確認します。まだ NotReady 状態にある可能性があり、kube-system で実行されているシステム ポッド内のフランネルが kubectl get pod を通じて実行されているかどうかを確認するのに時間がかかります。 -n kube-
システム
表示時に Ready 状態であれば、ネットワーク コンポーネントが正常に展開されていることを意味します。
付録: kubectl get pod -n kube-system は、
すべての k8s リソースがミラーリングを通じてデプロイされ、実行モードがポッドを通じて反映されることを説明しています。これらのポッドは k8s システム リソースです。ポッド -n は名前空間を意味します。システム下のポッド情報です。ポッドの詳細を表示するには、名前空間
を追加できます。幅が広くありません。
cubectl get pod -n cube-system -o Wide
付録: フランネルを介してデプロイされたポッドには、同様の保留中および ImagePullBackOff の問題があることが判明しました。
ポッドの詳細なログ情報をクエリして、エラーの原因 (通常はイメージのプルの失敗) を見つけます。
kubectl 説明ポッド kube-flannel-ds-amd64-jd67h -n kube-system
kube-flannel.yml ファイルが変更されている場合は、次のコマンドを使用して更新してデプロイします。
kubectl apply -f kube-flannel.yml
4. 他のノードの参加
Kubernetes マスター ノードが正常に構築されると、ログ ファイル kubeadm-init.log が生成されます。その内容は次の図に示されています。 (ログ出力ファイル「tee kubeadm-init.log
」)がコマンドで指定されている)
マスター ノードに参加し、他の稼働ノードの場合は、インストール ログ内のコマンドを実行して
ログ ファイルを表示します。
猫の kubeadm-init.log
下図の赤い部分のコマンドが他のノードを追加するコマンドです。
コマンドを他のいくつかのノードにコピーして実行します (他のスレーブ サーバーで実行されることに注意してください)。
実行後、マスター ホストで kubectl get node を確認する
と、まだ NotReady 状態のノードがあることがわかります。これらのノードのポッドコンテナはまだ「初期化に時間がかかる」状態です
が、他のノードが参加して「準備完了」状態になると、K8S クラスターが正常に構築されます。