[ TOC]
説明:以前のK8sエントリシステムアーキテクチャを通じて、シングルノードマスターとワーカーの作業展開プロセスを予備的に理解しましたが、kuboardが提供するインストールスクリプトは、テストプラクティスとしてインストールできますが、実際には実稼働環境ではビジネスが複雑で多様であるため、クラスターの安全性と信頼性を確保するためにクラスターに依存する必要があります。
K8をインストールする前に、クラスター計画の次の側面から準備する必要があります。
説明:CentOS 7x OSを使用する場合は、カーネルバージョン( stable> = 4.19
)をアップグレードすることをお勧めします。そうしないと、一部のJavaコンテナーを実行するときに問題が発生する可能性があります。初期段階では、テスト環境にいくつかのJavaアプリケーションサービスをデプロイして、このような問題が発生するかどうかを確認できます。このような問題が発生した場合は、カーネルバージョンをアップグレードして解決を試みることができます。
Q:Javaコンテナがすぐにプルアップされると、クラスタ全体がCPUによって使い果たされます。JavaCPUの起動時のCPUリソース競合の問題を解決するにはどうすればよいですか?
A:この問題が発生しました。その後、カーネルを4.19にアップグレードした後、多くのメモリの枯渇は発生しなくなりました。カーネルのアップグレードにより、CPUの爆発的な問題を解決しました。
このドキュメントが要約されている時点(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」
docker-ce
バージョンの場合、公式のyumソースの最新バージョン、つまり docker-ce-19.03.9-3.el7
をデフォルトで使用できます。harbor
バージョンの場合、harbor [v2.0.0-rc1](https://github.com/goharbor/harbor/releases/tag/v2.0.0-rc1)がリリースされたばかりであることを考慮すると、使用することはお勧めしません。[v1.9.4](https://github.com/goharbor/harbor/releases/tag/v1.9.4)バージョンを選択することをお勧めします。今後問題が発生した場合は、アップグレードする必要があります。この問題を解決するには、安定版をリリースした v2.xx
へのアップグレードを検討してください。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 |
説明:インストールするために必要なコンポーネントとプラグインをカスタマイズする必要があるため、 kubeadm
を使用してK8S( single machine | cluster
)を手動でデプロイします。
説明: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
説明:主に、指定された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
説明:以下は、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.
# ワーカーノードでのみ実行されます
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
説明: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 | ワークノード |
ApiServerロードバランサー(プライベートネットワーク)関連:*
接続ポートの監視:6443 / TCP
バックエンドリソースグループ:master-01、master-02、master-03が含まれます。
ロードバランサーを実装する方法: nginx / haproxy / keepalived /クラウドプロバイダーが提供するロードバランシング製品
、ここでは一時的に説明しません。
注意を払う:*
作業手順:
基本環境:
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)が実行状態になるまでお待ちください。
(1)(2)
を実行する前に、使用したイメージをダウンロードする必要があります。# (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。マスターノードから
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
# すべてのマスターノードマシンは次のように構成されています:[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
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) 削除するワーカーノードで実行します
kubeadm reset
# 最初のマスターノードマスター-01実行,ワーカーノードの名前は、kubectl getnodesコマンドを実行することで取得できます。;
kubectl delete node worker-02
# (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
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
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"}
説明:K8sのオフラインインストールとは、マシンが外部ネットワークに接続されていないときにK8Sクラスターをインストールすることを意味します。
2つのインストール方法:
sealos
は純粋なgolangで開発されています。バイナリのみが必要で、カーネルのローカルロードに依存せず、haproxy keepalivedに依存しません。99年の証明書に依存しません。カスタム構成をサポートします。インストールツールはリソースパッケージから分離されています。オフラインインストール、さまざまなバージョンのインストールingress kuboard prometheusなどのAPP(アドオン)のインストールをサポートするために、異なるリソースパッケージを置き換えるだけで済みます基本的な要件:
説明:kubernetesの半自動オフラインインストールでは、オフラインダウンロードミラーを使用して、ローカルの内部Yumウェアハウスサーバーを構築します。次の準備を行う必要があります。
kubelet-1.18.4 kubeadm-1.18.4 kubectl-1.18.4
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>
予防:
kubeadm pull
関連のミラーを使用する場合、 kubeadm
のバージョンは kubernetes-version = $ {version}
のバージョンと同じである必要があります。それらが矛盾している場合、ミラーの一部のバージョンをプルダウンできません。対応するバージョンのkubernetesを使用する必要があります。鏡像にすることができます。pause:3.2 / etcd:3.4.3-0 / coredns:1.6.7
説明:実稼働環境では、コントロールプレーンの高可用性を考慮する必要があります。ここでは、展開の便宜上、インストールに必要なすべてのバイナリファイル、ミラーファイル、systemd構成、yamlを含む、kubeadm [sealos](https://github.com/fanux/sealos)に基づく展開ツールを使用します。構成といくつかの簡単な起動スクリプト ;実稼働環境では、テスト環境でいくつかの準備をする必要はありません。
sealosを使用すると、ノードの初期化関連の作業を自動的に完了できます。マスターノードに
sealosバイナリファイル と
をダウンロードするだけで済みます。オフラインインストールパッケージを展開できます。
リソースを使用する:
基本的な説明:
1.17.0〜1.17.5
または 1.18.0〜1.18.5
のオフラインインストールパッケージの場合、kubenetetsのバージョンのみが異なるミラーイメージを持ち、残りのプラグインバージョンは一貫しているため、 1.17.0 /1.18を使用することを選択できます。 .0
バージョンは、ニーズに合ったバージョンを作成することに基づいています。例:[1.18.0基本バージョン](http://store.lameleg.com:8080/pro/kubernetes1.18.0?time=1593396354742&referrer=null)クラスターの展開:
パラメータ名 | 意味 | 例 | 必要ですか |
---|---|---|---|
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