Kubeadm は K8s1.26 クラスターをインストールします

Kubeadm は K8s1.26 クラスターをインストールします

基本的な紹介

k8s クラスター 1.26.4 は Kubeadm に基づいて Centos7.9 マシンにインストールされ、CRI はcontainerd を使用し、CNI は Calico を使用し、ルーティング ルールは ipvs を使用します。具体的な手順は原則として説明され、エンタープライズ レベルのクラスター アプリケーションの検討に重点が置かれます。この記事が、読者が Kubeadm による k8 のインストールの基本原則を習得するのに役立つことを願っています。

環境紹介

マシン名 ip システムバージョン システムカーネル CPUアーキテクチャ
m1 10.11.81.152 CentOS Linux リリース 7.9 5.4.242-1.el7 x86
w1 10.11.81.153 CentOS Linux リリース 7.9 5.4.242-1.el7 x86
w2 10.11.81.154 CentOS Linux リリース 7.9 5.4.242-1.el7 x86
w3 10.11.81.155 CentOS Linux リリース 7.9 5.4.242-1.el7 x86

1. 基本環境の初期化

1.1各マシン間の IP が相互にアクセスできることを確認する

cat /etc/hosts
10.11.81.152  m1
10.11.81.153  w1
10.11.81.154  w2
10.11.81.155  w3

1.2各マシンのシステム カーネルをアップグレードします。Centos7.9
のデフォルトのシステム カーネルは 3.10 です。ipvs を使用するには、カーネル バージョン 4.1 以降が必要です。

#安装ELRepo仓库的yum源
yum install -y https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm

#更新yum源仓库
yum -y update

#查看可用的系统内核包
yum  --disablerepo="*"  --enablerepo="elrepo-kernel"  list  available
# 长期维护版本为lt,最新主线稳定版为ml

#选择的是长期维护版本kernel-lt,如需更新最新稳定版选择kernel-ml,建议选择长期维护版,目前为5.4版本,内核版本过高也不好
yum  --enablerepo=elrepo-kernel  install  -y  kernel-lt

#查看可用内核版本及启动顺序
awk -F\' '$1=="menuentry " {print i++ " : " $2}' /boot/grub2/grub.cfg

0 : CentOS Linux (5.4.108-1.el7.elrepo.x86_64) 7 (Core)
1 : CentOS Linux (3.10.0-1160.11.1.el7.x86_64) 7 (Core)
2 : CentOS Linux (3.10.0-1160.el7.x86_64) 7 (Core)
3 : CentOS Linux (0-rescue-20210128140208453518997635111697) 7 (Core)

#安装辅助工具
yum install -y grub2-pc

#设置内核默认启动顺序
grub2-set-default 0

#编辑/etc/default/grub文件
vim /etc/default/grub

#设置GRUB_DEFAULT=0  #只需要修改这里即可
sed -i 's/GRUB_DEFAULT=saved/GRUB_DEFAULT=0/g' /etc/default/grub

#生成grub 配置文件
# 运行grub2-mkconfig命令来重新创建内核配置
grub2-mkconfig -o /boot/grub2/grub.cfg

#重启系统
reboot
# 或者
shutdown -r now

#重启完成后,查看内核版本是否正确
uname -r

1.3各マシンは IPv4 を転送するように設定され、iptables がブリッジされたトラフィックを認識できるようにする

cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

sudo modprobe overlay
sudo modprobe br_netfilter

# 设置所需的 sysctl 参数,参数在重新启动后保持不变
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF

# 应用 sysctl 参数而不重新启动
sudo sysctl --system

クラスターがインストールされたら、ipvs に切り替えます

1.4各マシンの時刻同期を設定する

yum install chrony -y
systemctl start chronyd
systemctl enable chronyd
chronyc sources

1.5各マシンがファイアウォールを閉じる
運用環境では、必要に応じてファイアウォール ポートを開く必要があります。もちろん、本番環境では K8s クラスターの前に負荷分散された要塞マシンが配置されますが、外部ネットワークに直接面していない場合は、K8s クラスター内のマシンのファイアウォールを閉じることもできます。

systemctl stop firewalld
systemctl disable firewalld

1.6各マシンはスワップを終了します。これは主にパフォーマンスを考慮するためです。

# 临时关闭
swapoff -a
# 永久关闭
sed -ri 's/.*swap.*/#&/' /etc/fstab
# 可以通过这个命令查看swap是否关闭了
free

スワップ領域が 0 であることを確認します。
ここに画像の説明を挿入
1.7各マシンのSELinux を無効にします。

# 临时关闭
setenforce 0
# 永久禁用
sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config

2. CRIをインストールする

Kubernetes バージョン 1.20 以降、Docker はデフォルトのコンテナー ランタイムとして正式にサポートされなくなりました。Docker がサポートされない理由については、K8s Docker の廃止のお知らせを参照してください。

2.1各マシンにcontainerdをインストールする

# 添加docker源
curl -L -o /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 安装containerd
yum install -y containerd.io
# 创建默认配置文件
containerd config default > /etc/containerd/config.toml
# 设置aliyun地址,不设置会连接不上, 如果无法下载镜像检查一下配置是否替换 cat /etc/containerd/config.toml |grep sandbox_image
# 将pause:3.6替换为pause:3.9,如果有关版本发生变化需要修改
sed -i "s#registry.k8s.io/pause:3.6#registry.aliyuncs.com/google_containers/pause:3.9#g" /etc/containerd/config.toml
# 设置驱动为systemd,Kubernetes官网推荐设置
sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml
# 设置dicker地址为aliyun镜像地址
sed -i '/\[plugins\."io\.containerd\.grpc\.v1\.cri"\.registry\.mirrors\]/a\      [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]\n        endpoint = ["https://8aj710su.mirror.aliyuncs.com" ,"https://registry-1.docker.io"]' /etc/containerd/config.toml

