k8s

1.docker与k8s

k8s与docker的关系

  • 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 initsudo kubeadm join sudo kubeadm reset时,可能需要加--cri-socket unix:///var/run/cri-dockerd.sock,不然可能出现如下错误:https://blog.csdn.net/m0_64284147/article/details/128124322
    有时候不加,却可以,加了却不可以。。。

3.基础

参考:Kubernetes(K8S)简介

我对k8s的理解:k8s用于管理集群,实现负载均衡、高可用、不停机的灰度更新、高扩展等。k8s控制多个节点上面运行多个容器,master通知worker节点启动对应的容器,master还负责进行负载均衡。

  • kubeadm:用来初始化集群的指令。
  • kubelet:在集群中的每个节点上用来启动 Pod 和容器等。
  • kubectl:用来与集群通信的命令行工具。kubectl的命令会发送kubelet,kubelet指定对应的动作。

Pod:,K8S 调度、管理的最小单位,一个 Pod 可以包含一个或多个容器,每个 Pod 有自己的虚拟IP。一个工作节点可以有多个 pod,主节点会考量负载自动调度 pod 到哪个节点运行。

Kubernetes(K8S)简介

  • 部署应用到集群中:
    • 直接命令运行
    • 使用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等
  • 命名空间:不同服务可以设置到不同的命名空间中,这样可以更好地管理。

八股

https://zhuanlan.zhihu.com/p/365759073

posted @ 2023-10-03 15:16  好人~  阅读(46)  评论(0编辑  收藏  举报