2-Kubernetesエントリーマニュアルのインストールと展開

[ TOC]

0 x00はじめに####

説明:以前のK8sエントリシステムアーキテクチャを通じて、シングルノードマスターとワーカーの作業展開プロセスを予備的に理解しましたが、kuboardが提供するインストールスクリプトは、テストプラクティスとしてインストールできますが、実際には実稼働環境ではビジネスが複雑で多様であるため、クラスターの安全性と信頼性を確保するためにクラスターに依存する必要があります。

K8をインストールする前に、クラスター計画の次の側面から準備する必要があります。

1. クラスター計画#####
オペレーティングシステム(OS)######

説明:CentOS 7x OSを使用する場合は、カーネルバージョン( stable> = 4.19)をアップグレードすることをお勧めします。そうしないと、一部のJavaコンテナーを実行するときに問題が発生する可能性があります。初期段階では、テスト環境にいくつかのJavaアプリケーションサービスをデプロイして、このような問題が発生するかどうかを確認できます。このような問題が発生した場合は、カーネルバージョンをアップグレードして解決を試みることができます。

Q:Javaコンテナがすぐにプルアップされると、クラスタ全体がCPUによって使い果たされます。JavaCPUの起動時のCPUリソース競合の問題を解決するにはどうすればよいですか?
A:この問題が発生しました。その後、カーネルを4.19にアップグレードした後、多くのメモリの枯渇は発生しなくなりました。カーネルのアップグレードにより、CPUの爆発的な問題を解決しました。

安定したバージョン選択(VERSION)######

このドキュメントが要約されている時点(2020-06-20)の時点で、現在も維持されているKubernetesの公式リリースと安定バージョンには、「1.16.x」、「1.17.x」、および「1.18.x」が含まれます。 1.14.xバージョンと 1.15.xバージョンのライフサイクルはすでに EOLに近いため、古いバージョンを選択することはお勧めしません。包括的な考慮事項現在、マイナーバージョン「4 <x <10」の「1.17.4」または「1.17.5」バージョンが最も適切であり、「1.18.3」

pkg version release date
kubernetes v1.17.5 2020-04-16
docker-ce 19.03.9 2020-04-12
harbor v1.9.4 2020-12-31

0 x01K8sシングルノードをインストールします####

説明:インストールするために必要なコンポーネントとプラグインをカスタマイズする必要があるため、 kubeadmを使用してK8S( single machine | cluster)を手動でデプロイします。

0. 基本的な環境構成#####

説明:kubeadmをインストールするときは、ワーカーノードとマスターノードの両方を実行する必要があります。
システム環境の推奨事項:

# OS
CentOS 7.x/8.x(ここで推奨環境7.8),Ubuntu(18.04) 
# Kerner
OS KERNER >=4.18 
# Docker Version:19.03.09
# kubernetes 1.18.3
#1. 現在のノード
hostnamectl set-hostname master-01
hostnamectl status

#2. kubeadmは、現在のホストが無効になっているかどうかを確認します`swap`,だからここで一時的にスワップとSELinuxを閉じます
# スワップとSELinuxを一時的に閉じます
swapoff -a
setenforce 0
# スワップとSELinuxを完全に閉じる
yes | cp /etc/fstab /etc/fstab_bak
cat /etc/fstab_bak |grep -v swap >/etc/fstab
sed -i 's/^SELINUX=.*$/SELINUX=disabled/'/etc/selinux/config

#3. ホスト名の設定
echo "127.0.0.1 $(hostname)">>/etc/hosts
cat  <<EOF >>/etc/hosts
10.80.172.211 master-01
EOF

#4. ファイアウォールをオフにする
systemctl stop firewalld
systemctl disable firewalld

システムカーネルパラメータの調整:

# /etc/sysctl.confはカーネルパラメータを設定します
# /etc/sysctl.d/99-kubernetes-cri.conf
egrep -q "^(#)?net.ipv4.ip_forward.*"/etc/sysctl.conf && sed -ri "s|^(#)?net.ipv4.ip_forward.*|net.ipv4.ip_forward = 1|g"/etc/sysctl.conf || echo "net.ipv4.ip_forward = 1">>/etc/sysctl.conf
egrep -q "^(#)?net.bridge.bridge-nf-call-ip6tables.*"/etc/sysctl.conf && sed -ri "s|^(#)?net.bridge.bridge-nf-call-ip6tables.*|net.bridge.bridge-nf-call-ip6tables = 1|g"/etc/sysctl.conf || echo "net.bridge.bridge-nf-call-ip6tables = 1">>/etc/sysctl.conf 
egrep -q "^(#)?net.bridge.bridge-nf-call-iptables.*"/etc/sysctl.conf && sed -ri "s|^(#)?net.bridge.bridge-nf-call-iptables.*|net.bridge.bridge-nf-call-iptables = 1|g"/etc/sysctl.conf || echo "net.bridge.bridge-nf-call-iptables = 1">>/etc/sysctl.conf
egrep -q "^(#)?net.ipv6.conf.all.disable_ipv6.*"/etc/sysctl.conf && sed -ri "s|^(#)?net.ipv6.conf.all.disable_ipv6.*|net.ipv6.conf.all.disable_ipv6 = 1|g"/etc/sysctl.conf || echo "net.ipv6.conf.all.disable_ipv6 = 1">>/etc/sysctl.conf
egrep -q "^(#)?net.ipv6.conf.default.disable_ipv6.*"/etc/sysctl.conf && sed -ri "s|^(#)?net.ipv6.conf.default.disable_ipv6.*|net.ipv6.conf.default.disable_ipv6 = 1|g"/etc/sysctl.conf || echo "net.ipv6.conf.default.disable_ipv6 = 1">>/etc/sysctl.conf
egrep -q "^(#)?net.ipv6.conf.lo.disable_ipv6.*"/etc/sysctl.conf && sed -ri "s|^(#)?net.ipv6.conf.lo.disable_ipv6.*|net.ipv6.conf.lo.disable_ipv6 = 1|g"/etc/sysctl.conf || echo "net.ipv6.conf.lo.disable_ipv6 = 1">>/etc/sysctl.conf
egrep -q "^(#)?net.ipv6.conf.all.forwarding.*"/etc/sysctl.conf && sed -ri "s|^(#)?net.ipv6.conf.all.forwarding.*|net.ipv6.conf.all.forwarding = 1|g"/etc/sysctl.conf || echo "net.ipv6.conf.all.forwarding = 1">>/etc/sysctl.conf

# コマンドを実行して適用します
sysctl -p
1. Docker関連の構成#####

説明:主に、指定されたDocker-ceバージョンとdocker-composeのダウンロード構成をダウンロードします。「マスター・ノードとワーカー・ノードで実行」に注意してください。

# に適用する:CentOS
# Dockerハブイメージアクセラレーションソース:マスターノードとワーカーノードの両方で実行します
# 最後のパラメータ1.18.2 kubenetesバージョンを指定するために使用され、すべてをサポートします1.18.xバージョンのインストール
# TencentCloudドッカーハブイメージ
# export REGISTRY_MIRROR="https://mirror.ccs.tencentyun.com"
# DaoCloudミラー
# export REGISTRY_MIRROR="http://f1361db2.m.daocloud.io"
# アリババクラウドドッカーハブ画像
export REGISTRY_MIRROR=
# https://registry.cn-hangzhou.aliyuncs.com

# dockerをインストールします
# 参考資料は以下の通りです
# https://docs.docker.com/install/linux/docker-ce/centos/ 
# https://docs.docker.com/install/linux/linux-postinstall/

# 古いバージョンをアンインストールします
yum remove -y docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine

# 基本的な依存関係をインストールする
yum install -y yum-utils lvm2 wget
# nfsをインストールします-utils 必须先nfsをインストールします-utilsはnfsネットワークストレージをマウントできます
yum install -y nfs-utils
# ドッカーミラーウェアハウスを追加
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# CentOS8
# dnf -y install https://download.docker.com/linux/centos/7/x86_64/stable/Packages/containerd.io-1.2.6-3.3.el7.x86_64.rpm

# dockerをインストールします
yum list docker-ce --showduplicates | sort -r
read -p 'インストールするDockerを入力してください-ceバージョン番号(例えば:19.03.9):' VERSION
yum install -y docker-ce-${VERSION} docker-ce-cli-${VERSION} containerd.io

