k8s
1.docker与k8s
- k8s容器运行时接口(CRI):CRI应该就相当于一个抽象类,而容器运行时负责抽象类的实现。
- 容器运行时:负责接口具体的实现,容器运行时定义了容器的创建和管理等功能。所以只要符合接口的规范,就可以实现各种各样的容器运行时,常见的容器运行时有containerd,CRI-O
- 镜像一般使用Open Container Initiative(OCI)格式进行打包。docker构建的镜像是OCI格式的,所以可以被k8s等软件直接使用。
- docker使用containerd作为容器运行时,使用containerd来管理容器。containerd实现了 CRI 规范,所以可以被k8s中的CRI调用。所以 Docker 自己在内部使用 containerd,当你安装 Docker 时也会安装 containerd。
docker中除了容器运行时,还有docker-cli:这是一个命令行工具,它是用来完成 docker pull, build, run, exec 等命令进行交互。
2.安装
如何在Ubuntu-22上安装Kubernetes(k8s)环境:严格按照此文章进行安装,如果发现错误,那么就会查,确保每一步的错误被解决。
- 环境:ubuntu22,Kubernates版本v1.28.2
- 给每个节点设置镜像加速器:设置阿里云镜像加速器,阿里云针对各种平台都提供了操作文档,按文档操作即可
- kubelet默认驱动是systemd,需要将节点中的containerd的cgroup 驱动设置为systemd
- 第四章开始后面所有的章节都是master节点需要做的事情,第四章初始化完毕之后,就可以具体初始化的提示信息将worker节点加入到master中。
- 安装容器网络接口(CNI),以便你的 Pod 可以相互通信。容器网络接口(CNI)有如下几种:K8s CNI 网络最强对比:Flannel、Calico、Canal 和 Weave
其他:
- 禁用swap的原因:使用swap会大大降低性能,所以一般在内存用完时直接杀掉进程,并向运维或者作业提交者报错提示。参考:链接
- kubeadm init执行以后可能需要
unset http_proxy
取消代理,从而让kubectl get node正常运行,否则可能出现:
E1004 14:07:11.285269 42188 memcache.go:265] couldn't get current server API group list: Get "http://localhost:8080/api?timeout=32s": dial tcp 127.0.0.1:8080: connect: connection refused - 使用
kubeadm init
、sudo kubeadm join
或sudo kubeadm reset
时,可能需要加--cri-socket unix:///var/run/cri-dockerd.sock
,不然可能出现如下错误:https://blog.csdn.net/m0_64284147/article/details/128124322
有时候不加,却可以,加了却不可以。。。
3.基础
我对k8s的理解:k8s用于管理集群,实现负载均衡、高可用、不停机的灰度更新、高扩展等。k8s控制多个节点上面运行多个容器,master通知worker节点启动对应的容器,master还负责进行负载均衡。
- kubeadm:用来初始化集群的指令。
- kubelet:在集群中的每个节点上用来启动 Pod 和容器等。
- kubectl:用来与集群通信的命令行工具。kubectl的命令会发送kubelet,kubelet指定对应的动作。
Pod:,K8S 调度、管理的最小单位,一个 Pod 可以包含一个或多个容器,每个 Pod 有自己的虚拟IP。一个工作节点可以有多个 pod,主节点会考量负载自动调度 pod 到哪个节点运行。
- 部署应用到集群中:
- 直接命令运行
- 使用Deployment配置文件运行多个Pod,Deployment 通过 label 关联起来 Pods,master会自动调度pod到节点上面运行。
Deployment配置文件被修改和apply以后,会进行灰度更新。我们可以通过undo来回退到历史版本。
我们还可以在配置文件中,指定pod在哪个节点上面运行,比如在拥有ssd的节点上运行。 - StatefulSet 是用来管理有状态的应用,例如数据库。
- StatefulSet 会固定每个 Pod 的名字,Pod 重建不会改变名字,但可能改变IP,所以一般使用名字来访问数据库,而不使用IP。
- 持久化:将磁盘抽象成三层,1.SC描述存储卷的种类,如SSD,普通磁盘,本地磁盘等、2.PV描述存储卷的具体信息,如磁盘大小,访问模式、3.PVC描述了一个申请单,系统根据这个申请单去找一个合适的 PV,从而获取到卷。
- Service可对集群外部提供访问端口。Service会自动将请求转发给集群中的pod。
- ClusterIP:Service的默认类型是ClusterIP,Service只能被集群内部的pod访问。可以通过端口转发向外暴露Service。分层的目的:更好的分工,运维人员负责提供好存储,开发人员不需要关注磁盘细节,只需要写一个申请单。
- NodePort 和 Loadbalancer 类型的 Service:直接将集群Service向外暴露出来,不用做端口转发。
- Headless:适合数据库,clusterIp 设置为 None 就变成 Headless 了,不会再分配 IP。这些配置信息可以作为环境变量被使用;也可以挂载为文件,会在容器中对应路径生成文件,一个 key 一个文件,内容就是 value,
- ConfigMap和Secret:ConfigMap和Secret中存储着各种配置信息,如数据库名字、密码等。
- Ingress 为外部访问集群提供了一个 统一 入口,避免了对外暴露集群端口;功能类似 Nginx,可以根据域名、路径把请求转发到不同的 Service。
- Helm:很多别人已经写好的YAML文件可以直接使用,可以通过Helm直接运行别人写好的YAML文件,这就相当于安装了某些服务。所以Helm就类似 npm,pip等
- 命名空间:不同服务可以设置到不同的命名空间中,这样可以更好地管理。