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-shim与containrd区别:
kubelet --> docker-shim (在 kubelet 进程中) --> dockerd --> containerd(不启动也可运行)
kubelet --> cri plugin(在 containerd 进程中) --> containerddocker-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