k8s核心概念与kubectl命令行工具的使用

艺帆风顺 发布于 2025-04-02 18 次阅读


k8s官方文档

https://kubernetes.io/zh-cn/docs/home/

作用:

kubernetes用于容器化应用程序的部署,扩展和管理。

目标:

是让部署容器化应用简单高效。

Kubernetes集群架构与组件

编辑

Master组件

kube-apiserver

kubernetes API,集群的统一入口,各组件协调者,以RESTful API提供接口服务,所有对象资源的增删改查和监听操作都交给APIServer处理后在提交给Etcd存储。

kube-controller-manager

处理集群中常规后台任务,一个资源对应一个控制器,而ControllerManager就是负责管理这些控制器的。例如:Deployment、Service

kube-scheduler

根据调度算法为新创建的Pod选择一个Node节点,可以任意部署,可以部署在同一个节点上,也可以部署在不同的节点上。

etcd

分布式键值存储系统。用于保存集群状态数据,比如Pod、Service等对象信息。

Node组件

kubelet

kubelet是Master在node节点上的Agent,管理本机运行容器的生命周期,比如创建容器、Pod挂载数据卷、下载secret、获取容器和节点状态等工作。kubelet将每个Pod转换成一组容器。

kube-proxy

在Node节点上实现Pod网络代理,维护网络规则和四层负载均衡工作。

第三方容器引擎

容器引擎,运行容器,例如docker、containerd、podman

简要架构图

编辑


kubeconfig配置文件

编辑

常用kubectl命令

编辑

编辑

kubectl案例:

#使用镜像控制器部署镜像

    kubectl create deployment java-demo --image=gyq/java-demokubectl get deployment,pods

    --image= 指定镜像地址,镜像来源有哪些?
      1、docker hub公共镜像仓库,即镜像地址里不含IP或者域名的都是从这里下载的2、私有镜像仓库、即镜像地址里包含ip或者域名

      #使用Service将Pod暴露出去

        kubectl expose deployment java-demo --port=80 --target-port=8080 --type=NodePortkubectl get service

        访问应用


          http://NodeIP:Port #端口随机生成,通过kubectl get service获取--port=80 #service的端口,暂时还不用--target-port=8080 #目标端口,即镜像中服务的端口 , 例如nginx 80、mysql 3306--type=NodePort #service类型,用于将容器暴露集群之外访问kubectl get endpoints #查看service关联的podkubectl get pods --show-labels #查看pod标签kubectl get pods -l app=java-demo #根据标签筛选


          命名空间=工作区

              应用场景:

                  资源分类管理,可根据不同团队、项目划分命名空间

                  基于命名空间权限授权

          #创建命名空间

          kubectl create namespace 命名空间名

          #获取命名空间

          default get namespace

            ·default:默认命名空间·kube-system:k8s系统方面的命名空间·kub-public:公开的命名空间,谁都可以访问·kube-node-lease:k8s内部命名空间

            获取所有命名空间

            编辑

            指定命名空间    -n

            编辑

            删除某个deployment

              kubectl delete deployment/deployment_name -n namespace deployment_name为具体的deployment名称 namespace为具体的命名空间 #如果不指定命名空间,则在默认的命名空间中查找目标
              案例:删除这三个deployment

              编辑

              删除第一个

              编辑

              全部删除了

              编辑


              从master节点中移除node节点

              在节点上的pod都被区逐后直接执行

              第一步:kubectl delete node 节点名

              第二步: 在被删除的node节点中清空集群数据信息

              编辑

              直接删除kubelet.conf和pki目录下的ca.crt

              编辑

              清空后

              编辑

              然后重启k8s和docker

                systemctl restart kubeletsystemctl restart docker

                部署的网络组建起什么作用?

                  部署网络组件的目的是打通Pod到Pod之间网络、Node与Pod之间网络,从而集群中数据包可以任意传输,形成了一个扁平化网络。主流网络组件有:Flannel、Calico等而所谓的CNI(容器网络接口)就是k8s对接这些第三方网络组件的接口。CNI 容器网络接口CRI 容器运行时接口

                  结论:解决容器跨主机通信问题


                  为什么Kubernetes移除默认docker

                    k8s核心代码优化docker内部调用链比较复杂,多层封装和调用(某些功能用不上了),导致性能降低、提升了故障率、不易排查docker还会在宿主机创建规则、存储卷,也带来了安全隐患

                    如何应对?

                      可通过cri-docker继续使用Docker,并了解其他主流容器运行时。除了docker之外,CRI还支持很多容器运行时,例如: containerd: containerd与Docke相兼容,相比docker轻量很多,目前较为成熟 cri-o,podman:都是红帽(RedHat)项目,目前红帽主推podman node : kube-proxy kubelet (systemd维护)