# Dockerをインストールする-compose
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m`>/usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

# ミラーソース加速構成
# curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s ${REGISTRY_MIRROR}
# curl -sSL https://kuboard.cn/install-script/set_mirror.sh | sh -s ${REGISTRY_MIRROR}
# 
# General CentOS8
mkdir /etc/docker/
cat >/etc/docker/daemon.json <<EOF
{" registry-mirrors":["REPLACE"]}
EOF
sed -i "s#REPLACE#${REGISTRY_MIRROR}#g"/etc/docker/daemon.json

# dockerを起動し、インストール後にバージョン情報を表示します
systemctl enable docker
systemctl start docker
docker-compose -v
docker info
2. k8s関連の構成#####

説明:以下は、K8s基本環境のインストールと、マスターノードとノードノードの初期化です。

k8s環境のインストール設定:

# kubneetsバージョン番号
export K8SVERSION="1.18.3"

# 古いバージョンをアンインストールします
yum remove -y kubelet kubeadm kubectl

# K8Syumソースを構成する
cat <<'EOF'>/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

# kubelet、kubeadm、kubectlをインストールします
# 意志${1}1などのkubernetesバージョン番号に置き換えます.18.3
yum list kubeadm --showduplicates|sort -r
yum install -y kubelet-${K8SVERSION} kubeadm-${K8SVERSION} kubectl-${K8SVERSION}

# docker CgroupDriverをsystemdに変更します
# # 意志/usr/lib/systemd/system/docker.サービスファイルのこの行ExecStart=/usr/bin/dockerd -H fd://--containerd=/run/containerd/containerd.sock
# # ExecStartに変更=/usr/bin/dockerd -H fd://--containerd=/run/containerd/containerd.sock --exec-opt native.cgroupdriver=systemd
# 変更しないと、ワーカーノードの追加時に以下のエラーが発生する場合があります。
# [ WARNING IsDockerSystemdCheck]: detected "cgroupfs"as the Docker cgroup driver. The recommended driver is "systemd". 
# Please follow the guide at https://kubernetes.io/docs/setup/cri/    
sed -i "s#^ExecStart=/usr/bin/dockerd.*#ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --exec-opt native.cgroupdriver=systemd#g"/usr/lib/systemd/system/docker.service

# dockerを再起動し、kubeletを起動します
systemctl daemon-reload
systemctl restart docker
systemctl enable kubelet && systemctl start kubelet
マスターノード######

説明:初期化中に使用される環境変数について

# kubneetsバージョン番号
export K8SVERSION="1.18.3"
# xを置き換えます.x.x.xはマスターノードの内部ネットワークIPです
# exportコマンドは、現在のシェルセッションでのみ有効です。新しいシェルウィンドウを開いた後、インストールプロセスを続行する場合は、ここでexportコマンドを再実行してください。
export MASTER_IP=${IPADDR}
# apiserverを置き換えます.デモはあなたが望むdnsNameです
export APISERVER_NAME=apiserver.test
# アリババクラウドドッカーハブ画像
export REGISTRY_MIRROR=https://registry.cn-hangzhou.aliyuncs.com

# マスターノードでのみ実行されます
# Kubernetesコンテナグループが配置されているネットワークセグメント。インストールが完了すると、ネットワークセグメントはkubernetesによって作成され、事前に物理ネットワークに存在しません。
export POD_SUBNET=10.100.0.1/16
echo "${MASTER_IP} ${APISERVER_NAME}">>/etc/hosts

if[ ${#POD_SUBNET}-eq 0]||[ ${#APISERVER_NAME}-eq 0]; then
 echo -e "\033[31;1m環境変数PODが設定されていることを確認してください_サブネットとAPISERVER_NAME \033[0m"
 エコー電流POD_SUBNET=$POD_SUBNET
 現在のAPISERVERをエコーします_NAME=$APISERVER_NAME
 exit 1
fi

# 完全な構成オプションを表示https://godoc.org/k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta2
rm -f ./kubeadm-config.yaml
cat <<EOF >./kubeadm-config.yaml
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
kubernetesVersion: v${K8SVERSION}
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
controlPlaneEndpoint:"${APISERVER_NAME}:6443"
networking:
serviceSubnet:"10.99.0.0/16"
podSubnet:"${POD_SUBNET}"
dnsDomain:"cluster.local"
EOF

# kubeadm init
# サーバーの速度に応じて、3を待つ必要があります-10分
kubeadm init --config=kubeadm-config.yaml --upload-certs

# kubectlを構成します
rm -rf /root/.kube/
mkdir /root/.kube/
cp -i /etc/kubernetes/admin.conf /root/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

# calicoネットワークプラグインをインストールする
# 参考資料https://docs.projectcalico.org/v3.13/getting-started/kubernetes/self-managed-onprem/onpremises
echo -e "---calicoをインストールする-3.13.1---"
rm -f calico-3.13.1.yaml
wget https://kuboard.cn/install-script/calico/calico-3.13.1.yaml
kubectl apply -f calico-3.13.1.yaml

# マスターノードでのみ実行されます
# 次のコマンドを実行し、3を待ちます-すべてのコンテナグループが実行状態になるまで10分
watch kubectl get pod -n kube-system -o wide
echo -e "---コンテナグループが構築されるのを待ちます---"&& sleep 180
# マスターノードの初期化結果を表示する
kubectl get nodes -o wide

結果:

# kubernetesの初期インストールが成功したことを示します
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
 mkdir -p $HOME/.kube
 sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
 sudo chown $(id -u):$(id -g) $HOME/.kube/config

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml"with one of the options listed at:

# これで、任意の数の制御平面ノードに参加できます(集まる)、ルートとして各ノードで次のコマンドを実行します:
kubeadm join apiserver.test:6443--token hzlzrr.uwuegx4locpu36oc \
 - - discovery-token-ca-cert-hash sha256:4cbe428cb3503277be9fbcf3a99de82a97397a624dd94d4270c4eed1b861f951 \
 - - control-plane --certificate-key 28b178f04afae3770aa92add0206650b2359dd61424f127a6d44142dd15a280d

# 各ワーカーノードでルートとして次の操作を実行することにより、任意の数のワーカーノードに参加します:
kubeadm join apiserver.test:6443--token hzlzrr.uwuegx4locpu36oc \
 - - discovery-token-ca-cert-hash sha256:4cbe428cb3503277be9fbcf3a99de82a97397a624dd94d4270c4eed1b861f951

WeiyiGeek.

ノードnode
# ワーカーノードでのみ実行されます
read -p "K8sマスターノードのIPアドレスを入力してください:" MASTER_IP
echo "${MASTER_IP}  ${APISERVER_NAME}">>/etc/hosts
echo -e "\e[32m#マスターノードでのみ次のコマンドを実行します\n kubeadm token create --print-join-command\n kubeadm joinコマンドとパラメーターを取得し、ノードノードで実行します\n"
echo -e "[注意]:トークンは24時間有効です。24時間以内に、このトークンを使用して、任意の数のワーカーノードを初期化できます。\e[0m"
# Master
[[ email protected]~]# kubeadm token create --print-join-command
W0616 15:10:45.62270123160 configset.go:202] WARNING: kubeadm cannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io]
kubeadm join apiserver.test:6443--token 5q3zl5.4h2xllxhy7gxccx1     --discovery-token-ca-cert-hash sha256:4cbe428cb3503277be9fbcf3a99de82a97397a624dd94d4270c4eed1b861f951

# Nodes
[[ email protected]~]# ./CentOS7-k8s_init.sh node node-1
K8sマスターノードのIPアドレスを入力してください:10.10.107.193
# マスターノードでのみ次のコマンドを実行します
kubeadm token create --print-join-command
kubeadm joinコマンドとパラメーターを取得して、ノードノードで実行できます。

[ 注意]:トークンの有効時間は2時間で、2時間以内に、このトークンを使用して任意の数のワーカーノードを初期化できます。
[[ email protected]~]# kubeadm join apiserver.test:6443--token 5q3zl5.4h2xllxhy7gxccx1     --discovery-token-ca-cert-hash sha256:4cbe428cb3503277be9fbcf3a99de82a97397a624dd94d4270c4eed1b861f951
[ preflight] Running pre-flight checks
[ preflight] Reading configuration from the cluster...[preflight] FYI: You can look at this config file with'kubectl -n kube-system get cm kubeadm-config -oyaml'[kubelet-start] Downloading configuration for the kubelet from the "kubelet-config-1.18" ConfigMap in the kube-system namespace
[ kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"[kubelet-start] Starting the kubelet
[ kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap...
This node has joined the cluster:* Certificate signing request was sent to apiserver and a response was received.* The Kubelet was informed of the newsecure connection details.

# マスターが実行され、結合されたノードが表示されます
Run 'kubectl get nodes' on the control-plane to see this node join the cluster.[[email protected]~]# kubectl get nodes
NAME      STATUS   ROLES    AGE   VERSION
ks8test   Ready    master   22h   v1.18.3
node-1    Ready    <none>   67s   v1.18.3

0 x02 K8sクラスターを手動でインストールする(オンライン)####

説明:K8の高可用性クラスターをインストールするには、少なくとも3つのマスターノードと無制限の数の作業ノードを構成する必要があります。そうしないと、「スプリットブレイン」の現象が発生します。

WeiyiGeek。クラスターアーキテクチャ

クラスターインストール環境の説明とIPアドレス計画の説明:

# オペレーティング・システム
CentOS Linux release 7.8.2003(Core)
# カーネルバージョン
5.7.0- 1. el7.elrepo.x86_64

# アプリバージョン
docker 19.03.9
docker-compose 1.25.5
Kubernetes 1.18.4

# 画像とバージョンによって異なります
# docker images | awk -F ' ''{print $1":"$2}'
# REPOSITORY:TAG
mirrorgcrio/kube-proxy:v1.18.4
mirrorgcrio/kube-apiserver:v1.18.4
mirrorgcrio/kube-controller-manager:v1.18.4
mirrorgcrio/kube-scheduler:v1.18.4
calico/node:v3.13.1
calico/pod2daemon-flexvol:v3.13.1
calico/cni:v3.13.1
calico/kube-controllers:v3.13.1
mirrorgcrio/pause:3.2
mirrorgcrio/coredns:1.6.7
mirrorgcrio/etcd:3.4.3-0
IP ホスト名 備考
10.10.107.191 master-01 マスターマスターノード
10.10.107.192 master-02 スレーブマスターノード
10.10.107.193 master-03 スレーブマスターノード
10.10.107.194 ワーカー-01 ワークノード
10.10.107.196 ワーカー-02 ワークノード

作業手順:

基本環境:

export HOSTNAME=worker-02
# スワップとSELinuxを一時的に閉じます
swapoff -a && setenforce 0
# スワップとSELinuxを完全に閉じる
yes | cp /etc/fstab /etc/fstab_bak
cat /etc/fstab_bak |grep -v swap >/etc/fstab
sed -i 's/^SELINUX=.*$/SELINUX=disabled/'/etc/selinux/config

# ホスト名の設定(ここで、ホスト名は上記のIPアドレスプランに対応するホスト名をインストールします-インストールされているホストによって異なります)
hostnamectl set-hostname $HOSTNAME
hostnamectl status

# ホスト名の設定
echo "127.0.0.1 $HOSTNAME">>/etc/hosts
cat >>/etc/hosts <<EOF
10.10.107.191 master-0110.10.107.192 master-0210.10.107.193 master-0310.10.107.194 worker-0110.10.107.196 worker-02
EOF

# コマンドの自動完了
echo "source <(kubectl completion bash)">>~/.bashrc

# DNS設定
echo -e "nameserver 223.6.6.6\nnameserver 192.168.10.254">>/etc/resolv.conf

# ファイアウォールをオフにする
systemctl stop firewalld && systemctl disable firewalld

# Dockerのインストール構成(すでにインストールしている場合はスキップできます)
# 基本的な依存関係をインストールする
yum install -y yum-utils lvm2 wget
# nfsをインストールします-utils 必须先nfsをインストールします-utilsはnfsネットワークストレージをマウントできます
yum install -y nfs-utils
# ドッカーミラーウェアハウスを追加
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 利用可能なDockerバージョンを表示し、Dockerをインストールします
yum list docker-ce --showduplicates | sort -r
read -p 'インストールするDockerを入力してください-ceバージョン番号(例えば:19.03.9):' VERSION
yum install -y docker-ce-${VERSION} docker-ce-cli-${VERSION} containerd.io

# Dockerをインストールする-compose
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m`>/usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

