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解决。解决参考文章

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