k8s kubernetes

发布于:2024-12-19 ⋅ 阅读:(10) ⋅ 点赞:(0)


在这里插入图片描述

CGroup

在 Linux 上,控制组(CGroup)用于限制分配给进程的资源。kubelet 和底层容器运行时都需要对接控制组来强制执行 为 Pod 和容器管理资源 并为诸如 CPU、内存这类资源设置请求和限制。若要对接控制组,kubelet 和容器运行时需要使用一个 cgroup 驱动。 关键的一点是 kubelet 和容器运行时需使用相同的 cgroup 驱动并且采用相同的配置。

  • cgroupfs 驱动:cgroupfs 驱动是 kubelet 中默认的 cgroup 驱动。 当使用 cgroupfs 驱动时, kubelet 和容器运行时将直接对接 cgroup 文件系统来配置 cgroup。当 systemd 是初始化系统时, 不 推荐使用 cgroupfs 驱动,因为 systemd 期望系统上只有一个 cgroup 管理器。 此外,如果你使用 cgroup v2, 则应用 systemd cgroup 驱动取代 cgroupfs。
  • systemd cgroup 驱动: 当某个 Linux 系统发行版使用 systemd 作为其初始化系统时,初始化进程会生成并使用一个 root 控制组(cgroup),并充当 cgroup 管理器。systemd 与 cgroup 集成紧密,并将为每个 systemd 单元分配一个 cgroup。 因此,如果你 systemd 用作初始化系统,同时使用 cgroupfs 驱动,则系统中会存在两个不同的 cgroup 管理器。同时存在两个 cgroup 管理器将造成系统中针对可用的资源和使用中的资源出现两个视图。某些情况下, 将 kubelet 和容器运行时配置为使用 cgroupfs、但为剩余的进程使用 systemd 的那些节点将在资源压力增大时变得不稳定。当 systemd 是选定的初始化系统时,缓解这个不稳定问题的方法是针对 kubelet 和容器运行时将 systemd 用作 cgroup 驱动。

k8s运行时

  • CRI(Container Runtime Interface): 容器运行时接口,用来运行容器,k8s通过这个接口去兼容不同的容器,目前主要的CRI有CRI-O和containered,dockershim在k8s的1.24版本后从kubelet中剥离出来,主要由docker维护(不是亲儿子k8s也不会管了)

  • docker-shimcontainrd区别:
    kubelet --> docker-shim (在 kubelet 进程中) --> dockerd --> containerd(不启动也可运行)
    kubelet --> cri plugin(在 containerd 进程中) --> containerd

  • docker-shim:dockerAPI的适配器,1.24后k8s不再支持,可以像以前一样继续基于 Docker Engine 构建 Kubernetes,只需从内置的 dockershim 切换到外部的 cri-docker 即可。cri-dockerd即后来从k8s独立出来的dockershim。

  • containerd:containerd由docker开发,是docker用来操作runc的handler,与docker平级,docker生成的images等资源与containerd生成的images等资源不共享。cri-containerd是containerd的一个插件,用来支持k8s的cri格式。

  • CRI-O(Container Runtime Interface - OCI): k8s孵化的符合OCI标准的容器运行环境,有逐步替代其它容器技术的趋势

  • other:2018年的其它容器所占的市场份额,CoreOS rkt(12%)、Mesos(4%)

  • OCI(Open Container Initiative): 可以看做是「容器运行时」的一个标准,Ta 使用 Linux 内核系统调用(例如:cgroups 与命名空间)生成容器,按此标准实现的「容器运行时」有 runC 和 gVisor

k8s组件

在这里插入图片描述

  • kubelet:运行在cluster所有节点上,负责启动POD和容器

  • kubeadm:用于初始化cluster

  • kubectl:kubectl是kubenetes命令行工具,通过kubectl可以部署和管理应用,查看各种资源,创建,删除和更新组件

  • Deployment: 一个Deployment对应一个Replica Set,副本集

  • Replica Sets: 一个副本集可有多个副本,副本就是pod

  • pod: 一个pod可存在多个container,这些container使用相同的ip和相同的端口段区间,一般的场景一个容器即一个服务,不需要在pod里拆分多个container

  • service: 对deployment的负载,单个节点多个备份的负载器

  • ingress: nginx反向代理,需要先安装 inginx控制器

