美文网首页
K8s学习(一):安装前的准备

K8s学习(一):安装前的准备

作者: 呦丶耍脾气 | 来源:发表于2024-05-02 16:13 被阅读0次

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

4.3 查看是否关闭

$ top
# 没关闭可以重启下

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 安装ipsetipvsadm

接下来还需要确保各个节点上已经安装了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
 

相关文章

网友评论

      本文标题:K8s学习(一):安装前的准备

      本文链接:https://www.haomeiwen.com/subject/efmzxjtx.html