My logo
Published on

K8s离线安装

k8s-install

一、k8s环境初始化

🔊🔊 注意:所有主机均需操作

1.1 环境准备

服务器要求:

  • 建议最小硬件配置:2核CPU、2G内存、20G硬盘
  • 操作系统是龙栖:AnolisOS

软件环境:

  • 操作系统:AnolisOS9.6
  • Docker:20.10.8
  • K8s:v1.27.6
角色IP地址
k8s-master192.168.1.100
k8s-node1192.168.1.101
k8s-node2192.168.1.102

1.2 主机域名解析

为了方便后面集群节点的直接调用,在这配置以下主机域名解析,企业中推荐使用内部DNS服务器

# 重点:必须先执行,不然后面获取的是localhost地址
hostnamectl set-hostname k8s-master

# 设置服务器使用名称访问
cat >> /etc/hosts <<EOF
192.168.1.100 k8s-master
192.168.1.101 k8s-node1
192.168.1.102 k8s-node2
EOF

1.3 时间同步(选装)

k8s要求集群中节点时间必须精确一致,这里直接使用ntp服务从网络同步时间,企业中建议配置内部的时间服务器,优先使用yum list确认nptdate服务是否安装若已经安装, 则直接配置crontab任务,若本地有ntpdate时钟同步器,则直接与其同步,若可以连接互联网,那么也可以直接与阿里时钟同步器进行时间同步,本实验与阿里时钟同步器进行同步ntpdate time1.aliyun.com

# 安装网络工具
yum install net-tools

# 检查是否部署ntp服务
yum list |grep ntpdate

# 若未安装ntp服务,则执行下面安装 
yum -y install ntpdate

# 与阿里在线时间进行同步时间
ntpdate time1.aliyun.com

# 检查crontab内容 ,修改常见crontab命令为“crontab -e”
crontab -l
0 */1 * * * /usr/sbin/ntpdate time1.aliyun.com

1.4 禁用iptables和firewalld服务

kubernetesdocker在运行中会产生大量的iptables规则,为了不让系统规则跟他们混淆,直接关闭系统的规则

systemctl stop firewalld
systemctl disable firewalld
iptables -F

1.5 禁用selinux

selinuxlinux系统下一个安全服务,如果不关闭它,在安装k8s集群中会产生各种各样的奇怪问题

# 编辑/etc/selinux/config文件,修改SELINUX的值为disabled
sed -ri 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

# 注意修改完毕之后需要重启linux服务
setenforce 0

1.6 禁用swap分区

swap分区指的是虚拟内存分区,它的作用是在物理内存使用完之后,将磁盘空间虚拟成内存来使用,启用swap设备会对系统的性能产生非常负面的影响,因此kubernetes要求每个节点都要禁用swap设备,但是如果因为某些原因不能关闭swap分区,就需要在集群安装过程中明确的参数进行配置说明

# 临时关闭swap分区
swapoff -a

# 永久关闭swap分区,注意修改完毕之后需要重启linux服务生效
sed -i '/swap/ s/^/#/' /etc/fstab
setenforce 0

1.7 修改linux内核参数

# 临时关闭swap分区
# 添加网桥过滤和地址转发功能
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

cat > /etc/sysctl.conf <<EOF
net.ipv4.ip_forward=1
EOF

# 重新加载配置
sysctl -p

# 加载网桥过滤模块
modprobe br_netfilter

# 查看网桥过滤是否加载成功
lsmod|grep br_netfilter

1.8 配置ipvs功能(选装)

kubernetesservice有两种代理模型,一种是基于iptables的,一种是基于ipvs的,两者比较的话,ipvs性能明显高一些,但是如果要使用它,需要手动载入ipvs模块

# 安装ipset和ipvsadm
yum -y install ipset ipvsadm

# 添加需要加载的模块写入脚本文件
cat <<EOF > /etc/sysconfig/modules/ipvs.modules
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack
EOF

# 为脚本文件添加执行权限
chmod +x /etc/sysconfig/modules/ipvs.modules

# 执行脚本文件
/bin/bash /etc/sysconfig/modules/ipvs.modules

# 查看对应的模块是否加载成功
lsmod | grep -e ip_vs -e nf_conntrack

二、docker离线安装部署

💥💥 注意,如果安装了docker就无需安装containerd,docker和containerd选一个装就行

2.1 官网下载 docker 离线安装包

wget https://download.docker.com/linux/static/stable/x86_64/docker-20.10.8.tgz

2.2 解压docker离线安装包

tar -zxvf docker-20.10.8.tgz

2.3 将解压之后的docker文件移到bin目录下