# ミラーソース加速構成
# フォルダが存在しない場合は作成します/etc/docker/if[[!-d "/etc/docker/"]];then mkdir /etc/docker/;fi
cat >/etc/docker/daemon.json <<EOF
{" registry-mirrors":["REPLACE"]}
EOF
sed -i "s#REPLACE#${REGISTRY_MIRROR}#g"/etc/docker/daemon.json

# dockerを起動し、インストール後にバージョン情報を表示します
systemctl enable docker && systemctl start docker
docker-compose -v && docker info

# 変更する/etc/sysctl.confはカーネルパラメータを設定します
egrep -q "^(#)?net.ipv4.ip_forward.*"/etc/sysctl.conf && sed -ri "s|^(#)?net.ipv4.ip_forward.*|net.ipv4.ip_forward = 1|g"/etc/sysctl.conf || echo "net.ipv4.ip_forward = 1">>/etc/sysctl.conf
egrep -q "^(#)?net.bridge.bridge-nf-call-ip6tables.*"/etc/sysctl.conf && sed -ri "s|^(#)?net.bridge.bridge-nf-call-ip6tables.*|net.bridge.bridge-nf-call-ip6tables = 1|g"/etc/sysctl.conf || echo "net.bridge.bridge-nf-call-ip6tables = 1">>/etc/sysctl.conf 
egrep -q "^(#)?net.bridge.bridge-nf-call-iptables.*"/etc/sysctl.conf && sed -ri "s|^(#)?net.bridge.bridge-nf-call-iptables.*|net.bridge.bridge-nf-call-iptables = 1|g"/etc/sysctl.conf || echo "net.bridge.bridge-nf-call-iptables = 1">>/etc/sysctl.conf
egrep -q "^(#)?net.ipv6.conf.all.disable_ipv6.*"/etc/sysctl.conf && sed -ri "s|^(#)?net.ipv6.conf.all.disable_ipv6.*|net.ipv6.conf.all.disable_ipv6 = 1|g"/etc/sysctl.conf || echo "net.ipv6.conf.all.disable_ipv6 = 1">>/etc/sysctl.conf
egrep -q "^(#)?net.ipv6.conf.default.disable_ipv6.*"/etc/sysctl.conf && sed -ri "s|^(#)?net.ipv6.conf.default.disable_ipv6.*|net.ipv6.conf.default.disable_ipv6 = 1|g"/etc/sysctl.conf || echo "net.ipv6.conf.default.disable_ipv6 = 1">>/etc/sysctl.conf
egrep -q "^(#)?net.ipv6.conf.lo.disable_ipv6.*"/etc/sysctl.conf && sed -ri "s|^(#)?net.ipv6.conf.lo.disable_ipv6.*|net.ipv6.conf.lo.disable_ipv6 = 1|g"/etc/sysctl.conf || echo "net.ipv6.conf.lo.disable_ipv6 = 1">>/etc/sysctl.conf
egrep -q "^(#)?net.ipv6.conf.all.forwarding.*"/etc/sysctl.conf && sed -ri "s|^(#)?net.ipv6.conf.all.forwarding.*|net.ipv6.conf.all.forwarding = 1|g"/etc/sysctl.conf || echo "net.ipv6.conf.all.forwarding = 1">>/etc/sysctl.conf
# 変更したカーネルパラメータをすぐに有効にします
sysctl -p

# K8Syumソースを構成する
 cat <<'EOF'>/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

# kubelet、kubeadm、kubectlを表示およびインストールし、1などの統合されたkubernetesバージョン番号を指定します。.18.4
yum list kubelet --showduplicates | tail -n 10
yum install -y kubelet-1.18.4 kubeadm-1.18.4 kubectl-1.18.4

# docker CgroupDriverをsystemdに変更します
# # 意志/usr/lib/systemd/system/docker.サービスファイルのこの行ExecStart=/usr/bin/dockerd -H fd://--containerd=/run/containerd/containerd.sock
# # ExecStartに変更=/usr/bin/dockerd -H fd://--containerd=/run/containerd/containerd.sock --exec-opt native.cgroupdriver=systemd
# 変更しないと、ワーカーノードの追加時に以下のエラーが発生する場合があります。
# [ WARNING IsDockerSystemdCheck]: detected "cgroupfs"as the Docker cgroup driver. The recommended driver is "systemd". 
# Please follow the guide at https://kubernetes.io/docs/setup/cri/    
sed -i "s#^ExecStart=/usr/bin/dockerd.*#ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --exec-opt native.cgroupdriver=systemd#g"/usr/lib/systemd/system/docker.service

