关闭防火墙、selinux、关闭交换分区、配置hosts网上教程很多,就不一一描述,可自行网上查找。
主机清单
| 系统 | K8S集群角色 | 服务器 | 主机名 | 
| CentOS7.9 | Master | 192.168.71.138 | master | 
| CentOS7.9 | Node1 | 192.168.71.139 | node1 | 
| CentOS7.9 | Node2 | 192.168.71.140 | node2 | 
版本说明
· contained version:1.6.8
· kubeadm version: 1.24.4
· kubectl version: 1.24.4
· kubelet version: 1.24.4
部署
1、配置内核参数
# 临时加载模块 modprobe br_netfilter # 永久生效(重启后仍保留) echo 'br_netfilter' | sudo tee /etc/modules-load.d/br_netfilter.conf modprobe br_netfilter # 检查文件是否存在 ls /proc/sys/net/bridge/bridge-nf-call-iptables # 检查模块是否加载 lsmod | grep br_netfilter ##修改内核参数 cat > /etc/sysctl.d/k8s.conf << EOF net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 vm.swappiness = 0 EOF # 禁止使用swap空间,只有当系统OOM时才允许使用它 vm.swappiness = 0 #生效 sysctl --system

2、配置yum源
## 更换阿里yum源 wget -O /etc/yum.repos.d/CenOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo yum chean all yum makecache ##下载常用的软件 yum install -y vim net-tools bash-completion wget lrzsz ##配置国内阿里云docker的repo源yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo ## 配置安装k8s组件需要的阿里云的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.gpghttp://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOF
3、配置IPVS
yum install -y ipvsadm ipset sysstat conntrack libseccomp cat > /etc/sysconfig/modules/ipvs.modules <<EOF #!/bin/bash ipvs_modules="ip_vs ip_vs_lc ip_vs_wlc ip_vs_rr ip_vs_wrr ip_vs_lblc ip_vs_lblcr ip_vs_dh ip_vs_sh ip_vs_fo ip_vs_nq ip_vs_sed ip_vs_ftp nf_conntrack ip_tables ip_set xt_set ipt_set ipt_rpfilter ipt_REJECT ipip " for kernel_module in \${ipvs_modules}; do/sbin/modinfo -F filename \${kernel_module} > /dev/null 2>&1if [ $? -eq 0 ]; then/sbin/modprobe \${kernel_module}fi done EOF chmod 755 /etc/sysconfig/modules/ipvs.modules sh /etc/sysconfig/modules/ipvs.modules lsmod | grep ip_vs
4、安装Containerd(二进制)
wget https://github.com/containerd/containerd/releases/download/v1.6.8/cri-containerd-1.6.8-linux-amd64.tar.gz
tar zxvf cri-containerd-1.6.8-linux-amd64.tar.gz

etc目录:主要为containerd服务管理配置文件及cni虚拟网卡配置文件;
opt目录:主要为gce环境中使用containerd配置文件及cni插件;
usr目录:主要为containerd运行时的二进制文件,包含runc;
拷贝二进制可执行文件至$PATH中

containerd 的安装包中一共有五个文件,通过上面的命令它们被安装到了 /usr/local/bin 目录中:
containerd:即容器的运行时,以 gRPC 协议的形式提供满足 OCI 标准的 API
containerd-release:containerd 项目的发行版发布工具
containerd-stress:containerd压力测试工具
containerd-shim:这是每一个容器的运行时载体,我们在 docker 宿主机上看到的 shim 也正是代表着一个个通过调用 containerd 启动的 docker 容器。
ctr:它是一个简单的 CLI 接口,用作 containerd 本身的一些调试用途,投入生产使用时还是应该配合docker 或者 cri-containerd 部署。
创建初始配置文件
Containerd 的默认配置文件为 /etc/containerd/config.toml
mkdir -p /etc/containerd/
# 创建默认得配置文件
containerd config default > /etc/containerd/config.toml
修改配置
替换镜像源,由于国内环境原因我们需要将 sandbox_image 镜像源设置为阿里云google_containers镜像源。
sed -i "s#k8s.gcr.io/pause#registry.cn-hangzhou.aliyuncs.com/google_containers/pause#g" /etc/containerd/config.toml
配置镜像加速
vim /etc/containerd/config.toml[plugins."io.containerd.grpc.v1.cri".registry.mirrors][plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]endpoint = ["https://zggody61.mirror.aliyuncs.co"] 注释:此步骤配置需要为阿里云服务器才可用,非阿里云服务器配置后可忽略,后边下载插件用到了其它镜像源
配置驱动器
sed -i 's#SystemdCgroup = false#SystemdCgroup = true#g' /etc/containerd/config.toml
创建服务管理配置文件
## 拷贝服务管理配置文件到/usr/lib/systemd/system/目录 grep -v ^# etc/systemd/system/containerd.service mv etc/systemd/system/containerd.service /usr/lib/systemd/system/containerd.service
启动 containerd 服务
systemctl daemon-reload systemctl enable --now containerd.service systemctl status containerd.service containerd --version