# 重启服务
systemctl daemon-reload
systemctl enable --now containerd
systemctl restart containerd

# 查看是否安装成功
containerd -version

2.2各マシンにcrictl ツールをインストールする

# 安装crictl工具
yum install -y cri-tools
# 生成配置文件
crictl config runtime-endpoint
# 编辑配置文件
cat << EOF | tee /etc/crictl.yaml
runtime-endpoint: "unix:///run/containerd/containerd.sock"
image-endpoint: "unix:///run/containerd/containerd.sock"
timeout: 10
debug: false
pull-image-on-create: false
disable-pull-on-run: false
EOF

# 查看是否安装成功
crictl info
crictl version

3. kubelet kubeadm kubectl をインストールします

3.1各マシンにkubelet kubeadm kubectl をインストールする

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
exclude=kubelet kubeadm kubectl #添加可以确保不发生版本漂移
EOF

# 安装指定版本
sudo yum install -y kubelet-1.26.4 kubeadm-1.26.4 kubectl-1.26.4 --disableexcludes=kubernetes

#启动kubelet
systemctl enable kubelet

3.2 m1 マシンはクラスターの初期化を実行します

kubeadm init \
  --apiserver-advertise-address=10.11.81.152 \
  --image-repository registry.aliyuncs.com/google_containers \
  --kubernetes-version v1.26.4 \
  --service-cidr=172.16.0.0/16 \
  --pod-network-cidr=10.244.0.0/16 \
  --ignore-preflight-errors=all

3.3 kubelet の起動に失敗した場合は起動ファイルを確認する

cat /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
cat /var/lib/kubelet/kubeadm-flags.env

3.4 初期化エラーリセットコマンド

kubeadm reset
rm -fr ~/.kube/  /etc/kubernetes/* var/lib/etcd/*

3.5 同様の出力が成功を示します

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

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 10.11.81.152:6443 --token abcdef.1234567890abcdef \
    --discovery-token-ca-cert-hash sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef

3.6 クラスターに 3 つのワーカー ノードを追加する

kubeadm join 10.11.81.152:6443 --token abcdef.1234567890abcdef \
    --discovery-token-ca-cert-hash sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef

#如果出现如下错误
[ERROR FileContent--proc-sys-net-ipv4-ip_forward]: /proc/sys/net/ipv4/ip_forward contents are not set to 1
#执行
sysctl -w net.ipv4.ip_forward=1

4. Calico ネットワーク プラグインをインストールする

現在のエンタープライズレベルの環境で最も使用されている CNI プラグインは Calico です。これには、優れた転送効率と簡単なエラーチェックという利点があります。
4.1 m1 ノードのインストール Calico プラグインの公式ドキュメントのインストール方法

# 创建一个yaml文件存放目录
mkdir /root/cni
cd /root/cni

# 下载operator & custom-resources
wget https://raw.githubusercontent.com/projectcalico/calico/v3.25.1/manifests/tigera-operator.yaml
wget https://raw.githubusercontent.com/projectcalico/calico/v3.25.1/manifests/custom-resources.yaml

# 修改custom-resources.yaml匹配容器网络 --pod-network-cidr=10.244.0.0/16
vi custom-resources.yaml #cidr: 192.168.0.0/16 -> cidr: 10.244.0.0/16

# 器群启动calico网络
kubectl create -f tigera-operator.yaml
kubectl create -f custom-resources.yaml

4.2 成功後、図に示すように
ここに画像の説明を挿入

5.ipvsを切り替える

5.1すべてのマシンが準備ステップを実行します

# 所有机器执行,为kube-proxy开启ipvs的前提需要加载以下的内核模块
cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack
EOF

# 执行加载命令,检查是否完成加载
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack

# 所有机器ipset软件包
yum install -y ipset ipvsadm

5.2 m1 マシンがkube-proxy configmap を変更する

#修改kube-proxy configmap为ipvs模式
kubectl edit configmap kube-proxy -n kube-system

...
    kind: KubeProxyConfiguration
    metricsBindAddress: ""
    mode: "ipvs"  # "" 改成 ipvs
    nodePortAddresses: null
    oomScoreAdj: null
...
 
configmap/kube-proxy edited

# 重启kube-proxy容器
kubectl  delete pods -n kube-system -l k8s-app=kube-proxy

# 成功验证
kubectl -n kube-system logs kube-proxy-qmdhp|grep ipvs

I0415 10:48:49.984477       1 server_others.go:259] Using ipvs Proxier.
 # 在 kube-proxy pod 看到如上信息后说明是启用ipvs的

6. 以降のオプション操作

1. クラスターが使用可能かどうかを確認します

# 使用 deployment 控制器部署镜像
kubectl create deployment nginx-demo --image=nginx --replicas=1
deployment.apps/nginx-demo created

# 创建service暴露方式为NodePort
kubectl expose deployment nginx-demo --port=80 --target-port=80 --type=NodePort
service/nginx-demo exposed

# 访问Nginx资源
kubectl get svc
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   172.16.0.1      <none>        443/TCP        5h59m
nginx-demo   NodePort    172.16.17.244   <none>        80:30392/TCP   11s

curl http://9.46.255.229:30392
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html {
    
     color-scheme: light dark; }
body {
    
     width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

6.2 m1 マシン設定の kubectl 略語、実際の操作で非常に実用的

cat >> ~/.bashrc << EOF 
alias kg='kubectl get'
alias k='kubectl'
alias kd='kubectl describe pods'
alias ke='kubectl explain'
alias ka='kubectl apply'
EOF

source ~/.bashrc

おすすめ

転載: blog.csdn.net/weixin_46660849/article/details/130580689