三. Kubernetes 基础使用示例

文章详细介绍了Kubernetes中的kubectl命令,包括kubectlrun和kubectlcreatedeployment的区别,强调了Deployment的自我修复机制。还探讨了Pod的网络通信、挂载卷的问题以及Node的角色。同时,提到了常用kubectl命令的使用,并阐述了手动扩缩容的操作过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一. 基础解释

  1. 使用k8s后,通过k8s管理监控服务,在只有docker时,通过"docker run"命令运行容器,此时使用"kubectl run"命令运行pod,例如:
//kubectl run 自定义pod名称 --image=指定镜像 下方示例: 
kubectl run name --image=alpine
kubectl run nginx --image=nginx

//其它命令,下方命令等价于在docker中的"docker ps -a"
kubectl get pod 

//获取pod是在哪个节点上运行的
kubectl get pod -o wide
  1. 在使用k8s集群时,所有kubectl命令都是在master节点运行的, master只负责调度, master节点根据前面说的List-Watch的机制通知工作节点获取命令并进行实际的落地执行,再复习一下master节点中的几个关键组件
  1. kubelet:所有节点必备,控制节点上pod的启停,以及通过该组件与apiServer进行交互等工作,我们可以称为监工
  2. kubelet-api-server: 负责接收所有请求, 无论是命令行还是uiweb端操作k8s,都是通过该组件去接收操作指令的,集群中k8s多个节点的通信也是通过apiServer完成的
  3. kubelet-proxy: 每个节点都有,负责节点的网络通信相关
  4. cri: 容器运行环境

二. 部署一个应用

  1. Deployment(部署)
  1. Deployment 处于 master 节点上,通过发布 Deployment,master 节点会选择合适的 worker 节点创建 Container容器,Container 会被包含在 Pod里,Pod 是 k8s 中最小可管理单元
  2. 如果与docker连起来去看的话, 在k8s中通过发布 Deployment,可以创建应用程序的实例,这个应用程序实例可以理解为在k8s的pod中运行了一个docker image+启动了一个docker container
  3. pod中有ip,端口号等信息, 通过这个ip+端口号,就可以访问pod中运行的指定container容器应用
  4. 在创建应用程序实例后,Kubernetes Deployment Controller 会持续监控这些实例。如果运行实例的 worker 节点关机或被删除,则 Kubernetes Deployment Controller 将在群集中资源最优的另一个 worker 节点上重新创建一个新的实例。提供了自我修复机制来解决机器故障或维护问题。
  1. 部署命令:"kubectl create deploy xxxxxx "
//kubectl create deployment 自定义名称 --image=选择镜像名称
kubectl create deployment my-nginx --image=nginx

kubectl create deployment my-nginx --image=nginx --port=80
  1. 当执行一次部署命令时, 部署命令有apiServer将执行指令存储到etcd
  2. 后续通过List-Watch的机制该指令被k8s集群中的某个工作节点获取到开始执行
  3. 工作节点中会先创建一个pod出来, 在pod中创建此次部署的容器
  4. pod中存在ip,端口号等信息,通过这个ip端口号就可以访问部署的实际容器
    在这里插入图片描述
  1. k8s运行容器时,容器命名规则:
  1. 上面的示例中我们部署了一个nginx, 执行"kubectl get pod -o wide"命令可以查k8s的详细信息,查看实际部署到了k8s的哪个节点上,
  2. 然后进入指定节点,执行"docker ps nginx"查看运行的容器具体信息,能够获取到下方示例
