一、部署说明
1、主机操作系统说明
2、主机硬件配置说明
二、主机准备(没有特别说明都是三台都要配置)
1、配置主机名和IP
2、配置hosts解析
3、防火墙和SELinux
4、时间同步配置
5、配置内核转发及网桥过滤
6、关闭swap
7、启用ipvs
8、句柄数最大
9、系统优化
三、容器运行时工具安装及运行
1、安装docker
2、安装cri-dockerd
1. 下载最新版cri-dockerd rpm包
2、安装并启动cri-docker
3、cri-dockerd设置国内镜像加速
四、K8S软件安装
1、配置kubernetes源
2、查看所有可用的版本
3、安装kubelet、kubeadm、kubectl、kubernetes-cni
4、配置cgroup
五、K8S集群初始化
六、K8S集群工作节点加入
七、K8S集群网络插件使用
八、Kubectl命令自动补全
九、报错问题与解决
1、在替换默认源时----dnf makecache出现以下内容
2、在安装docker的,更新并安装Docker-CE时出现
3、在安装cri-dockerd时,
4、K8S集群初始化时
一、部署说明
1、主机操作系统说明
序号 | 操作系统及版本 | 备注 |
---|---|---|
1 | Rocky Linux release 9 | 下载链接:https://mirrors.163.com/rocky/9.5/isos/x86_64/Rocky-9.5-x86_64-minimal.iso |
2、主机硬件配置说明
作用 | IP地址 | 操作系统 | 配置 | 关键组件 |
---|---|---|---|---|
k8s-master01 | 192.168.131.137 | Rocky Linux release 9 | 2颗CPU 4G内存 100G硬盘 | kube-apiserver, etcd, etc |
k8s-node01 | 192.168.131.138 | Rocky Linux release 9 | 2颗CPU 4G内存 100G硬盘 | kubelet, kube-proxy |
k8s-node02 | 192.168.131.139 | Rocky Linux release 9 | 2颗CPU 4G内存 100G硬盘 | kubelet, kube-proxy |
网络规划表
网络类型 | CIDR | 用途说明 |
---|---|---|
节点管理网络 | 10.10.0.0/24 | SSH/K8s组件通信 |
Pod网络 | 10.244.0.0/16 | Flannel默认网段 |
Service网络 | 10.96.0.0/16 | ClusterIP地址池 |
Ingress网络 | 172.16.90.0/24 | 外部访问入口 |
二、主机准备(没有特别说明都是三台都要配置)
1、系统最小化安装。(最小内存) 2、替换默认源。
#这组命令的作用是把 Rocky Linux 的软件源配置文件中的官方镜像地址替换成阿里云的镜像地址,同时备份原配置文件sed -e 's|^mirrorlist=|#mirrorlist=|g' \-e 's|^#baseurl=http://dl.rockylinux.org/$contentdir|baseurl=https://mirrors.aliyun.com/rockylinux|g' \-i.bak \/etc/yum.repos.d/rocky*.repo#更新软件包元数据缓存dnf makecache
3、安装epel软件仓库,更换国内源1>. 在 Rocky Linux 9 中启用并安装 EPEL Repo。
dnf config-manager --set-enabled crb
dnf install epel-release
2>. 备份(如有配置其他epel源)并替换为国内镜像 注意最后这个库,阿里云没有对应的镜像,不要修改它,如果误改恢复原版源即可
cp /etc/yum.repos.d/epel.repo /etc/yum.repos.d/epel.repo.backup
cp /etc/yum.repos.d/epel-testing.repo /etc/yum.repos.d/epel-testing.repo.backup
cp /etc/yum.repos.d/epel-cisco-openh264.repo /etc/yum.repos.d/epel-cisco-openh264.repo.backup
3>. 将 repo 配置中的地址替换为阿里云镜像站地址执行下面语句,它会替换epel.repo、eple-testing.repo中的网址,不会修改epel-cisco-openh264.repo,可以正常使用。
sed -e 's!^metalink=!#metalink=!g' \-e 's!^#baseurl=!baseurl=!g' \-e 's!https\?://download\.fedoraproject\.org/pub/epel!https://mirrors.aliyun.com/epel!g' \-e 's!https\?://download\.example/pub/epel!https://mirrors.aliyun.com/epel!g' \-i /etc/yum.repos.d/epel{,-testing}.repo
现在我们有了 EPEL 仓库,更新仓库缓存
dnf clean all
dnf makecache
1、配置主机名和IP
#在131.137上配置
hostnamectl set-hostname k8s-master01
#在131.138上配置
hostnamectl set-hostname k8s-node01
#在131.139上配置
hostnamectl set-hostname k8s-node02
2、配置hosts解析
# cat >> /etc/hosts << EOF
172.16.90.11 k8s-master01
172.16.90.12 k8s-node01
172.16.90.13 k8s-node02
EOF# 配置免密登录,只在k8s-master01上操作
[root@k8s-master01 ~]# ssh-keygen -f ~/.ssh/id_rsa -N '' -q
# 点拷贝秘钥到其他 2 台节点
[root@k8s-master01 ~]# ssh-copy-id k8s-node01
[root@k8s-master01 ~]# ssh-copy-id k8s-node02
3、防火墙和SELinux
systemctl disable --now firewalld
sed -i '/^SELINUX=/ c SELINUX=disabled' /etc/selinux/config
setenforce 0
4、时间同步配置
#安装chrony
dnf install -y chrony
# 修改同步服务器
sed -i '/^pool/ c pool ntp1.aliyun.com iburst' /etc/chrony.conf
systemctl restart chronyd
systemctl enable chronyd
chronyc sources
出现以下内容:
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
^* 47.96.149.233 2 6 17 3 +77us[ +147us] +/- 34ms
5、配置内核转发及网桥过滤
添加网桥过滤及内核转发配置文件
# cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
vm.swappiness = 0
EOF
#加载br_netfilter模块
modprobe br_netfilter
#查看是否加载
lsmod | grep br_netfilter
br_netfilter 22256 0
bridge 151336 1 br_netfilter
使用新添加配置文件生效
# sysctl -p /etc/sysctl.d/k8s.conf
6、关闭swap
# 临时关闭
swapoff -a#永远关闭swap分区
sed -i 's/.*swap.*/#&/' /etc/fstab
7、启用ipvs
cat >> /etc/modules-load.d/ipvs.conf << EOF
br_netfilter
ip_conntrack
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
ip_vs_sh
nf_conntrack
ip_tables
ip_set
xt_set
ipt_set
ipt_rpfilter
ipt_REJECT
ipip
EOF#下载安装
dnf install ipvsadm ipset sysstat conntrack libseccomp -y
# 重启服务
systemctl restart systemd-modules-load.service
# 查看以下内容
lsmod | grep -e ip_vs -e nf_conntrack#出现以下内容
ip_vs_ftp 16384 0
nf_nat 61440 1 ip_vs_ftp
.....
nf_defrag_ipv4 16384 1 nf_conntrack
libcrc32c 16384 4 nf_conntrack,nf_nat,xfs,ip_vs
8、句柄数最大
ulimit -SHn 65535
cat >> /etc/security/limits.conf <<EOF
* soft nofile 655360
* hard nofile 131072
* soft nproc 655350
* hard nproc 655350
* seft memlock unlimited
* hard memlock unlimitedd
EOF
#查看修改结果
ulimit -a
9、系统优化
cat > /etc/sysctl.d/k8s_better.conf << EOF
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
vm.swappiness=0
vm.overcommit_memory=1
vm.panic_on_oom=0
fs.inotify.max_user_instances=8192
fs.inotify.max_user_watches=1048576
fs.file-max=52706963
fs.nr_open=52706963
net.ipv6.conf.all.disable_ipv6=1
net.netfilter.nf_conntrack_max=2310720
EOF
modprobe br_netfilterlsmod |grep conntrackmodprobe ip_conntracksysctl -p /etc/sysctl.d/k8s_better.conf
三、容器运行时工具安装及运行
1、安装docker
#安装依赖
yum install -y yum-utils device-mapper-persistent-data lvm2
#添加软件源信息
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/rhel/docker-ce.repo
#更新并安装Docker-CE
yum makecache fast
yum -y install docker-ce
#查看版本
docker -v
#出现以下
Docker version 27.5.1, build 9f9e405
# 设置国内镜像加速
mkdir -p /etc/docker/
cat >> /etc/docker/daemon.json << EOF
{"registry-mirrors":["https://p3kgr6db.mirror.aliyuncs.com","https://docker.m.daocloud.io","https://your_id.mirror.aliyuncs.com","https://docker.nju.edu.cn/","https://docker.anyhub.us.kg","https://dockerhub.jobcher.com","https://dockerhub.icu","https://docker.ckyl.me","https://cr.console.aliyun.com"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
#设置docker开机启动并启动
systemctl enable --now docker
#查看docker版本
docker version
2、安装cri-dockerd
1. 下载最新版cri-dockerd rpm包
网络条件好的话直接使用wget下载,网络条件一般的话可以在github上面先下载再上传到虚拟机
下载地址:Releases · Mirantis/cri-dockerd (github.com)。
https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.16/cri-dockerd-0.3.16-3.fc35.x86_64.rpm
2、安装并启动cri-docker
wget -c https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.16/cri-dockerd-0.3.16-3.fc35.x86_64.rpm
wget -c https://rpmfind.net/linux/almalinux/8.10/BaseOS/x86_64/os/Packages/libcgroup-0.41-19.el8.x86_64.rpm
yum install libcgroup-0.41-19.el8.x86_64.rpm
yum install cri-dockerd-0.3.16-3.fc35.x86_64.rpm
systemctl enable cri-docker但一般如果没有代理是安装不了的,可以上传cri-dockerd和他的lincgroup依赖包的包(私我)上传好后
顺序不要错
yum install libcgroup-0.41-19.el8.x86_64.rpm
yum install cri-dockerd-0.3.16-3.fc35.x86_64.rpm
systemctl enable cri-docke
3、cri-dockerd设置国内镜像加速
vim /usr/lib/systemd/system/cri-docker.service
------------------
修改第10行内容
ExecStart=/usr/bin/cri-dockerd --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9 --container-runtime-endpoint fd://
-----------------------------------
# 重启Docker组件
systemctl daemon-reload && systemctl restart docker cri-docker.socket cri-docker
# 检查Docker组件状态
systemctl status docker cir-docker.socket cri-docker
四、K8S软件安装
1、配置kubernetes源
#添加阿里云YUM软件源
cat <<EOF | tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.32/rpm/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.32/rpm/repodata/repomd.xml.key
EOF
2、查看所有可用的版本
yum list kubelet --showduplicates | sort -r |grep 1.32kubelet.x86_64 1.32.2-150500.1.1 kubernetes
kubelet.x86_64 1.32.1-150500.1.1 kubernetes
kubelet.x86_64 1.32.0-150500.1.1 kubernetes
kubelet.src 1.32.2-150500.1.1 kubernetes
kubelet.src 1.32.1-150500.1.1 kubernetes
kubelet.src 1.32.0-150500.1.1 kubernetes
kubelet.s390x 1.32.2-150500.1.1 kubernetes
kubelet.s390x 1.32.1-150500.1.1 kubernetes
kubelet.s390x 1.32.0-150500.1.1 kubernetes
kubelet.ppc64le 1.32.2-150500.1.1 kubernetes
kubelet.ppc64le 1.32.1-150500.1.1 kubernetes
kubelet.ppc64le 1.32.0-150500.1.1 kubernetes
kubelet.aarch64 1.32.2-150500.1.1 kubernetes
kubelet.aarch64 1.32.1-150500.1.1 kubernetes
kubelet.aarch64 1.32.0-150500.1.1 kubernetes
3、安装kubelet、kubeadm、kubectl、kubernetes-cni
yum install -y kubelet kubeadm kubectl kubernetes-cni
4、配置cgroup
为了实现docker使用的cgroupdriver与kubelet使用的cgroup的一致性,建议修改如下文件内容。
vim /etc/sysconfig/kubelet [3台全部设置下]
---------------------
添加
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
---------------------
设置kubelet为开机自启动即可,由于没有生成配置文件,集群初始化后自动启动
systemctl enable kubelet
-----------------------------------
五、K8S集群初始化
# 只在master01节点上操作创建初始化文件 kubeadm-init.yaml
kubeadm config print init-defaults > kubeadm-init.yaml
#修改如下配置:
#- advertiseAddress:为控制平面地址,( Master 主机 IP )
# advertiseAddress: 1.2.3.4
修改为 advertiseAddress: 172.16.90.11#- criSocket:为 containerd 的 socket 文件地址
# criSocket: unix:///var/run/containerd/containerd.sock
修改为 criSocket: unix:///var/run/cri-dockerd.sock# name: node
修改为 name: k8s-master01
#- imageRepository:阿里云镜像代理地址,否则拉取镜像会失败
# imageRepository: registry.k8s.io
修改为:imageRepository: registry.aliyuncs.com/google_containers#- kubernetesVersion:为 k8s 版本
# kubernetesVersion: 1.32.0
修改为:kubernetesVersion: 1.32.2#注意:一定要配置镜像代理,否则会由于防火墙问题导致集群安装失败文件末尾增加启用ipvs功能
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs
# 根据配置文件启动 kubeadm 初始化 k8skubeadm init --config=kubeadm-init.yaml --upload-certs --v=6
...
#(当出现以下就说明配置成功了)
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/config
Alternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
You 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 172.16.90.11:6443 --token abcdef.0123456789abcdef \--discovery-token-ca-cert-hash sha256:06faf8d64c03530bf88d1a34eae877b3d446ab5e4f0e071fc96567ccf53b1e70 #配置一下内容mkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/config
export KUBECONFIG=/etc/kubernetes/admin.conf
六、K8S集群工作节点加入
#所有的工作节点加入集群注意:加入集群时需要添加 (node1和node2添加)
--cri-socket unix:///var/run/cri-dockerd.sock
kubeadm join 172.16.90.11:6443 --token abcdef.0123456789abcdef \--discovery-token-ca-cert-hash sha256:06faf8d64c03530bf88d1a34eae877b3d446ab5e4f0e071fc96567ccf53b1e70 \--cri-socket unix:///var/run/cri-dockerd.sock[root@k8s-master01 ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
k8s-master01 NotReady control-plane 2m55s v1.32.2
k8s-node01 NotReady <none> 56s v1.32.2
k8s-node02 NotReady <none> 49s v1.32.2
七、K8S集群网络插件使用
网络插件选型对比
插件 | 网络模式 | 性能损耗 | 适用场景 |
---|---|---|---|
Flannel | VXLAN | 8-10% | 中小型集群 |
Calico | BGP | 3-5% | 大规模生产环境 |
Cilium | eBPF | 1-3% | 云原生安全场景 |
Weave | mesh | 10-15% | 混合云环境 |
# 只在master01上操作可能也需要代理,如果curl不下来,私我发包直接上传不用修改)
curl -O https://docs.projectcalico.org/archive/v3.28/manifests/calico.yaml
vim calico.yaml
以下两行默认没有开启,开始后修改第二行为kubeadm初始化使用指定的pod network即可。
3680 # The default IPv4 pool to create on startup if none exists. Pod IPs will be
3681 # chosen from this range. Changing this value after installation will have
3682 # no effect. This should fall within `--cluster-cidr`.
3683 - name: CALICO_IPV4POOL_CIDR
3684 value: "10.244.0.0/16"
3685 # Disable file logging so `kubectl logs` works.
#可以将镜像提前拉取下来,如果官网仓库不可达,可以尝试手动从quay.io下载镜像,quay.io是一个公共镜像仓库。(这步需要三台都要拉镜像)
docker pull calico/cni:v3.28.0
docker pull calico/node:v3.28.0
docker pull calico/kube-controllers:v3.28.0
#(可能也是需要代理才能拉下镜像来,私我发包直接上传,再按以下步骤)
docker load -i calico.tar.gz
docker images#部署calico网络(在master上)
[root@k8s-master01 ~]# kubectl apply -f calico.yaml
#检查:
[root@k8s-master01 ~]# kubectl get pod -n kube-system
NAME READY STATUS RESTARTS AGE
calico-kube-controllers-cb7c98d86-qbbmr 1/1 Running 0 10m
calico-node-68gc6 1/1 Running 0 10m
calico-node-gxcl8 1/1 Running 0 10m
calico-node-xj6xp 1/1 Running 0 10m
coredns-6766b7b6bb-dzbzb 1/1 Running 0 59m
coredns-6766b7b6bb-qmwjw 1/1 Running 0 59m
etcd-k8s-master01 1/1 Running 0 59m
kube-apiserver-k8s-master01 1/1 Running 0 59m
kube-controller-manager-k8s-master01 1/1 Running 0 59m
kube-proxy-gfv7j 1/1 Running 0 59m
kube-proxy-nfhvt 1/1 Running 0 57m
kube-proxy-pf2rs 1/1 Running 0 57m
kube-scheduler-k8s-master01 1/1 Running 0 59m
八、Kubectl命令自动补全
yum -y install bash-completion
source /usr/share/bash-completion/bash_completion
source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc
九、报错问题与解决
1、在替换默认源时----dnf makecache出现以下内容
1、检查网络连接(如果无法 ping 通,可能是网络配置问题,在管理出检查设备是否可以net连接)
ping mirrors.aliyun.com
如果网络连接正常,但域名解析失败,可能是 DNS 配置有问题。 /etc/resolv.conf
文件,添加一个可靠的 DNS 服务器,我这里是
search localdomain nameserver 192.168.131.2
你也可以写 Google 的公共 DNS:
nameserver 8.8.8.8
nameserver 8.8.4.4
2、在安装docker的,更新并安装Docker-CE时出现
加一个sudo就行
sudo yum makecache fast
3、在安装cri-dockerd时,
这表示没有cri-docker的依赖包libcgroup,只需要改变一下顺序:先安装libcgroup如下:
yum install libcgroup-0.41-19.el8.x86_64.rpm
yum install cri-dockerd-0.3.16-3.fc35.x86_64.rpm
4、K8S集群初始化时
1、出现重复字段和未知字段,如下
#进入到kubeadm-init.yaml里,将配置修改为以下内容(可以直接粘贴过去,但 advertiseAddress:后面的ip改为你自己的master IP地址)
vim kubeadm-init.yamlapiVersion: kubeadm.k8s.io/v1beta4
kind: InitConfiguration
bootstrapTokens:
- groups:- system:bootstrappers:kubeadm:default-node-tokentoken: abcdef.0123456789abcdefttl: 24h0m0susages:- signing- authentication
localAPIEndpoint:advertiseAddress: 192.168.131.137bindPort: 6443
nodeRegistration:criSocket: unix:///var/run/cri-dockerd.sockimagePullPolicy: IfNotPresentname: k8s-master01taints: null
timeouts:controlPlaneComponentHealthCheck: 4m0sdiscovery: 5m0setcdAPICall: 2m0skubeletHealthCheck: 4m0skubernetesAPICall: 1m0stlsBootstrap: 5m0supgradeManifests: 5m0s
---
apiVersion: kubeadm.k8s.io/v1beta4
kind: ClusterConfiguration
clusterName: kubernetes
imageRepository: registry.aliyuncs.com/google_containers
kubernetesVersion: 1.32.2
networking:dnsDomain: cluster.localserviceSubnet: 10.96.0.0/12
certificatesDir: /etc/kubernetes/pki
caCertificateValidityPeriod: 87600h0m0s
certificateValidityPeriod: 8760h0m0s
encryptionAlgorithm: RSA-2048
apiServer: {}
controllerManager: {}
scheduler: {}
etcd:local:dataDir: /var/lib/etcd
dns: {}
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs
再次执行 kubeadm init --config=kubeadm-init.yaml --upload-certs --v=6
2、kubelet没有运行
首先,检查 kubelet
是否正在运行:
systemctl status kubelet
如果 kubelet
没有运行,尝试启动它:
sudo systemctl start kubelet
然后再次检查状态:
systemctl status kubelet
再次执行 kubeadm init --config=kubeadm-init.yaml --upload-certs --v=6
3、问题 1:端口被占用。问题 2:文件已存在。问题 3:/var/lib/etcd
目录不为空问题/var/lib/etcd
目录不为空
#安装 net-tools
sudo dnf install net-tools -y
#检查端口占用
[root@k8s-master01 ~]# sudo netstat -tuln | grep -E '6443|10259|10257|10250|2379|2380'
tcp6 0 0 :::10250 :::* LISTEN
#运行以下命令停止 kubelet 服务:
sudo systemctl stop kubelet2. 检查 kubelet 是否仍在运行
运行以下命令确认 kubelet 是否已停止:
sudo systemctl status kubelet3. 清理 Kubernetes 环境
运行以下命令清理 Kubernetes 环境:
sudo kubeadm reset
sudo rm -rf /etc/kubernetes
sudo rm -rf /var/lib/etcd
sudo rm -rf $HOME/.kube
再次执行 kubeadm init --config=kubeadm-init.yaml --upload-certs --v=6