在 CentOS 上离线安装 Kubernetes(k8s)
说明
- Kubernetes(k8s)全自动安装配置脚本
- 本文以 CentOS 7.9 最小化安装、Kubernetes(k8s)1.25.3 为例(其他 CentOS、k8s 版本类似),离线包(免费下载):https://download.csdn.net/download/qq_32596527/87127488。
- 如果没有在有网的环境下安装 Kubernetes(k8s)成功过,也不影响本文离线安装的阅读与学习。
- yum 包准备:可通过查阅 Kubernetes(k8s)安装 文中的
yum install ***
命令在后面添加--downloadonly --downloaddir=./下载的文件夹
下载到指定文件夹中获取,或者使用作者提供安装包。 - Docker 镜像准备:可通过学习 Kubernetes(k8s)安装 安装成功后,使用命令
ctr -n=k8s.io image list
查询 k8s 安装成功后,当前使用的 Docker 镜像,使用命令ctr -n=k8s.io image export 导出Docker镜像到磁盘的文件名 Docker镜像名
- Docer 镜像导入:
ctr -n=k8s.io image import Docker镜像导出到磁盘的文件名 Docker镜像名
- 一键生成所需命令参见:Docker 镜像迁移
准备
- 已整理的安装包:,下载所需的离线安装包。
- 将云盘中的软件安装包解压在一台没有网络的 CentOS 7.9 最小化安装的电脑上。
- 如果你的环境不是 CentOS 7.9 最小化安装,或者所需安装的 k8s、Docker、Containerd 的等版本不同时,可以根据下面的命令在有网的电脑上提前下载准备
准备 vim
shellsudo yum -y install vim --downloadonly --downloaddir=./vim
准备 wget(可忽略)
shellsudo yum -y install wget --downloadonly --downloaddir=./wget
准备 ntpdate(可忽略)
shellsudo yum -y install ntpdate --downloadonly --downloaddir=./ntpdate
准备 bash-completion(可忽略,推荐)
shellsudo yum -y install bash-completion --downloadonly --downloaddir=./bash-completion
准备 Docker、Containerd 安装前的依赖
shellsudo yum install -y yum-utils device-mapper-persistent-data lvm2 --downloadonly --downloaddir=./docker-before
准备 Docker 安装包
shellsudo curl https://download.docker.com/linux/centos/docker-ce.repo > /etc/yum.repos.d/docker-ce.repo sudo yum makecache # sudo yum clean all && yum makecache
shellsudo yum install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin containerd --downloadonly --downloaddir=./docker
准备 k8s 安装包
shellcat <<EOF > /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ # 是否开启本仓库 enabled=1 # 是否检查 gpg 签名文件 gpgcheck=0 # 是否检查 gpg 签名文件 repo_gpgcheck=0 gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOF
shellsudo yum makecache # sudo yum clean all && yum makecache
shell# yum --showduplicates list kubelet --nogpgcheck # yum --showduplicates list kubeadm --nogpgcheck # yum --showduplicates list kubectl --nogpgcheck sudo yum install -y kubelet-1.25.3-0 kubeadm-1.25.3-0 kubectl-1.25.3-0 --disableexcludes=kubernetes --nogpgcheck --downloadonly --downloaddir=./k8s
准备 k8s 初始化 Docker 镜像包,准备 containerd 所需的 Docker 镜像包 pause
- k8s 1.25.3 所需 pause 的版本是 3.8
- 当前使用的 containerd 版本是 1.6.10(最新版,2022-11-22),containerd 1.6.10 所需的 pause 版本是 3.6
- 根据上面的描述,需要下载两个 pause 版本
- 可以使用
sudo containerd config default
查看当前 containerd 所需的 pause 版本。 - 如果要修改 containerd 使用的 pause 版本,可以在
/etc/containerd/config.toml
文件中将 pause 的版本与 k8s 设置成一样的。 - 默认安装时,
/etc/containerd/config.toml
文件内容较少,并且配置不支持 k8s,需要使用sudo containerd config default > /etc/containerd/config.toml
重新生成配置文件。生成前请备份源文件。 --kubernetes-version
- kubeadm 的参数,用于控制镜像的版本
- 如果不使用
--kubernetes-version
参数,k8s 初始化下载镜像时,会使用 的,例如:- 安装的 k8s 版本是 1.26.-0,但是初始化时,下载的镜像版本是 v1.26.
- 如果需要安装的 k8s 是 1.26.-0,下载的镜像版本也是 1.26. ,则需要运行命令
kubeadm init --kubernetes-version=v1.26.1
,其他参数加在后面即可 - 如果想提前查看镜像,运行
kubeadm config images list --kubernetes-version=v1.26.1
,其他参数加在后面即可 - 如果想提前下载镜像,运行
kubeadm config images pull --kubernetes-version=v1.26.1
,其他参数加在后面即可 - 部分镜像举例:
- registry.k8s.io/kube-apiserver:v1.26.6
- registry.k8s.io/kube-controller-manager:v1.26.6
- registry.k8s.io/kube-scheduler:v1.26.6
- registry.k8s.io/kube-proxy:v1.26.6
shell# 在有网的电脑上安装 k8s 后,运行下列命令就可以获取到 k8s 初始化时所需的 docker 镜像了 kubeadm config images list # k8s 1.25.3 执行结果如下 # registry.k8s.io/kube-apiserver:v1.25.3 # registry.k8s.io/kube-controller-manager:v1.25.3 # registry.k8s.io/kube-scheduler:v1.25.3 # registry.k8s.io/kube-proxy:v1.25.3 # registry.k8s.io/pause:3.8 # registry.k8s.io/etcd:3.5.4-0 # registry.k8s.io/coredns/coredns:v1.9.3
shell# 使用 Docker 拉取镜像:k8s 1.25.3 初始化所需 Docker 镜像如下 # 如果你的网络可以直接拉取 registry.k8s.io 域名下的包,则可以直接使用下列命令,并且可以节省操作 Docker 镜像标签的命令 # docker pull registry.k8s.io/kube-apiserver:v1.25.3 # docker pull registry.k8s.io/kube-controller-manager:v1.25.3 # docker pull registry.k8s.io/kube-scheduler:v1.25.3 # docker pull registry.k8s.io/kube-proxy:v1.25.3 # docker pull registry.k8s.io/pause:3.8 # containerd 所需 # docker pull registry.k8s.io/pause:3.6 # docker pull registry.k8s.io/etcd:3.5.4-0 # docker pull registry.k8s.io/coredns/coredns:v1.9.3 # 在这里我们使用阿里云Docker镜像来拉取上面的 Docker image docker pull registry.aliyuncs.com/google_containers/kube-apiserver:v1.25.3 docker pull registry.aliyuncs.com/google_containers/kube-controller-manager:v1.25.3 docker pull registry.aliyuncs.com/google_containers/kube-scheduler:v1.25.3 docker pull registry.aliyuncs.com/google_containers/kube-proxy:v1.25.3 docker pull registry.aliyuncs.com/google_containers/pause:3.8 # containerd 所需 docker pull registry.aliyuncs.com/google_containers/pause:3.6 docker pull registry.aliyuncs.com/google_containers/etcd:3.5.4-0 docker pull registry.aliyuncs.com/google_containers/coredns:v1.9.3 docker images # 将上述的 registry.aliyuncs.com 修改为 registry.k8s.io docker tag registry.aliyuncs.com/google_containers/kube-apiserver:v1.25.3 registry.k8s.io/kube-apiserver:v1.25.3 docker tag registry.aliyuncs.com/google_containers/kube-scheduler:v1.25.3 registry.k8s.io/kube-scheduler:v1.25.3 docker tag registry.aliyuncs.com/google_containers/kube-controller-manager:v1.25.3 registry.k8s.io/kube-controller-manager:v1.25.3 docker tag registry.aliyuncs.com/google_containers/kube-proxy:v1.25.3 registry.k8s.io/kube-proxy:v1.25.3 docker tag registry.aliyuncs.com/google_containers/pause:3.8 registry.k8s.io/pause:3.8 # containerd 所需 docker tag registry.aliyuncs.com/google_containers/pause:3.6 registry.k8s.io/pause:3.6 docker tag registry.aliyuncs.com/google_containers/etcd:3.5.4-0 registry.k8s.io/etcd:3.5.4-0 # 注意这里的名称为 coredns/coredns:v1.9.3 docker tag registry.aliyuncs.com/google_containers/coredns:v1.9.3 registry.k8s.io/coredns/coredns:v1.9.3 # 保存镜像到磁盘 docker save -o kube-apiserver-v1.25.3.tar registry.k8s.io/kube-apiserver:v1.25.3 docker save -o kube-controller-manager-v1.25.3.tar registry.k8s.io/kube-controller-manager:v1.25.3 docker save -o kube-scheduler-v1.25.3.tar registry.k8s.io/kube-scheduler:v1.25.3 docker save -o kube-proxy-v1.25.3.tar registry.k8s.io/kube-proxy:v1.25.3 docker save -o pause-3.8.tar registry.k8s.io/pause:3.8 # containerd 所需 docker save -o pause-3.6.tar registry.k8s.io/pause:3.6 docker save -o etcd-3.5.4-0.tar registry.k8s.io/etcd:3.5.4-0 docker save -o coredns-v1.9.3.tar registry.k8s.io/coredns/coredns:v1.9.3 # 将上述镜像复制到已安装 k8s、待初始化 k8s 的系统上
下面是 k8s 1.25.3 初始化所需要的 Docker 镜像包
准备 网络 calico 初始化 Docker 镜像包
本文使用 calico 3.24.5,可以从下面链接中获取
如果要使用其他版本的 calico,请查看 calico.yaml 文件中的 calico/node、calico/cni、calico/kube-controllers 版本,下载对应的 Docker 镜像就可
不同 calico 支持的 k8s 版本不同,请查看 calico 与 k8s 版本的对应关系:Kubernetes(k8s)安装
shelldocker pull docker.io/calico/node:v3.24.5 docker pull docker.io/calico/cni:v3.24.5 docker pull docker.io/calico/kube-controllers:v3.24.5 docker images docker save -o node-v3.24.5.tar docker.io/calico/node:v3.24.5 docker save -o cni-v3.24.5.tar docker.io/calico/cni:v3.24.5 docker save -o kube-controllers-v3.24.5.tar docker.io/calico/kube-controllers:v3.24.5
安装
安装 vim
shellcd ./vim yum -y localinstall *.rpm # yum -y install *.rpm cd ..
安装 wget(可忽略)
shellcd ./wget yum -y localinstall *.rpm # yum -y install *.rpm cd ..
安装 ntpdate(可忽略)
shellcd ./ntpdate yum -y localinstall *.rpm # yum -y install *.rpm cd ..
安装 bash-completion(可忽略,推荐)
shellcd ./bash-completion yum -y localinstall *.rpm # yum -y install *.rpm source /etc/profile cd ..
安装 Docker、Containerd 安装前的依赖
shellcd ./docker-before yum -y localinstall *.rpm # yum -y install *.rpm cd ..
安装 Docker、Containerd
shellcd ./docker yum -y localinstall *.rpm # yum -y install *.rpm cd .. # 启动 docker 时,会启动 containerd # sudo systemctl status containerd.service --no-pager sudo systemctl stop containerd.service sudo cp /etc/containerd/config.toml /etc/containerd/config.toml.bak sudo containerd config default > $HOME/config.toml sudo cp $HOME/config.toml /etc/containerd/config.toml # 由于是离线安装,提前准备了Docker镜像,所以此处不用修改 pause # https://kubernetes.io/zh-cn/docs/setup/production-environment/container-runtimes/#containerd-systemd # 确保 /etc/containerd/config.toml 中的 disabled_plugins 内不存在 cri sudo sed -i "s#SystemdCgroup = false#SystemdCgroup = true#g" /etc/containerd/config.toml sudo systemctl enable --now containerd.service # sudo systemctl status containerd.service --no-pager # sudo systemctl status docker.service --no-pager sudo systemctl start docker.service # sudo systemctl status docker.service --no-pager sudo systemctl enable docker.service sudo systemctl enable docker.socket sudo systemctl list-unit-files | grep docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://hnkfbj7x.mirror.aliyuncs.com"], "exec-opts": ["native.cgroupdriver=systemd"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker sudo docker info
shellsudo systemctl status docker.service --no-pager
shellsudo systemctl status containerd.service --no-pager
安装 k8s
shell# 设置所需的 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
shell# 应用 sysctl 参数而不重新启动 sudo sysctl --system
shellcd k8s yum -y localinstall *.rpm # yum -y install *.rpm cd .. systemctl daemon-reload sudo systemctl restart kubelet sudo systemctl enable kubelet
导入k8s 初始化时所需的Docker镜像
shellcd init-images # 注意这里指定了命名空间为 k8s.io ctr -n=k8s.io image import kube-apiserver-v1.25.3.tar ctr -n=k8s.io image import kube-controller-manager-v1.25.3.tar ctr -n=k8s.io image import kube-scheduler-v1.25.3.tar ctr -n=k8s.io image import kube-proxy-v1.25.3.tar ctr -n=k8s.io image import pause-3.8.tar # containerd 使用 ctr -n=k8s.io image import pause-3.6.tar ctr -n=k8s.io image import etcd-3.5.4-0.tar ctr -n=k8s.io image import coredns-v1.9.3.tar ctr -n=k8s.io images list ctr i list cd ..
将主机名指向本机IP,主机名只能包含:字母、数字、-(横杠)、.(点)
获取主机名
shellhostname
临时设置主机名
shellhostname 主机名
永久设置主机名
shellsudo echo '主机名' > /etc/hostname
编辑 hosts
shellsudo vim /etc/hosts
控制面板:设置IP
shell当前机器的IP 当前机器的主机名
关闭防火墙、或者开通指定端口
shellsudo systemctl stop firewalld.service sudo systemctl disable firewalld.service
shell# 控制面板 firewall-cmd --zone=public --add-port=6443/tcp --permanent # Kubernetes API server 所有 firewall-cmd --zone=public --add-port=2379/tcp --permanent # etcd server client API kube-apiserver, etcd firewall-cmd --zone=public --add-port=2380/tcp --permanent # etcd server client API kube-apiserver, etcd firewall-cmd --zone=public --add-port=10250/tcp --permanent # Kubelet API 自身, 控制面 firewall-cmd --zone=public --add-port=10259/tcp --permanent # kube-scheduler 自身 firewall-cmd --zone=public --add-port=10257/tcp --permanent # kube-controller-manager 自身 firewall-cmd --zone=trusted --add-source=192.168.80.60 --permanent # 信任集群中各个节点的IP firewall-cmd --zone=trusted --add-source=192.168.80.16 --permanent # 信任集群中各个节点的IP firewall-cmd --add-masquerade --permanent # 端口转发 firewall-cmd --reload firewall-cmd --list-all firewall-cmd --list-all --zone=trusted # 工作节点 firewall-cmd --zone=public --add-port=10250/tcp --permanent # Kubelet API 自身, 控制面 firewall-cmd --zone=public --add-port=30000-32767/tcp --permanent # NodePort Services† 所有 firewall-cmd --zone=trusted --add-source=192.168.80.60 --permanent # 信任集群中各个节点的IP firewall-cmd --zone=trusted --add-source=192.168.80.16 --permanent # 信任集群中各个节点的IP firewall-cmd --add-masquerade --permanent # 端口转发 firewall-cmd --reload firewall-cmd --list-all firewall-cmd --list-all --zone=trusted
关闭交换空间
shellsudo swapoff -a sudo sed -i 's/.*swap.*/#&/' /etc/fstab
k8s 初始化
shell# 由于导入的 Docker 镜像已经修改为原始的名称,故此处初始化无需增加 --image-repository=registry.aliyuncs.com/google_containers kubeadm init # 指定集群的IP # kubeadm init --image-repository=registry.aliyuncs.com/google_containers --apiserver-advertise-address=192.168.80.60 mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config kubectl cluster-info # 初始化失败后,可进行重置,重置命令:kubeadm reset # 执行成功后,会出现类似下列内容: # kubeadm join 192.168.80.60:6443 --token f9lvrz.59mykzssqw6vjh32 \ # --discovery-token-ca-cert-hash sha256:4e23156e2f71c5df52dfd2b9b198cce5db27c47707564684ea74986836900107
网络初始化,下载 calico.yaml 文件,复制到电脑上
shellcd calico ctr -n=k8s.io image import node-v3.24.5.tar ctr -n=k8s.io image import cni-v3.24.5.tar ctr -n=k8s.io image import kube-controllers-v3.24.5.tar cd ..
shell# 增加 DNS vim /etc/resolv.conf
shell# 没有DNS时随便写一个 nameserver 192.168.10.1
shellkubectl apply -f calico.yaml
查看集群
shellkubectl get pods --all-namespaces -o wide
shellkubectl get nodes -o wide
关于去污、创建实例、其他命令,参见 Kubernetes(k8s)安装