K8S裸机安装实践
K8S裸机安装实践,构建三主机集群
目录
Kubernetes相关理论介绍
docker与k8s
docker提供了轻量化的运行环境的隔离,以docker镜像的方式解决了应用打包和发布问题,大大降低了普通开发人员运维部署应用的门槛。docker一经诞生迅速成为炙手可热的技术,并在一定时间内引领了容器化技术发展的浪潮。
docker解决了部署的问题却没有解决管理问题,当机器少的时候,可以每台机器单独部署,再加一个负载均衡。当集群规模扩大,每次加机器、软件更新、版本回滚,都会变得非常麻烦。Kubernetes 可以提供集中式的管理集群机器和应用。目前已经成为云平台上的“操作系统”。
k8s整体架构
Kubernetes在架构上主要由Master和Node两种类型的节点组成,这两种节点分别对应着控制节点和计算节点。
master:
主节点,控制平台,也可以通过多个主节点来提高集群可用度。
node:
工作节点,可以是虚拟机或物理计算机,任务都在这里跑,机器性能需要好点;通常都有很多个,可以不断加机器扩大集群;每个工作节点由主节点管理
Pod:
K8S 调度、管理的最小单位,一个 Pod 可以包含一个或多个容器,每个 Pod 有自己的虚拟IP。Pod 类似于共享名字空间和文件系统卷的一组 Docker 容器,上图中kubelet通过容器运行时管理Pod,Pod 中的业务容器被自动安排到集群中的同一物理机或虚拟机上,并可以一起进行调度。
pod是k8s容器编排功能的重要实现方式,容器编排是指容器具体放在什么位置。Kubernetes是对容器间的访问进行了分类,如果这些应用之间需要非常频繁的交互和访问,或者它们之间存在直接通过本地文件进行信息交换的情况,那么在Kubernetes中可以将这些容器划分为一个“Pod”,而Pod中的容器将共享同一个Network Namespace、同一组数据卷,从而实现高效率通信。
Kubernetes 裸机搭建
K8s的搭建至少需要两台主机,一台master,一台node,实践的话最好是三台,可以体现master和node的关系。可以去云平台租赁。
软件安装
1.docker安装:
源配置(阿里云):
yum install wget -y
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
安装语句:
yum install docker-ce docker-ce-cli -y
2.k8s安装:
k8s的安装需要同时安装kubelet、kubectl、kubeadm
Kubeadm 是一个提供了 kubeadminit 和 kubeadmjoin 的工具,会提供环境检查、配置生成、tls证书生成、安装proxy和dns等功能,帮助我们启动和运行集群。
如上图,kubelet:
1.通过CRI接口和容器(不一定是docker)进行交互,维护容器生命周期
2.通过grpc和访问设备接口,管理物理设备
3.通过CNI为容器进行网络配置
4.通过CSI为容器提供持久化
kubectl是一个命令行工具,外部通过kubectl和整个集群进行交互
配置源(阿里云):
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[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
安装语句:
yum install -y kubelet-1.22.4 kubectl-1.22.4 kubeadm-1.22.4
设置docker和kubelet的开机自启动:
systemctl enable kubelet
systemctl enable docker
修改docker的cgroupdriver为systemd
为什么要修改参考:为什么要修改docker的cgroup driver
简单来说cgroups是内核追踪、控制程序调用资源的一个工具,在k8s和docker里配置是不一样的,这样会运行两个cgroup控制管理器,当资源有压力的情况时,有可能出现不稳定的情况。
cat <<EOF > daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": ["https://ud6340vz.mirror.aliyuncs.com"]
}
EOF
mv daemon.json /etc/docker/
# 重启生效
systemctl daemon-reload
systemctl restart docker
初始化集群
在master节点通过kubeadm init文件
kubeadm init --image-repository=registry.aliyuncs.com/google_containers
–image-repository registry.aliyuncs.com/google_containers 指定镜像源,由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址。
kubeadm init可配置参数可见官方文档
cubectl配置
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
这项配置让cubectl有权限访问集群
子节点加入集群
kubeadm init 执行完成后,最后会生成两行代码:
kubeadm join ip:port --token ***
--discovery-token-ca-cert-hash ***
将代码在子节点运行就可以加入集群了
在主节点使用kubectl get nodes 查看子节点信息
报错与解决
1.报错Initial timeout of 40s passed.
根据提示查看journalctl -xeu kubelet,报错为"Container not found in pod’s containers"
解决方法:
docker与k8s版本不一致导致,参考问题:stack-overflow
卸载原有docker并安装新版本
systemctl stop docker
yum remove erase docker docker-common docker-client cockpit-docker
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
yum install -y docker-ce-20.10.14-3.el7
systemctl enable docker
systemctl start docker
2.报错"CreatePodSandbox for pod failed"
runc did not terminate successfully: exit status 127: unknown
运行runc命令排查:
原因是缺少依赖包,通过安装libseccomp-devel解决。解决参考文章
更多推荐
所有评论(0)