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