//k8s_镜像(nginx)_pod名(my-nginx-6b74b79f57-snlr4)_容器名(default_dbeac79e-1ce9-42c9-bc59-c8ca0412674b_0)
//解释:k8s+镜像+pod名称+容器名称
k8s_nginx_my-nginx-6b74b79f57-snlr4_default_dbeac79e-1ce9-42c9-bc59-c8ca0412674b_0
  1. 获取k8s Deployment 部署的应用命令"kubectl get deploy",可以看到部署的应用, 应用的准备状态,运行状态等信息
    在这里插入图片描述
  2. 由于k8s提供了修复机制,当在k8s中创建启动程序时,如果程序宕机,或删除容器,k8s都会执行ContainerCreating选择一台资源最优的节点再次创建运行这个容器程序
  3. 注意点k8s的修复自愈机制只针对与Deployment 部署的应用,像"kubectl run nginx --image=nginx" 是直接启动一个应用不会产生部署信息,该方式不支持自愈功能
  4. 如果真想删除某个应用,执行"kubectl delete deploy 部署名字" 删除指定部署,否则会一直拉起

kubectl create deployment 与 kubectl run 的区别

  1. kubectl run :直接启动一个pod, 不会产生一次部署信息,没有自愈功能
  2. kubectl create deploy: 启动一个Pod,以及记录这次部署信息,这个pod如果宕机或删除,k8s会根据这次部署信息有,强制同步到这次部署信息期望的最终结果,执行kubectl get 命令时 deploy,pod 都有内容

三. 了解Kubernetes Pod

  1. 通过上面部署一个应用了解到,在执行部署命令时,k8s会通过kubelet创建pod,在pod中创建运行应用程序容器,pod上与ip,有端口号等信息,通过这个ip端口号就可以访问pod中运行的指定程序,并且通过deployment 命令部署的应用具有自愈功能
  2. 实际在执行 Deployment 后,k8s创建了一个 Pod(容器组) 来放置应用程序实例container 容器, pod是容器的再封装,一个Pod中实际可以运行多个容器,
  3. 同一个pod中的多个容器ip,挂载卷(文件系统)dns解析相同, 通过不同的端口号来区分
    在这里插入图片描述
  4. 官方点的解释Pod是一个k8s中一个抽象的概念,由被称为容器组,用于存放一组 container(可包含一个或多个 container 容器,即图上正方体),以及这些 container (容器)的一些共享资源,共享资源包括:
  1. 共享存储,称为卷(Volumes),即图上紫色圆柱
  2. 网络,每个 Pod(容器组)在集群中有个唯一的 IP,pod(容器组)中的 container(容器)共享该IP地址
  3. container(容器)的基本信息,例如容器的镜像版本,对外暴露的端口等
  1. 如果多个容器紧密耦合并且需要共享磁盘等资源,则他们应该被部署在同一个Pod(容器组)中
  2. kubelet启动的所有pod都存在ip地址,全集群中任意位置都可访问, pod的ip是怎么设定的,
  1. 那么是如何进行网络通信的,k8s中安装了calico网络组件实现,通过calico网络扁平化处理,将pod网段设置到指定范围内
  2. 复习搭建k8s集群时初始化集群命令,下方命令中的"pod-network-cidr=192.168.0.0/16"就是设置创建pod时ip的取值范围
kubeadm init \
--apiserver-advertise-address=10.170.11.8 \
--image-repository registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images \
--kubernetes-version v1.21.0 \
--service-cidr=10.96.0.0/16 \
--pod-network-cidr=192.168.0.0/16

pod 与挂载卷的问题

  1. 思考一个问题,通过 Deployment 命令创建pod,运行应用程序,该应用程序挂载了宿主机的其它系统,如果应用宕机,当通过自愈机制再次拉起时,原挂载的宿主机的文件卷还会有内容吗

不一定,因为再次拉起时,新创建出的pod很大概率不在原来的节点上,那么挂载宿主机的系统也有可能不是原来那个一

  1. 进而引出,如果与宿主机挂载,要考虑是否使用共享卷挂载