k8s组件安装

  • 运行时安装:k8s运行时选其一,笔者不建议使用containered,目前问题太多,建议使用cri-o或cri-docker,官方教程:
    https://kubernetes.io/zh-cn/docs/setup/production-environment/container-runtimes/

kubeadm命令

指令 描述
kubeadm config print join-defaults 默认配置
kubeadm config images list 镜像列表
kubeadm init --config=kubeadm.yaml 初始化(初始化完后需要先copy $HOME/.kube 等操作,见初始化日志)
kubeadm init --apiserver-advertise-address=172.20.167.110 --image-repository registry.aliyuncs.com/google_containers --pod-network-cidr=10.244.0.0/16 --cri-socket=unix:///var/run/cri-dockerd.sock 详细见如下
–apiserver-advertise-address API server 的广播地址、,一般设置为master的ip地址 默认使用默认网关eth0关联的网络接口
–image-repository image拉取源替换为国内
–pod-network-cidr pod使用的子网? 需要有cni插件去创建网络
–cri-socket 运行环境选择 /var/run/cri-dockerd.sock 或 /var/run/containerd/containerd.sock
kubectl apply -f calico.yaml 执行脚本 初始化cni
kubeadm join … --cri-socket /var/run/cri-dockerd.sock 需要指定cri runtime 忘记后 kubeadm token create --print-join-command
kubectl taint nodes --all node-role.kubernetes.io/control-plane- 删除所有污点
kubectl taint nodes k8s-master node-role.kubernetes.io/control-plane- 删除 k8s-master 节点上的 node-role.kubernetes.io/control-plane 污点策略
kubectl taint nodes k8s-master node-role.kubernetes.io/control-plane:NoSchedule 添加污点策略 NoSchedule:表示K8S将不会把Pod调度到具有该污点的Node节点上 taint格式 key:(描述)effect(NoSchedule
kubeadm token create --ttl 0 master节点的token 24小时过期后,可以通过命令产生新的token
kubeadm token list master节点上运行命令,可查询

kubectl命令

指令 描述
kubectl explain pod.spec.containers 命令解释
kubectl config view 当前k8s集群配置
kubectl get nodes -o wide --show-labels 查看节点
kubectl get namespace kube-system 命名空间
kubectl get pod --all-namespaces -o wide 查看所有namespaces下的pod
kubectl get pod -n kube-system -o wide 查看单个namespaces下的pod
kubectl get pod -n kube-system -o wide pod_name 详情(包含CPU内存的分配)
kubectl get deployment -n kube-system -o wide 副本升级版
kubectl get rs -n kube-system -o wide 副本
kubectl get service -n kube-system 副本访问入口(负载)
kubectl get ingress -n kube-system 反向代理nginx
kubectl describe node k8s-master 查看k8s-master节点详情 包含 traints…
kubectl describe namespace 命名空间
kubectl describe pod -n kube-system pod_name 详情
kubectl exec -it pod_name -c container_name bash 进入容器
kubectl exec -it myapp-pod1 -n mypodspace bash 进入pod
kubectl create namespace nmsp1 创建namespace
kubectl delete namespace nmsp1 删除namespace
kubectl delete pod -n kube-system web-sg 删除加入的pod
kubectl create -f pod-resources.yaml 创建pod
kubectl apply -f pod_web_single.yaml 创建pod通过yml
kubectl delete -f pod_web_single.yaml 删除加入的pod通过yml
kubectl logs -f -n namespace_name pod_name -n 命名空间
kubectl logs -f -n namespace_name -c container_name pod_name -c 容器
kubectl proxy --address=‘0.0.0.0’ --accept-hosts=‘^*$’ --port=8001 内网 开启代理 dashboard (使外网能访问到) nohup ${command} >> logs/dashboard.log 2<&1 &
kubectl port-forward -n kubernetes-dashboard --address 0.0.0.0 service/kubernetes-dashboard 8080:443 外网 浏览器输入 thisisunsafe
kubectl -n kubernetes-dashboard create token admin-user 已生成账户但并未生成token的话用此命令

k8s官网

https://kubernetes.io/zh-cn/docs/setup/production-environment/container-runtimes/

代码

以下是基于ruoyi spring cloud的kubernetes部署demo:
https://github.com/yuzhou152/RuoYi-Cloud-Kubernetes.git


网站公告

今日签到

点亮在社区的每一天
去签到