目录
2.将 sandbox_image 镜像源设置为阿里云 google_containers 镜像源(所有节点)。
3.配置 containerd cgroup 驱动程序 systemd(所有节点)
4.开始安装 kubeadm,kubelet 和 kubectl(master 节点)
6.安装 Pod 网络插件(CNI:Container Network Interface)(master)
一、环境
该实验使用对应Kubeadm 部署工具快速安装 Kubernetes 。
环境信息清单:(先部署 1master 和 2node 节点,后面再加一个 master 节点)
主机名 | 操作系统 | 内网IP |
k8s-master | CentOS 7.6.1810 | 192.168.0.13 |
k8s-node1 | CentOS 7.6.1810 | 192.168.0.17 |
k8s-node2 | CentOS 7.6.1810 | 192.168.0.18 |
二、部署前期准备
1、基础准备
配置主机名:
# 在192.168.0.13执行
hostnamectl set-hostname k8s-master
# 在192.168.0.17执行
hostnamectl set-hostname k8s-node1
# 在192.168.0.18执行
hostnamectl set-hostname k8s-node2
关闭防火墙
systemctl stop firewalld #关闭防火墙
systemctl disable firewalld #禁用开机自启防火墙
关闭禁用selinux
sed -i '/^SELINUX=/c SELINUX=disabled' /etc/selinux/config #设置对应配置文件永久关闭
setenforce 0 #临时关闭
关闭swap
swapoff -a #临时关闭swap分区
sed -i 's/^.*centos-swap/#&/g' /etc/fstab #在配置文件中禁用swap分区
free #确认是否关闭
配置集群内的主机名映射:
cat <<EOF >> /etc/hosts
192.168.0.13 k8s-master
192.168.0.17 k8s-node1
192.168.0.18 k8s-node2
EOF
2.配置系统内核参数
# 激活 br_netfilter 模块
modprobe br_netfilter
cat << EOF > /etc/modules-load.d/k8s.conf
br_netfilter
EOF
# 内核参数设置:开启IP转发,允许iptables对bridge的数据进行处理
cat << EOF > /etc/sysctl.d/k8s.conf
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF
# 立即生效
sysctl --system
3.同步集群内每个节点的时间
master节点:
yum install -y chrony #安装对应服务
sed -i 's/^server/#&/' /etc/chrony.conf #修改对应配置信息
cat >> /etc/chrony.conf << EOF #写对应的配置文件
> #server ntp1.aliyun.com iburst
> local stratum 10
> allow 192.168.0.0/16
> EOF
systemctl restart chronyd #启动对应服务
systemctl enable chronyd #设置对应服务开机自启
node节点:
yum install -y chrony
sed -i 's/^server/#&/' /etc/chrony.conf
cat >> /etc/chrony.conf << EOF
> server 192.168.0.13 iburst
> EOF
systemctl restart chronyd
systemctl enable chronyd
三、为每个节点部署docker服务
提示:v1.24 之前的 Kubernetes 版本包括与 Docker Engine 的直接集成,使用名为 dockershim 的组件。这种特殊的直接整合不再是 Kubernetes 的一部分 (这次删除被作为 v1.20 发行版本的一部分宣布)。你可以阅读检查 Dockershim 弃用是否会影响你 以了解此删除可能会如何影响你。要了解如何使用 dockershim 进行迁移,请参阅从 dockershim 迁移。
# 配置yum源
cd /etc/yum.repos.d ; mkdir bak; mv CentOS-Linux-* bak/
# centos7
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum -y install yum-utils # 安装yum-config-manager配置工具
# 设置yum源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install -y docker-ce # 安装docker-ce版本
systemctl start docker # 启动
systemctl enable docker # 开机自启
docker --version # 查看版本号
docker version # 查看版本具体信息
配置 docker 的镜像加速器、cgroup 驱动及存储驱动程序。加速器请自行去aly获取。
# Docker镜像源设置
# 修改文件 /etc/docker/daemon.json,没有这个文件就创建
# 添加以下内容后,重启docker服务:
cat << EOF > /etc/docker/daemon.json
{
"registry-mirrors": ["https://xxxxx.mirror.aliyuncs.com"]
}
EOF
systemctl reload docker #加载
systemctl restart docker #重启
systemctl status docker #查看
四、安装kubeadm和相关工具
1.配置kubernetes yam源
cat << EOF > /etc/yum.repos.d/kubernetes.repo
[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
2.将 sandbox_image 镜像源设置为阿里云 google_containers 镜像源(所有节点)。
# 导出默认配置,config.toml这个文件默认是不存在的
containerd config default > /etc/containerd/config.toml
grep sandbox_image /etc/containerd/config.toml
sed -i "s#registry.k8s.io/pause#registry.aliyuncs.com/google_containers/pause#g" /etc/containerd/config.toml
grep sandbox_image /etc/containerd/config.toml
3.配置 containerd cgroup 驱动程序 systemd(所有节点)
kubernets 自v 1.24.0 后,就不再使用 docker.shim,替换采用 containerd 作为容器运行时端点。因此需要安装 containerd(在 docker 的基础下安装),上面安装 docker 的时候就自动安装了 containerd 了。这里的 docker 只是作为客户端而已。容器引擎还是 containerd。
sed -i 's#SystemdCgroup = false#SystemdCgroup = true#g' /etc/containerd/config.toml
# 应用所有更改后,重新启动containerd
systemctl restart containerd
4.开始安装 kubeadm,kubelet 和 kubectl(master 节点)
# 不指定版本就是最新版本,当前最新版就是1.24.1
yum install -y kubelet-1.24.1 kubeadm-1.24.1 kubectl-1.24.1 --disableexcludes=kubernetes
# disableexcludes=kubernetes:禁掉除了这个kubernetes之外的别的仓库
# 设置为开机自启并现在立刻启动服务 --now:立刻启动服务
systemctl enable --now kubelet
# 查看状态,这里需要等待一段时间再查看服务状态,启动会有点慢
systemctl status kubelet
kubectl version #查看版本
yum info kubeadm
5.使用 kubeadm 初始化集群(master 节点)
先将需要的镜像直接下载好,这我们通过官网得知我们在master上需要安装
kube-apiserver:它是Kubernetes API服务器的主要组件,用于公开Kubernetes API,并且允许管理Kubernetes集群上的所有对象(如Pod、Service、ReplicaSet等)。
etcd:etcd是Kubernetes集群中的分布式键值存储系统,它存储了整个集群的状态和元数据信息。
kube-scheduler:kube-scheduler是负责在Kubernetes集群中选择合适的Node节点来运行Pod的组件,它考虑了各种因素,如硬件约束、数据本地性、软件/服务亲和性等。
kube-controller-manager:kube-controller-manager是一组控制器的集合,这些控制器负责监视集群状态的变化,并将期望状态与当前状态进行比较,以确保集群中的所有对象都保持期望状态。
kube-proxy:kube-proxy是Kubernetes集群中的网络代理组件,它负责为Pod对象提供网络代理和负载均衡功能。
coredns:DNS插件为Kubernetes集群中的Pod对象提供DNS解析服务,使它们能够通过域名访问其他Pod
docker pull registry.aliyuncs.com/google_containers/kube-apiserver:v1.24.1
docker pull registry.aliyuncs.com/google_containers/kube-controller-manager:v1.24.1
docker pull registry.aliyuncs.com/google_containers/kube-scheduler:v1.24.1
docker pull registry.aliyuncs.com/google_containers/kube-proxy:v1.24.1
docker pull registry.aliyuncs.com/google_containers/pause:3.7
docker pull registry.aliyuncs.com/google_containers/etcd:3.5.3-0
docker pull registry.aliyuncs.com/google_containers/coredns:v1.8.6
集群初始化(其中 --control-plane-endpoint为实现高可用在初始化时直接加载上)
kubeadm init \
--apiserver-advertise-address=192.168.0.13 \
--image-repository registry.aliyuncs.com/google_containers \
--control-plane-endpoint=cluster-endpoint \
--kubernetes-version v1.24.1 \
--service-cidr=10.1.0.0/16 \
--pod-network-cidr=10.244.0.0/16 \
--v=5 #如果在初始化过程中报错不够详细可以使用v=6来显示详细的报错
# –image-repository string: 这个用于指定从什么位置来拉取镜像(1.13版本才有的),默认值是k8s.gcr.io,我们将其指定为国内镜像地址:registry.aliyuncs.com/google_containers
# –kubernetes-version string: 指定kubenets版本号,默认值是stable-1,会导致从https://dl.k8s.io/release/stable-1.txt下载最新的版本号,我们可以将其指定为固定版本(v1.22.1)来跳过网络请求。
# –apiserver-advertise-address 指明用 Master 的哪个 interface 与 Cluster 的其他节点通信。如果 Master 有多个 interface,建议明确指定,如果不指定,kubeadm 会自动选择有默认网关的 interface。这里的ip为master节点ip,记得更换。
# –pod-network-cidr 指定 Pod 网络的范围。Kubernetes 支持多种网络方案,而且不同网络方案对 –pod-network-cidr有自己的要求,这里设置为10.244.0.0/16 是因为我们将使用 flannel 网络方案,必须设置成这个 CIDR。
# --control-plane-endpoint cluster-endpoint 是映射到该 IP 的自定义 DNS 名称,这里配置hosts映射:192.168.0.13 cluster-endpoint。 这将允许你将 --control-plane-endpoint=cluster-endpoint 传递给 kubeadm init,并将相同的 DNS 名称传递给 kubeadm join。 稍后你可以修改 cluster-endpoint 以指向高可用性方案中的负载均衡器的地址。
配置环境变量.(在此处有输入对应的token及一定保存好)
# 临时生效(退出当前窗口重连环境变量失效)
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Alternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
You can now join any number of control-plane nodes by copying certificate authorities
and service account keys on each node and then running the following as root:
# 永久生效(推荐)
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
source ~/.bash_profile
如果在安装过程中依然存在问题在/var/log/messages中查看
tail -f /var/log/messages
根据对应报错为对应的pod的网络插件未进行安装:
6.安装 Pod 网络插件(CNI:Container Network Interface)(master)
必须部署一个基于 Pod 网络插件的 容器网络接口 (CNI),以便你的 Pod 可以相互通信
# 最好提前下载镜像(所有节点)
docker pull quay.io/coreos/flannel:v0.14.0
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
7.node 节点加入 k8s 集群
安装 kubelet
yum install -y kubelet-1.24.1 kubeadm-1.24.1 kubectl-1.24.1 --disableexcludes=kubernetes
# 设置为开机自启并现在立刻启动服务 --now:立刻启动服务
systemctl enable --now kubelet
systemctl status kubelet
加入对应的节点:
这里需要等待一段时间,再查看节点节点状态,因为需要安装 kube-proxy 和 flannel
kubectl get pods -A
kubectl get nodes