sudo cp docker/* /usr/bin/

2.4 将docker注册成系统启动服务

cat > /etc/systemd/system/docker.service <<'EOF'
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target

[Service]
Type=notify
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=infinity
LimitNPROC=infinity
TimeoutStartSec=0
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s

[Install]
WantedBy=multi-user.target
EOF
# 给文件增加可执行权限
chmod +x /etc/systemd/system/docker.service

2.5 配置镜像下载加速器

mkdir /etc/docker
cat >/etc/docker/daemon.json <<EOF
{
    "registry-mirrors": [
        "https://do.nark.eu.org",
        "https://dc.j8.work",
        "https://docker.m.daocloud.io",
        "https://dockerproxy.com",
        "https://docker.mirrors.ustc.edu.cn",
        "https://docker.nju.edu.cn"
    ],
    "exec-opts": ["native.cgroupdriver=systemd"]
}
EOF

2.6 将docker加入开机自启并启动

systemctl daemon-reload
systemctl enable docker --now

三、docker-cri离线安装部署

🔊🔊 Kubernetes v1.24移除docker-shim的够支持到CRI规范的桥梁,支持,而Docker Engine默认又不支持CRI标准,因此二者默认无法再直接集成。为此,Mirantis和Docker联合创建了cri-dockerd项目,用于为Docker Engine提供一个能从而能够让Docker作为Kubernetes容器引擎。

docker-cri离线安装包下载地址

3.1 下载docker-cri离线安装包

wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.15/cri-dockerd-0.3.15.amd64.tgz

3.2 解压docker-cri离线安装包

tar xvf cri-dockerd-0.3.15.amd64.tgz

3.3 将解压之后的docker文件移到bin目录下

sudo cp cri-dockerd/* /usr/bin

3.4 将docker-cri注册成系统启动服务

cat > /usr/lib/systemd/system/cri-docker.service <<'EOF'
[Unit]
Description=CRI Interface for Docker Application Container Engine
Documentation=https://docs.mirantis.com
After=network-online.target firewalld.service docker.service
Wants=network-online.target
Requires=cri-docker.socket
[Service]
Type=notify
ExecStart=/usr/bin/cri-dockerd --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.7
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
StartLimitBurst=3
StartLimitInterval=60s
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
Delegate=yes
KillMode=process
[Install]
WantedBy=multi-user.target
EOF
cat > /usr/lib/systemd/system/cri-docker.socket <<'EOF'
[Unit]
Description=CRI Docker Socket for the API
PartOf=cri-docker.service

[Socket]
ListenStream=%t/cri-dockerd.sock
SocketMode=0660
SocketUser=root
SocketGroup=root

[Install]
WantedBy=sockets.target
EOF

3.5 将cri-docker加入开机自启并启动

systemctl daemon-reload
systemctl enable cri-docker --now

四、k8s离线安装部署

4.1 安装kubeadm、kubelet和kubectl

我离线下载的安装版本如下,放在k8s_rpm 文件夹下面(从阿里镜像源下载下面依赖包,如果同个版本有多个不同文件,我是获取最新时间的):

阿里镜像源下载地址

k8s-install

# 解压k8s离线安装包
tar xvf k8s_rpm.tar
# 安装离线包
yum -y install k8s_rpm/*.rpm

4.2 配置kubelet的cgroup

编辑/etc/sysconfi/kkubelet,添加下面配置

cat > /etc/sysconfig/kubelet <<EOF
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"
EOF

4.3 设置kubelet开机自启

systemctl enable kubelet

4.4 导入k8s组件镜像

docker load -i k8s-master.tar

4.5 初始化k8s集群 (🚀🚀 只需要在master主节点执行)

  • apiserver-advertise-address 集群通告地址,此处填写master节点IP
  • image-repository 由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址
  • kubernetes-version K8s版本,与上面安装的一致
  • service-cidr 集群内部虚拟网络,Pod统一访问入口
  • pod-network-cidr Pod网络,与下面部署的CNI网络组件yaml中保持一致
  kubeadm init \
  --apiserver-advertise-address=192.168.1.100 \
  --image-repository registry.aliyuncs.com/google_containers \
  --kubernetes-version v1.27.16 \
  --service-cidr=10.96.0.0/12 \
  --pod-network-cidr=10.244.0.0/16 \
  --cri-socket=unix:///var/run/cri-dockerd.sock \
  --ignore-preflight-errors=all

成功会出现下面打印: kubernetes安装成功后会提示如何加入集群 Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.1.100:6443 --token byjaat.knb8kma4j3zof9qf
--discovery-token-ca-cert-hash sha256:920c7aee5791e6b6b846d78d59953d609ff02fdcebc00bb644fe1696a97d5011

4.6 初始化成功之后,执行下面语句

mkdir -p $HOME/.kube

sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

sudo chown $(id -u):$(id -g) $HOME/.kube/config

4.7 如果初始化失败,则需要执行以下命令在重新进行初始化,如果初始化成功此步骤不用操作

kubeadm reset -f --cri-socket=unix:///var/run/cri-dockerd.sock

ipvsadm --clear

rm -rf ~/.kube

五、calico网络插件离线部署(🚀🚀 在master 节点执行)

kubernetes支持多种网络插件,比如flannel、calico、canal等,任选一种,本次选择calico calico官网地址:https://docs.tigera.io/calico/3.27/about

5.1 将镜像导入到docker

docker load -i calico-master.tar

5.2 安装Tigera-Calico管理和自定义资源定义

kubectl create -f tigera-operator.yaml

5.3 通过创建必要的自定义资源来安装Calico

kubectl create -f custom-resources.yaml

六、k8s-node节点部署

在和master 相同操作之后,只要导子节点的组件,在加入主节点即可:

k8s-install

6.1 将k8s组件镜像导入到docker

docker load -i k8s-node.tar

6.2 安装完成后 其他节点加入(✅ ✅ 在子节点执行)

key 的生成是有有效期的,以后有新的节点加入,需要重新去生成。

kubeadm join 192.168.1.100:6443 --token kdfkef.t7inksanynszd7zk \
        --discovery-token-ca-cert-hash sha256:bd68f15c072eaaf61c35342a9b6e7d856363f890b47d65fce19ff2fe36cda755 --cri-socket unix:///var/run/cri-dockerd.sock

七、测试集群

cat > nginx.yaml <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deploy
spec:
  replicas: 4
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
EOF

# 执行上面的yaml 文件
kubectl apply -f nginx.yaml

k8s-install