admin管理员组文章数量:1438502
快速部署一套K8s集群(V1.32)
1、准备服务器环境
Kubernetes集群节点规划。
主机名 | 操作系统 | IP地址 |
---|---|---|
k8s-master | CentOS7.9_x64 | 192.168.111.128 |
k8s-node1 | CentOS7.9_x64 | 192.168.111.129 |
k8s-node2 | CentOS7.9_x64 | 192.168.111.130 |
集群节点运行的组件:
在上述环境中,我们选择Docker作为Kubernetes的容器运行时。因此,除了部署Kubernetes组件之外,还需部署Docker相关服务。
2、系统初始化配置
1)关闭防火墙
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl disable firewalld
2)关闭SELinux
SELinux是Linux的一个安全机制,但使用复杂和存在兼容性问题,通常选择关闭它。
[root@localhost ~]# setenforce 0 # 临时
[root@localhost ~]# sed -i 's/enforcing/disabled/' /etc/selinux/config # 永久
3)关闭Swap交换分区
Swap是一种虚拟内存技术,它允许系统将部分内存数据写到硬盘上的特定分区,从而释放更多物理内存。由于硬盘读写性能相比物理内存低,因此使用Swap会影响系统处理性能。并且Kubelet组件默认要求关闭Swap,以提高系统的稳定性和可靠性。
关闭Swap交换分区:
[root@localhost ~]# swapoff -a # 临时
[root@localhost ~]# sed -ri 's/.*swap.*/#&/' /etc/fstab # 永久
- 设置主机名
[root@localhost ~]# hostnamectl set-hostname xxx
- 在master添加hosts
[root@localhost ~]# cat >> /etc/hosts << EOF
192.168.111.128 k8s-master
192.168.111.129 k8s-node1
192.168.111.130 k8s-node2
EOF
6)配置内核参数
某些Kubernetes网络插件可能会用到网络桥接(Bridge),为了确保网络桥接的数据包经过Iptables处理,启用相关的内核参数:
[root@localhost ~]# cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
[root@localhost ~]# sysctl --system
7)替换yum源:
[root@localhost ~] curl -o /etc/yum.repos.d/CentOS-Base.repo .repo
8)# 时间同步
[root@localhost ~] yum install ntpdate -y
[root@localhost ~] ntpdate time.windows
3、安装docker
在所有节点上安装并启动Docker。
下载阿里云Yum软件源文件:
[root@localhost ~]# wget .repo -O /etc/yum.repos.d/docker-ce.repo
安装指定版本Docker:
[root@localhost ~]# yum install -y docker-ce
[root@localhost ~]# cat > /etc/docker/daemon.json << EOF
{
"registry-mirrors": [";,";,";],
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
启动并设置开机启动:
[root@localhost ~]systemctl start docker && systemctl enable docker
4、安装cri-docker
在Kubernetes早期版本中,Docker作为默认容器运行时,并在Kubelet程序中开发了一个名为“Dockershim”的代理程序,负责Kubelet与Docker通信。
随着Kubernetes生态系统的发展,涌现出多种容器运行时,例如containerd、cri-o、rkt等。为了支持这些容器运行时,Kubernetes引入CRI(Container Runtime Interface,容器运行时接口)标准,使得第三方容器运行时只需对接CRI即可与Kubernetes集成。
后来,在Kubernetes 1.20版本发布时宣布:为了优化核心代码,减少维护负担,将在1.24版本中正式移除“Dockershim”,而当时Docker又不支持CRI,这就意味着Kubernetes无法再Docker作为容器运行时。Docker官方为了解决这个问题,与Mirantis公司合作,开发了一个名为“cri-dockerd”的代理程序,负责Kubelet与Docker通信。
因此,从Kubernetes 1.24版本及更高版本开始,使用Docker作为容器运行时,需要安装cri-dockerd。可以在GitHub Releases页面()找到适用于你系统平台版本的安装包,下载后上传到所有节点上并进行安装:
[root@localhost ~] rpm -ivh cri-dockerd-0.3.2-3.el7.x86_64.rpm
安装完成后,修改Systemd服务文件指定依赖的Pause镜像为国内镜像地址:
[root@localhost ~] vi /usr/lib/systemd/system/cri-docker.service
…
ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --pod-infra-container-image=registry.aliyuncs/google_containers/pause:3.9
…
启动并设置开机启动:
[root@localhost ~] systemctl start cri-docker && systemctl enable cri-docker
5、安装kubeadm和kubelet
在所有节点上安装kubeadm、kubectl和kubelet组件。但这些软件包未包含在系统默认软件源中,需要额外配置Yum软件源,例如配置阿里云的软件源:
[root@localhost ~] cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=.32/rpm/
enabled=1
gpgcheck=1
gpgkey=.32/rpm/repodata/repomd.xml.key
EOF
安装指定版本kubeadm、kubectl和kubelet:
[root@localhost ~] yum install -y kubeadm-1.32.0 kubectl-1.32.0 kubelet-1.32.0
kubeadm和kubectl仅是一个集群搭建工具和管理工具,不涉及启动。而kubelet是一个守护进程程序,由kubeadm在搭建过程中自动启动,这里仅设置开机启动即可:
[root@localhost ~] systemctl enable kubelet
6、部署Master节点
在Master节点执行以下命令初始化Kubernetes管理节点:
[root@localhost ~] kubeadm init \
--apiserver-advertise-address=192.168.111.128 \
--image-repository=registry.aliyuncs/google_containers \
--kubernetes-version=v1.32.0 \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.96.0.0/12 \
--cri-socket=unix:///var/run/cri-dockerd.sock \
--ignore-preflight-errors=all
该命令中各参数含义如下:
--apiserver-advertise-address:指定API Server监听的IP地址。如果没有设置,将使用默认的网络接口。
--image-repository:指定镜像仓库地址。默认值为“registry.k8s.io”,但该仓库在国内无法访问,因此这里指定阿里云仓库。
--kubernetes-version:指定Kubernetes版本。
--pod-network-cidr:指定Pod网络的CIDR地址范围。
--service-cidr:指定Service网络的CIDR地址范围。
--cri-socket:指定kubelet连接容器运行时的Unix套接字文件。
命令执行后,kubeadm会执行一系列任务,大概如下:
[preflight]:该阶段执行一系列检查,验证当前系统环境是否满足Kubernetes的安装要求,包括:
CPU和内存是否满足最低要求;
网络是否正常;
操作系统版本是否满足;
容器运行时是否可以连接;
内核参数是否正确配置;
下载所需的容器镜像。
[certs]:生成Kubernetes组件所需的HTTPS证书和秘钥,并存放到“/etc/kubernetes/pki”目录;
[kubeconfig]:生成kubeconfig文件,该文件包含API Server地址、客户端证书等信息,并存放到“/etc/kubernetes”目录。
[kubelet-start]:生成kubelet配置文件“/var/lib/kubelet/config.yaml”并启动kubelet服务。
[control-plane]:为kube-apiserver、kube-controller-manager和kube-scheduler创建静态Pod资源文件,并存储到“/etc/kubernetes/manifests”目录。
[etcd]:为etcd创建静态Pod资源文件,并存储到“/etc/kubernetes/manifests”目录。
[wait-control-plane]:等待kubelet从目录“/etc/kubernetes/manifest”中以静态Pod的形式启动Master组件。
[apiclient]:检查Master组件是否健康。
[upload-config]:将kubeadm配置存储到ConfigMap对象中。
[kubelet]:将kubelet配置存储到ConfigMap对象中。
[upload-certs]:提示用户跳过证书上传。
[mark-control-plane]:给Master节点添加标签和污点。
[bootstrap-token]:生成引导令牌,用于Node节点在加入集群时使用。
[kubelet-finalize]:更新kubelet配置文件(/etc/kubernetes/kubelet.conf)。
[addons]:安装CoreDNS和kube-proxy插件。
紧接着,输出初始化成功的信息:
根据上述提示,执行以下命令开始使用集群:
这些命令是将文件“/etc/kubernetes/admin.conf”复制到“$HOME/.kube/config”,以便kubectl根据该配置文件连接和管理Kubernetes集群。
7、部署Node节点
在两台工作节点执行上述返回的“kubeadm init”命令,并添加“--cri-socket”参数,以将这些工作节点加入到集群中:
[root@localhost ~] kubeadm join 192.168.111.128:6443 --token twrp53.v7dz7hjulwr4u10t --discovery-token-ca-cert-hash sha256:95341cb0152412e136b15176bec9daf9e728c504d7ee71a33a150b93e4634d17 --cri-socket=
unix:///var/run/cri-dockerd.sock --ignore-preflight-errors=all
可以在Master节点执行“kubectl get nodes”命令查看节点,结果如下:
两个工作节点已成功加入集群中。kubeadm默认根据主机名来设置节点名称,还可以添加“--node-name”参数自定义节点名称。
8、部署网络插件
在上述结果中,节点状态显示为“NotReady”,表示节点尚未准备就绪。这是由于kubelet服务未发现网络插件导致的,kubelet日志中也有相关说明(“network plugin is not ready”)。
Kubernetes网络插件主要用于实现集群内部Pod通信,它负责配置和管理Pod的网络。常见的网络插件包括Calico、Flannel、Cilium等,这里选择使用Calico作为Kubernetes网络插件,安装Calico网络插件:
[root@localhost ~] kubectl create -f tigera-operator.yaml
[root@localhost ~] kubectl create -f custom-resources.yaml
等待片刻,查看Pod对象:
[root@localhost ~] kubectl get pods -n calico-system
所有Pod的状态均显示为“Running”,说明Calico安装成功。再通过“kubectl get nodes”命令查看节点,状态转为“Ready”,表示节点准备就绪。
需要注意的是,Kubernetes考虑到安全性,“kubeadm join”命令中的Token有效期为24小时,过期后不可再使用。届时,可以通过“kubeadm token create --print-join-command”命令创建新的Token,以添加新的工作节点。
9、部署Dashboard
Dashboard是官方开发的一个Web管理系统,通过它可以管理集群资源、查看应用概览、查看容器日志和进入容器等操作。
下载Dashboard的资源文件:
[root@localhost ~] wget .7.0/aio/deploy/recommended.yaml
将Service的类型设置为“NodePort”类型并指定访问端口,以便将其暴露到集群外部访问,修改如下:
[root@localhost ~]# vim recommended.yaml
在集群中创建资源:
[root@localhost ~] kubectl apply -f recommended.yaml
查看Pod对象:
[root@localhost ~] kubectl get pods -n kubernetes-dashboard
所有Pod的状态都显示为“Running”,说明Dasboard安装成功。浏览器访问“https://<节点IP地址>:30001”,将看到登录界面。
创建一个服务账号并授予集群管理员权限:
[root@localhost ~] kubectl create serviceaccount admin-user -n kubernetes-dashboard
[root@localhost ~] kubectl create clusterrolebinding admin-user --clusterrole=cluster-admin --serviceaccount=kubernetes-dashboard:admin-user
根据服务账号创建Token:
[root@localhost ~] kubectl create token admin-user -n kubernetes-dashboard
将输出的Token复制到输入框中,然后点击登录,进入到Dashboard首页。
到此k8s (v1.32)已安装完毕。
本文标签: 快速部署一套K8s集群(V132)
版权声明:本文标题:快速部署一套K8s集群(V1.32) 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/biancheng/1747582564a2715786.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论