# dockerを再起動し、kubeletを起動します
systemctl daemon-reload
systemctl enable kubelet
systemctl restart docker && systemctl restart kubelet
APISERVER_IP=10.10.107.191
APISERVER_NAME=k8s.weiyigeek.top
APISERVER_PORT=6443
SERVICE_SUBNET=10.99.0.0/16
POD_SUBNET=10.100.0.1/16
echo "${APISERVER_IP} ${APISERVER_NAME}">>/etc/hosts

# 初期構成(各コンポーネントのバージョンがk8sのバージョンと一致していることをお勧めします)
rm -f ./kubeadm-config.yaml
 cat <<EOF >./kubeadm-config.yaml
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
kubernetesVersion: v${K8SVERSION}
imageRepository: mirrorgcrio
# imageRepository: registry.aliyuncs.com/google_containers
# imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
# imageRepository: gcr.azk8s.cn/google_containers
controlPlaneEndpoint:"${APISERVER_NAME}:${APISERVER_PORT}"
networking:
 serviceSubnet:"${SERVICE_SUBNET}"
 podSubnet:"${POD_SUBNET}"
 dnsDomain:"cluster.local"
EOF

# kubeadm initサーバーの速度に応じて、3を待つ必要があります-10分
kubeadm init --config=kubeadm-config.yaml --upload-certs

# kubectlを構成します。構成しないと、kubectl getpodsを実行できません。-A
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

# calicoネットワークプラグインをインストールする
# 参考資料https://docs.projectcalico.org/v3.13/getting-started/kubernetes/self-managed-onprem/onpremises
rm -f calico-3.13.1.yaml
wget -L https://kuboard.cn/install-script/calico/calico-3.13.1.yaml
kubectl apply -f calico-3.13.1.yaml

結果:

# (1) 次のコマンドを実行し、3を待ちます-すべてのコンテナグループが実行状態になるまで10分
watch kubectl get pod -n kube-system -o wide
# NAME                                       READY   STATUS    RESTARTS   AGE   IP              NODE        NOMINATED NODE   READINESS GATES
# calico-kube-controllers-5b8b769fcd-ns9r4   1/1     Running   0          6m   10.100.184.65   master-01<none><none>
# calico-node-bg2g9                          1/1     Running   0          6m   10.10.107.191   master-01<none><none>
# coredns-54f99b968c-2tqc4                   1/1     Running   0          6m   10.100.184.67   master-01<none><none>
# coredns-54f99b968c-672zn                   1/1     Running   0          6m   10.100.184.66   master-01<none><none>
# etcd-master-011/1     Running   0          6m   10.10.107.191   master-01<none><none>
# kube-apiserver-master-011/1     Running   0          6m   10.10.107.191   master-01<none><none>
# kube-controller-manager-master-011/1     Running   0          6m   10.10.107.191   master-01<none><none>
# kube-proxy-trg7v                           1/1     Running   0          6m   10.10.107.191   master-01<none><none>
# kube-scheduler-master-011/1     Running   0          6m   10.10.107.191   master-01<none><none>

# (2) このとき、マスターノードのステータスはReadyになっているはずです。
kubectl get node -o wide
# NAME        STATUS   ROLES    AGE   VERSION   INTERNAL-IP     EXTERNAL-IP   OS-IMAGE                KERNEL-VERSION              CONTAINER-RUNTIME
# master-01   Ready    master   7m   v1.18.410.10.107.191<none>        CentOS Linux 7(Core)5.7.0-1.el7.elrepo.x86_64   docker://19.3.9

# (3) ダウンロードした画像情報
docker images
# REPOSITORY                            TAG                 IMAGE ID            CREATED             SIZE
# mirrorgcrio/kube-proxy                v1.18.4             718fa77019f2        5 days ago          117MB
# mirrorgcrio/kube-apiserver            v1.18.4             408913fc18eb        5 days ago          173MB
# mirrorgcrio/kube-scheduler            v1.18.4             c663567f869e        5 days ago          95.3MB
# mirrorgcrio/kube-controller-manager   v1.18.4             e8f1690127c4        5 days ago          162MB
# calico/node                           v3.13.1             2e5029b93d4a        3 months ago        260MB
# calico/pod2daemon-flexvol             v3.13.1             e8c600448aae        3 months ago        111MB
# calico/cni                            v3.13.1             6912ec2cfae6        3 months ago        207MB
# calico/kube-controllers               v3.13.1             3971f13f2c6c        3 months ago        56.6MB
# mirrorgcrio/pause                     3.2                 80d28bedfe5d        4 months ago        683kB
# mirrorgcrio/coredns                   1.6.7               67da37a9a360        4 months ago        43.8MB
# mirrorgcrio/etcd                      3.4.3-0             303ce5db0e90        8 months ago        288MB

# (4) これで、ポッドネットワークをクラスターにデプロイして、calicoプラグインをデプロイする必要があります。(クラスターネットワークをインストールする)
kubectl apply -f calico-3.13.1.yaml
# configmap/calico-config created
# customresourcedefinition.apiextensions.k8s.io/bgpconfigurations.crd.projectcalico.org created
# customresourcedefinition.apiextensions.k8s.io/bgppeers.crd.projectcalico.org created
# customresourcedefinition.apiextensions.k8s.io/blockaffinities.crd.projectcalico.org created
# customresourcedefinition.apiextensions.k8s.io/clusterinformations.crd.projectcalico.org created
# customresourcedefinition.apiextensions.k8s.io/felixconfigurations.crd.projectcalico.org created
# customresourcedefinition.apiextensions.k8s.io/globalnetworkpolicies.crd.projectcalico.org created
# customresourcedefinition.apiextensions.k8s.io/globalnetworksets.crd.projectcalico.org created
# customresourcedefinition.apiextensions.k8s.io/hostendpoints.crd.projectcalico.org created
# customresourcedefinition.apiextensions.k8s.io/ipamblocks.crd.projectcalico.org created
# customresourcedefinition.apiextensions.k8s.io/ipamconfigs.crd.projectcalico.org created
# customresourcedefinition.apiextensions.k8s.io/ipamhandles.crd.projectcalico.org created
# customresourcedefinition.apiextensions.k8s.io/ippools.crd.projectcalico.org created
# customresourcedefinition.apiextensions.k8s.io/networkpolicies.crd.projectcalico.org created
# customresourcedefinition.apiextensions.k8s.io/networksets.crd.projectcalico.org created
# clusterrole.rbac.authorization.k8s.io/calico-kube-controllers created
# clusterrolebinding.rbac.authorization.k8s.io/calico-kube-controllers created
# clusterrole.rbac.authorization.k8s.io/calico-node created
# clusterrolebinding.rbac.authorization.k8s.io/calico-node created
# daemonset.apps/calico-node created
# serviceaccount/calico-node created
# deployment.apps/calico-kube-controllers created
# serviceaccount/calico-kube-controllers Created

注:次の手順に進む前に、すべてのコンテナーグループ(約9)が実行状態になるまでお待ちください。

# (0) 中国ではK8にアクセスできません.gcr.マスターノードから初期化するときにコントロールプレーンノードコマンドを追加した後、タイムアウト期間までioがスタックします。
# 解決:Dockerの公式のデフォルトミラーリングプラットフォームからイメージをプルし、タグを付け直してk8をバイパスします.gcr.ioアクセス。
kubeadm config images pull --image-repository mirrorgcrio
# [ config/images] Pulled mirrorgcrio/kube-apiserver:v1.18.4
# [ config/images] Pulled mirrorgcrio/kube-controller-manager:v1.18.4
# [ config/images] Pulled mirrorgcrio/kube-scheduler:v1.18.4
# [ config/images] Pulled mirrorgcrio/kube-proxy:v1.18.4
# [ config/images] Pulled mirrorgcrio/pause:3.2
# [ config/images] Pulled mirrorgcrio/etcd:3.4.3-0
# [ config/images] Pulled mirrorgcrio/coredns:1.6.7