四. 了解Node

  1. 此处只从部署层面去了解,在k8s的master节点上执行部署命令, 实际会将部署的pod容器组,应用程序等,创建运行在k8s的工作节点上,
  2. Node节点是 kubernetes 集群中的计算机,可以是虚拟机或物理机,每个Node都由master管理。一个Node中可以有多个Pod(容器组), kubernetes master 会根据每个 Node 上可用资源的情况,自动调度Pod(容器组)安装到到最佳的 Node上, 每个Node节点至少运行:
  1. Kubelet: 负责 master 节点和 worker 节点之间通信的进程;管理 Pod和Pod中运行的 Container容器
  2. kube-proxy: 网络代理,负责网络通信流量转发等
  3. 容器运行环境(如Docker)负责下载镜像、创建和运行容器等。

五. 常用命令

  1. 先说一下怎么看k8s命令文档
  1. 执行"kubectl" 命令,就可以看到kubectl子集命令与命令解释如下,拿到了scale命令
    在这里插入图片描述
  2. 执行"kubectl scale --help" 就可以看到scale命令下的子集命令及示例
    在这里插入图片描述
  1. 查看资源类型命令
  	# kubectl get 资源类型
    #获取Deployment列表
    kubectl get deployments
    #获取Pod列表
    kubectl get pods
    #获取Node列表
    kubectl get nodes
    # 查看所有名称空间的 Deployment
    kubectl get deployments -A
    kubectl get deployments --all-namespaces
    # 查看 kube-system 名称空间的 Deployment
    kubectl get deployments -n kube-system
    #####并不是所有的对象都在名称空间中
    
    # 在名称空间里
    kubectl api-resources --namespaced=true
    
    # 不在名称空间里
    kubectl api-resources --namespaced=false
  1. kubectl describe 显示有关资源的详细信息
    # kubectl describe 资源类型 资源名称
    
    #查看名称为nginx-XXXXXX的Pod的信息
    kubectl describe pod nginx-XXXXXX	
    
    #查看名称为nginx的Deployment的信息
    kubectl describe deployment my-nginx	
  1. kubectl logs 查看pod中的容器的打印日志(和命令docker logs 类似)
    # kubectl logs Pod名称
    
    #查看名称为nginx-pod-XXXXXXX的Pod内的容器打印的日志
    #本案例中的 nginx-pod 没有输出日志,所以您看到的结果是空的
    kubectl logs -f nginx-pod-XXXXXXX
  1. kubectl exec - 在pod中的容器环境内执行命令(和命令docker exec 类似)
    # kubectl exec Pod名称 操作命令
    
    # 在名称为nginx-pod-xxxxxx的Pod中运行bash
    kubectl exec -it nginx-pod-xxxxxx /bin/bash
    
    ### 注意:新版1.21.0 提示这个命令会过期
  1. 其它创建运行容器命令
kubectl create 资源  #创建任意资源
kubectl create deploy #创建部署
kubectl run #只创建一个Pod
kubectl get 资源名(node/pod/deploy) -n xxx(指定名称空间,默认是default) #获取资源
kubectl describe  资源名(node/pod/deploy)  xxx #描述某个资源的详细信息
kubectl logs 资源名 ##查看日志
kubectl exec -it pod名 -- 命令  #进pod并执行命令
kubectl delete 资源名(node/pod/deploy) xxx  #删除资源

六. 手动扩缩容操作

  1. 在上面我们部署了一个应用, 假设后续发现一个应用无法承载当前的请求数量, 需要扩容,k8s中如何创建副本
#kubectl scale --replicas=扩容数量 deployment 部署名称,下方是扩容3个部署的tomcat6
kubectl scale --replicas=3  deployment tomcat6
  1. 下图解释:
  1. 执行扩容命令,扩容部署3个my-nginx2
  2. 执行"kubectl get depoloy" 查看当前k8s中的部署信息
  3. 然后执行"kubectl get pod -o wide" 查看当前k8s中pod信息,发现my-nginx2部署了3个
    在这里插入图片描述
    在这里插入图片描述
  1. 手动缩容
kubectl  scale --replicas=1 deployment.apps/指定部署名
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值