安装runc(二进制)
由于二进制包中提供的runC默认需要系统中安装seccomp支持,需要单独安装,且不同版本runC对seccomp版本要求不一致,所以建议单独下载runC 二进制包进行安装,里面包含了seccomp模块支持。下载地址:https://github.com/opencontainers/runc/releases

chmod +x runc.amd64 mv runc.amd64 /usr/bin/runc runc -version

配置crictl客户端
mv etc/crictl.yaml /etc/ # 若只有一行可把配置复制 cat /etc/crictl.yaml runtime-endpoint: unix:///run/containerd/containerd.sock image-endpoint: unix:///var/run/containerd/containerd.sock timeout: 10 debug: false
下载并安装kubeadm、kubectl、kubelet
yum install -y kubelet-1.24.4 kubeadm-1.24.4 kubectl-1.24.4 systemctl enable kubelet && systemctl start kubelet && systemctl status kubelet #上面可以看到kubelet状态不是running状态,这个是正常的,不用管,等k8s组件起来这个kubelet就正常了。 ##注:每个软件包的作用 Kubeadm: kubeadm是一个工具,用来初始化k8s集群的 kubelet: 安装在集群所有节点上,用于启动Pod的 kubectl: 通过kubectl可以部署和管理应用,查看各种资源,创建、删除和更新各种组件
设置Table键补全
# 让命令可用自动table键进行补全,对新手无法记住命令提供很好的支持,所在主机进行该操作方可使用table补全。 Kubectl命令补全 kubectl completion bash > /etc/bash_completion.d/kubelet Kubeadm命令补全 kubeadm completion bash > /etc/bash_completion.d/kubeadm
检测安装环境
kubeadm init --dry-run
镜像下载/导入
kubeadm config images list
列出需要使用的镜像列表
kubeadm config images list
拉取镜像
kubeadm config images pull \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.24.4
创建配置文件
创建默认的配置文件
kubeadm config print init-defaults > kubeadm-init.yaml
修改配置文件
apiVersion: kubeadm.k8s.io/v1beta3 bootstrapTokens: - groups:- system:bootstrappers:kubeadm:default-node-tokentoken: abcdef.0123456789abcdefttl: 24h0m0susages:- signing- authentication kind: InitConfiguration localAPIEndpoint:advertiseAddress: 192.168.71.138 #修改为控制节点IP(VIP)bindPort: 6443 nodeRegistration:criSocket: /run/containerd/containerd.sock #使用containerd为容器运行时imagePullPolicy: IfNotPresentname: master #修改为控制节点主机名taints: null --- apiServer:timeoutForControlPlane: 4m0s apiVersion: kubeadm.k8s.io/v1beta3 certificatesDir: /etc/kubernetes/pki clusterName: kubernetes controllerManager: {} dns: {} etcd:local:dataDir: /var/lib/etcd imageRepository: registry.aliyuncs.com/google_containers #修改为阿里镜像地址 kind: ClusterConfiguration kubernetesVersion: 1.24.4 #版本 networking:dnsDomain: cluster.localpodSubnet: 10.244.0.0/16 #指定Pod网段serviceSubnet: 10.96.0.0/12 #指定Service网段 scheduler: {} --- apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration mode: ipvs --- apiVersion: kubelet.config.k8s.io/v1beta1 kind: KubeletConfiguration cgroupDriver: systemd
初始化
kubeadm init --config kubeadm-init.yaml
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/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/configAlternatively, if you are the root user, you can run:export KUBECONFIG=/etc/kubernetes/admin.confYou should now deploy a pod network to the cluster. Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:https://kubernetes.io/docs/concepts/cluster-administration/addons/ Then you can join any number of worker nodes by running the following on each as root:kubeadm join 192.168.71.138:6443 --token abcdef.0123456789abcdef \--discovery-token-ca-cert-hash sha256:aa8cd7fe008ec286b790526fe1ba403aa93b093e3f001737676f62f6117ba3d4

