说明
:部分操作请先看报错说明,在进行操作!!
kubeadm方式安装k8s
在 Kubernetes 1.20 版本中,nf_conntrack_ipv4 模块已经被 nf_conntrack 模块替代。因此,你需要使用 modprobe nf_conntrack 命令来加载这个模块。
另外,在配置 IPVS 模式时,需要修改 kube-proxy 的配置文件,并将 mode: "iptables" 改为 mode: "ipvs"。你可以使用以下命令来编辑配置文件:
bash
sudo kubectl edit configmap -n kube-system kube-proxy
然后将其中的 mode: "iptables" 改为 mode: "ipvs",并保存退出。
最后,重启 kube-proxy 服务以使更改生效:
bash
sudo systemctl restart kube-proxy
这样应该就可以成功开启 IPVS 模式了。
主机准备
ip | 主机名 |
---|---|
192.168.182.136 | master |
192.168.182.137 | slave-1 |
192.168.182.138 | slave-2 |
192.168.182.139 | slave-3 |
基础环境准备(1.、centos操作系统配置)
四台机器都要操作
# (1)更新系统
yum update -y
#-----------------------------------
# (2)更换yum源(更换成阿里的)
# (2.1)备份原 REPO (将CentOS-Base.repo 改为 CentOS-Base.repo.bak)
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
# (2.2)进入/etc/yum.repos.d/文件夹
cd /etc/yum.repos.d/
# (2.3)下载 阿里云 样例配置
wget http://mirrors.aliyun.com/repo/Centos-7.repo
# (2.4)修改文件名
mv Centos-7.repo CentOS-Base.repo
# (2.5)清除缓存
yum clean all
# (2.6)生成缓存
yum makecache
# (2.7)输出显示下面的内容,包含 mirrors.aliyun.com,就代表替换完成了。
yum update -y
#-----------------------------------
# (3)更换epel源(更换成阿里的)
# (3.1)查看epel源状态(如果执行这个命令后输出有信息,则说明你的系统中已经安装了EPEL源。如果没有输出,那么就表示没有安装EPEL源。)
yum repolist all |grep epel
# (3.2)备份(第一条命令没有输入,就不用备份,如果之前没有设置过,默认应该是没有这两个文件的)
mv /etc/yum.repos.d/epel.repo /etc/yum.repos.d/epel.repo.backup
mv /etc/yum.repos.d/epel-testing.repo /etc/yum.repos.d/epel-testing.repo.backup
# (3.3)下载epel源(contos7)
wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo
# (3.4)清除缓存
yum clean all
# (3.5)生成缓存
yum makecache
#-----------------------------------
# (4)修改在主机名
# (4.1)格式
hostnamectl set-hostname <hostname>
# (4.1.1)执行
hostnamectl set-hostname meishibiexuejava-master
hostnamectl set-hostname meishibiexuejava-slave-1
hostnamectl set-hostname meishibiexuejava-slave-2
hostnamectl set-hostname meishibiexuejava-slave-3
# (4.2)重启系统(建议修改后还是重启一下,这样可以看到改后的名字)
reboot
#-----------------------------------
# (5)修改hosts文件
# (5.1)编辑hosts文件:方式一
vim /etc/hosts
192.168.182.136 meishibiexuejava-master
192.168.182.137 meishibiexuejava-slave-1
192.168.182.138 meishibiexuejava-slave-2
192.168.182.139 meishibiexuejava-slave-3
# (5.2)新建一个hosts并覆盖:方式二(推荐这个,方便一点)
cat <<EOF >>/etc/hosts
192.168.182.136 meishibiexuejava-master
192.168.182.137 meishibiexuejava-slave-1
192.168.182.138 meishibiexuejava-slave-2
192.168.182.139 meishibiexuejava-slave-3
EOF
# (5.3)查看hosts文件是否需改成功
cat /etc/hosts
#-----------------------------------
# (6)给关闭防火墙(如果是虚拟机的话,都关了方便一点,服务器根据真实情况方式端口)
# (6.1)下面两个命令依次执行
systemctl stop firewalld # 关闭防火墙(临时关闭-立即生效)
systemctl disable firewalld # 关闭防火墙(永久关闭)
# (6.2)查看防火前状态
systemctl status firewalld
#-----------------------------------
# (7)升级内核(3.10内核不行,需要升级4.18+以上),下方命令依次执行
# 总的来说,这些命令的作用是添加一个额外的软件仓库,然后从这个仓库中安装一个新的Linux内核,并将其设置为系统的默认启动选项。这样做的目的是为了更新或替换现有的内核,以获得新的功能、修复安全漏洞等。
# (7.1)设置elrepo仓库
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
# (7.2--可跳过,只是一个查看)会列出ELRepo仓库中可用的软件包
yum --disablerepo="*" --enablerepo="elrepo-kernel" list available
# (7.3)这将下载并安装最新的长期支持(LTS)内核版本。
yum --enablerepo=elrepo-kernel install -y kernel-lt
# (7.4-可跳过)会查找/boot/grub2/grub.cfg文件中包含"initrd16"字符串的行
grep initrd16 /boot/grub2/grub.cfg
# (7.5)会列出/etc/grub2.cfg文件中的所有菜单项,并显示它们的编号和名称。
cat /etc/grub2.cfg | grep menuentry|awk -F "\'" '$1=="menuentry " {print i++ " : " $2}'
# (7.5.1)执行结果
0 : CentOS Linux (5.4.262-1.el7.elrepo.x86_64) 7 (Core) # 下载的最新内核,标号为 0
1 : CentOS Linux (3.10.0-1160.102.1.el7.x86_64) 7 (Core)
2 : CentOS Linux (3.10.0-1160.el7.x86_64) 7 (Core)
3 : CentOS Linux (0-rescue-14cd2f4994524e1b809539ae2f42e7ea) 7 (Core)
# (7.6)将编号为0的设置为启动项
grub2-set-default 0
# (7.7)重启
reboot
# (7.7.1)重启虚拟机界面
CentOS Linux (5.4.262-1.el7.elrepo.x86_64) 7 (Core) # 默认选中,新下载的内核
CentOS Linux (3.10.0-1160.102.1.el7.x86_64) 7 (Core)
CentOS Linux (3.10.0-1160.el7.x86_64) 7 (Core)
CentOS Linux (0-rescue-14cd2f4994524e1b809539ae2f42e7ea) 7 (Core)
# (7.8)更新GRUB启动加载器的配置文件。 这将确保系统能够正确地找到新的内核映像文件和初始化映像文件,并使用它们来启动系统。
grub2-mkconfig -o /boot/grub2/grub.cfg
# (7.9-仅供参考格式,不出问题,不需要执行)卸载内核,/boot存储不够时在使用
rpm -e kernel-lt-5.4.262-1.el7.elrepo.x86_64
rpm -e kernel-3.10.0-1160.92.1.el7.x86_64
#-----------------------------------
# (8)关闭 selinux
# (8.1--测试环境建议执行这个)永久关闭(重启生效)
sed -i 's/enforcing/disabled/' /etc/selinux/config
# (8.2--测试环境不建议执行这个条)临时关闭(只在当前会话中有效)
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux setenforce 0
# (8.3)重启
reboot
# (8.4)使用sestatus命令查看当前的SELinux状态,如果显示“Disabled”,则表示已经成功禁用了SELinux。
sestatus
#-----------------------------------
# (9)关闭 swap
# (9.1)方式一
swapoff -a # 临时(重启后无效)
# (9.2)方式二
vim /etc/fstab # 永久(这个执行后不会生效) free -m 看swap都为0 是生效的
# (9.2.1)注释掉,有 swap 的行(列如):
# UUID=a7a5896b-8706-4837-a767-aa0a79b81278 swap swap defaults 0 0
# (9.2.2)立即关闭(如果没有重启服务器的打算,就执行可以让修改立即生效)
swapoff -a
# (9.3)方式三(不建议使用,测试没事)
echo "vm.swappiness = 0">> /etc/sysctl.conf
swapoff -a && swapon -a
sysctl -p
# (9.4)方式四(推荐,其实与方式二,一样)
sed -ri 's/.*swap.*/#&/' /etc/fstab # 永久
# (9.4.1)立即关闭(如果没有重启服务器的打算,就执行可以让修改立即生效)
swapoff -a
# (9.5)开启swap(无需执行-只是为了一个有开有关的一个说明)
# (9.5.1)编辑fstab文件
vim /etc/fstab
# (9.5.2)去掉,有 swap 的行注释(列如):
#UUID=a7a5896b-8706-4837-a767-aa0a79b81278 swap swap defaults 0 0
# (9.5.3)立即开启
swapon -a
#-----------------------------------
# (10)将桥接的IPv4流量传递到 iptables 的链
# (10.1)加载内核所需模块
modprobe overlay
modprobe br_netfilter
# (10.1.1-可跳过)验证加载内核所需模块是否执行成功
lsmod | grep overlay
lsmod | grep br_netfilter
# (10.2)设置开机时能够自动加载模块
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
# (10.2.1)设置开机时能够自动加载模块是否成功
cat /etc/modules-load.d/k8s.conf
# (10.3)设置所需的 sysctl 参数,参数在重新启动后保持不变(注释,执行的时候不到带入到文件中)
# (10.3.1)新建一个k8s.conf并覆盖:方式一
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
vm.swappiness = 0 # 禁止使用swap空间,只有当系统OOM时才允许使用它(如果,已经禁用了swap,这个可以不配置,保留也没有影响)
EOF
# (10.3.2)编辑k8s.conf文件:方式二
vim /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0 # 禁止使用swap空间,只有当系统OOM时才允许使用它(如果,已经禁用了swap,这个可以不配置,保留也没有影响)
# (10.4)查看是否有设置的属性
cat /etc/sysctl.d/k8s.conf
# (10.5)应用 sysctl 参数
sysctl --system # 生效
# (10.6)验证是否设置成功
sysctl -a|grep "bridge-nf-call-ip6tables"
sysctl -a|grep "bridge-nf-call-iptables"
sysctl -a|grep "ip_forward"
sysctl -a|grep "swappiness"
#-----------------------------------
# (11)安装依赖环境
yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstatlibseccomp wget vim net-tools git iproute lrzsz bash-completion tree bridge-utils unzip bind-utils gcc
#-----------------------------------
# (12)开启IPVS
# (12.1)安装IPVS
yum -y install ipset ipvsdm
# (12.2)编译ipvs.modules文件
# 在 Kubernetes 1.20 版本中,nf_conntrack_ipv4 模块已经被 nf_conntrack 模块替代。因此,你需要使用 modprobe nf_conntrack 命令来加载这个模块
# (12.2.1)编辑ipvs.modules文件:方式一
vi /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
# (12.2.2)新建一个ipvs.modules并覆盖:方式二(推荐)
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
EOF
# (12.3)赋予权限并执行
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack
# (12.4-跳过)重启电脑(如果你在执行此命令之前已经启动了 kube-proxy 服务,并且kube-proxy 已经使用了 iptables 模式,那么你需要先停止 kube-proxy 服务,然后重新启动它以启用 IPVS 模式。这样就可以避免因同时启用两种模式而导致的冲突问题。)
reboot
# (12.5)检查是否生效
lsmod | grep ip_vs_rr
或者
lsmod | grep -e ipvs -e nf_conntrack
#-----------------------------------
# (13)时间同步
# (13.1)安装ntpdate
yum install ntpdate -y
# (13.2)向阿里云服务器同步时间
ntpdate time1.aliyun.com
# (13.3)删除本地时间并设置时区为上海
rm -rf /etc/localtime
ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
# (13.4)查看时间
date -R || date
#-----------------------------------
# (14)设置主机之间ssh连接不要密码(将公钥给谁,就可以不用密码连接谁)
# (14.1)在四台服务器上分别执行下面命令,生成公钥和私钥(注意:连续按换行回车采用默认值)
ssh-keygen -t rsa
# (14.2)在三台slave服务器分别执行下面命令,将公钥拷到master服务器上
ssh-copy-id 192.168.182.136 # 命令执行后,需要输入 yes 和 密码(master密码)
# (14.3)之后可以在master服务器上检查下,看看.ssh/authorized_keys文件是否包含3个公钥
cat /root/.ssh/authorized_keys
# (14.4)在master执行下面命令,将master的公钥添加到authorized_keys文件中(此时应该包含4个公钥)
cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys
# (14.5)从master服务器执行下面命令,向其他三台MySQL服务器分发公钥信息。
# (14.5.1)命令执行后,需要输入 yes 和 密码(slave密码)
scp /root/.ssh/authorized_keys root@192.168.182.137:/root/.ssh/authorized_keys
scp /root/.ssh/authorized_keys root@192.168.182.138:/root/.ssh/authorized_keys
scp /root/.ssh/authorized_keys root@192.168.182.139:/root/.ssh/authorized_keys
# (14.6)检测
ssh 192.168.182.136
ssh 192.168.182.137
ssh 192.168.182.138
ssh 192.168.182.139
基础环境准备(2、docker安装及配置、安装指定版本的 kubeadm kubelet kubectl)
四台机器都要操作
# (1)安装docker(参考:https://developer.aliyun.com/mirror/docker-ce?spm=a2c6h.13651102.0.0.73701b11u308cs)
# (1.1)安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# (1.2)添加软件源信息
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# (1.3)
sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
# (1.4)更新并安装Docker-CE
sudo yum makecache fast
sudo yum -y install docker-ce
# (1.5)开启Docker服务
sudo service docker start
# (1.6)停止docker
sudo service docker stop
# (1.7)启动docker服务,并设置开机启动
systemctl enable docker.service && service docker start
# (1.8)查看docker服务状态
systemctl status docker
# (1.9)重启docker
sudo service docker restart
#-----------------------------------
# (2)修改docker源
# (2.1)修改daemon配置文件/etc/docker/daemon.json:方式一
vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://93p84jkw.mirror.aliyuncs.com"]
}
或者
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
# (2.2)新建一个daemon.json并覆盖:方式二
cat > /etc/docker/daemon.json <<EOF
{
"registry-mirrors": ["https://93p84jkw.mirror.aliyuncs.com"]
}
EOF
# (2.3)重新加载
systemctl daemon-reload
# (2.4)重新启动
systemctl restart docker
#-----------------------------------
# (3)修改docker驱动,cgroup驱动程序改为systemd驱动
# 原因:默认情况下,Docker 使用的是 cgroupfs 驱动,而 Kubernetes 在较新版本中使用的是 systemd 驱动。如果这两个驱动不匹配,可能会导致一些问题,比如容器无法启动或者资源限制不生效等。
# 问题1:master不改slave改了,在执行kubeadm join 时无法添加节点(连接拒绝)
# 问题2:lave没改的话在执行kubeadm join 会出现警告(具体不改能不能行,不太确定)
# (3.1)修改前先查看驱动信息
docker info | grep Cgrou
# (3.2)添加以下信息
cat > /etc/docker/daemon.json <<EOF
{
"registry-mirrors": ["https://93p84jkw.mirror.aliyuncs.com"], # 这个是之前设置的docker加速(复制时,去掉这个注释)
"exec-opts":["native.cgroupdriver=systemd"] # 修改驱动添加的内容(复制时,去掉这个注释)
}
EOF
# (3.3)重新加载
systemctl daemon-reload
# (3.4)重启docker
systemctl restart docker
# (3.5)查看驱动信息
docker info | grep Cgrou
#-----------------------------------
# (4)添加k8s yum源(这里是阿里云的,但是去阿里云复制的无法使用,这个是百度出来的)
# 安装参考(https://developer.aliyun.com/mirror/kubernetes?spm=a2c6h.13651102.0.0.73701b11zWTm4G)
# gpgcheck=0,表示不检查包的GPG签名,
# repo_gpgcheck=0,表示不检查仓库的GPG签名。
# 总的来说,启用GPG签名检查可以提高安全性,因为它有助于防止安装来自不受信任源的软件包。然而,如果因为某种原因无法访问或下载GPG密钥,这可能会导致安装失败。因此,在生产环境中通常建议启用GPG签名检查,但在开发或测试环境中可能不需要。
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
# (4.1)清除缓存
yum clean all
# (4.2)生成缓存
yum -y makecache
#-----------------------------------
# (5)安装指定版本的 kubeadm,kubelet 和 kubectl,为了下面拉取对应版本镜像做准备
# (5.1)可以用下面的命令查看可以安装的版本(推荐使用第二条)
# --disableexcludes=kubernetes选项。这个选项的作用是禁用Yum的排除规则(如果有的话),确保不会因为某些设置而隐藏或排除Kubernetes相关的软件包。
yum list kubeadm --showduplicates | sort -r
# # 使用这条命令查看
yum list --showduplicates kubeadm --disableexcludes=kubernetes
# (5.2)由于官网未开放同步方式, 可能会有索引gpg检查失败的情况, 这时请用 yum install -y --nogpgcheck kubelet kubeadm kubectl 安装
# --disableexcludes=kubernetes选项。因此,如果你在系统中设置了可能影响到Kubernetes软件包显示的排除规则,那么这个命令可能会受到这些规则的影响,导致无法正确地安装软件包。
yum install -y kubelet-1.20.1-0 kubeadm-1.20.1-0 kubectl-1.20.1-0
# 使用这条命令安装
yum install -y kubelet-1.20.1-0 kubeadm-1.20.1-0 kubectl-1.20.1-0 --disableexcludes=kubernetes
#-----------------------------------
# (6)设置kubelet(设置内核、ipvs)
# 如果不正确配置kubelet,确实可能导致Kubernetes(K8s)集群无法启动。确保docker使用的cgroup driver与kubelet使用的cgroup driver一致是非常重要的。
# (6.1)编辑 kubelet 文件:方式一
vim /etc/sysconfig/kubelet
# (6.1.1)添加的内容
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"
# (6.2)新建一个kubelet 文件,并覆盖(测试环境使用):方式二
# 原因:因为原本的内容少,我就直接将原本的内容一起写在这里,重新创建并覆盖了
cat > /etc/sysconfig/kubelet <<EOF
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"
EOF
# (6.3)开机启动:设置kubelet服务开机自启动,但不希望立即启动它:方式一
systemctl enable kubelet
# (6.4)开机启动:每次系统启动时自动运行kubelet,并且现在就启动kubelet服务:方式二(推荐)
systemctl enable kubelet && systemctl start kubelet
#-----------------------------------
# (7)kubectl命令自动补全
echo "source <(kubectl completion bash)" >> ~/.bash_profile
source ~/.bash_profile
K8s环境准备(1.、k8s集群镜像下载-可跳过-基本上指定国内源都没问题,不用操作这一步)
这里在执行 kubeadm init 时制定了仓库这一步就不用准备了
如果没有指定仓库需要准备的,因为无法下载国外的镜像(具体没有试过,没有指定仓库的,但是肯定要准备镜像的)
# (1)查看安装集群需要的镜像
kubeadm config images list
# (1.1)输出结果(部分)
k8s.gcr.io/kube-apiserver:v1.20.15
k8s.gcr.io/kube-controller-manager:v1.20.15
k8s.gcr.io/kube-scheduler:v1.20.15
k8s.gcr.io/kube-proxy:v1.20.15
k8s.gcr.io/pause:3.2
k8s.gcr.io/etcd:3.4.13-0
k8s.gcr.io/coredns:1.7.0
# (1.2)在 kubeadm init --apiserver-advertise-address=192.168.182.134 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.20.1 --service-cidr=10.1.0.0/16 --pod-network-cidr=10.81.0.0/16 中指定镜像仓库后从阿里云下载的镜像(不指定镜像需要自己下载,看下面)
registry.aliyuncs.com/google_containers/kube-apiserver:v1.20.15
registry.aliyuncs.com/google_containers/kube-controller-manager:v1.20.15
registry.aliyuncs.com/google_containers/kube-scheduler:v1.20.15
registry.aliyuncs.com/google_containers/kube-proxy:v1.20.15
registry.aliyuncs.com/google_containers/pause:3.2
registry.aliyuncs.com/google_containers/etcd:3.4.13-0
registry.aliyuncs.com/google_containers/coredns:1.7.0
# (1.2)在 kubeadm init --apiserver-advertise-address=192.168.182.134 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.20.1 --service-cidr=10.1.0.0/16 --pod-network-cidr=10.81.0.0/16 不指定仓库需要自己下载镜像
# 国内环境无法下载,官方镜像
docker pull k8s.gcr.io/kube-apiserver:v1.20.15
docker pull k8s.gcr.io/kube-controller-manager:v1.20.15
docker pull k8s.gcr.io/kube-scheduler:v1.20.15
docker pull k8s.gcr.io/kube-proxy:v1.20.15
docker pull k8s.gcr.io/pause:3.2
docker pull k8s.gcr.io/etcd:3.4.13-0
docker pull k8s.gcr.io/coredns:1.7.0
# (1.3)手动下载国内镜像
docker pull registry.aliyuncs.com/google_containers/kube-apiserver:v1.20.15
docker pull registry.aliyuncs.com/google_containers/kube-controller-manager:v1.20.15
docker pull registry.aliyuncs.com/google_containers/kube-scheduler:v1.20.15
docker pull registry.aliyuncs.com/google_containers/kube-proxy:v1.20.15
docker pull registry.aliyuncs.com/google_containers/pause:3.2
docker pull registry.aliyuncs.com/google_containers/etcd:3.4.13-0
docker pull registry.aliyuncs.com/google_containers/coredns:1.7.0
# (1.4)tag(应该不用改名字,没试过)
docker tag registry.aliyuncs.com/google_containers/kube-apiserver:v1.20.15 k8s.gcr.io/kube-apiserver:v1.20.15
docker tag registry.aliyuncs.com/google_containers/kube-controller-manager:v1.20.15 k8s.gcr.io/kube-controller-manager:v1.20.15
docker tag registry.aliyuncs.com/google_containers/kube-scheduler:v1.20.15 k8s.gcr.io/kube-scheduler:v1.20.15
docker tag registry.aliyuncs.com/google_containers/kube-proxy:v1.20.15 k8s.gcr.io/kube-proxy:v1.20.15
docker tag registry.aliyuncs.com/google_containers/pause:3.2 k8s.gcr.io/pause:3.2
docker tag registry.aliyuncs.com/google_containers/etcd:3.4.13-0 k8s.gcr.io/etcd:3.4.13-0
docker tag registry.aliyuncs.com/google_containers/coredns:1.7.0 k8s.gcr.io/coredns:1.7.0
K8s环境准备(2、部署Kubernetes Master)
# (1)初始化(只在master执行)
kubeadm init \
--apiserver-advertise-address=192.168.182.136 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.20.1 \
--service-cidr=10.1.0.0/16 \
--pod-network-cidr=10.81.0.0/16
# (1.1)参数说明:
--apiserver-advertise-address:节点绑定的服务器ip(多网卡可以用这个参数指定ip)
--image-repository:指定镜像仓库 # 由于从阿里云拉镜像,解决了k8s.gcr.io镜像拉不下来的问题
--kubernetes-version:要安装的版本
--service-cidr:为service的虚拟 IP 地址另外指定 IP 地址段
--pod-network-cidr:负载容器的子网网段
------ 还没有学习calico和flannel先不用看,能后面学习了,再回来看(kubeadm init 命令和上方一样) ----
# (2)
# 如果用 calico 要将calico.yaml中192.168.0.0/16(这里的192.168.0.0/16为calico.yaml中的默认ip) 改为 --pod-network-cidr 一样的值
# 如果用 flannel 要将 -pod-network-cidr的ip 就等于 kube-flannel.yml中的Network的ip
kubeadm init --apiserver-advertise-address=192.168.182.136 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.20.1 --service-cidr=10.1.0.0/16 --pod-network-cidr=10.81.0.0/16
# (2.1)ip范围
10.81.0.0/24:这个范围包含了 256 个可用 IP 地址(10.81.0.1 到 10.81.0.254),通常适用于小型集群或测试环境。
10.81.0.0/16:这个范围包含了 65,536 个可用 IP 地址(10.81.0.1 到 10.81.255.254),对于中等规模的集群来说已经足够大了。
10.81.0.0/8:这个范围包含了超过 16 百万个可用 IP 地址(10.81.0.1 到 10.81.255.254),适合大型集群使用。
------------------ 参考 ------------------
# (3--有需要的时候在操作)重新初始化(重新执行kubeadm init命令)
# (3.1)所有节点都要执行
kubeadm reset
# (3.2)master节点执行就行
rm -rf ~/.kube
# (4)没有指定仓库(参考,不建议执行,国内无法下载官方镜像,除非用魔法)
kubeadm init --apiserver-advertise-address=192.168.182.136 --kubernetes-version v1.20.1 --service-cidr=10.1.0.0/16 --pod-network-cidr=10.81.0.0/16
# (5)kubeadm init 执行结果,上方截图中的内容(需要在master节点执行的)
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# (6)看节点
kubectl get nodes
# (6.1)结果
[root@meishibiexuejava-master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
meishibiexuejava-master NotReady control-plane,master 44m v1.20.1
#-----------------------------------遇到的问题,仅供参供
# 报错1
输入 :cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
输出 :cp: overwrite ‘/root/.kube/config’?
# 后面输入y 就行,如下:
cp: overwrite ‘/root/.kube/config’? y
# 报错2 (master 主机中的docker没有修改驱动的情况下)
# Docker的cgroup驱动程序,推荐使用systemd驱动
如果在准备环境的时候没有修改驱动,那么在下面的 “部署Kubernetes node” 中执行 kubeadm join.....略 时会失败
# 报错如下
[kubelet-check] The HTTP call equal to 'curl -sSL http://localhost:10248/healthz' failed with error: Get "http://localhost:10248/healthz": dial tcp [::1]:10248: connect: connection refused.
[kubelet-check] It seems like the kubelet isn't running or healthy.
[kubelet-check] The HTTP call equal to 'curl -sSL http://localhost:10248/healthz' failed with error: Get "http://localhost:10248/healthz": dial tcp [::1]:10248: connect: connection refused.
[kubelet-check] It seems like the kubelet isn't running or healthy.
[kubelet-check] The HTTP call equal to 'curl -sSL http://localhost:10248/healthz' failed with error: Get "http://localhost:10248/healthz": dial tcp [::1]:10248: connect: connection refused.
[kubelet-check] It seems like the kubelet isn't running or healthy.
[kubelet-check] The HTTP call equal to 'curl -sSL http://localhost:10248/healthz' failed with error: Get "http://localhost:10248/healthz": dial tcp [::1]:10248: connect: connection refused.
[kubelet-check] It seems like the kubelet isn't running or healthy.
[kubelet-check] The HTTP call equal to 'curl -sSL http://localhost:10248/healthz' failed with error: Get "http://localhost:10248/healthz": dial tcp [::1]:10248: connect: connection refused.
error execution phase kubelet-start: error uploading crisocket: timed out waiting for the condition
To see the stack trace of this error execute with --v=5 or higher
# 修改前先查看驱动信息
docker info | grep Cgrou
# 修改/etc/docker/daemon.json文件
vim /etc/docker/daemon.json
#添加以下信息
{
"exec-opts":["native.cgroupdriver=systemd"]
}
# 重启docker
systemctl restart docker
# 查看驱动信息
docker info | grep Cgrou
# 重新初始化
kubeadm reset # 先重置
rm -rf ~/.kube
# 重新执行第一步
kubeadm init \
--apiserver-advertise-address=192.168.182.136 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.20.1 \
--service-cidr=10.1.0.0/16 \
--pod-network-cidr=10.81.0.0/16
# 报错3
Unable to connect to the server: x509: certificate signed by unknown authority (possibly because of "crypto/rsa: verification error" while trying to verify candidate authority certificate "kubernetes")
# 原因:执行 kubeadm reset命令后没有删除创建的 .kube目录,重新创建集群就会出现这个问题!
# 解决
rm -rf ~/.kube
K8s环境准备(3、部署Kubernetes node)
# (1)向集群中添加新的节点
# 在 slave-1、slave-2、slave-3 中执行
# kubeadm init 执行结果,上方截图中的内容(需要在node节点执行的)
kubeadm join 192.168.182.136:6443 --token 431p4c.07t90x0z9ymctwns \
--discovery-token-ca-cert-hash sha256:5c554d750f77cce990ed12ce155a3849b1b95950748ea0bc5a39740104df0ddd
# (1.1)看节点
kubectl get nodes
# (1.1.1)结果(到这,预期是正常的)
[root@meishibiexuejava-master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
meishibiexuejava-master NotReady control-plane,master 59m v1.20.1
meishibiexuejava-slave-1 NotReady <none> 15s v1.20.1
meishibiexuejava-slave-2 NotReady <none> 70s v1.20.1
meishibiexuejava-slave-3 NotReady <none> 67s v1.20.1
# kubeadm join 过期了在使用
# (2)默认token有效期为24小时,当过期之后,改token就不可用了,这时就需要重新创建token(master执行)
kubeadm token create --print-join-command
# (2.1)执行后就是重新生成一个如下内容:
kubeadm join 192.168.182.136:6443 --token 8katoc.j4q74xjhj5pp3qli \
--discovery-token-ca-cert-hash sha256:9065dc8d35f11fcdf76cf6bc32f211bf835485dd2b8a661056911ea1fe766e6b
#-----------------------------------遇到的问题,仅供参供
# 报错1
# error execution phase preflight: couldn't validate the identity of the API Server: Get "https://192.168.182.134:6443/api/v1/namespaces/kube-public/configmaps/cluster-info?timeout=10s": dial tcp 192.168.182.134:6443: connect: no route to host To see the stack trace of this error execute with --v=5 or higher
# 1解决方法
# master主机上重新生成token
# 默认token有效期为24小时,当过期之后,改token就不可用了,这时就需要重新创建token(master执行)
kubeadm token create --print-join-command
# 执行后就是重新生成一个如下内容:
kubeadm join 192.168.182.136:6443 --token 8katoc.j4q74xjhj5pp3qli \
--discovery-token-ca-cert-hash sha256:9065dc8d35f11fcdf76cf6bc32f211bf835485dd2b8a661056911ea1fe766e6b
# 2 解决方法
# k8s api server不可达
# 此时需要检查和关闭所有服务器的firewalld和selinux
[root@master ~]#setenforce 0
[root@master ~]#sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
[root@master ~]# systemctl disable firewalld --now
# 3 解决方法
# 上面方法试了没用,关闭防火墙后重启服务器后可以了
# 报错2
# error execution phase kubelet-start: error uploading crisocket: timed out waiting for the condition To see the stack trace of this error execute with --v=5 or higher
# 解决
swapoff -a
kubeadm reset
systemctl daemon-reload
systemctl restart kubelet
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
# 报错3
# error execution phase preflight: [preflight] Some fatal errors occurred: [ERROR FileAvailable--etc-kubernetes-kubelet.conf]: /etc/kubernetes/kubelet.conf already exists [ERROR FileAvailable--etc-kubernetes-pki-ca.crt]: /etc/kubernetes/pki/ca.crt already exists [preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`
# 解决
# 重新初始化
kubeadm reset # 先重置
# 警告1
# [WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/
# 解决方法
# (6)(slave执行就行,可以先不执行报错了在执行)
# 使用systemd驱动(不修改在下面操作过程中会报错(警告) 检测到"cgroupfs"作为Docker的cgroup驱动程序,推荐使用systemd驱动。)
# 修改前先查看驱动信息
docker info | grep Cgrou
# 修改/etc/docker/daemon.json文件
vim /etc/docker/daemon.json
#添加以下信息
{
"exec-opts":["native.cgroupdriver=systemd"]
}
# 重启docker
systemctl restart docker
# 查看驱动信息
docker info | grep Cgrou
K8s环境准备(4、部署CNI网络插件:calico、flannel二选一)
1、CNI(Container Network Interface)是一种容器网络接口规范,它定义了如何为容器添加、删除和配置网络接口。这个规范允许不同类型的插件提供网络功能,并且能够跨不同的容器运行时工作。
2、在Kubernetes中,Pod是部署和管理容器的基本单位。每个Pod都有一个唯一的IP地址,这些IP地址通常来自于预先配置的CIDR(Classless Inter-Domain Routing)范围。在一个典型的Kubernetes集群中,会有一个或多个网段用于分配给Pod使用,比如10.244.0.0/16。这个网段会被划分为较小的子网,然后分配给各个节点上的Pod。
3、这样做的目的是确保每个Pod在网络中的唯一性,同时也使得Pod之间可以相互通信,无论它们是否位于同一主机上。通过配置适当的路由规则和网络策略,Kubernetes可以实现跨主机的容器网络通信。而CNI插件负责具体实现这些网络连接和路由规则的配置。
4、例如,Calico、Flannel等都是流行的CNI插件,它们提供了跨主机的容器网络解决方案,支持自动IP地址分配、网络策略实施等功能。
# 都是在在master节点上运行的(以最常用的calico和flannel插件为例)
# 没有部署网络插件前 STATUS是NotReady,这是因为需要一个网络插件才行
[root@meishibiexuejava-master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
meishibiexuejava-master NotReady control-plane,master 6m v1.20.1
meishibiexuejava-slave-1 NotReady <none> 15s v1.20.1
meishibiexuejava-slave-2 NotReady <none> 11s v1.20.1
meishibiexuejava-slave-3 NotReady <none> 8s v1.20.1
安装flannel网络插件(master上安装)
# (1)
# kube-flannel.yml文件在国外服务器上,搭建k8s集群时可以使用如下kube-flannel.yml。
# kube-flannel的命名空间是在 kube-system下。
# (1.1)下载连接(可能下载不了)
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
# (1.1.1)gitee 上的库
https://gitee.com/meishibiexuejava/flannel/blob/v0.21.0/Documentation/kube-flannel.yml
# (2)flannel所需的镜像可能下载缓慢需要用魔法,后者找国内镜像,但是我没有找到(我用的是阿里云服务器下载后,打包到本地)
docker pull docker.io/flannel/flannel-cni-plugin:v1.1.2
docker pull docker.io/flannel/flannel:v0.20.2
# (2.1)将镜像打包成压缩包
docker save flannel/flannel-cni-plugin:v1.1.2 flannel/flannel:v0.20.2 -o flannel.tar
# (2.2)导入镜像
docker load -i flannel.tar
# (3)修改kube-flannel.yml
vim kube-flannel.yml
如果kube-flannel.yml中的`"Network": "10.244.0.0/16"`和`--pod-network-cidr`不一样就需要修改kube-flannel.yml中的Network的值
# (4)安装网络插件
kubectl apply -f kube-flannel.yml
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
# (4.1)结果(成功)
[root@meishibiexuejava-master ~]# kubectl apply -f kube-flannel.yml
namespace/kube-flannel created
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
serviceaccount/flannel created
configmap/kube-flannel-cfg created
daemonset.apps/kube-flannel-ds created
# (5)安装成功后验证
# (5.1--可跳过)获取【kube-system命名空间】下的pod列表(查看flannel部署进度,有的版本flannel不在 kube-system命名空间下了)
kubectl get pod -n kube-system -owide
# (5.2--可跳过)获取【kube-system命名空间】下的pod列表(查看flannel部署进度,有的版本flannel不在 kube-system命名空间下了)
kubectl get pods -n kube-system
# (5.3--可跳过)获取【kube-flannel命名空间】下的pod列表(查看flannel部署进度)
kubectl get pods -n kube-flannel
# (5.4)获取【所有命名空间】下的pod列表(查看flannel部署进度)(建议使用这个吧)
kubectl get pods --all-namespaces
# (5.4.1)结果(正常)
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-flannel kube-flannel-ds-6d8wn 1/1 Running 0 24m
kube-flannel kube-flannel-ds-bzgll 1/1 Running 0 24m
kube-flannel kube-flannel-ds-fsb9m 1/1 Running 0 24m
kube-flannel kube-flannel-ds-wdczg 1/1 Running 0 24m
kube-system coredns-7f89b7bc75-gp9ff 1/1 Running 0 11h
kube-system coredns-7f89b7bc75-lqpsm 1/1 Running 0 11h
kube-system etcd-zkc-master 1/1 Running 0 11h
kube-system kube-apiserver-zkc-master 1/1 Running 0 11h
kube-system kube-controller-manager-zkc-master 1/1 Running 0 11h
kube-system kube-proxy-5p6vd 1/1 Running 0 11h
kube-system kube-proxy-bmt6k 1/1 Running 0 11h
kube-system kube-proxy-bvr48 1/1 Running 0 11h
kube-system kube-proxy-rz44k 1/1 Running 0 11h
kube-system kube-scheduler-zkc-master 1/1 Running 0 11h
# (5.5.1)查看节点状态
kubectl get nodes
# (5.5.2)结果(正常)
NAME STATUS ROLES AGE VERSION
zkc-master Ready control-plane,master 11h v1.20.1
zkc-slave-1 Ready <none> 11h v1.20.1
zkc-slave-2 Ready <none> 11h v1.20.1
zkc-slave-3 Ready <none> 11h v1.20.1
-----------------------------------遇到的问题,仅供参供
# (参考)查看日志(kube-flannel-ds-5sth7,就是 kubectl get pods --all-namespaces 执行后的 NAME)
kubectl -n kube-flannel logs kube-flannel-ds-5sth7
# (参考)查看pod日志(kube-flannel-ds-5sth7,就是 kubectl get pods --all-namespaces 执行后的 NAME)
kubectl get pod -n kube-flannel kube-flannel-ds-5sth7
# (参考)查看 pod 的详细状态,包括所有容器的状态(kube-flannel-ds-5sth7,就是 kubectl get pods --all-namespaces 执行后的 NAME)
kubectl -n kube-flannel describe pod kube-flannel-ds-5sth7
# 问题1:镜像无法拉取,但是docker images是有的
[root@meishibiexuejava-master ~]# kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-flannel kube-flannel-ds-2hgnr 1/1 Running 0 95s
kube-flannel kube-flannel-ds-5sth7 0/1 Init:ImagePullBackOff 0 95s
kube-flannel kube-flannel-ds-bhcql 1/1 Running 0 95s
kube-flannel kube-flannel-ds-lm4lg 0/1 Init:ImagePullBackOff 0 95s
kube-system coredns-7f89b7bc75-bjg7c 1/1 Running 1 48m
kube-system coredns-7f89b7bc75-vwqlg 1/1 Running 1 48m
kube-system etcd-meishibiexuejava-master 1/1 Running 1 48m
kube-system kube-apiserver-meishibiexuejava-master 1/1 Running 1 48m
kube-system kube-controller-manager-meishibiexuejava-master 1/1 Running 1 48m
kube-system kube-proxy-5d9nr 1/1 Running 0 40m
kube-system kube-proxy-7ckrj 1/1 Running 1 48m
kube-system kube-proxy-mkxjt 1/1 Running 0 40m
kube-system kube-proxy-qdshs 1/1 Running 0 40m
kube-system kube-scheduler-meishibiexuejava-master 1/1 Running 1 48m
# 查看日志
kubectl -n kube-flannel logs kube-flannel-ds-5sth7
# 查看pod日志
kubectl get pod -n kube-flannel kube-flannel-ds-5sth7
# 查看 pod 的详细状态,包括所有容器的状态
kubectl -n kube-flannel describe pod kube-flannel-ds-5sth7
# 解决
# 重启kubelet(每个节点重启kubelet)
systemctl daemon-reload
systemctl restart kubelet
# 问题2
# 执行查看安装的状态
[root@zkc-master ~]# kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-flannel kube-flannel-ds-9696z 0/1 CrashLoopBackOff 1 13s
kube-flannel kube-flannel-ds-d6tk9 0/1 CrashLoopBackOff 1 13s
kube-flannel kube-flannel-ds-l9p4p 0/1 CrashLoopBackOff 1 13s
kube-flannel kube-flannel-ds-trdd9 0/1 CrashLoopBackOff 1 13s
kube-system coredns-7f89b7bc75-gp9ff 0/1 ContainerCreating 0 10h
kube-system coredns-7f89b7bc75-lqpsm 0/1 ContainerCreating 0 10h
# 说明:
此报错是因为安装Kubeadm Init的时候,没有增加 `--pod-network-cidr 10.244.0.0/16`参数或者`kube-flannel.yml`如果yml中的`"Network": "10.244.0.0/16"`和`--pod-network-cidr`不一样,所以,修改yml文件中的Network为相同网段后即可
# 解决方式
用这个就没事:kubeadm init --apiserver-advertise-address=192.168.182.136 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.20.1 --service-cidr=10.1.0.0/16 --pod-network-cidr=10.81.0.0/16
查看集群健康状况
# (1)查看集群健康状况
kubectl get cs
# (1.1)结果(发现集群不健康)
[root@zkc-master ~]# kubectl get cs
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME STATUS MESSAGE ERROR
scheduler Unhealthy Get "http://127.0.0.1:10251/healthz": dial tcp 127.0.0.1:10251: connect: connection refused
controller-manager Unhealthy Get "http://127.0.0.1:10252/healthz": dial tcp 127.0.0.1:10252: connect: connection refused
etcd-0 Healthy {"health":"true"}
# (2)发现集群不健康,那么需要注释掉etc/kubernetes/manifests下的kube-controller-manager.yaml和kube-scheduler.yaml的 –port=0:
vim /etc/kubernetes/manifests/kube-controller-manager.yaml
vim /etc/kubernetes/manifests/kube-scheduler.yaml
# (2.1)Master节点再次查看集群健康状况:(修改后需要等一小段时间)
kubectl get cs
# (2.1.1)结果
[root@zkc-master ~]# kubectl get cs
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME STATUS MESSAGE ERROR
scheduler Healthy ok
controller-manager Healthy ok
etcd-0 Healthy {"health":"true"}
测试 kubernetes 集群
# (1)在 Kubernetes 集群中创建一个 pod,验证是否正常运行:
# (2)下载nginx
kubectl create deployment nginx --image=nginx
# (2.1)查看nginx 是否下载成功
watch kubectl get pod # 可动态查看是否下载好
kubectl get pod
# (2.1.1)结果(需要等待下载完成)
NAME READY STATUS RESTARTS AGE
nginx-6799fc88d8-gtkbc 0/1 ContainerCreating 0 51s
# (2.1.2)结果(下载成功)
NAME READY STATUS RESTARTS AGE
nginx-6799fc88d8-gtkbc 1/1 Running 0 105s
# (3)对外暴露端口
kubectl expose deployment nginx --port=80 --type=NodePort
# (4)查看pod对外端口
kubectl get pod,svc
# (4.1)结果(可以看到对外端口是:30319)
NAME READY STATUS RESTARTS AGE
pod/nginx-6799fc88d8-gtkbc 1/1 Running 0 2m11s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.1.0.1 <none> 443/TCP 21h
service/nginx NodePort 10.1.223.51 <none> 80:30319/TCP 8s
# (5)访问地址
http://NodeIP:Port
# (6)任意node节点ip+30629就可以访问
http://192.168.182.137:30319
http://192.168.182.138:30319
http://192.168.182.139:30319
# (6.1)master也可以
http://192.168.182.136:30319
# (7--可跳过)卸载
# (7.1)删除 Nginx Service:
kubectl delete service nginx
# (7.2)删除 Nginx Deployment:
kubectl delete deployment nginx
卸载flannel网络插件(适用于重新安装)
# (1)卸载 flanne(适用于重新安装)
# (2)找到之前的flannel yaml 的文件,执行:
kubectl delete -f kube-flannel.yml
# (3)删除cni配置文件
rm -rf /var/lib/cni/
rm -f /etc/cni/net.d/*
# (4)重启kubelet ,不行的话重启服务器 reboot
systemctl restart kubelet
# (5)然后查看
kubectl get pods --all-namespaces
# flannel已经消失
卸载flannel网络切换calico(也适用彻底卸载flannel)
# (1)卸载flannel网络切换calico(yaml形式安装的flanneld切换calico)
# (2)删除flannel布署资源:
kubectl delete -f kube-flannel.yml
# (3)删除路由 (我们删除网卡会自动删除这两个网卡的路由) ip route 查看路由
# 我们删除网卡会自动删除这两个网卡的路由
ip link delete flannel.1
ip link delete cni0
# (4)删除cni配置文件
rm -rf /var/lib/cni/
rm -f /etc/cni/net.d/*
# (5)删掉其他路由(此前flannel配置为host-gw网络类型,没有配置就不用删除,本文档暂时没有该配置教程)
ip route del 10.81.1.0/24 via 192.168.88.172 dev ens33
ip route del 10.81.1.0/24 via 192.168.88.171 dev ens33
ip route del 10.81.1.0/24 dev cni0 proto kernel scope link src 10.244.1.1
# (6)清除网络规则
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
# (7)重启kubelet(每个节点重启kubelet)
systemctl daemon-reload
systemctl restart kubelet
安装calico网络插件(master上安装)
# (1--参考)calico 官网3.21安装方法
https://docs.tigera.io/archive/v3.21/getting-started/kubernetes/quickstart
# (2)下载
wget https://docs.projectcalico.org/archive/v3.21/manifests/calico.yaml
# (3--参考)calico所需镜像(国内可能下载缓慢-我是从阿里云服务器下载的,然后在导入本地,本地网络环境不行,无法下载)
docker pull docker.io/calico/cni:v3.21.6
docker pull docker.io/calico/pod2daemon-flexvol:v3.21.6
docker pull docker.io/calico/node:v3.21.6
docker pull docker.io/calico/kube-controllers:v3.21.6
# (3.1)将镜像打包成压缩包
docker save calico/kube-controllers:v3.21.6 calico/cni:v3.21.6 calico/pod2daemon-flexvol:v3.21.6 calico/node:v3.21.6 -o calico.tar
# (3.2)导入镜像
docker load -i calico.tar
# (4)编辑 (要和 --pod-network-cidr 的 ip一致)
vim calico.yaml
# (4.1)替换内容
-------------------------------------------------------------------------------------------------------------------
# no effect. This should fall within `--cluster-cidr`.
# - name: CALICO_IPV4POOL_CIDR
# value: "192.168.0.0/16"
# Disable file logging so `kubectl logs` works.
- name: CALICO_DISABLE_FILE_LOGGING
value: "true"
---------------------------------------------- 换成 ---------------------------------------------------------------
# no effect. This should fall within `--cluster-cidr`.
- name: CALICO_IPV4POOL_CIDR
value: "10.81.0.0/16"
# Disable file logging so `kubectl logs` works.
- name: CALICO_DISABLE_FILE_LOGGING
value: "true"
-------------------------------------------------------------------------------------------------------------------
# (4.2)新增内容
-------------------------------------------------------- 原本内容(找到这个,下方添加新内容) -------------------------
# Cluster type to identify the deployment type
- name: CLUSTER_TYPE
value: "k8s,bgp"
-------------------------------------------------------- 新添加如下 -------------------------------------------------
# 新添加如下
- name: IP_AUTODETECTION_METHOD
value: "interface=eth.*" # 或者 value: "interface=eth0"(服务器是eth 如果是虚拟机是 ens)
# Auto-detect the BGP IP address.
- name: IP
value: "autodetect"
# Enable IPIP
- name: CALICO_IPV4POOL_IPIP
value: "Always"
-------------------------------------------------------------------------------------------------------------------
# (5)安装网络插件
kubectl apply -f calico.yaml # 使用这个
kubectl apply -f https://docs.projectcalico.org/archive/v3.14/manifests/calico.yaml
# (5.1)结果(成功)
[root@meishibiexuejava-master ~]# kubectl apply -f calico.yaml
configmap/calico-config created
customresourcedefinition.apiextensions.k8s.io/bgpconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/bgppeers.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/blockaffinities.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/caliconodestatuses.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/clusterinformations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/felixconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/globalnetworkpolicies.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/globalnetworksets.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/hostendpoints.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamblocks.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamconfigs.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamhandles.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ippools.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipreservations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/kubecontrollersconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/networkpolicies.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/networksets.crd.projectcalico.org created
clusterrole.rbac.authorization.k8s.io/calico-kube-controllers created
clusterrolebinding.rbac.authorization.k8s.io/calico-kube-controllers created
clusterrole.rbac.authorization.k8s.io/calico-node created
clusterrolebinding.rbac.authorization.k8s.io/calico-node created
daemonset.apps/calico-node created
serviceaccount/calico-node created
deployment.apps/calico-kube-controllers created
serviceaccount/calico-kube-controllers created
poddisruptionbudget.policy/calico-kube-controllers created
# (6)验证
# (6.1)使用以下命令确认您现在在集群中有3个节点。
kubectl get nodes -o wide # 查出的信息更详细
kubectl get nodes
# (6.1.1)结果(正常)
[root@meishibiexuejava-master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
meishibiexuejava-master Ready control-plane,master 23h v1.20.1
meishibiexuejava-slave-1 Ready <none> 23h v1.20.1
meishibiexuejava-slave-2 Ready <none> 23h v1.20.1
meishibiexuejava-slave-3 Ready <none> 23h v1.20.1
# (6.2)使用以下命令确认所有 pod 都在运行。
# (6.2.1)kubectl apply -f calico.yaml命令执行后需要等待一段时间才行
watch kubectl get pods --all-namespaces # 加上 watch 是一个动态的,没过几秒执行一次(用这个可以看到变化)
kubectl get pods --all-namespaces
# (6.2.1)结果(正常)
[root@meishibiexuejava-master ~]# kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system calico-kube-controllers-5bb48c55fd-sz49c 1/1 Running 1 10m
kube-system calico-node-7smlp 1/1 Running 1 10m
kube-system calico-node-ckdwt 1/1 Running 1 10m
kube-system calico-node-frr8l 1/1 Running 1 10m
kube-system calico-node-kqlck 1/1 Running 1 10m
kube-system coredns-7f89b7bc75-bjg7c 1/1 Running 37 24h
kube-system coredns-7f89b7bc75-vwqlg 1/1 Running 37 24h
kube-system etcd-meishibiexuejava-master 1/1 Running 4 24h
kube-system kube-apiserver-meishibiexuejava-master 1/1 Running 4 24h
kube-system kube-controller-manager-meishibiexuejava-master 1/1 Running 2 22h
kube-system kube-proxy-5d9nr 1/1 Running 3 23h
kube-system kube-proxy-7ckrj 1/1 Running 4 24h
kube-system kube-proxy-mkxjt 1/1 Running 3 23h
kube-system kube-proxy-qdshs 1/1 Running 3 23h
kube-system kube-scheduler-meishibiexuejava-master 1/1 Running 2 22h
# (6.3)查看 calico 容器是否运行成功
kubectl get pods -n kube-system | grep calico-node
# (6.3.1)结果
[root@meishibiexuejava-master ~]# kubectl get pods -n kube-system | grep calico-node
calico-node-7smlp 1/1 Running 0 3m28s
calico-node-ckdwt 1/1 Running 0 3m28s
calico-node-frr8l 1/1 Running 0 3m28s
calico-node-kqlck 1/1 Running 0 3m28s
# (参考)查看日志(coredns-7f89b7bc75-bjg7c,就是 kubectl get pods --all-namespaces 执行后的 NAME)
kubectl -n kube-system logs coredns-7f89b7bc75-bjg7c
# (参考)查看pod日志(coredns-7f89b7bc75-bjg7c,就是 kubectl get pods --all-namespaces 执行后的 NAME)
kubectl get pod -n kube-system coredns-7f89b7bc75-bjg7c
# (参考)查看 pod 的详细状态,包括所有容器的状态(coredns-7f89b7bc75-bjg7c,就是 kubectl get pods --all-namespaces 执行后的 NAME)
kubectl -n kube-system describe pod coredns-7f89b7bc75-bjg7c
-----------------------------------遇到的问题,仅供参供
# 警告
# Warning: apiextensions.k8s.io/v1beta1 CustomResourceDefinition is deprecated in v1.16+, unavailable in v1.22+; use apiextensions.k8s.io/v1 CustomResourceDefinition
# 原因:
我用了Kubernetes 1.20.1版本 但是 calico是3.14版本不合适,光改 “ apiextensions.k8s.io/v1beta1 改为 apiextensions.k8s.io/v1”不行还有其他格式,最简单的方式是,升级 calico 版本到 3.21
# 解决(不建议又该,改太多了,不修改可以用)
将 apiVersion 的值 apiextensions.k8s.io/v1beta1 改为 apiextensions.k8s.io/v1
# 问题:
[root@meishibiexuejava-master ~]# kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system calico-kube-controllers-5bb48c55fd-wbt6x 0/1 ImagePullBackOff 0 3m4s
kube-system calico-node-5fqwn 0/1 Init:ImagePullBackOff 0 3m4s
kube-system calico-node-5kvj4 0/1 Init:ImagePullBackOff 0 3m4s
kube-system calico-node-g9pdl 0/1 Init:2/3 0 3m4s
kube-system calico-node-xcqkh 0/1 CrashLoopBackOff 5 3m4s
kube-system coredns-7f89b7bc75-bjg7c 0/1 CrashLoopBackOff 27 23h
kube-system coredns-7f89b7bc75-vwqlg 0/1 CrashLoopBackOff 27 23h
kube-system etcd-meishibiexuejava-master 1/1 Running 3 23h
kube-system kube-apiserver-meishibiexuejava-master 1/1 Running 3 23h
kube-system kube-controller-manager-meishibiexuejava-master 1/1 Running 1 22h
kube-system kube-proxy-5d9nr 1/1 Running 2 23h
kube-system kube-proxy-7ckrj 1/1 Running 3 23h
kube-system kube-proxy-mkxjt 1/1 Running 2 23h
kube-system kube-proxy-qdshs 1/1 Running 2 23h
kube-system kube-scheduler-meishibiexuejava-master 1/1 Running 1 22h
[root@meishibiexuejava-master ~]# watch kubectl get pods --all-namespaces
[root@meishibiexuejava-master ~]# kubectl -n kube-system logs calico-node-5fqwn
2023-12-14 17:34:21.493 [INFO][9] startup/startup.go 397: Early log level set to info
2023-12-14 17:34:21.494 [INFO][9] startup/utils.go 126: Using NODENAME environment for node name meishibiexuejava-slave-1
2023-12-14 17:34:21.494 [INFO][9] startup/utils.go 138: Determined node name: meishibiexuejava-slave-1
2023-12-14 17:34:21.494 [INFO][9] startup/startup.go 99: Starting node meishibiexuejava-slave-1 with version v3.21.6
2023-12-14 17:34:21.495 [INFO][9] startup/startup.go 402: Checking datastore connection
2023-12-14 17:34:21.504 [INFO][9] startup/startup.go 426: Datastore connection verified
2023-12-14 17:34:21.504 [INFO][9] startup/startup.go 109: Datastore is ready
2023-12-14 17:34:21.509 [INFO][9] startup/customresource.go 102: Error getting resource Key=GlobalFelixConfig(name=CalicoVersion) Name="calicoversion" Resource="GlobalFelixConfigs" error=the server could not find the requested resource (get GlobalFelixConfigs.crd.projectcalico.org calicoversion)
2023-12-14 17:34:21.517 [INFO][9] startup/startup.go 455: Initialize BGP data
2023-12-14 17:34:21.518 [WARNING][9] startup/startup.go 724: Unable to auto-detect an IPv4 address using interface regexes [eth.*]: no valid host interfaces found
2023-12-14 17:34:21.518 [WARNING][9] startup/startup.go 477: Couldn't autodetect an IPv4 address. If auto-detecting, choose a different autodetection method. Otherwise provide an explicit address.
2023-12-14 17:34:21.518 [INFO][9] startup/startup.go 361: Clearing out-of-date IPv4 address from this node IP=""
2023-12-14 17:34:21.525 [WARNING][9] startup/utils.go 48: Terminating
Calico node failed to start
# 原因
Calico 在尝试自动检测 IPv4 地址时失败了。它使用了一个正则表达式来匹配主机接口名称(例如 eth.*),但是没有找到任何有效的接口
# 解决
calico.yaml 文件中, value: "interface=eth.*" ,这个地方,因为服务器是:eth,如果是虚拟机是:ens,所以修改为ens 就好了
# 问题
[root@meishibiexuejava-master ~]# kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system calico-kube-controllers-5bb48c55fd-sz49c 1/1 Running 0 4m19s
kube-system calico-node-7smlp 1/1 Running 0 4m19s
kube-system calico-node-ckdwt 1/1 Running 0 4m19s
kube-system calico-node-frr8l 1/1 Running 0 4m19s
kube-system calico-node-kqlck 1/1 Running 0 4m19s
kube-system coredns-7f89b7bc75-bjg7c 0/1 Running 34 24h
kube-system coredns-7f89b7bc75-vwqlg 0/1 Running 34 24h
kube-system etcd-meishibiexuejava-master 1/1 Running 3 24h
kube-system kube-apiserver-meishibiexuejava-master 1/1 Running 3 24h
kube-system kube-controller-manager-meishibiexuejava-master 1/1 Running 1 22h
kube-system kube-proxy-5d9nr 1/1 Running 2 23h
kube-system kube-proxy-7ckrj 1/1 Running 3 24h
kube-system kube-proxy-mkxjt 1/1 Running 2 23h
kube-system kube-proxy-qdshs 1/1 Running 2 23h
kube-system kube-scheduler-meishibiexuejava-master 1/1 Running 1 22h
# 解决
如果出现 “0/1”,建议先重启k8s或者虚拟机试一试
卸载calico网络插件(彻底卸载calico)
# (1)卸载calico(彻底卸载calico)
# (2)删除(master上执行)
kubectl delete -f calico.yaml
# (3)检查所有节点上的网络,看看是否存在Tunl0
ifconfig
# (4)删除Tunl0
modprobe -r ipip
# (5)移除Calico配置文件(查看 /etc/cni/net.d/ 目录下是否存在相关文件,如:10-calico.conflist, calico-kubeconfig,calico-tls等,需要删除。)
ls /etc/cni/net.d/
rm -rf /etc/cni/net.d/*
# (6)重启kubelet(每个节点重启kubelet)
systemctl daemon-reload
systemctl restart kubelet
# (7)查看calico开头的是否还存在
[root@meishibiexuejava-master ~]# kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system calico-kube-controllers-5bb48c55fd-sz49c 1/1 Running 0 4m19s
kube-system calico-node-7smlp 1/1 Running 0 4m19s
kube-system calico-node-ckdwt 1/1 Running 0 4m19s
kube-system calico-node-frr8l 1/1 Running 0 4m19s
kube-system calico-node-kqlck 1/1 Running 0 4m19s
# (7.1)删除pod(关于calico)
kubectl delete pod calico-kube-controllers-5bb48c55fd-sz49c --namespace=kube-system
# (7.2) 遇到的问题
[root@meishibiexuejava-master ~]# kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system calico-kube-controllers-5bb48c55fd-sz49c 0/1 Terminating 1 43m
# (7.2.1)发现
通过:kubectl get pods -o wide --all-namespaces | grep calico-kube-controllers 命令得知 slave-1还在占用
# (7.2.2)解决
重启 slave-1