Kubeadm instala cluster K8s1.26
introdução básica
O cluster k8s 1.26.4 é instalado na máquina Centos7.9 com base em Kubeadm, o CRI usa containerd, o CNI usa Calico e as regras de roteamento usam ipvs. As etapas específicas serão explicadas em princípio e se concentrarão na consideração de aplicativos de cluster de nível empresarial. Espero que este artigo possa ajudar os leitores a dominar os princípios básicos do Kubeadm instalando k8s.
Introdução ao ambiente
nome da maquina | ip | versão do sistema | kernel do sistema | arquitetura da CPU |
---|---|---|---|---|
m1 | 10.11.81.152 | CentOS Linux versão 7.9 | 5.4.242-1.el7 | x86 |
w1 | 10.11.81.153 | CentOS Linux versão 7.9 | 5.4.242-1.el7 | x86 |
w2 | 10.11.81.154 | CentOS Linux versão 7.9 | 5.4.242-1.el7 | x86 |
w3 | 10.11.81.155 | CentOS Linux versão 7.9 | 5.4.242-1.el7 | x86 |
1. Inicialize o ambiente básico
1.1 Certifique-se de que o ip entre cada máquina pode acessar um ao outro
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 Atualize o kernel do sistema de cada máquina . O
kernel do sistema padrão do Centos7.9 é 3.10. O uso do ipvs requer uma versão do kernel superior a 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 Cada máquina está configurada para encaminhar IPv4 e permitir que o iptables veja o tráfego em ponte
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
Após a instalação do cluster, alterne para ipvs
1.4 Defina a sincronização de tempo para cada máquina
yum install chrony -y
systemctl start chronyd
systemctl enable chronyd
chronyc sources
1.5 Cada máquina fecha o firewall.
O ambiente de produção precisa abrir a porta do firewall conforme necessário. Obviamente, haverá uma máquina bastião com balanceamento de carga na frente do cluster K8s no ambiente de produção. Se ela não estiver voltada diretamente para a rede externa, você também pode fechar o firewall da máquina no cluster K8s.
systemctl stop firewalld
systemctl disable firewalld
1.6 Cada máquina fecha a troca, que é principalmente para considerações de desempenho
# 临时关闭
swapoff -a
# 永久关闭
sed -ri 's/.*swap.*/#&/' /etc/fstab
# 可以通过这个命令查看swap是否关闭了
free
Veja que a área Swap é 0
1.7 Desabilitar SELinux para cada máquina
# 临时关闭
setenforce 0
# 永久禁用
sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config
2. Instale o CRI
A partir da versão 1.20 do Kubernetes, o Docker não tem mais suporte oficial como tempo de execução de contêiner padrão. Para saber os motivos do Docker sem suporte, consulte o Anúncio de substituição do Docker do K8s
2.1 Instale o containerd em cada máquina
# 添加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 Instale a ferramenta crictl em cada máquina
# 安装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. Instale kubelet kubeadm kubectl
3.1 Instale kubelet kubeadm kubectl em cada máquina
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
A máquina de 3,2 m1 executa a inicialização do cluster
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 Se o kubelet falhar ao iniciar, verifique o arquivo de inicialização
cat /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
cat /var/lib/kubelet/kubeadm-flags.env
3.4 Comando de redefinição de erro de inicialização
kubeadm reset
rm -fr ~/.kube/ /etc/kubernetes/* var/lib/etcd/*
3.5 Uma saída semelhante indica sucesso
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 Adicionar 3 nós de trabalho ao cluster
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. Instale o plug-in de rede Calico
O plug-in CNI mais usado no ambiente corporativo atual é o Calico, que tem a vantagem de boa eficiência de encaminhamento e fácil verificação de erros Instalação de nó
de 4,1 m1 Método de instalação de documento oficial do plug-in 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 Após o sucesso, conforme mostrado na figura
5. mudar ipvs
5.1 Todas as máquinas executam etapas preparatórias
# 所有机器执行,为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 modificação do mapa de configuração do kube-proxy
#修改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. Operações opcionais subsequentes
1. Verifique se o cluster está disponível
# 使用 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>
Abreviação de kubectl de configuração de máquina de 6,2 m1 , muito prática na operação real
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