kubeadm config images list --image-repository mirrorgcrio > gcr.io.log 
# 画像にk8sのタグを付け直します.gcr.io\画像名:バージョン
sed -e "s#\\(/.*$\\)#\1 k8s.gcr.io\1#g" gcr.io.log > gcr.io.log1
while read k8sgcrio;do
 docker tag ${k8sgcrio}
done < gcr.io.log1

# mirrorgcrioでタグを削除します
while read k8s;do
 docker rmi ${k8s}
done < gcr.io.log

# 最終効果
$docker images
# REPOSITORY                           TAG                 IMAGE ID            CREATED             SIZE
# k8s.gcr.io/kube-proxy                v1.18.4             718fa77019f2        6 days ago          117MB
# k8s.gcr.io/kube-scheduler            v1.18.4             c663567f869e        6 days ago          95.3MB
# k8s.gcr.io/kube-apiserver            v1.18.4             408913fc18eb        6 days ago          173MB
# k8s.gcr.io/kube-controller-manager   v1.18.4             e8f1690127c4        6 days ago          162MB
# k8s.gcr.io/pause                     3.2                 80d28bedfe5d        4 months ago        683kB
# k8s.gcr.io/coredns                   1.6.7               67da37a9a360        4 months ago        43.8MB
# k8s.gcr.io/etcd                      3.4.3-0             303ce5db0e90        8 months ago        288MB

# (1) APIServerはマスターIPとサーバー名の構成を実行します
APISERVER_IP=10.10.107.191
APISERVER_NAME=k8s.weiyigeek.top
echo "${APISERVER_IP} ${APISERVER_NAME}">>/etc/hosts

# (2) マスターノードからコントロールプレーンノードに参加します(certificate-key)2時間後に期限切れ
kubeadm join k8s.weiyigeek.top:6443--token opcpye.79zeofy6eo4h9ag6 \
 - - discovery-token-ca-cert-hash sha256:0795075090d621285dbaa4a76b9b320150f5ae3c37f5d7b92fc1c4f8942d9243 \
 - - control-plane --certificate-key 6dbee003011ac1dae15ae1fad3014ac8b568d154387aa0c43663d5fc47a109c4

# (3) kubernetes構成ファイルをユーザーのホームディレクトリにコピーします(実行されない場合、kubectlgetリソースは失敗します)
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

WeiyiGeek。マスターノードから

  1. 残りの2つのノードノードで kubeadmjoinコマンドを実行します。
# (1) APIServerはマスターIPとサーバー名の構成を実行します
APISERVER_IP=10.10.107.191
APISERVER_NAME=k8s.weiyigeek.top
echo "${APISERVER_IP} ${APISERVER_NAME}">>/etc/hosts

# (2) マスターノードによって管理されるクラスターにワーカーノードを追加します;
kubeadm join k8s.weiyigeek.top:6443--token opcpye.79zeofy6eo4h9ag6 \
 - - discovery-token-ca-cert-hash sha256:0795075090d621285dbaa4a76b9b320150f5ae3c37f5d7b92fc1c4f8942d9243
  1. K8sクラスターでetcdクラスターを構成し、etcd.yamlファイルの–initial-clusterパラメーターを変更して、3つのマスターノードマシンすべてがetcdクラスターに追加されるようにします。
# すべてのマスターノードマシンは次のように構成されています:[root@master-01~]$ grep -n "initial-cluster"/etc/kubernetes/manifests/etcd.yaml
21:- - - initial-cluster=master-01=https://10.10.107.191:2380,master-03=https://10.10.107.193:2380,master-02=https://10.10.107.192:2380[root@master-02~]$ grep -n "initial-cluster"/etc/kubernetes/manifests/etcd.yaml
21:- - - initial-cluster=master-01=https://10.10.107.191:2380,master-02=https://10.10.107.192:2380,master-03=https://10.10.107.193:238022:---initial-cluster-state=existing

[ root@master-03~]$ grep -n "initial-cluster"/etc/kubernetes/manifests/etcd.yaml
21:- - - initial-cluster=master-01=https://10.10.107.191:2380,master-03=https://10.10.107.193:2380,master-02=https://10.10.107.192:238022:---initial-cluster-state=existing

# 後でkubeを変更する-apiserveretcdはクラスター内の各ノードのIPに接続されています
[ root@master-01~]$ grep -n "etcd-servers"/etc/kubernetes/manifests/kube-apiserver.yaml
25:- - - etcd-servers=https://10.10.107.191:2379,https://10.10.107.192:2379,https://10.10.107.193:2379[root@master-02~]$ grep -n "etcd-servers"/etc/kubernetes/manifests/kube-apiserver.yaml
25:- - - etcd-servers=https://10.10.107.191:2379,https://10.10.107.192:2379,https://10.10.107.193:2379[root@master-03~]$ grep -n "etcd-servers"/etc/kubernetes/manifests/kube-apiserver.yaml
25:- - - etcd-servers=https://10.10.107.191:2379,https://10.10.107.192:2379,https://10.10.107.193:2379
  1. マスタークラスターが正常にデプロイされていることを確認します
kubectl get nodes -o wide
# NAME        STATUS   ROLES    AGE     VERSION   INTERNAL-IP     EXTERNAL-IP   OS-IMAGE                KERNEL-VERSION              CONTAINER-RUNTIME
# master-01   Ready    master   5d1h    v1.18.410.10.107.191<none>        CentOS Linux 7(Core)5.7.0-1.el7.elrepo.x86_64   docker://19.3.9
# master-02   Ready    master   4d13h   v1.18.410.10.107.192<none>        CentOS Linux 7(Core)5.7.0-1.el7.elrepo.x86_64   docker://19.3.9
# master-03   Ready    master   4d4h    v1.18.410.10.107.193<none>        CentOS Linux 7(Core)5.7.0-1.el7.elrepo.x86_64   docker://19.3.9
# worker-01   Ready    <none>   5d1h    v1.18.410.10.107.194<none>        CentOS Linux 7(Core)5.7.0-1.el7.elrepo.x86_64   docker://19.3.9
# worker-02   Ready    <none>   4d14h   v1.18.410.10.107.196<none>        CentOS Linux 7(Core)5.7.0-1.el7.elrepo.x86_64   docker://19.3.9

kubectl get pods -A -o wide
# NAMESPACE     NAME                                       READY   STATUS             RESTARTS   AGE     IP              NODE        NOMINATED NODE   READINESS GATES
# default       helloworld                                 0/1     CrashLoopBackOff   1089       3d21h   10.100.37.193   worker-02<none><none>
# kube-system   calico-kube-controllers-5b8b769fcd-ns9r4   1/1     Running            0          5d1h    10.100.184.65   master-01<none><none>
# kube-system   calico-node-8rn2s                          1/1     Running            0          4d4h    10.10.107.193   master-03<none><none>
# kube-system   calico-node-bg2g9                          1/1     Running            0          5d1h    10.10.107.191   master-01<none><none>
# kube-system   calico-node-d2vqd                          1/1     Running            0          4d13h   10.10.107.196   worker-02<none><none>
# kube-system   calico-node-n48dt                          1/1     Running            0          4d13h   10.10.107.192   master-02<none><none>
# kube-system   calico-node-whznq                          1/1     Running            1          5d1h    10.10.107.194   worker-01<none><none>
# kube-system   coredns-54f99b968c-2tqc4                   1/1     Running            0          5d1h    10.100.184.67   master-01<none><none>
# kube-system   coredns-54f99b968c-672zn                   1/1     Running            0          5d1h    10.100.184.66   master-01<none><none>
# kube-system   etcd-master-011/1     Running            0          4d2h    10.10.107.191   master-01<none><none>
# kube-system   etcd-master-021/1     Running            0          4d2h    10.10.107.192   master-02<none><none>
# kube-system   etcd-master-031/1     Running            0          4d4h    10.10.107.193   master-03<none><none>
# kube-system   kube-apiserver-master-011/1     Running            0          4d2h    10.10.107.191   master-01<none><none>
# kube-system   kube-apiserver-master-021/1     Running            0          4d2h    10.10.107.192   master-02<none><none>
# kube-system   kube-apiserver-master-031/1     Running            0          4d2h    10.10.107.193   master-03<none><none>
# kube-system   kube-controller-manager-master-011/1     Running            3          5d1h    10.10.107.191   master-01<none><none>
# kube-system   kube-controller-manager-master-021/1     Running            2          4d13h   10.10.107.192   master-02<none><none>
# kube-system   kube-controller-manager-master-031/1     Running            1          4d4h    10.10.107.193   master-03<none><none>
# kube-system   kube-proxy-5jjql                           1/1     Running            0          4d13h   10.10.107.196   worker-02<none><none>
# kube-system   kube-proxy-7ln9t                           1/1     Running            1          5d1h    10.10.107.194   worker-01<none><none>
# kube-system   kube-proxy-8x257                           1/1     Running            0          4d4h    10.10.107.193   master-03<none><none>
# kube-system   kube-proxy-gbm52                           1/1     Running            0          4d13h   10.10.107.192   master-02<none><none>
# kube-system   kube-proxy-trg7v                           1/1     Running            0          5d1h    10.10.107.191   master-01<none><none>
# kube-system   kube-scheduler-master-011/1     Running            1          5d1h    10.10.107.191   master-01<none><none>
# kube-system   kube-scheduler-master-021/1     Running            3          4d13h   10.10.107.192   master-02<none><none>
# kube-system   kube-scheduler-master-031/1     Running            2          4d4h    10.10.107.193   master-03<none><none>

