1.服务器
准备三台服务器,根据需要配置(最少2核2g否则不能启动kube)即可,可以是同样的操作系统的:
服务器 | IP | 配置 | 系统 |
---|---|---|---|
mater | 192.168.77.133 | 2核2G | CentOS 8.0 |
node1 | 192.168.77.134 | 2核2G | CentOS 8.0 |
node2 | 192.168.77.135 | 2核2G | CentOS 8.0 |
- master
$ hostnamectl
Static hostname: k8s-master
Icon name: computer-vm
Chassis: vm
Machine ID: c56c719798cd4cfaae573b3a1099208a
Boot ID: 328319d521024a8eb9726276b38cb629
Virtualization: vmware
Operating System: Ubuntu 20.04.6 LTS
Kernel: Linux 5.4.0-177-generic
Architecture: x86-64
- node1
$ hostnamectl
Static hostname: node1
Icon name: computer-vm
Chassis: vm
Machine ID: 47204371722d40bfb4fa6c11164aa070
Boot ID: e31cd84fda9347dbb2f285f2a713b939
Virtualization: vmware
Operating System: CentOS Stream 8
CPE OS Name: cpe:/o:centos:centos:8
Kernel: Linux 4.18.0-552.el8.x86_64
Architecture: x86-64
- node3
$ hostnamectl
Static hostname: node2
Icon name: computer-vm
Chassis: vm
Machine ID: 47204371722d40bfb4fa6c11164aa070
Boot ID: 93d50f3f32c44feb951fcffaec8ad179
Virtualization: vmware
Operating System: CentOS Stream 8
CPE OS Name: cpe:/o:centos:centos:8
Kernel: Linux 4.18.0-552.el8.x86_64
Architecture: x86-64
以下操作如未指定,均需要所有机器执行
2.关闭防火墙
关于防火墙的原因(
nftables
后端兼容性问题,产生重复的防火墙规则)
#centos
$ systemctl stop firewalld && systemctl disable firewalld
# ubuntu
$ systemctl stop ufw && systemctl disable ufw
4.关闭Swap
分区
kubeadm
默认会先检查当前主机是否禁用了Swap
,如果未禁用,则会强制终止部署k8s
过程。
4.1 临时关闭
$ swapoff -a
4.2 永久关闭
避免开机启动交换空间,需要把/etc/fstab
中的swap
注释掉
$ sed -i 's/.*swap.*/#&/' /etc/fstab
![](https://img.haomeiwen.com/i2648722/8e9708cee1db5183.png)
4.3 查看是否关闭
$ top
# 没关闭可以重启下
![](https://img.haomeiwen.com/i2648722/5fbe66fbcc376ee3.png)
5. 禁用selinux
关闭
selinux
后,容器便可允许访问宿主机的文件系统。
新的ubuntu系统默认没有安装selinux
5.1 临时关闭
$ setenforce 0
5.2 永久关闭
$ sed -i "s/^SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
6. 把桥接的IPv4流量传递到iptables的链
6.1 编辑配置文件
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
EOF
注意:将桥接的
IPv4
流量传递到iptables
的链 由于开启内核 ipv4 转发需要加载 br_netfilter 模块,需执行modprobe br_netfilter
bridge-nf
使得 netfilter 可以对 Linux 网桥上的 IPv4/ARP/IPv6 包过滤。比如,设置net.bridge.bridge-nf-call-iptables=1
后,二层的网桥在转发包时也会被 iptables的 FORWARD 规则所过滤。常用的选项包括:
net.bridge.bridge-nf-call-arptables
:是否在 arptables 的 FORWARD 中过滤网桥的 ARP 包net.bridge.bridge-nf-call-ip6tables
:是否在 ip6tables 链中过滤 IPv6 包net.bridge.bridge-nf-call-iptables
:是否在 iptables 链中过滤 IPv4 包net.bridge.bridge-nf-filter-vlan-tagged
:是否在 iptables/arptables 中过滤打了 vlan 标签的包。
6.2 执行生效
$ sysctl -p /etc/sysctl.d/k8s.conf
如果报找不到文件(sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-ip6tables: No such file or directory),需要先加载bridge和br_netfilter内核模块,执行如下代码:
sudo modprobe bridge
sudo modprobe br_netfilter
8. 服务器时间
8.1 设置时区
$ timedatectl set-timezone Asia/Shanghai
8.2 同步时间
使用chrony
实现同步
# ubuntu安装chrony
$ apt-get install chrony
# centos安装
$ yum install chrony -y
# 设置开机启动
$ systemctl enable chronyd --now
# 同步时间
$ chronyc sources
9. 配置DNS解析
$ cat >> /etc/hosts << EOF
192.168.77.133 master
192.168.77.134 node1
192.168.77.135 node2
EOF
问题:k8s集群安装时节点是否需要配置dns解析?
kubectl
是通过kubectl get node
出来的名称去连接的,所以我们需要在宿主机上能够解析到它。如果解析不到,可能连不上;
10. 安装IPVS
k8s从1.8版本开始,kube-proxy引入了IPVS模式,IPVS模式与iptables同样基于Netfilter,但是ipvs采用的hash表,iptables采用一条条的规则列表。
- ipvs 为大型集群提供了更好的可扩展性和性能
- ipvs 支持比 iptables 更复杂的负载均衡算法(最小负载、最少连接、加权等等)
- ipvs 支持服务器健康检查和连接重试等功能
- iptables 因为它纯粹是为防火墙而设计的,并且基于内核规则列表,集群数量越多性能越差
10.1 配置文件
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_ipv4
EOF
10.2 执行生效
$ chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4
上面脚本创建了的
/etc/sysconfig/modules/ipvs.modules
文件,保证在节点重启后能自动加载所需模块。 使用lsmod | grep -e ip_vs -e nf_conntrack_ipv4
命令查看是否已经正确加载所需的内核模块。
问题:
modprobe: FATAL: Module nf_conntrack_ipv4 not found in directory /lib/modules/4.18.0-552.1.1.el8.x86_64
解决:高版本的centos内核使用modprobe -- nf_conntrack
,修改vim /etc/sysconfig/modules/ipvs.modules
10.3 安装ipset
和ipvsadm
接下来还需要确保各个节点上已经安装了
ipset
软件包,为了便于查看ipvs
的代理规则,最好安装一下管理工具ipvsadm
。
$ yum install -y ipset ipvsadm
11. 安装Containerd
11.1 下载解压
# 下载二进制包
$ wget https://github.com/containerd/containerd/releases/download/v1.6.4/cri-containerd-cni-1.6.4-linux-amd64.tar.gz
# 解压到系统的根目录/中
$ sudo tar -zxvf cri-containerd-cni-1.6.4-linux-amd64.tar.gz -C /
etc/
etc/systemd/
etc/systemd/system/
etc/systemd/system/containerd.service
......
opt/cni/bin/vlan
opt/cni/bin/dhcp
opt/cni/bin/loopback
opt/cni/bin/ptp
最新包地址:https://github.com/containerd/containerd/releases/tag/v1.7.16
11.2 配置文件
a. 生成默认文件
# 创建目录,有则不创建
$ mkdir -p /etc/containerd
# 生成默认配置文件 如果用root用户执行提示没有containerd,看看是不是没有把`/usr/local/bin`加入环境变量
$ containerd config default > /etc/containerd/config.toml
b. 把cgroup driver设为systemd
# vim /etc/containerd/config.toml
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
...
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
SystemdCgroup = true # 将这里设置为true
c. 修改镜像源地址
[plugins."io.containerd.grpc.v1.cri"]
...
# sandbox_image = "k8s.gcr.io/pause:3.6"
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.7"
11.3 设置开机启动
$ systemctl enable containerd --now
11.4 测试结果
$ crictl version
Version: 0.1.0
RuntimeName: containerd
RuntimeVersion: v1.6.4
RuntimeApiVersion: v1
crictl 是Kubelet容器接口(CRI)的CLI和验证工具。。 你可以使用它来检查和调试 Kubernetes 节点上的容器运行时和应用程序。 crictl 和它的源代码在
cri-tools
仓库。安装完k8s会自动安装,也可以使用如下命令安装
VERSION="v1.24.2"
wget https://github.com/kubernetes-sigs/cri-tools/releases/download/$VERSION/crictl-$VERSION-linux-amd64.tar.gz
sudo tar zxvf crictl-$VERSION-linux-amd64.tar.gz -C /usr/local/bin
rm -f crictl-$VERSION-linux-amd64.tar.gz
如果有pod拉取镜像失败的话,如报错:
Failed to pull image "kubernetesui/dashboard:v2.6.1"
,可以在对应pod服务器里面手动拉取,ctr images pull kubernetesui/dashboard:v2.6.1
,也可以使用nerdctl
如果出现pulling image: rpc error: code = Unknown desc = failed to pull and unpack image "docker.io/kubernetesui/dashboard:v2.6.1": failed to resolve reference "docker.io/kubernetesui/dashboard:v2.6.1": pulling from host o2j0mc5x.mirror.aliyuncs.com failed with status code [manifests v2.6.1]: 403 Forbidden
这种问题就是需要做镜像了,目前有两种方式:
#方式1
$ vim /etc/containerd/conf.toml
[plugins."io.containerd.grpc.v1.cri".registry]
[plugins."io.containerd.grpc.v1.cri".registry.auths]
[plugins."io.containerd.grpc.v1.cri".registry.configs]
[plugins."io.containerd.grpc.v1.cri".registry.headers]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
#添加docker.io的对应镜像
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
endpoint = ["https://docker.m.daocloud.io","https://atomhub.openatom.cn"]
#重启服务
$systemctl daemon-reload && systemctl restart containerd
#方式2
#添加镜像目录
$ vim /etc/containerd/conf.yaml
[plugins."io.containerd.grpc.v1.cri".registry]
config_path = "/etc/containerd/certs.d"
[plugins."io.containerd.grpc.v1.cri".registry.auths]
#配置镜像
$ vim /etc/containerd/certs.d/docker.io/hosts.toml
server = "https://docker.io"
[host."https://o2j0mc5x.mirror.aliyuncs.com"]
capabilities = ["pull", "resolve"]
server = "https://k8s.gcr.io"
[host."https://gcr.mirrors.ustc.edu.cn/google-containers/"]
capabilities = ["pull", "resolve"]
server = "https://quay.io"
[host."https://mirror.ccs.tencentyun.com"]
capabilities = ["pull", "resolve"]
[host."https://docker.m.daocloud.io"]
capabilities = ["pull", "resolve"]
#重启服务
$systemctl daemon-reload && systemctl restart containerd
配置好之后如果还是不行,手动拉取一下
$ crictl pull docker.io/kubernetesui/dashboard:v2.6.1
以下是网上找到的镜像对应表
cr.l5d.io --> I5d.m.daocloud.io
docker.elastic.co --> elastic.m.daocloud.io
docker.io --> docker.m.daocloud.io
gcr.io --> gcr.m.daocloudio
ghcr.io --> ghcr.m.daocloud.io
k8s.gcr.io --> k8s-gcr.m.daocloud.io
registry.k8s.io --> k8s.m.daocloud.io
mcr.microsoft.com --> mcr.m.daocloud.io
nvcr.io --> nvcr.m.daocloud.io
quay.io --> quay.m.daocloud.io
registryjujucharms.com --> jujucharms.m.daocloud.io
rocks.canonical.com --> rocks-canonical.m.daocloud.io
网友评论