k8s集群离线部署

K8s离线部署

环境

目标

k8s离线部署

步骤

部署docker

详情见文章:《离线安装docker及后端项目离线打包》

https://blog.csdn.net/qq_45371023/article/details/140279746?spm=1001.2014.3001.5501

所用到的所有文件在:

链接:https://pan.baidu.com/s/10cb-dXkgdShdjPEBCyvTrw?pwd=fpuy

提取码:fpuy

安装cri_dockerd

1、安装cri_dockerd

rpm -ivh cri-dockerd-0.3.9-3.el8.x86_64.rpm

2、重载系统守护进程→设置cri-dockerd自启动→启动cri-dockerd

重载系统守护进程

复制代码
sudo systemctl daemon-reload

设置cri-dockerd自启动

复制代码
sudo systemctl enable cri-docker.socket cri-docker

启动cri-dockerd

复制代码
sudo systemctl start cri-docker.socket cri-docker

sudo systemctl status cri-docker.socket

sudo systemctl status cri-docker

问题:启动cri-docker失败

措施:

方法一:systemctl restart docker # 重启docker

方法二:卸载docker重新安装,重新执行以上步骤

*安装Kubernetes

安装kubectl

1、安装kubectl

复制代码
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl

2、检测是否安装完成

复制代码
kubectl version --client

安装kubeadm

3、开放端口或关闭防火墙(用于确保安装过程顺利)

开放端口(云服务器)

开启6443端口

复制代码
sudo firewall-cmd --zone=public --add-port=6443/tcp --permanent

重新加载防火墙

复制代码
sudo firewall-cmd --reload

查看所有开放的端口

复制代码
sudo firewall-cmd --zone=public --list-ports

或关闭防火墙(虚拟机)

关闭防火墙

复制代码
sudo systemctl stop firewalld

关闭防火墙自启动

复制代码
sudo systemctl disable firewalld

4、禁用SELinux(确保容器能够访问系统资源)

复制代码
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

5、安装 kubeadm、kubelet 和 kubectl

相关离线安装包一下载rpm格式,存在于3_yum_package下,使用命令安装目录下所有rpm安装包

复制代码
cd 3_yum_package && rpm -ivh *.rpm

6、设置kubelet自启动

复制代码
sudo systemctl enable --now kubelet

*部署k8s集群

以上步骤完成后,具备以下环境

·两台ip不相同的服务器或虚拟机,能够互相通信,保持局域网状态,ip设为192.168..34和192.168..35

·两台server上都安装了容器运行时(Docker+cri_dockerd),已经安装kubernetes组件kubectl、kubeadm和kubelet。

环境准备

7、关闭swap分区,这里分为临时关闭和永久关闭,虚拟机环境推荐永久关闭,因为会经常开关机,反之云环境推荐临时关闭。

临时关闭swap分区

复制代码
swapoff -a

永久关闭swap分区,注释掉fstab中包含swap的这一行即可

复制代码
vi /etc/fstab

/dev/mapper/centos-swap swap swap defaults 0 0

重启使其生效,重启可能导致cri-dockerd状态发生变化,实际部署中我没有选择重启,原因猜测是由于版本或配置没配好,可以通过重装docker与cri-dockerd再启动cri-dockerd使cri-dockerd状态正常

reboot

8、安装runc作为k8s运行环境

安装runc

复制代码
sudo install -m 755 runc.amd64 /usr/local/bin/runc

检查是否安装成功

复制代码
runc -v