# コンポーネントのヘルス情報を表示する
[ root@master-01~]$ kubectl get cs
NAME                 STATUS    MESSAGE             ERROR
scheduler            Healthy   ok
controller-manager   Healthy   ok
etcd-1               Healthy   {"health":"true"}
etcd-2               Healthy   {"health":"true"}
etcd-0               Healthy   {"health":"true"}[root@master-02~]$ kubectl get cs
NAME                 STATUS    MESSAGE             ERROR
scheduler            Healthy   ok
controller-manager   Healthy   ok
etcd-2               Healthy   {"health":"true"}
etcd-0               Healthy   {"health":"true"}
etcd-1               Healthy   {"health":"true"}[root@master-03~]$ kubectl get cs
NAME                 STATUS    MESSAGE             ERROR
controller-manager   Healthy   ok
scheduler            Healthy   ok
etcd-2               Healthy   {"health":"true"}
etcd-1               Healthy   {"health":"true"}
etcd-0               Healthy   {"health":"true"}

# 構成情報ビュー
kubectl get cm kubeadm-config -n kube-system -o yaml

# 選挙情報ビュー
kubectl get ep kube-controller-manager -n kube-system -o yaml

WeiyiGeek。選挙ビュー

  1. ワーカーノードを削除します
#(1) 削除するワーカーノードで実行します
kubeadm reset

# 最初のマスターノードマスター-01実行,ワーカーノードの名前は、kubectl getnodesコマンドを実行することで取得できます。;
kubectl delete node worker-02
  1. この時点で、単純なK8sクラスターがセットアップされ、最後に次のコマンドを使用してトークン障害の問題についてもう1つのポイントを追加します。「マスターマスターノードでコマンドを実行する必要があります」。
# (1) トークンが無効かどうかを確認します。デフォルトは24Hです。
kubeadm token list
# TOKEN                     TTL         EXPIRES                     USAGES                   DESCRIPTION                                                EXTRA GROUPS
# opcpye.79zeofy6eo4h9ag6   13h         2020-06-24T12:45:29+08:00   authentication,signing   <none>                                                     system:bootstrappers:kubeadm:default-node-token

## 道(1) ## 
# (2) ノードのkubeadmをk8sクラスターに参加させます(おすすめ)、このコマンドを使用して、initワークフローの単一ステージを呼び出します
kubeadm init phase upload-certs --upload-certs
# [ upload-certs] Using certificate key:
# 70 eb87e62f052d2d5de759969d5b42f372d0ad798f98df38f7fe73efdf63a13c
kubeadm token create --print-join-command
# kubeadm join apiserver.demo:6443--token bl80xo.hfewon9l5jlpmjft --discovery-token-ca-cert-hash sha256:b4d2bed371fe4603b83e7504051dcfcdebcbdcacd8be27884223c4ccc13059a4 
# 結合後の2番目と3番目のマスターノードの結合コマンドは次のようになります。:
kubeadm join apiserver.demo:6443--token ejwx62.vqwog6il5p83uk7y \
- - discovery-token-ca-cert-hash sha256:6f7a8e40a810323672de5eee6f4d19aa2dbdb38411845a1bf5dd63485c43d303 \
- - control-plane --certificate-key 70eb87e62f052d2d5de759969d5b42f372d0ad798f98df38f7fe73efdf63a13c
# (3) ワーカーノードが参加し、上記のトークンを直接実行します
 kubeadm join apiserver.demo:6443--token bl80xo.hfewon9l5jlpmjft --discovery-token-ca-cert-hash sha256:b4d2bed371fe4603b83e7504051dcfcdebcbdcacd8be27884223c4ccc13059a4 

## 道(2) ##
# 1) 失敗した場合は、トークンの有効期限が切れた後に再生成できます。
kubeadm token create
# 2 q41vx.w73xe9nrlqdujawu     ##これが新しいトークンです
# 2) CA(証明書)公開鍵のハッシュ値を取得します
openssl x509 -pubkey -in/etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null| openssl dgst -sha256 -hex | sed 's/^ .* //'
# ( stdin)= 43c8b7186efa9c68002aca3d4eed56fbc9e200c8550071a3dd1db99a10445713  ###これが公開鍵のハッシュ値です(マシン上の証明書はsha256値と同じままです)
# (3) ノードがクラスターに参加します
kubeadm join 192.168.80.137:6443--トークン新しく生成されたトークンをここに入力します--discovery-token-ca-cert-hash sha256:取得した公開鍵のハッシュ値をここに入力します
# kubeadm join apiserver.demo:6443--token 2q41vx.w73xe9nrlqdujawu  --discovery-token-ca-cert-hash sha256:43c8b7186efa9c68002aca3d4eed56fbc9e200c8550071a3dd1db99a10445713
  1. マスターノードのみが実行してノードおよびポッド関連の情報を表示できます。2)マスターマスターノードの初期化中にエラーが発生し、再構成が必要な場合は、次のコマンドを実行してリセットしてください。
systemctl stop kubelet
docker stop $(docker ps -aq)
docker rm -f $(docker ps -aq)
systemctl stop docker
kubeadm reset
rm -rf $HOME/.kube /etc/kubernetes
rm -rf /var/lib/cni//etc/cni//var/lib/kubelet/* 
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
systemctl start docker
systemctl start kubelet
  1. マスターノードに参加するときに飛行前の状態のままでいる場合は、2番目と3番目のノードで次のコマンドを確認してください: curl -ik https:// settings APISERVER:6443 / version
# 通常の状態
$curl -ik https://k8s.weiyigeek.top:6443/version
HTTP/1.1200 OK
Cache-Control: no-cache,private
Content-Type: application/json
Date: Wed,24 Jun 202002:16:23 GMT
Content-Length:263{"major":"1","minor":"18","gitVersion":"v1.18.4","gitCommit":"c96aede7b5205121079932896c4ad89bb93260af","gitTreeState":"clean","buildDate":"2020-06-17T11:33:59Z","goVersion":"go1.13.9","compiler":"gc","platform":"linux/amd64"}

0 x03 K8sクラスターを手動でインストールする(オフライン)####

説明:K8sのオフラインインストールとは、マシンが外部ネットワークに接続されていないときにK8Sクラスターをインストールすることを意味します。
2つのインストール方法:

基本的な要件:

1. 半自動オフラインインストール#####

説明:kubernetesの半自動オフラインインストールでは、オフラインダウンロードミラーを使用して、ローカルの内部Yumウェアハウスサーバーを構築します。次の準備を行う必要があります。

k8s.gcr.ioミラーダウンロード方法:

基本的なプロセス:
ステップ1.ローカルの内部yumウェアハウスを構築します(関連環境の依存関係パッケージをダウンロードします)

## グローバル変数
export K8SVERSION="1.18.5"export REGISTRY_MIRROR="https://xlx9erfu.mirror.aliyuncs.com"

## 基本的なシステム設定
hostnamectl set-hostname k8s-yum-server && echo "127.0.0.1 k8s-yum-server">>/etc/hosts
setenforce 0&& getenforce && hostnamectl status

