网站建设与管理中专,上海注册公司注册地址,家具网站开发任务书,海淀网站建设电话Kubernetes#xff08;k8s#xff09;集群部署-----#xff1e;超详细 一、资源准备二、安装准备2.1 主机环境设置2.1.1 关闭操作系统防火墙、selinux2.1.2 关闭swap交换分区2.1.3 允许iptables检测桥接流量#xff08;可选#xff09; 2.2 安装Docker环境2.3 安装Kubeadm… Kubernetesk8s集群部署-----超详细 一、资源准备二、安装准备2.1 主机环境设置2.1.1 关闭操作系统防火墙、selinux2.1.2 关闭swap交换分区2.1.3 允许iptables检测桥接流量可选 2.2 安装Docker环境2.3 安装Kubeadm、Kubelet和Kubectl2.3.1 配置k8s的yum源阿里云的源2.3.2 安装及版本检查2.3.3 设置kubelet自启动2.3.4 卸载 三、Kubernetes集群所需的镜像拉取3.1 生成一个默认 kubeadm 初始化配置文件3.2 列出当前Kubernetes集群所需的所有镜像列表及其版本信息3.3 拉取所k8s需要的容器镜像3.4 镜像检查 四、初始化Master节点4.1 初始化报错解决4.2 再次执行初始化报错解决4.3 初始化完成root用户执行命令 五、安装网络插件Calico六、Worker节点部署七、集群检查八、集群测试--集群自我修复九、 部署Dashboard十、集群的加入令牌过期--处理 The Begin点点关注收藏不迷路
Kubernetes简称k8s是一个开源的容器编排平台可以帮助开发人员和运维团队更轻松地管理容器化应用程序。本文将详细介绍如何进行k8s集群的部署以帮助读者快速搭建一个高可用、可伸缩的k8s集群。
一、资源准备
1、操作系统至少三台物理机或虚拟机具有至少2核4GB内存的配置操作系统为Linux。
主机名IPk8s-01192.168.234.21k8s-02192.168.234.22k8s-03192.168.234.23
2、主机名设置确保每台服务器都有唯一的主机名并且主机名能够通过DNS解析进行互相访问。 3、网络设置确保每台服务器之间可以互相通信建议使用静态IP地址并关闭防火墙或者开放必要的端口。
4、安装Docker在每台服务器上安装Docker引擎。
二、安装准备
2.1 主机环境设置
在每台服务器上执行设置。
2.1.1 关闭操作系统防火墙、selinux
1、修改/etc/selinux/config文件中的SELINUX值为disabled
[rootk8s-01 ~]# vi /etc/selinux/config2、修改SELINUX的值为disabled
SELINUXdisabled或者使用命令设置sudo sed -i s/^SELINUXenforcing$/SELINUXdisabled/ /etc/selinux/config3、检查防火墙是否关闭
[rootk8s-01 ~]# systemctl status firewalld若防火墙状态显示为active (running)则表示防火墙未关闭 若防火墙状态显示为inactive (dead)则无需再关闭防火墙 4、关闭防火墙并禁止开机重启
[rootk8s-01 ~]# systemctl disable firewalld.service
[rootk8s-01 ~]# systemctl stop firewalld.service2.1.2 关闭swap交换分区
关闭swap交换内存是为了保障数据库的访问性能避免把数据库的缓冲区内存淘汰到磁盘上。 如果服务器内存比较小内存过载时可打开swap交换内存保障正常运行。
###永久关闭命令
[rootk8s-01 ~]# swapoff -ased -ri s/.*swap.*/#/ /etc/fstab##目的是将swap那行注释如下图所示 ###开启命令不执行
[rootk8s-01 ~]# swapon -a2.1.3 允许iptables检测桥接流量可选
cat EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOFcat EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables 1
net.bridge.bridge-nf-call-iptables 1
EOF# 加载所有配置
sudo sysctl --system2.2 安装Docker环境
安装Docker在每台服务器上安装DockerKubernetes依赖于Docker来运行容器。
docker 安装可参考前面的文章Docker基础入门Docker起源、组成、安装、及常用命令
[rootk8s-01 ~]# docker -v #查看是否安装成功
Docker version 20.10.7, build f0df350
[rootk8s-01 ~]#
2.3 安装Kubeadm、Kubelet和Kubectl
在每台服务器上安装Kubeadm、Kubelet和Kubectl这些工具将帮助我们部署和管理Kubernetes集群。
Kubeadm、Kubelet和Kubectl是Kubernetes中的三个核心组件。
1、KubeadmKubeadm是用于初始化和设置Kubernetes集群的工具。它负责启动集群的控制平面组件如API服务器、控制器管理器和调度器以及节点上的网络插件如Flannel、Calico等。Kubeadm还处理证书和安全性设置并提供了一种简化的方式来添加或删除节点。
2、KubeletKubelet是每个节点上运行的主要代理程序负责管理该节点上的容器和Pod。它与控制平面通信接收Pod的调度信息并确保它们在节点上正确运行。Kubelet还监控容器的状态并在需要时重启失败的容器。
3、KubectlKubectl是Kubernetes的命令行工具用于与Kubernetes集群进行交互。它允许用户创建、管理和监视Kubernetes对象如Pod、Service、Deployment等。Kubectl可以通过命令行界面执行各种操作例如创建和删除资源、查看集群状态、日志记录和调试。
这三个组件共同协作使得用户能够轻松地部署、管理和监控Kubernetes集群并与集群进行交互。
2.3.1 配置k8s的yum源阿里云的源
在每台服务器上执行
cat /etc/yum.repos.d/kubernetes.repo EOF
[kubernetes]
nameKubernetes
baseurlhttp://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled1
gpgcheck1
repo_gpgcheck0
gpgkeyhttp://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpghttp://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF2.3.2 安装及版本检查
执行以下命令开始安装。
## 指定版本安装
sudo yum install -y kubelet-1.24.1 kubeadm-1.24.1 kubectl-1.24.1 --disableexcludeskubernetes## 或 yum install 安装最新版
sudo yum install kubelet kubeadm kubectl## 版本检查
kubeadm version2.3.3 设置kubelet自启动
## 所有服务器执行
systemctl enable --now kubelet##kubelet状态查看
systemctl status kubelet## 获取有关kubeadm软件包的详细信息的命令
yum info kubeadm2.3.4 卸载
sudo apt-get remove kubelet kubectl kubeadm三、Kubernetes集群所需的镜像拉取
3.1 生成一个默认 kubeadm 初始化配置文件
kubeadm config print init-defaults kubeadm-init.yaml## 将k8s.gcr.io 修改为阿里云地址 registry.aliyuncs.com/google_containers3.2 列出当前Kubernetes集群所需的所有镜像列表及其版本信息
kubeadm config images list[rootk8s-01 ~]# kubeadm config images list
I1213 18:44:19.052543 11505 version.go:255] remote version is much newer: v1.28.4; falling back to: stable-1.24
k8s.gcr.io/kube-apiserver:v1.24.17
k8s.gcr.io/kube-controller-manager:v1.24.17
k8s.gcr.io/kube-scheduler:v1.24.17
k8s.gcr.io/kube-proxy:v1.24.17
k8s.gcr.io/pause:3.7
k8s.gcr.io/etcd:3.5.3-0
k8s.gcr.io/coredns/coredns:v1.8.6
[rootk8s-01 ~]#3.3 拉取所k8s需要的容器镜像
## 单条批量执行
docker pull registry.aliyuncs.com/google_containers/kube-apiserver:v1.24.17
docker pull registry.aliyuncs.com/google_containers/kube-controller-manager:v1.24.17
docker pull registry.aliyuncs.com/google_containers/kube-scheduler:v1.24.17
docker pull registry.aliyuncs.com/google_containers/kube-proxy:v1.24.17
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## 或者使用脚本执行批量拉取sudo tee ./images.sh -EOF
#!/bin/bash
images(
kube-apiserver:v1.24.17
kube-controller-manager:v1.24.17
kube-scheduler:v1.24.17
kube-proxy:v1.24.17
pause:3.7
etcd:3.5.3-0
coredns:v1.8.6
)
for imageName in ${images[]} ; dodocker pull registry.aliyuncs.com/google_containers/$imageName
done
EOF ## Shell脚本命令用于给当前目录下的images.sh文件添加执行权限并执行该文件。
chmod x ./images.sh ./images.sh3.4 镜像检查
docker images四、初始化Master节点
初始化Master节点使用Kubeadm初始化Master节点该命令将自动完成Kubernetes的初始化配置。
kubeadm init \--apiserver-advertise-address192.168.234.21 \--control-plane-endpointk8s-01 \--image-repository registry.aliyuncs.com/google_containers \--kubernetes-version v1.24.1 \--service-cidr10.11.0.0/16 \--pod-network-cidr172.30.0.0/16具体的参数解释如下--apiserver-advertise-address192.168.0.113指定API服务器的广播地址即集群内其他节点访问API服务器的地址。
--image-repository registry.aliyuncs.com/google_containers指定所使用的镜像仓库地址这里使用了阿里云的镜像仓库地址。
--kubernetes-version v1.22.1指定初始化集群时使用的Kubernetes版本。
--service-cidr10.11.0.0/16指定Service的IP地址段Service是Kubernetes中用于提供服务发现和负载均衡的组件。
--pod-network-cidr172.30.0.0/16指定Pod的IP地址段Pod是Kubernetes中最小的调度单位。4.1 初始化报错解决
报错1
[rootk8s-01 ~]# kubeadm init \--apiserver-advertise-address192.168.234.21 \--control-plane-endpointk8s-01 \--image-repository registry.aliyuncs.com/google_containers \--kubernetes-version v1.24.1 \--service-cidr10.11.0.0/16 \--pod-network-cidr172.30.0.0/16
[init] Using Kubernetes version: v1.24.1
[preflight] Running pre-flight checks
error execution phase preflight: [preflight] Some fatal errors occurred:[ERROR CRI]: container runtime is not running: output: time2023-12-13T20:40:1408:00 levelfatal msgvalidate service connection: CRI v1 runtime API is not implemented for endpoint \unix:///var/run/containerd/containerd.sock\: rpc error: code Unimplemented desc unknown service runtime.v1.RuntimeService
, error: exit status 1
[preflight] If you know what you are doing, you can make a check non-fatal with --ignore-preflight-errors...
To see the stack trace of this error execute with --v5 or higher
[rootk8s-01 ~]# 解决
注意kubernetes 1.24版本之后docker必须要加装cir-docker。 cir-docker下载链接: https://pan.baidu.com/s/1ZCmY07McMdicB-bdQvnSeA 提取码: ivax 1、上传安装cir-docker
[rootk8s-01 ~]# ll
total 12952
-rw-------. 1 root root 1419 Dec 12 16:09 anaconda-ks.cfg
-rw-r--r--. 1 root root 886 May 26 2021 config.toml.bak
-rw-r--r-- 1 root root 13242440 Dec 13 20:59 cri-dockerd-0.3.4.amd64.tgz
-rwxr-xr-x. 1 root root 269 Dec 13 19:28 images.sh
-rw-r--r--. 1 root root 859 Dec 13 19:55 kubeadm-init.yaml
[rootk8s-01 ~]# tar -xf cri-dockerd-0.3.4.amd64.tgz -C /usr/local/
[rootk8s-01 ~]# cd /usr/local/
[rootk8s-01 local]# mv cri-dockerd/cri-dockerd /usr/local/bin
[rootk8s-01 local]# cri-dockerd --version
cri-dockerd 0.3.4 (e88b1605)
[rootk8s-01 local]# 2、配置开机自启
[rootk8s-01 local]# vi /etc/systemd/system/cri-dockerd.service
添加内容[Unit]
DescriptionCRI Interface for Docker Application Container Engine
Documentationhttps://docs.mirantis.com
Afternetwork-online.target firewalld.service docker.service
Wantsnetwork-online.target[Service]
Typenotify
ExecStart/usr/local/bin/cri-dockerd --pod-infra-container-imageregistry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.9 --network-plugincni --cni-conf-dir/etc/cni/net.d --cni-bin-dir/opt/cni/bin --container-runtime-endpointunix:///var/run/cri-dockerd.sock --cri-dockerd-root-directory/var/lib/dockershim --docker-endpointunix:///var/run/docker.sock --cri-dockerd-root-directory/var/lib/docker
ExecReload/bin/kill -s HUP $MAINPID
TimeoutSec0
RestartSec2
Restartalways
StartLimitBurst3
StartLimitInterval60s
LimitNOFILEinfinity
LimitNPROCinfinity
LimitCOREinfinity
TasksMaxinfinity
Delegateyes
KillModeprocess
[Install]
WantedBymulti-user.target[rootk8s-01 local]# vi /etc/systemd/system/cri-dockerd.socket
添加内容
[Unit]
DescriptionCRI Docker Socket for the API
PartOfcri-docker.service
[Socket]
ListenStream/var/run/cri-dockerd.sock
SocketMode0660
SocketUserroot
SocketGroupdocker
[Install]
WantedBysockets.target3、设置开机自启
systemctl daemon-reload
systemctl start cri-dockerd.service
systemctl enable cri-dockerd.service4.2 再次执行初始化报错解决
kubeadm init \--apiserver-advertise-address192.168.234.21 \--control-plane-endpointk8s-01 \--image-repository registry.aliyuncs.com/google_containers \--kubernetes-version v1.24.1 \--service-cidr10.11.0.0/16 \--pod-network-cidr172.30.0.0/16报错2
[rootk8s-01 ~]# kubeadm init \--apiserver-advertise-address192.168.234.21 \--control-plane-endpointk8s-01 \--image-repository registry.aliyuncs.com/google_containers \--kubernetes-version v1.24.1 \--service-cidr10.11.0.0/16 \--pod-network-cidr172.30.0.0/16
Found multiple CRI endpoints on the host. Please define which one do you wish to use by setting the criSocket field in the kubeadm configuration file: unix:///var/run/containerd/containerd.sock, unix:///var/run/cri-dockerd.sock
To see the stack trace of this error execute with --v5 or higher
[rootk8s-01 ~]#
解决
报错原因没有整合kubelet和cri-dockerd。
3、解决办法在命令后面加上以下选项--cri-socket unix:///var/run/cri-dockerd.sock完整命令kubeadm init \--apiserver-advertise-address192.168.234.21 \--control-plane-endpointk8s-01 \--image-repository registry.aliyuncs.com/google_containers \--kubernetes-version v1.24.1 \--service-cidr10.11.0.0/16 \--pod-network-cidr172.30.0.0/16 \--cri-socket unix:///var/run/cri-dockerd.sock
初始化正常 Your Kubernetes control-plane has initialized successfully!
这个消息表示Kubernetes控制平面已经成功初始化。
以下输出信息复制保存。
Your Kubernetes control-plane has initialized successfully!To start using your cluster, you need to run the following as a regular user:mkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/configAlternatively, if you are the root user, you can run:export KUBECONFIG/etc/kubernetes/admin.confYou 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:kubeadm join k8s-01:6443 --token 5sevvb.yo465pjpjogd7j21 \--discovery-token-ca-cert-hash sha256:210b469de41249798071688b67f618e2f69d28a6694aeec412c89b281c391c1c \--control-planeThen you can join any number of worker nodes by running the following on each as root:kubeadm join k8s-01:6443 --token 5sevvb.yo465pjpjogd7j21 \--discovery-token-ca-cert-hash sha256:210b469de41249798071688b67f618e2f69d28a6694aeec412c89b281c391c1c翻译
你的Kubernetes控制平面已经成功初始化要开始使用你的集群你需要以普通用户身份运行以下命令mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config或者如果你是root用户可以运行以下命令export KUBECONFIG/etc/kubernetes/admin.conf现在你应该在集群中部署一个pod网络。
运行 “kubectl apply -f [podnetwork].yaml” 命令选择其中一个选项参考链接
https://kubernetes.io/docs/concepts/cluster-administration/addons/你现在可以通过在每个节点上复制证书机构和服务帐户密钥然后以root身份运行以下命令来加入任意数量的控制平面节点kubeadm join k8s-01:6443 –token 5sevvb.yo465pjpjogd7j21
–discovery-token-ca-cert-hash sha256:210b469de41249798071688b67f618e2f69d28a6694aeec412c89b281c391c1c
–control-plane然后你可以通过在每个工作节点上以root身份运行以下命令来加入任意数量的工作节点kubeadm join k8s-01:6443 –token 5sevvb.yo465pjpjogd7j21
–discovery-token-ca-cert-hash sha256:210b469de41249798071688b67f618e2f69d28a6694aeec412c89b281c391c1c4.3 初始化完成root用户执行命令
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config五、安装网络插件Calico
安装网络插件选择一种网络插件如Flannel、Calico等并在Master节点上安装和配置该插件。 1、使用wget工具下载指定URL的文件calico.yaml并且禁用SSL证书验证wget https://docs.projectcalico.org/v3.25/manifests/calico.yaml --no-check-certificate2、将清单文件calico.yaml应用到Kubernetes集群中apply是一个kubectl的子命令用于创建或更新Kubernetes资源kubectl apply -f calico.yaml六、Worker节点部署
加入集群在每个Worker节点上使用Kubeadm加入到Kubernetes集群中。 在每个从节点执行
kubeadm join k8s-01:6443 --token 5sevvb.yo465pjpjogd7j21 \--discovery-token-ca-cert-hash sha256:210b469de41249798071688b67f618e2f69d28a6694aeec412c89b281c391c1c \--cri-socket unix:///var/run/cri-dockerd.sock需要在末尾添加 --cri-socket unix:///var/run/cri-dockerd.sock要不会报错
Found multiple CRI endpoints on the host. Please define which one do you wish to use by setting the criSocket field in the kubeadm configuration file: unix:///var/run/containerd/containerd.sock, unix:///var/run/cri-dockerd.sock
To see the stack trace of this error execute with --v5 or higherk8s-02: k8s-03: 七、集群检查
1、获取所有命名空间中的所有Pod的信息。
kubectl get pod -A ##所有都为runing状态2、获取集群中的所有节点列表。
kubectl get nodes NAME节点的名称。
STATUS节点的状态包括 Ready准备就绪和 NotReady未准备就绪。
ROLES节点的角色如 master主节点和 worker工作节点。
AGE节点的运行时间。
VERSION节点上运行的 Kubernetes 版本。八、集群测试–集群自我修复
三台设备reboot重启。三台设备重新启动后集群应该能够自动检测到它们的重新加入并将它们纳入集群的运行中。
重启后集群运行正常。
部署示例应用在Kubernetes集群中部署一个简单的示例应用如一个Nginx服务。 验证应用状态通过Kubectl命令或者Dashboard界面验证示例应用的状态是否正常运行。 水平扩展应用通过增加Pod的数量测试集群的水平扩展能力。 高可用测试模拟Master节点故障测试集群的高可用性。
九、 部署Dashboard
可选步骤如果需要可视化的管理界面可以在Master节点上部署Dashboard。 1、Kubernetes Dashboard项目在Github上的源代码文件kubernetes-dashboard.yaml。保存为kubernetes-dashboard.yaml文件。curl -o kubernetes-dashboard.yaml https://raw.githubusercontent.com/kubernetes/dashboard/v2.6.1/aio/deploy/recommended.yaml2、根据提供的kubernetes-dashboard.yaml文件中的配置信息创建或更新Kubernetes Dashboard资源。kubectl apply -f kubernetes-dashboard.yaml --validatefalse3、获取kube-system命名空间中的所有pods的详细信息kubectl get pods -n kube-system -o wide4、修改访问端口kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard5、通过grep命令筛选出带有”kubernetes-dashboard”关键字的服务kubectl get svc -A | grep kubernetes-dashboard 30187 即为对外暴露的端口。
6、浏览器访问测试https://192.168.234.21:30187/#/loginip 可以是集群任意IP7、创建管理员角色 dashboard-adminuser.yamlcat dashboard-adminuser.yamlEOF
apiVersion: v1
kind: ServiceAccount
metadata:name: admin-usernamespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:name: admin-user
roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: cluster-admin
subjects:
- kind: ServiceAccountname: admin-usernamespace: kubernetes-dashboard
---
apiVersion: v1
kind: Secret
metadata:name: admin-usernamespace: kubernetes-dashboardannotations:kubernetes.io/service-account.name: admin-user
type: kubernetes.io/service-account-token
EOF8、kubectl apply -f dashboard-adminuser.yaml
kubectl get secret admin-user -n kubernetes-dashboard -o jsonpath{.data.token} | base64 -d#复制上面命令返回的token到web页面即可登录。十、集群的加入令牌过期–处理
当Kubernetes集群的加入令牌过期时可以采取以下步骤进行处理
1、首先检查是否有其他有效的加入令牌可用。可以通过运行以下命令获取可用的加入令牌列表
kubeadm token list2、如果有其他有效的加入令牌可用可以使用该令牌重新加入集群。运行以下命令以使用新的令牌加入集群 kubeadm token create --print-join-command结语
本文详细介绍了Kubernetes分布式部署的实用步骤希望能够帮助读者顺利部署和管理自己的Kubernetes集群。
Kubernetes作为一款强大的容器编排工具能够帮助我们更高效地管理和运行容器化应用提高应用的可靠性和可伸缩性。祝您在Kubernetes的世界里探索出更多的可能性 The End点点关注收藏不迷路