9、Docker和cri-dockerd设置国内镜像加速(由于本次文件夹中以下要用到的软件包名称带有镜像地址,即使是局域网也建议配置相应镜像加速,防止安装完成后kubectl要求联网拉取软件包而忽略本地镜像

复制代码
sudo tee /etc/docker/daemon.json <<-'EOF'

{

 "registry-mirrors": ["https://tsvqojsz.mirror.aliyuncs.com"]

}

EOF

\# 找到第10行

vi /usr/lib/systemd/system/cri-docker.service

\# 修改为ExecStart=/usr/bin/cri-dockerd --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9

重启Docker组件

复制代码
systemctl daemon-reload && systemctl restart docker cri-docker.socket cri-docker

检查Docker组件状态

复制代码
systemctl status docker cir-docker.socket cri-docker

10、检查hostname以及hosts

主节点

hostname为k8s-master

复制代码
vi /etc/hostname

添加域名映射

复制代码
echo "192.168.**.35 k8s-slave01">> /etc/hosts

其他node

hostname为k8s-slave01

复制代码
vi /etc/hostname

添加域名映射

复制代码
echo "192.168.**.34 k8s-master" >> /etc/hosts

11、转发IPv4并让iptables看到桥接流

复制代码
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf

overlay

br_netfilter

EOF

 

sudo modprobe overlay

sudo modprobe br_netfilter

设置所需的 sysctl 参数,参数在重新启动后保持不变

复制代码
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf

net.bridge.bridge-nf-call-iptables = 1

net.bridge.bridge-nf-call-ip6tables = 1

net.ipv4.ip_forward          = 1

EOF

应用 sysctl 参数而不重新启动

复制代码
sudo sysctl --system

 

lsmod | grep br_netfilter

lsmod | grep overlay

 

sysctl net.bridge.bridge-nf-call-iptables net.bridge.bridge-nf-call-ip6tables net.ipv4.ip_forward

如果init时仍提示iptables错误请执行

复制代码
echo "1">/proc/sys/net/bridge/bridge-nf-call-iptables

echo "1">/proc/sys/net/ipv4/ip_forward

初始化控制平面节点/master

12、初始化主节点

在初始化之前需要通过kubeadm config images获得初始化需要的docker镜像:

安装镜像docker load -i **.tar

相关镜像文件存在5_kubeadm-images中。

执行初始化:

复制代码
kubeadm init --node-name=k8s-master list--image-repository=registry.aliyuncs.com/google_containers --cri-socket=unix:///var/run/cri-dockerd.sock --apiserver-advertise-address=192.168.**.34 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12

--image-repository=registry.aliyuncs.com/google_containers # 将下载容器镜像源替换为阿里云,否则因为网络原因会导致镜像拉不下来,一定会执行不成功。

--cri-socket=unix:///var/run/cri-dockerd.sock # 这是指定容器运行时,因为containerd也是Docker的组件之一,下载Docker会一并将containerd下载下来,在执行初始化时当Kubernetes检测到有多个容器运行时环境,就必须要手动选择一个。这里也可以看出containerd实际上比Docker更轻量得多。

--apiserver-advertise-address=192.168.56.50 # 为API server设置广播地址,这里选择本机的ipv4地址,这里不希望API SERVER设置在其他node上的话就不要改为其他地址。

--pod-network-cidr=10.244.0.0/16 # 指明 pod 网络可以使用的 IP 地址段,暂时不清楚的可以先不管就用这个值。

--service-cidr=10.96.0.0/12 # 为服务的虚拟 IP 地址另外指定 IP 地址段,暂时不清楚的可以先不管就用这个值。

问题:cordns:v1.10.1检查不存在,实际上cordns:v1.10.1已存在,但是是cordns:1.10.1。

措施:修改cordns的tag。

复制代码
docker tag registry.aliyuncs.com/google_containers/coredns:1.10.1 registry.aliyuncs.com/google_containers/coredns:v1.10.1

重新执行初始化命令

记录kubeadm join下面的信息,node join时需要,以上示例的相关信息是:

复制代码
kubeadm join 192.168.51.34:6443 --token 1qtv3k.p8tfvdcds6x5ichf \

​    --discovery-token-ca-cert-hash sha256:90afb5751086aabf7ac90d9e77a946eb768d47ffaaead62243264641954a5e26

如果忘记了可以使用kubeadm token list查询,该token存在24h,重新创建kubeadm token create --print-join-command,删除使用kubeadm token delete tokenid。

非root用户请执行

复制代码
mkdir -p $HOME/.kube

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

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

root用户直接执行

临时生效,重启后失效,不推荐。

复制代码
export KUBECONFIG=/etc/kubernetes/admin.conf 

永久生效,执行kubeadm reset后再次init也无需再次执行这条命令

复制代码
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile 

执行永久生效命令之后需要source一下使其生效

复制代码
source ~/.bash_profile

检测配置是否生效

复制代码
echo $KUBECONFIG 

/etc/kubernetes/admin.conf

13、安装配置网络插件

这里使用flannel,将kube-flannel.yml文件下载并上传到server上。

将相关镜像上传到server上安装。kube-flannel.yml和镜像文件存在于6_kube-flannel中。

查询网卡

ifconfig

kube-flannel.yml默认会找enp1s0网卡,本次示例中34的网卡为enp1s0,无需修改,35的网卡为enp4s0。

//修改35的kube-flannel.yml,添加--iface=enp0s3进行指定(这里的enp0s3是ip对应的网卡,例如上图框中部分)。参数位置如下:

复制代码
container:

  ......

  command:

  - /opt/bin/flanneld

  arg:

  - --ip-masq

  - --kube-subnet-mgr

  - --iface=enp4s0

为Kubernetes配置flannel网络插件

复制代码
kubectl apply -f /data/k8s/6_kube-flannel/kube-flannel.yml
复制代码
cat /run/flannel/subnet.env

没有这个文件或文件夹的话则需要手动创建,内容同下

复制代码
FLANNEL_NETWORK=10.244.0.0/16

FLANNEL_SUBNET=10.244.0.1/24

FLANNEL_MTU=1450

FLANNEL_IPMASQ=true

Node节点加入Master

14、Node节点加入Master

14.1、将主节点机器中的/etc/kubernetes/admin.conf拷贝到从节点机器中

复制代码
scp /etc/kubernetes/admin.conf 192.168.56.51:/etc/kubernetes/

不要忘记将admin.conf加入环境变量,这里直接使用永久生效。

复制代码
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile

source ~/.bash_profile

拷贝时如果出现问题:

ECDSA host key for 192.168.55.187 has changed and you have requestd strict checking.Host key verification failed.

执行以下语句进行修复

复制代码
ssh-keygen -R 192.168.55.187

14.2、执行join指令(初始化主节点成功后,会给出join命令)

例如:

kubeadm join 192.168.51.34:6443 --token by7t4x.da3f98dzrvjylykz --discovery-token-ca-cert-hash sha256:90afb5751086aabf7ac90d9e77a946eb768d47ffaaead62243264641954a5e26 --cri-socket unix:///var/run/cri-dockerd.sock

14.3、执行kubectl get nodes

k8s集群部署成功!!!

问题

问题一

kubectl get nodes

措施:检查swap是否关闭;检查防火墙是否开启6443端口

关闭swap

临时关闭防火墙

成功

问题二

kubectl get nodes

向集群添加k8s节点后查看该节点状态为NotReady

措施:

复制代码
systemctl restart kubelet.service

systemctl restart docker.service

重启kubelet和docker

问题三

kubeadm join 192.168.51.34:6443 --token l2qlvh.and3fnjmzecueu9h --discovery-token-ca-cert-hash sha256:90afb5751086aabf7ac90d9e77a946eb768d47ffaaead62243264641954a5e26 --cri-socket unix:///var/run/cri-dockerd.sock

将子节点加入k8s集群中时出现初始化超时的情况

措施:

复制代码
kubeadm reset -f --cri-socket unix:///var/run/cri-dockerd.sock

成功

问题四

将主节点机器中的/etc/kubernetes/admin.conf拷贝到从节点机器中

scp /etc/kubernetes/admin.conf 192.168.55.187:/etc/kubernetes/

如果拷贝文件失败时,报错如下:

ECDSA host key for 192.168.55.187 has changed and you have requestd strict cheching.

Host key verification failed.

执行以下语句进行修复

复制代码
ssh-keygen -R 192.168.55.187

快速删除

复制代码
kubectl delete node k8s-slave01
kubectl delete node k8s-slave02
kubectl delete node k8s-master

从节点

复制代码
rm -rf /etc/kubernetes/*
kubeadm reset --cri-socket unix:///var/run/cri-dockerd.sock

主节点

复制代码
rm -rf /etc/kubernetes/*
rm -rf ~/.kube/*
rm -rf /var/lib/etcd/*
kubeadm reset -f --cri-socket unix:///var/run/cri-dockerd.sock

如果需要就要重新初始化k8s集群

复制代码
kubeadm init --node-name=k8s-master --image-repository=registry.aliyuncs.com/google_containers --cri-socket=unix:///var/run/cri-dockerd.sock --apiserver-advertise-address=192.168.51.34 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12

主节点

复制代码
kubectl apply -f /data/k8s/6_kube-flannel/kube-flannel.yml
kubectl get pod -A

主节点

复制代码
scp /etc/kubernetes/admin.conf 192.168.51.35:/etc/kubernetes/
scp /etc/kubernetes/admin.conf 192.168.51.36:/etc/kubernetes/

从节点

复制代码
kubeadm join 192.168.51.34:6443 --token 1k9kdy.dvn2qbtd7rjar1ly \
       --discovery-token-ca-cert-hash sha256:ff90d8ed41ae1902a839194f179a1c3ba8374a5197ea3111e10e5ca1c09fa442 --cri-socket unix:///var/run/cri-dockerd.sock

kubectl get pod -A
kubectl get nodes
相关推荐
能不能别报错16 小时前
K8s学习笔记(十六) 探针(Probe)
笔记·学习·kubernetes
能不能别报错17 小时前
K8s学习笔记(十四) DaemonSet
笔记·学习·kubernetes
火星MARK19 小时前
k8s面试题
容器·面试·kubernetes
Serverless社区20 小时前
阿里云函数计算 AgentRun 全新发布,构筑智能体时代的基础设施
阿里云·云原生·serverless·函数计算
赵渝强老师20 小时前
【赵渝强老师】Docker容器的资源管理机制
linux·docker·容器·kubernetes
能不能别报错21 小时前
K8s学习笔记(十五) pause容器与init容器
笔记·学习·kubernetes
稚辉君.MCA_P8_Java1 天前
kafka解决了什么问题?mmap 和sendfile
java·spring boot·分布式·kafka·kubernetes
乄bluefox1 天前
保姆级docker部署nacos集群
java·docker·容器
每天进步一点_JL1 天前
Docker 是什么?
后端·docker·容器
一叶飘零_sweeeet1 天前
从 0 到 1 掌控云原生部署:Java 项目的 Docker 容器化与 K8s 集群实战指南
docker·云原生·kubernetes·项目部署