## アプリケーションの基本設定
sed -i "s#keepcache=0#keepcache=1#g"/etc/yum.conf && echo -e "キャッシュディレクトリ:"&& grep "cachedir"/etc/yum.conf 
if[[!-d "/etc/docker/"]];then mkdir /etc/docker/;fi
cat >/etc/docker/daemon.json <<EOF
{" registry-mirrors":["REPLACE"]}
EOF
sed -i "s#REPLACE#${REGISTRY_MIRROR}#g"/etc/docker/daemon.json
systemctl daemon-reload
systemctl restart docker kubelet

## アプリのインストール設定
# 基本的な依存関係をインストールする
yum install -y yum-utils lvm2 wget nfs-utils
# ドッカーミラーウェアハウスを追加
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

cat <<'EOF'>/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

yum list docker-ce --showduplicates | sort -r
read -p 'インストールするDockerを入力してください-ceバージョン番号(例えば:19.03.9):' VERSION
yum install -y docker-ce-${VERSION} docker-ce-cli-${VERSION} containerd.io

yum list kubeadm --showduplicates | sort -r
# createrepoとhttpdは、内部ウェアハウスを構築するために必要なソフトウェアです
yum install -y kubelet-${K8SVERSION} kubeadm-${K8SVERSION} kubectl-${K8SVERSION} httpd createrepo
# 指定されたバージョンのdockerをインストールします-ceとkubelet、kubeadm
# yum install docker-ce-19.03.3-3.el7 kubelet-1.17.4-0 kubeadm-1.17.4-0 kubectl-1.17.4-0--disableexcludes=kubernetes

ステップ2.K8s.gcr.ioのミラーをローカルにダウンロードし、パッケージ化します

## DockerダウンロードK8s.gcr.ioミラー
kubeadm config images list --kubernetes-version=${K8SVERSION}2>/dev/null| sed 's/k8s.gcr.io/docker pull mirrorgcrio/g'| sudo sh
kubeadm config images list --kubernetes-version=${K8SVERSION}2>/dev/null| sed 's/k8s.gcr.io\(.*\)/docker tag mirrorgcrio\1 k8s.gcr.io\1/g'| sudo sh
kubeadm config images list --kubernetes-version=${K8SVERSION}2>/dev/null| sed 's/k8s.gcr.io/docker image rm mirrorgcrio/g'| sudo sh
docker save -o v${K8SVERSION}.tar $(docker images | grep -v TAG | cut -d ' '-f1)
# 画像パッケージの量を減らす
gzip v${K8SVERSION}.tar v${K8SVERSION}.tar.gz

ステップ3.yumキャッシュによってダウンロードされたrpmとk8sのパッケージ化されたイメージをhttpdアプリケーションサービスアクセスディレクトリ、つまり / var / www / html /に置き、内部のyumデータベースと情報インデックスファイルを生成します。

mv /etc/httpd/conf.d/welcome.conf{,.bak}
mkdir /var/www/html/yum/
find /var/cache/yum -name *.rpm -exec cp -a {}/var/www/html/yum/ \;
# 権限は非常に重要です。そうしないと、ダウンロードによって不十分な権限が要求されます
cp v${K8SVERSION}.tar.gz /var/www/html/yum/&& chmod +644/var/www/html/yum/v${K8SVERSION}.tar.gz

# 内部yumデータベースと情報インデックスファイルを生成します
createrepo -pdo /var/www/html/yum//var/www/html/yum/
createrepo --update /var/www/html/yum/

ステップ4.内部yumウェアハウスのhttpdサービスの起動とファイアウォールの設定

firewall-cmd --add-port=80/tcp --permanent
firewall-cmd --reload
systemctl start httpd

ステップ5.テンプレートを使用してマシンのクローンを作成し、内部ウェアハウスが正常に構成され、ソフトウェアを正常にインストールできるかどうかを確認します

echo "10.10.107.201 yum.weiyigeek.top">>/etc/hosts
cat >/etc/yum.repos.d/localyumserver.repo <<END
[ localyumserver]
name=localyumserver
baseurl=http://yum.weiyigeek.top/yum/
enabled=1
gpgcheck=0
END
yum --enablerepo=localyumserver --disablerepo=base,extras,updates,epel,elrepo,docker-ce-stable list

以下が正常に表示されれば作成は成功ですが、そうでない場合はエラーメッセージを参照して対応する調整を行ってください。

WeiyiGeek.localyumserver

export HOSTNAME=worker-03
# スワップとSELinuxを一時的に閉じます
swapoff -a && setenforce 0
# スワップとSELinuxを完全に閉じる
yes | cp /etc/fstab /etc/fstab_bak
cat /etc/fstab_bak |grep -v swap >/etc/fstab
sed -i "s/^SELINUX=.*$/SELINUX=disabled/"/etc/selinux/config

# ホスト名の設定(ここで、ホスト名は、上記のIPアドレスプランに対応するホスト名をインストールします-インストールされているホストによって異なります)
hostnamectl set-hostname $HOSTNAME
hostnamectl status

# ホスト名の設定
echo "127.0.0.1 $HOSTNAME">>/etc/hosts
cat >>/etc/hosts <<EOF
10.10.107.191 master-0110.10.107.192 master-0210.10.107.193 master-0310.10.107.194 worker-0110.10.107.196 worker-0210.20.172.200 worker-03
EOF

# 変更する/etc/sysctl.confはカーネルパラメータを設定します
egrep -q "^(#)?net.ipv4.ip_forward.*"/etc/sysctl.conf && sed -ri "s|^(#)?net.ipv4.ip_forward.*|net.ipv4.ip_forward = 1|g"/etc/sysctl.conf || echo "net.ipv4.ip_forward = 1">>/etc/sysctl.conf
egrep -q "^(#)?net.bridge.bridge-nf-call-ip6tables.*"/etc/sysctl.conf && sed -ri "s|^(#)?net.bridge.bridge-nf-call-ip6tables.*|net.bridge.bridge-nf-call-ip6tables = 1|g"/etc/sysctl.conf || echo "net.bridge.bridge-nf-call-ip6tables = 1">>/etc/sysctl.conf 
egrep -q "^(#)?net.bridge.bridge-nf-call-iptables.*"/etc/sysctl.conf && sed -ri "s|^(#)?net.bridge.bridge-nf-call-iptables.*|net.bridge.bridge-nf-call-iptables = 1|g"/etc/sysctl.conf || echo "net.bridge.bridge-nf-call-iptables = 1">>/etc/sysctl.conf
egrep -q "^(#)?net.ipv6.conf.all.disable_ipv6.*"/etc/sysctl.conf && sed -ri "s|^(#)?net.ipv6.conf.all.disable_ipv6.*|net.ipv6.conf.all.disable_ipv6 = 1|g"/etc/sysctl.conf || echo "net.ipv6.conf.all.disable_ipv6 = 1">>/etc/sysctl.conf
egrep -q "^(#)?net.ipv6.conf.default.disable_ipv6.*"/etc/sysctl.conf && sed -ri "s|^(#)?net.ipv6.conf.default.disable_ipv6.*|net.ipv6.conf.default.disable_ipv6 = 1|g"/etc/sysctl.conf || echo "net.ipv6.conf.default.disable_ipv6 = 1">>/etc/sysctl.conf
egrep -q "^(#)?net.ipv6.conf.lo.disable_ipv6.*"/etc/sysctl.conf && sed -ri "s|^(#)?net.ipv6.conf.lo.disable_ipv6.*|net.ipv6.conf.lo.disable_ipv6 = 1|g"/etc/sysctl.conf || echo "net.ipv6.conf.lo.disable_ipv6 = 1">>/etc/sysctl.conf
egrep -q "^(#)?net.ipv6.conf.all.forwarding.*"/etc/sysctl.conf && sed -ri "s|^(#)?net.ipv6.conf.all.forwarding.*|net.ipv6.conf.all.forwarding = 1|g"/etc/sysctl.conf || echo "net.ipv6.conf.all.forwarding = 1">>/etc/sysctl.conf
# 変更したカーネルパラメータをすぐに有効にします
sysctl -p

