Docker$Kubernetes笔记---01---Kubernetes的集群部署
2023-11-07 14:26:19 0 举报
Kubernetes的集群部署
作者其他创作
大纲/内容
概念及组件、工具解释
k8s:kubernetes,因为k和s之间,有8个字母,所以通常又称为K8S。用来对容器进行调度和管理的,即用来对容器进行编排的。
CRI:容器运行时接口 container runtime interface
CNI: Container Network Interface 的缩写,它是一个用于定义和配置容器网络的标准接口。CNI 插件负责为容器设置网络连接,以使容器可以与其他容器和外部网络通信。
cri-containerd-cni:cri-containerd-cni组件包含了containerd、CNI 插件(Container Network Interface 插件)、crictl、Kubernetes CRI 接口(gRPC API)
containerd:containerd 是一个开源的容器运行时,由 Docker 团队维护。它负责容器的生命周期管理,包括创建、运行、停止和删除容器,以及镜像管理等。containerd 是 cri-containerd-cni 的核心组件,用于运行和管理容器。
CNI 插件(Container Network Interface 插件):CNI 插件是一组用于配置容器网络的插件,使容器能够与其他容器和外部网络进行通信。cri-containerd-cni 包括一组 CNI 插件,用于为容器配置网络,以确保它们可以正常工作。
crictl:crictl 是一个命令行工具,用于与 Kubernetes CRI(Container Runtime Interface)兼容的容器运行时进行交互。它允许管理员执行容器运行时操作,如创建、启动、停止和查看容器等。crictl 通常包括在 cri-containerd-cni 中,以便管理员可以与容器运行时交互。
Kubernetes CRI 接口(gRPC API):cri-containerd-cni 实现了 Kubernetes CRI 接口,这是 Kubernetes 控制平面与容器运行时之间的标准通信协议。它定义了 Kubernetes 控制平面如何与容器运行时进行交互,以管理容器。
runc:runc 是一个用于运行容器的命令行工具,它是 OCI(Open Container Initiative)标准的一部分,用于创建和运行容器。OCI 是一个定义容器规范的开放标准,旨在提供容器格式和运行时的一致性,以确保容器在不同容器运行时中具有可移植性。它通常用于容器运行时的创建和管理,但不包括高级容器编排功能,如容器编排、服务发现等。runc 主要关注容器的生命周期管理和资源隔离。
OCI 标准:runc 遵循 OCI 标准,这意味着它可以与符合 OCI 标准的容器镜像一起使用。这有助于确保容器可以在不同的容器运行时中运行,而无需修改容器镜像。
容器运行时:runc 是一个容器运行时,负责创建和运行容器。它提供了一种将容器启动的底层方法,但不提供高级容器编排功能。因此,通常需要与容器编排工具(如 Kubernetes、Docker Compose 等)一起使用,以实现容器的自动化部署和管理。
轻量级:runc 设计简单,轻量级,专注于容器的生命周期管理。它的目标是提供一个标准的接口,以便与各种容器编排平台和工具集成。
安全性:runc 非常关注安全性,它采用了许多安全机制,以确保容器在运行时的隔离性和安全性。这包括使用 Linux 的命名空间、控制组(cgroup)、Seccomp 等特性来隔离容器。
可移植性:runc 的标准接口使得容器可以在不同的容器运行时中运行,从而实现容器的可移植性。这有助于避免对特定容器运行时的依赖性。
nerdctl:nerdctl 是一个用于运行容器的命令行工具,它是 containerd 的封装器,旨在提供与 Docker CLI 相似的用户体验。nerdctl 可以用来管理和运行容器,而无需完全依赖于 Docker CLI。
兼容性:nerdctl 旨在与 Docker CLI 兼容,因此您可以使用类似的命令和选项来运行容器。这使得迁移到 nerdctl 相对容易,尤其是对于那些习惯于使用 Docker CLI 的用户。
依赖于 containerd:与 Docker 不同,nerdctl 不使用 Docker 引擎,而是依赖于 containerd。这意味着它可以提供更轻量级的容器运行时,同时保持 Docker 命令的兼容性。
支持 OCI 标准:nerdctl 遵循 OCI(Open Container Initiative)标准,这是一个定义容器规范的开放标准。这使得它可以与符合 OCI 标准的容器镜像一起使用。
不需要 root 权限:nerdctl 允许非特权用户运行容器,因此不需要 root 权限。这有助于提高安全性。
可用选项和功能:nerdctl 支持常见的 Docker 命令,如 run、build、ps 等,以及一些其他功能,例如多阶段构建、GPU 支持等。
crictl:crictl 是一个命令行工具,用于与 Kubernetes CRI(Container Runtime Interface)兼容的容器运行时进行交互。它允许您在 Kubernetes 集群中执行容器运行时操作,如创建、启动、停止、删除容器,查看容器状态以及获取容器日志等。
kubeadm,kubelet 和 kubectl<br>
kubeadm(Kubernetes Admin):<br>作用:kubeadm 是一个命令行工具,用于快速部署和初始化 Kubernetes 集群。它可以帮助管理员在不同的环境中设置 Kubernetes 主控节点(Master Node)。<br>用途:通常用于在新的集群中创建和配置 Master 节点,以便其他节点可以加入集群。kubeadm 可以自动处理大部分复杂的初始化工作。<br>
kubelet:<br>作用:kubelet 是每个 Kubernetes 节点上运行的主要代理。它负责维护节点的容器生命周期,确保容器正常运行。kubelet 还与 Master 节点通信,确保节点的状态和资源使用信息被汇报到集群的控制平面。<br>用途:kubelet 用于在节点上管理容器,它会监控 Pod 的创建、更新和销毁,并确保它们的状态与期望状态一致。<br>
kubectl:<br>作用:kubectl 是 Kubernetes 集群的命令行客户端工具,用于与集群进行交互。管理员和开发人员可以使用 kubectl 执行各种操作,如创建、管理和监视 Kubernetes 资源(如 Pod、Service、Deployment 等)。<br>用途:kubectl 允许用户执行各种操作,包括创建和部署应用程序、查看集群状态、调试故障、扩展集群等。<br>
K8S在1.24版本开始直接把dockershim代码删除了,直接弃用了docker;前因后果可以查看这篇文档:https://www.cnblogs.com/1234roro/p/16892031.html
Alpha 阶段:<br>在 Alpha 阶段,软件处于早期开发阶段,通常由内部开发团队进行测试。这个阶段的软件可能存在许多缺陷和问题,并且不适合正式发布给外部用户。Alpha 阶段的主要目标是内部测试和探索,以发现和修复问题。<br>
Beta 阶段<br>在 Beta 阶段,软件已经发展到足够成熟的程度,可以在有限的用户群体中进行测试。这些用户可能是开发者、测试人员或愿意承担一些风险的终端用户。在 Beta 阶段,软件可能仍然存在某些问题,但已经经过了内部 Alpha 测试,并进行了一些修复和改进。<br>
Stable 阶段<br>在 Stable 阶段,软件已经经历了广泛的测试,包括 Beta 测试和可能的公开测试。在这个阶段,软件被认为是相对稳定和可靠的,并且适合正式发布和广泛使用。稳定版本的软件应该在性能、安全性和可用性方面经过了充分验证。<br>
Docker安装部署---安装最新版本
如果之前有安装过docker的可以用以下命令移除掉旧版本<br><font color="#4669ea">yum remove docker \<br> docker-client \<br> docker-client-latest \<br> docker-common \<br> docker-latest \<br> docker-latest-logrotate \<br> docker-logrotate \<br> docker-selinux \<br> docker-engine-selinux \<br> docker-engine</font><br>
删除所有旧的数据<br><font color="#4669ea">rm -rf /var/lib/docker</font>
安装依赖包<br><font color="#4669ea">yum install -y yum-utils device-mapper-persistent-data lvm2</font><br>
添加docker的yum源,这里使用阿里云的镜像<br><font color="#4669ea">yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo</font><br>
配置缓存<br><font color="#4669ea">yum makecache fast</font><br>
安装最新稳定版本的docker<br><font color="#4669ea">yum install -y docker-ce</font><br>
配置镜像加速器<br><font color="#4669ea">mkdir -p /etc/docker<br>cat <<EOF > /etc/docker/daemon.json<br>{<br>"registry-mirrors": ["https://aoewjvel.mirror.aliyuncs.com"]<br>}<br>EOF</font><br>
启动docker引擎并设置开机启动<br><font color="#4669ea">systemctl start docker<br>systemctl enable docker</font><br>
查看docker当前的历史版本并使其倒叙排序,最新的在最上面<br><font color="#4669ea">yum list docker-ce --showduplicates | sort -r</font>
Docker安装部署---安装指定版本
如果之前有安装过docker的可以用以下命令移除掉旧版本<br><font color="#4669ea">yum remove docker \<br> docker-client \<br> docker-client-latest \<br> docker-common \<br> docker-latest \<br> docker-latest-logrotate \<br> docker-logrotate \<br> docker-selinux \<br> docker-engine-selinux \<br> docker-engine</font><br>
删除所有旧的数据<br><font color="#4669ea">rm -rf /var/lib/docker</font>
安装依赖包<br><font color="#4669ea">yum install -y yum-utils device-mapper-persistent-data lvm2</font><br>
添加docker的yum源,这里使用阿里云的镜像<br><font color="#4669ea">yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo</font><br>
查看docker当前的历史版本并使其倒叙排序,最新的在最上面<br><font color="#4669ea">yum list docker-ce --showduplicates | sort -r</font>
配置缓存<br><font color="#4669ea">yum makecache fast</font><br>
安装指定版本的docker<br><font color="#4669ea">yum install -y docker-ce-20.10.24 docker-ce-cli-20.10.24 containerd.io</font><br>
配置镜像加速器<br><font color="#4669ea">mkdir -p /etc/docker<br>cat <<EOF > /etc/docker/daemon.json<br>{<br>"registry-mirrors": ["https://aoewjvel.mirror.aliyuncs.com"]<br>}<br>EOF</font><br>
启动docker引擎并设置开机启动<br><font color="#4669ea">systemctl start docker<br>systemctl enable docker</font><br>
K8S一主多从安装部署步骤
准备工作---所有节点都需要运行
配置部署所需基础环境
安装常用工具,更改系统的默认yum源<br><font color="#4669ea">yum install -y wget<br>mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup<br>wget http://mirrors.163.com/.help/CentOS7-Base-163.repo -O /etc/yum.repos.d/CentOS-Base.repo<br>yum install -y vim</font><br>
关闭系统自带的防火墙<br><font color="#4669ea">systemctl stop firewalld && systemctl disable firewalld<br>setenforce 0 && sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config</font>
设置hostname,此处以1.197为master节点,其他两台为从节点<br><font color="#4669ea">echo -e "192.168.1.197 master\n192.168.1.198 node01\n192.168.1.199 node02" >> /etc/hosts</font><br>
关闭交换分区<br><font color="#4669ea">swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab</font><br>
配置时间服务器并同步时间<br><font color="#4669ea">yum install -y ntp<br>ntpdate ntp.aliyun.com</font><br>
添加网桥过滤和地址转发功能<br><font color="#4669ea">cat <<EOF > /etc/sysctl.d/kubernetes.conf<br>net.bridge.bridge-nf-call-ip6tables = 1<br>net.bridge.bridge-nf-call-iptables = 1<br>net.ipv4.ip_forward = 1<br>EOF</font><br><br>重新加载配置:<br><font color="#4669ea">sysctl -p</font><br>
加载网桥过滤器模块<br><font color="#4669ea">modprobe br_netfilter</font><br>
查看网桥过滤器模块是否加载成功<br><font color="#4669ea">lsmod | grep br_netfilter</font><br>
配置ipvs<br>安装ipset和ipvsadm软件<br><font color="#4669ea">yum -y install ipset ipvsadm</font><br>添加需要加载的模块写入脚本文件<br><font color="#4669ea">cat > /etc/sysconfig/modules/ipvs.modules <<EOF<br>modprobe -- ip_vs<br>modprobe -- ip_vs_rr<br>modprobe -- ip_vs_wrr<br>modprobe -- ip_vs_sh<br>modprobe -- nf_conntrack_ipv4<br>EOF</font><br>设置脚本权限<br><font color="#4669ea">chmod +x /etc/sysconfig/modules/ipvs.modules</font><br>执行脚本<br><font color="#4669ea">/etc/sysconfig/modules/ipvs.modules</font><br>查看对应的模块是否加载成功<br><font color="#4669ea">lsmod | grep -e ip_vs -e nf_conntrack_ipv4</font><br>
重启系统,使之前的配置生效<br><font color="#4669ea"> reboot</font><br>
安装容器
为什么部署K8S要安装容器<br>Kubernetes(简称k8s)是一个开源的容器编排平台,由Google发起并开源。它用于自动化容器化应用程序的部署、扩展和管理。Kubernetes支持多种容器运行时技术,其中最为广泛使用的就是Docker。通过Kubernetes,我们可以对容器进行分布式管理,实现容器的高可用、负载均衡和故障恢复等功能。<br>
Kubernetes 的两种调用链<br>1:用 CRI 接口调用 dockershim,然后 dockershim 调用 Docker,Docker 再走 containerd 去操作容器。<br>2:用 CRI 接口直接调用 containerd 去操作容器。<br><br>
方法一:安装docker,步骤参考上面的docker安装部署
安装完docker后在启动docker前需要更改以下配置,<br><font color="#4669ea">cat <<EOF > /etc/docker/daemon.json<br>{<br>"registry-mirrors": ["https://aoewjvel.mirror.aliyuncs.com"],<br>"exec-opts": ["native.cgroupdriver=systemd"]<br>}</font><br><font color="#ec6e6c">PS:第一条是配置了Docker 镜像仓库的镜像加速器<br>PS:第二条是指定了 Docker 在容器运行时中使用 systemd 作为 cgroup 驱动程序。这是一种容器运行时的配置,以便 Docker 与系统中的 cgroup(控制组)管理相集成;Docker默认使用的Cgroup Driver为默认文件驱动,而k8s默认使用的文件驱动为systemd,k8s要求驱动类型必须要一致,所以需要将docker文件驱动改成systemd</font>
方法二:K8S1.24版本后就不在使用dockershim调用docker,所以在部署k8s1.24及以上版本时就不能使用docker去操作容器,我们需要新的插件去操作容器;此处以cri-containerd-cni插件为例:<br>
选择所需的版本,点击进去拉倒最下面找对应的安装包,此处以为例:https://github.com/containerd/containerd/releases/download/v1.6.23/cri-containerd-cni-1.6.23-linux-amd64.tar.gz<br><font color="#4669ea">wget https://github.com/containerd/containerd/releases/download/v1.6.23/cri-containerd-cni-1.6.23-linux-amd64.tar.gz</font>
下载containerd 的二进制包并解压<br>
可以使用下列命令直接将安装包解压至根目录,但如果已经存文同名文件会直接覆盖掉,存在一定的风险。可以参考这个文档:https://www.cnblogs.com/zjl-throb/p/16528463.html<br><font color="#4669ea">tar -zxvf cri-containerd-cni-1.6.23-linux-amd64.tar.gz -C /<br>vim /etc/profile<br>export PATH=$PATH:/usr/local/bin:/usr/local/sbin<br>source /etc/profile</font><br>
但推荐先解压至指定目录 然后再将下列文件复制到对应的目录即可:可以参考这个文档中第三点:https://blog.51cto.com/flyfish225/5360370<br><font color="#4669ea">mkdir containerd<br>tar -zxvf cri-containerd-cni-1.6.23-linux-amd64.tar.gz -C containerd<br>cp -p /root/containerd/usr/local/bin/* /usr/local/bin/<br>cp -p /root/containerd/etc/systemd/system/containerd.service /usr/lib/systemd/system/<br>chmod +x /usr/lib/systemd/system/containerd.service</font><br>
生成containerd 的配置文件<br>
生成配置文件<br>Containerd 的默认配置文件为 `/etc/containerd/config.toml`,可以使用`containerd config default > /etc/containerd/config.toml`命令创建一份模块配置文件<br><font color="#4669ea">mkdir -p /etc/containerd<br>containerd config default > /etc/containerd/config.toml</font><br>
配置文件的部分解释
root 和 state<br>这些是 containerd 使用的文件系统根目录和运行时状态目录的路径。通常,/var/lib/containerd 是存储容器和运行时数据的根目录,而 /run/containerd 用于存储运行时状态<br>
grpc<br>这部分配置了 gRPC 通信的相关参数,包括 gRPC 通信的地址和一些身份验证和安全性设置。
cni<br>这部分包含 CNI(Container Network Interface) 插件的配置,用于容器的网络设置。它指定了 CNI 插件的二进制文件路径和配置文件路径。
containerd.default_runtime<br>这是容器的默认运行时配置,包括默认的运行时名称、容器注释等。
containerd.runtimes<br>这部分配置了不同运行时的选项,包括 runc 运行时和它的选项。
containerd.snapshotter<br>这部分配置了容器快照(snapshot)的存储后端,包括 aufs、btrfs、overlayfs、zfs 等。
stream_processors<br>这部分配置了容器图像流处理器,用于处理加密的容器图像流。
timeouts<br>这部分配置了容器操作的超时时间,以确保容器操作在合理的时间内完成。
ttrpc<br>这是 ttrpc(Type-Transparent Remote Procedure Call)通信的配置,它用于 containerd 内部的通信。
更改配置文件<br>备份下配置文件后再作更改<br><font color="#4669ea">cp -p /etc/containerd/config.toml /etc/containerd/config.toml.bak</font><br>
更改容器的 cgroup driver<br><font color="#4669ea">将SystemdCgroup = false改成true<br><br></font>
更改进项仓库的加速器<br>原本是国外镜像:<font color="#4669ea">sandbox_image = "registry.k8s.io/pause:3.6"</font><br><font color="#4669ea">可以改成sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9" </font><br><font color="#e74f4c">PS:这里pause:3.9的版本可以根据下面kubeadm config images list获取的版本来定,当前用的1.28.2版本对应的是3.9版本</font><font color="#4669ea"><br></font><br>
启动containerd并设置开机启动<br><font color="#4669ea">systemctl enable containerd<br>systemctl start containerd<br>systemctl status containerd</font><br><br>
查看containerd版本<br><font color="#4669ea">ctr version</font><br>
<font color="#e74f4c">安装runc</font>
<font color="#e74f4c">必须额外安装runc,因为cri-containerd-cni这个包里的runc有问题,输入runc无法调用命令,例如,输入runc不能提示帮助</font>
下载地址:https://github.com/opencontainers/runc/releases/download/v1.1.9/runc.amd64<br><font color="#4669ea">wget https://github.com/opencontainers/runc/releases/download/v1.1.9/runc.amd64</font><br><font color="#4669ea">chmod +x runc.amd64<br>which runc<br>mv runc.amd64 /usr/local/sbin/runc<br>runc --version<br></font><br>
安装kubeadm、kubelet、kubectl
配置K8S的yum源
配置阿里云上的K8S yum源<br><font color="#4669ea">cat <<EOF > /etc/yum.repos.d/kubernetes.repo<br>[kubernetes]<br>name=Kubernetes<br>baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64<br>enabled=1<br>gpgcheck=0<br>repo_gpgcheck=0<br>gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg<br>EOF<br></font><br><font color="#4669ea">yum repolist<br>yum makecache</font><br>
安装kubeadm、kubelet、kubectl最新版本<br><font color="#4669ea">yum install -y kubelet kubeadm kubectl</font><br>
安装kubeadm、kubelet、kubectl最新版本<br><font color="#4669ea">yum install -y kubelet-1.23.0 kubeadm-1.23.0 kubectl-1.23.0</font><br>
配置kubelet<br>为了实现docker使用的cgroupdriver与kubelet使用的cgroup的一致性,建议修改如下文件内容。<br><font color="#4669ea">vim /etc/sysconfig/kubelet<br>KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"</font><br><br>
启动kubectl并设置其开机自启动<br><font color="#4669ea">systemctl enable --now kubelet</font><br>
修改K8S证书有效期
<font color="#e855a4">为什么要修改证书有效期:<br>k8s各组件非常依赖证书;而默认情况下ca证书是十年,而其他证书都只有一年;Kubernetes中的如果证书过期了,会导致集群中的许多组件无法正常通信,从而影响整个集群的功能。</font><br>
查看证书有效期
方法一:<br><font color="#4669ea">cd /etc/kubernetes/pki<br>for i in $(ls *.crt); do echo "===== $i ====="; openssl x509 -in $i -text -noout | grep -A 3 'Validity' ; done</font><br><br>
方法二:<br><font color="#4669ea">kubeadm certs check-expiration</font><br><br>
安装GO并配置
下载源码<br><font color="#4669ea">wget https://go.dev/dl/go1.21.3.linux-amd64.tar.gz</font><br>
解压安装<br><font color="#4669ea">tar -xf go1.21.3.linux-amd64.tar.gz -C /usr/local/</font><br>
添加环境变量<br><font color="#4669ea">echo "export PATH=$PATH:/usr/local/go/bin" >>/etc/profile<br>source /etc/profile</font><br>
验证是否安装<br><font color="#4669ea">go version</font><br><br>
下载对应版本的k8s源码<br>查看版本然后去github上下载对应的版本<br><font color="#4669ea">kubectl version<br>wget https://github.com/kubernetes/kubernetes/archive/refs/tags/v1.28.2.tar.gz</font><br><br>
解压<br><font color="#4669ea">tar -zxf kubernetes-1.28.2.tar.gz</font><br>
修改两个证书的源文件<br><font color="#4669ea">cd kubernetes-1.28.2</font><br>
修改kubeadm证书;constants.go 文件<br><font color="#4669ea">vim cmd/kubeadm/app/constants/constants.go</font><br>
修改CA 证书:cert.go文件<br><font color="#4669ea">vim staging/src/k8s.io/client-go/util/cert/cert.go</font><br>
编译源代码<br>重新编辑之前先安装rsync ,不然会提示缺少这个工具<br><font color="#4669ea">yum -y install rsync</font><br><br><font color="#4669ea">make WHAT=cmd/kubeadm GOFLAGS=-v</font><br><br>
替换就文件,更换kubeadm
备份文件<br><font color="#4669ea">cp /usr/bin/kubeadm /usr/bin/kubeadm.bak</font><br>
替换文件<br><font color="#4669ea">cp _output/bin/kubeadm /usr/bin/</font><br>
备份证书<br><font color="#4669ea">cd /etc/kubernetes<br>cp -R pki pki.bak</font><br><br>
更新所有证书<br><font color="#4669ea">kubeadm certs renew all</font><br>重启服务或者重启机器,这边选择重启机器<br><font color="#4669ea">reboot</font>
查看证书<br><font color="#4669ea">kubeadm certs check-expiration</font><br><br>
下载集群所需镜像
使用命令列出集群在配置过程中需要哪些镜像:<br><font color="#4669ea">kubeadm config images list</font><br>
因为这个是外网的无法访问,需要替换成国内的镜像地址;
安装docker的直接通过docker去拉取
新建一个文件,将上面获取的镜像名称复制到文件中,然后遍历这个文件,依次进行镜像的下载<br>
示例:<br><span class="tag">#!/bin/bash</span><br><font color="#4669ea">images=(</font><br><font color="#4669ea">kube-apiserver:v1.28.2</font><br><font color="#4669ea">kube-controller-manager:v1.28.2</font><br><font color="#4669ea">kube-scheduler:v1.28.2</font><br><font color="#4669ea">kube-proxy:v1.28.2</font><br><font color="#4669ea">pause:3.9</font><br><font color="#4669ea">etcd:3.5.9-0</font><br><font color="#4669ea">coredns:v1.10.1</font><br><font color="#4669ea">)</font><br><font color="#4669ea">for</font> <font color="#4669ea">imageName</font> <font color="#4669ea">in</font> <font color="#4669ea">${images[@]};do</font><br><font color="#4669ea">docker</font> <font color="#4669ea">pull</font> <font color="#4669ea">registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName</font><br><font color="#4669ea">docker</font> <font color="#4669ea">tag</font> <font color="#4669ea">registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName</font> <font color="#4669ea">k8s.gcr.io/$imageName</font><br><font color="#4669ea">docker</font> <font color="#4669ea">rmi</font> <font color="#4669ea">registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName</font><br><font color="#4669ea">done</font><br><br>
再次查看镜像<br><font color="#4669ea">docker images</font><br><br>
安装containerd的通过ctr命令拉取
新建一个文件,将上面获取的镜像名称复制到文件中,然后遍历这个文件,依次进行镜像的下载
示例:<br><span class="tag">#!/bin/bash</span><br><br><font color="#4669ea">images=(</font><br><font color="#4669ea">kube-apiserver:v1.28.2</font><br><font color="#4669ea">kube-controller-manager:v1.28.2</font><br><font color="#4669ea">kube-scheduler:v1.28.2</font><br><font color="#4669ea">kube-proxy:v1.28.2</font><br><font color="#4669ea">pause:3.9</font><br><font color="#4669ea">etcd:3.5.9-0</font><br><font color="#4669ea">coredns:v1.10.1</font><br><font color="#4669ea">)</font><br><font color="#4669ea">for</font> <font color="#4669ea">imageName</font> <font color="#4669ea">in</font> <font color="#4669ea">"${images[@]}";</font> <font color="#4669ea">do</font><br><font color="#4669ea">ctr</font> <font color="#4669ea">-n</font> <font color="#4669ea">k8s.io</font> <font color="#4669ea">i</font> <font color="#4669ea">pull</font> <font color="#4669ea">registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName</font><br><font color="#4669ea">ctr</font> <font color="#4669ea">-n</font> <font color="#4669ea">k8s.io</font> <font color="#4669ea">i</font> <font color="#4669ea">tag</font> <font color="#4669ea">registry.cn-hangzhou.aliyuncs.com/google_containers/"$imageName"</font> <font color="#4669ea">k8s.gcr.io/"$imageName"</font><br><font color="#4669ea">ctr</font> <font color="#4669ea">-n</font> <font color="#4669ea">k8s.io</font> <font color="#4669ea">i</font> <font color="#4669ea">rm</font> <font color="#4669ea">registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName</font><br><font color="#4669ea">done<br></font><br>
再次查看镜像<br><font color="#4669ea">ctr -n k8s.io images list -q</font><br><br>
<font color="#ec6e6c">PS; 这个查看镜像需要先指定查看哪儿个命名空间才可以查看到,不然查看不到当前机器上已有的镜像,可以通过下列命令先查看当前有哪儿些命名空间,然后在指定命名空间查看已有镜像</font><br><font color="#4669ea">ctr namespace list<br>ctr images list -q<br></font><br>
初始化集群---Master节点运行
初始化
集群初始化<br><font color="#4669ea">kubeadm init \<br>--apiserver-advertise-address=192.168.1.197 \<br>--kubernetes-version=v1.28.2 \<br>--pod-network-cidr=10.244.0.0/16 \<br>--service-cidr=10.254.0.0/16 \<br>--image-repository registry.aliyuncs.com/google_containers</font><br>
在使用 `kubeadm init` 初始化 Kubernetes 控制平面时,通常需要配置一些常见选项,以确保集群的正确设置和性能。以下是一些常用的配置选项:<br>1. `--apiserver-advertise-address`: 指定 Kubernetes API Server 监听的网络接口地址。通常是控制平面节点的 IP 地址或主机名。<br>2. `--kubernetes-version`: 指定要安装的 Kubernetes 版本。<br>3. `--pod-network-cidr`: 指定 Pod 网络的 IP 地址范围。这个范围用于分配给容器的 IP 地址。<br>4. `--service-cidr`: 指定 Kubernetes 服务的 IP 地址范围。这个范围用于分配给 Kubernetes 服务的 IP 地址。<br>5. `--ignore-preflight-errors`: 允许忽略预安装检查中的特定错误,这在特定情况下可能很有用。<br>6. `--control-plane-endpoint`: 用于配置 Kubernetes 控制平面节点的端点地址。通常包括 IP 地址和 API 服务器的端口。<br>7. `--upload-certs`: 允许上传生成的证书和密钥到 Kubernetes 控制平面节点上的密钥存储区,以便其他节点可以加入集群。<br>8. `--config`: 通过配置文件指定初始化选项,这是一种更复杂但可扩展的方式,允许你自定义更多选项。<br>9. `--node-name`: 指定节点的名称,通常在初始化单个节点时使用。<br>
查看集群信息<br><br>
安装网络插件(我这里选择的安装安装calico作为网络插件)<br>
安装网络插件calico
<br><br>
安装calico<br>
<font color="#4669ea">kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.3/manifests/tigera-operator.yaml</font><br>
<font color="#4669ea">wget https://raw.githubusercontent.com/projectcalico/calico/v3.26.3/manifests/custom-resources.yamlkubectl create -f custom-resources.yaml </font><br>
查看calico状态<br><font color="#4669ea">kubectl get pods -n calico-system -owide</font><br>
安装网络插件flannel
只在master节点安装flannel插件即可,该插件使用的是DaemonSet控制器,该控制器会在每个节点上都运行<br><font color="#4669ea">wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml<br>kubectl apply -f kube-flannel.yml</font><br>
初始化集群---Node节点运行
获取证书key<br>在master节点上运行<br><font color="#4669ea">kubeadm token create --print-join-command</font><br><br>
添加worker节点<br>分别在worker节点上运行上述命令<br>
node01上运行<br><font color="#4669ea">kubeadm join 192.168.1.197:6443 --token a81tq8.zsj9rd99h35q4sb2 --discovery-token-ca-cert-hash sha256:2f9a74d3c5033933b23c52fe9f00fdb76719bc259adb6f71dcce0d91630b78be</font><br><br>
node02上运行<br><font color="#4669ea">kubeadm join 192.168.1.197:6443 --token a81tq8.zsj9rd99h35q4sb2 --discovery-token-ca-cert-hash sha256:2f9a74d3c5033933b23c52fe9f00fdb76719bc259adb6f71dcce0d91630b78be</font><br><br>
Q&A
01:故障现象:运行kubectl get nodes提示如下报错<br><font color="#e855a4">E1101 16:19:06.496382 32806 memcache.go:265] couldn't get current server API group list: Get "http://localhost:8080/api?timeout=32s": dial tcp [::1]:8080: connect: connection refused</font><br>
原因:kubectl命令需要使用kubernetes-admin来运行,需要admin.conf文件;而admin.conf 文件是通过 “kubeadmin init” 命令在 /etc/kubernetes 中创建的,从节点没有该配置文件;因此需要将admin.conf复制到从节点
解决方法:<br><font color="#4669ea">ls /etc/kubernetes/<br>mkdir ~/.kube<br>cp /etc/kubernetes/admin.conf ~/.kube/<br>cd ~/.kube<br>mv admin.conf config</font><br><br>
02:故障现象:master节点kubeadm初始化提示如下报错<br><br>
原因,之前的重启导致添加的网桥和地址转发功能失效了
解决方法:需要重新添加网桥过滤和地址转发功能,并将这个加入开机启动项<br><font color="#4669ea">cat <<EOF > /etc/sysctl.d/kubernetes.conf<br>net.bridge.bridge-nf-call-ip6tables = 1<br>net.bridge.bridge-nf-call-iptables = 1<br>net.ipv4.ip_forward = 1<br>EOF<br>sysctl --system</font><br><br>
03;故障现象:安装完网络插件calico后没有两个node节点没有正常运行起来对应的pod<br><br>
原因:两台node节点中/etc/containerd/config.toml配置文件中的镜像地址写错了,通过这个命令查看没起来的日志<br><font color="#4669ea">kubectl describe pod -n tigera-operator tigera-operator-597bf4ddf6-d5fr7</font><br><br>
解决方法:将配置文件中的镜像地址改成正确的地址,更改完后可以看到网络插件对应的pod都已正常启动<br><font color="#4669ea">kubectl get pods -n calico-system -owide</font><br><br>
0 条评论
下一页