根据初始化成功后的提示对集群进行基础的配置。
mkdir -p $HOME/.kube cp -i /etc/kubernetes/admin.conf $HOME/.kube/config chown $(id -u):$(id -g) $HOME/.kube/config export KUBECONFIG=/etc/kubernetes/admin.conf echo "KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bashrc && source ~/.bashrc kubectl get nodes

初始化master有问题,可将集群重置,再次初始化master
kubeadm reset
通过下面命令扩展node节点
kubeadm join 192.168.71.138:6443 --token abcdef.0123456789abcdef \--discovery-token-ca-cert-hash sha256:aa8cd7fe008ec286b790526fe1ba403aa93b093e3f001737676f62f6117ba3d4 注:该token 有效期为24小时。参数 --control-plane 就是加入控制节点,不带该参数就是加入工作节点。
查看集群状态
kubectl get nodes

通过查看集群状态可以看到,状态为NotReady,是因为还未安装网络插件,安装网络插件后就正常了,且node的点的角色为空,<none>就表示这个节点是工作节点。 按照如下方法,可以把node1,node2的ROLES变成work
kubectl label node node1 node-role.kubernetes.io/worker=worker
kubectl label node node2 node-role.kubernetes.io/worker=worker

安装插件
下载地址
curl https://projectcalico.docs.tigera.io/archive/v3.23/manifests/calico.yaml -O ##或者 wget https://docs.projectcalico.org/v3.23/manifests/calico.yaml --no-check-certificat
调整calico.yaml如下:
#新增两行配置 直接配置通配符 :value: "interface=ens.*" - name: IP_AUTODETECTION_METHODvalue: "interface=ens.*"

注意:在安装calico网络时,默认安装是IPIP网络。calico.yaml文件中,将CALICO_IPV4POOL_IPIP的值修改成 "off",就能够替换成BGP网络。ens.*是根据自己机器的网络来调整的。这样可以避很多calico网络错误。如下:

提前下载Calico镜像
grep image calico.yaml

预先下载calico相关的镜像
ctr images pull docker.io/calico/cni:v3.23.3 ctr images pull docker.io/calico/node:v3.23.3 ctr images pull docker.io/calico/kube-controllers:v3.23.3 或(上述因为镜像源得问题pull失败) ctr images pull quay.io/calico/cni:v3.23.3 ctr images pull quay.io/calico/node:v3.23.3 ctr images pull quay.io/calico/kube-controllers:v3.23.3 安装Calico网络插件 ##在其中一个master节点执行即可 注:需要更改calico.yaml 文件中镜像源(docker.io改成quay.io) kubectl apply -f calico.yaml 查看node节点和pod状态 kubectl get nodes kubectl get pods -n kube-system

安装CoreDNS域名解析插件
在kubeadm安装的k8s集群中,安装Calico网络插件后会自动安装CoreDNS插件
安装Metrics数据采集插件
下载yum文件
##下载最新版本的yaml文件https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
##指定下载v0.4.1版本https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.4.1/components.yaml
修改yaml文件
mv components.yaml metrics-server.yaml
containers:- args:- --cert-dir=/tmp- --secure-port=10250- --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname- --kubelet-use-node-status-port- --metric-resolution=15s- --kubelet-insecure-tls #跳过验证SSL证书 image: registry.aliyuncs.com/google_containers/metrics-server:v0.8.0
提前下载镜像
ctr images pull registry.aliyuncs.com/google_containers/metrics-server:v0.8.0
调整apiserver的配置
需要在kube-apiserver的配置文件中添加–enable-aggregator-routing=true参数来启用聚合认证
vim /etc/kubernetes/manifests/kube-apiserver.yaml
##增加如下内容:- --enable-aggregator-routing=true

更新apiserver的配置
kubectl apply -f /etc/kubernetes/manifests/kube-apiserver.yaml
kubectl get pods -n kube-system
安装metrics-server
kubectl apply -f metrics-server.yaml

## 查看pod状态
kubectl get pods -n kube-system

查看节点资源
kubectl top nodes

集群验证
kubectl get node

【参考:https://developer.aliyun.com/article/1323537】