- Published on
K8s离线安装
一、k8s环境初始化
🔊🔊 注意:所有主机均需操作
1.1 环境准备
服务器要求:
- 建议最小硬件配置:
2核CPU、2G内存、20G硬盘
- 操作系统是龙栖:
AnolisOS
软件环境:
- 操作系统:
AnolisOS9.6
- Docker:
20.10.8
- K8s:
v1.27.6
角色 | IP地址 |
---|---|
k8s-master | 192.168.1.100 |
k8s-node1 | 192.168.1.101 |
k8s-node2 | 192.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服务
kubernetes
和docker
在运行中会产生大量的iptables
规则,为了不让系统规则跟他们混淆,直接关闭系统的规则
systemctl stop firewalld
systemctl disable firewalld
iptables -F
1.5 禁用selinux
selinux
是linux
系统下一个安全服务,如果不关闭它,在安装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功能(选装)
在kubernetes
中service
有两种代理模型,一种是基于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容器引擎。
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离线安装包
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 相同操作之后,只要导子节点的组件,在加入主节点即可:
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