# ミラー加速
export REGISTRY_MIRROR="https://xlx9erfu.mirror.aliyuncs.com"if[[!-d "/etc/docker/"]];then mkdir /etc/docker/;fi
cat >/etc/docker/daemon.json <<EOF
{" registry-mirrors":["REPLACE"]}
EOF
sed -i "s#REPLACE#${REGISTRY_MIRROR}#g"/etc/docker/daemon.json
yum install -y --enablerepo=localyumserver --disablerepo=base,extras,updates,epel,elrepo,docker-ce-stable kubelet kubeadm kubectl
# Dockerの起動設定
sed -i "s#^ExecStart=/usr/bin/dockerd.*#ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --exec-opt native.cgroupdriver=systemd#g"/usr/lib/systemd/system/docker.service
# dockerを再起動し、kubeletを起動します
systemctl daemon-reload && systemctl enable kubelet
systemctl restart docker kubelet

WeiyiGeek.kube関連のコマンドインストールルーチン

ステップ8.yumウェアハウス内のイメージをローカル展開マシンにプルした後、docker loadコマンドを使用して、イメージを[ホスト](https://cloud.tencent.com/product/cdh?from=10680)ドッカーイメージストレージにインポートします。

wget -c http://10.10.107.201/yum/v1.18.5.tar.gz 
gzip -dv v1.18.5.tar.gz && docker load < v1.18.5.tar

WeiyiGeek。ミラーのインポート結果

ステップ9.ワーカーノードをクラスターに追加します

# (1) メインマスターノードが実行されています
[[ email protected]~]$kubeadm token create --print-join-command 2>/dev/null
kubeadm join k8s.weiyigeek.top:6443--token fvu5ei.akiiuhywibwxvdwh     --discovery-token-ca-cert-hash sha256:0795075090d621285dbaa4a76b9b320150f5ae3c37f5d7b92fc1c4f8942d9243

# (2) 作業ノードの実行がk8sクラスターに追加されます
APISERVER_IP=10.10.107.191
APISERVER_NAME=k8s.weiyigeek.top
echo "${APISERVER_IP} ${APISERVER_NAME}">>/etc/hosts

[[ email protected]~]$kubeadm join k8s.weiyigeek.top:6443--token fvu5ei.akiiuhywibwxvdwh     --discovery-token-ca-cert-hash sha256:0795075090d621285dbaa4a76b9b320150f5ae3c37f5d7b92fc1c4f8942d9243

# (3) マスターノードは、追加されたワーカーノードを確認します
$kubectl get nodes
NAME        STATUS   ROLES    AGE     VERSION
master-01   Ready    master   6d8h    v1.18.4
master-02   Ready    master   5d20h   v1.18.4
master-03   Ready    master   5d11h   v1.18.4
worker-01   Ready    <none>   6d8h    v1.18.4
worker-02   Ready    <none>   5d21h   v1.18.4
worker-03   Ready    <none>   11m     v1.18.5  #kubeletはv1なので.18.バージョン5、安定したバージョンは通常、実際の実稼働環境で使用されます

$kubectl get pods -A -n kube-system  -o wide | grep "worker-03"
kube-system   calico-node-f2vwk                          1/1     Running   0          2m14s   10.20.172.200   worker-03<none><none>
kube-system   kube-proxy-mwml4                           1/1     Running   0          2m5s    10.20.172.200   worker-03<none><none>

予防:

2. オフラインパッケージインストール(sealos)#####

説明:実稼働環境では、コントロールプレーンの高可用性を考慮する必要があります。ここでは、展開の便宜上、インストールに必要なすべてのバイナリファイル、ミラーファイル、systemd構成、yamlを含む、kubeadm [sealos](https://github.com/fanux/sealos)に基づく展開ツールを使用します。構成といくつかの簡単な起動スクリプト ;実稼働環境では、テスト環境でいくつかの準備をする必要はありません。sealosを使用すると、ノードの初期化関連の作業を自動的に完了できます。マスターノードに sealosバイナリファイル をダウンロードするだけで済みます。オフラインインストールパッケージを展開できます。

リソースを使用する:

基本的な説明:

クラスターの展開:

パラメータ名 意味 必要ですか
passwd サーバーパスワード 123456 秘密鍵から1つ選択してください
master k8sマスターノードIPアドレス 192.168.0.2 必須
node k8sノードノードIPアドレス 192.168.0.3 オプション
pkg-url ローカルでダウンロードできるオフラインリソースパッケージアドレス、またはリモートアドレス /root/kube1.16.0.tar.gz 必須
version リソースパッケージに対応するバージョン v1.16.0 必須
kubeadm-config カスタムkubeadm構成ファイル kubeadm.yaml.temp オプション
pk ssh秘密鍵アドレス、鍵が不要な場合に使用 /root/.ssh/id_rsa そしてpasswdが1つ選択
ユーザー sshユーザー名 ルート オプション
インターフェイス マシンネットワークカード名、CNIネットワークカード検出の使用 eth。* オプション
ネットワーク calicoフランネルなどのCNIタイプ calico オプション
podcidr ポッドネットワークセグメント 100.64.0.0 / 10 オプション
repo ミラーウェアハウス、オフラインパッケージは、ミラーを独自のプライベートウェアハウスにインポートしない限り、通常は構成する必要はありません k8s.gcr.io オプション
svccidr clusteripネットワークセグメント 10.96.0.0 / 22 オプション
without-cni ユーザーが他のCNIをインストールするためにcniプラグインをインストールしないでください オプション

作成したオフラインインストールパッケージ scp masterノードの / optディレクトリに置きます。

sealos init --master 10.10.107.109 \
 - - master 10.10.107.119 \
 - - master 10.10.107.121 \
 - - node 10.10.107.123 \
 - - node 10.10.107.124 \
 - - user root \
 - - passwd weiyigeek_test \
 - - version v1.17.4 \
 - - network calico \
 - - pkg-url /opt/kube1.17.4.tar.gz

展開が成功すると、次のプロンプトが表示されます。

15:37:35[ INFO][ssh.go:60][ssh][10.10.107.124:22]:15:37:35[INFO][ssh.go:11][ssh][10.10.107.124:22]exec cmd is : mkdir -p /etc/kubernetes/manifests
15:37:36[ DEBG][ssh.go:23][ssh][10.10.107.124:22]command result is:15:37:36[ALRT][scp.go:156][ssh][10.10.107.124:22]transfer total size is: 0MB
15:37:36[ INFO][ssh.go:36][ssh][10.10.107.124:22]exec cmd is : rm -rf /root/kube
15:37:36[ DEBG][print.go:20]==>SendPackage==>KubeadmConfigInstall==>InstallMaster0==>JoinMasters==>JoinNodes
15:37:36[ INFO][print.go:25] sealos install success.

予防:

Recommended Posts

2-Kubernetesエントリーマニュアルのインストールと展開
Centos6.5のインストールとKVMの展開
CentOs7のインストールと展開Zabbix3.4オリジナル
CentOS7でのErlang20.2のインストールと展開
JumpServer Bastion Host--CentOS 8のインストールと展開(4)
ubuntuDockerのインストールとRancherの展開
Ubuntuのインストールと展開Redash操作ノート(2020.08)
Centos-6.5LNMP環境のインストールと展開
Ubuntu環境でのNginxのインストールと展開
CentOSでのZabbixのインストールと展開およびローカリゼーション
CentOS7でのJenkinsのインストールと展開のチュートリアル
Centos7のインストールとAirflowの展開の詳細
CentOSでのMySQL8.0のインストールと展開、非常に詳細!
CentOS8でのMySQL8.0のインストール、展開、および構成のチュートリアル
Ubuntuインストールのマニュアル
PyCUDA-Ubuntu14.04のインストールとテスト
OpenMPI-Ubuntuのインストールと構成
Tungsten Fabricナレッジベース丨構築、インストール、およびパブリッククラウドの展開
CentOS7のインストールとエントリからマスターまでのnginxのメンテナンス
Centos8のOpenStackUssuriの最小限の展開とインストールの詳細なチュートリアル
Pythonの紹介と環境のインストール
Discourse CentOS8の新しいインストールマニュアル
Centosmysqlのインストールと構成
Centos7のインストールと構成のプロメテウス
CentOS7のインストールと構成PPTP
CentOSのインストールと構成cmake
Centos7.5のインストールと構成MongoDB4.0.4
CentOS7のインストールと構成PPTP
centos7kvmのインストールと使用
Ubuntuの展開とNexus3の経験
CentOS7postgresqlのインストールと使用
UbuntuPostgreSQLのインストールと構成
Caffe-Ubuntuのインストールと問題解決
Discourse CentOS8の新しいインストールマニュアル
Centos7elk7.1.1のインストールと使用