k8s学习之路 | Day4 跟着官方使用 Minikube 操作应用

使用互动教程,你可以学习:

  • 在集群上部署容器化应用程序
  • 弹性部署
  • 使用新的软件版本,更新容器化应用程序
  • 调试容器化应用程序

官网交互教程:https://kubernetes.io/zh-cn/docs/tutorials/kubernetes-basics/

跟着官网学操作

  1. 创建一个k8s集群
  2. 部署应用程序
  3. 应用程序探索
  4. 应用外部可见
  5. 应用可扩展
  6. 应用的更新

创建一个k8s集群

还是利用我的云上环境进行操作

##先清理一下存在的环境
minikube delete --all
rm -rf ~/.minikube

image-20230209122708219

  • 查看一下minikube环境
#查看minikube版本
minikube version

#创建一个集群
minikube start --kubernetes-version=v1.23.3 --image-mirror-country='cn' --force

image-20230209123041821

部署我们的应用

查看基础环境

#kubectl 版本
kubectl version

#查看k8s集群节点信息
kubectl get nodes

image-20230209123310838

拉取需要的镜像

#官网拉取的镜像是gcr.io/google-samples/kubernetes-bootcamp:v1  国内不得行,就直接用国内的镜像替代
docker pull registry.cn-beijing.aliyuncs.com/typ/kubernetes-bootcamp:v1

image-20230209123644382

创建应用

#基于镜像创建应用
kubectl create deployment kubernetes-bootcamp --image=registry.cn-beijing.aliyuncs.com/typ/kubernetes-bootcamp:v1

image-20230209123740589

查看应用状态

kubectl get deployments
#显示正常

image-20230209124441281

  • 这个时候,k8s内部就运行了一个pod,在一个专用的、隔离的网络上,这个网络默认情况下,他们可以从同一个k8s集群内的其他pod和服务中看到,但是不能在该网络之外看到

创建代理

可以创建一个代理,将通信转发到集群范围的专用网络,新打开一个终端,执行代理命令

  • 现在主机和k8s集群之间建立了连接
kubectl proxy

image-20230209124920535

对k8s集群的操作

上一个步骤建立了k8s集群连接,可以尝试访问一下k8s API版本

curl http://localhost:8001/version

image-20230209125237457

通过API访问Pod

API服务器将根据pod名称自动为每一个pod创建一个端点,该点是可以通过代理访问

#先获取pod名称
kubectl get pods

image-20230209125601344

#再通过API访问Pod
curl http://localhost:8001/api/v1/namespaces/default/pods/kubernetes-bootcamp-77b6c98f86-2zz2m/

image-20230209125706358

了解我们的应用

查看pod和工作节点

上面一个步骤,部署了一个应用,通过deployment操作,k8s就添加了一个pod来托管这个应用

pod是k8s抽象出来的,表示一组一个或多个应用容器,以及共享的资源(共享存储、网络等)

  1. pod中的容器共享IP地址和端口,始终位于同一位置并且共同调度,并在同一工作节点上的共享上下文中运行
  2. Pod是Kubernetes平台上的原子单元
  3. 当我们在Kubernetes上创建Deployment时,该Deployment会在其中创建包含容器的Pod(而不是直接创建容器)。每个Pod都与调度它的工作节点绑定,并保持在那里直到终止(根据重启策略)或删除。 如果工作节点发生故障,则会在集群中的其他可用工作节点上调度相同的Pod

Pod

image-20230209130350682

工作节点

  1. pod总是运行在工作节点上
  2. 参与计算的k8s机器就是工作节点,可以是虚拟机,也可以是物理机
  3. 任意一个工作节点有主节点管理
  4. 工作节点可以有多个pod,主节点自动处理在集群的工作节点调度pod

这里说的工作节点,应该就是k8s集群中的node概念,主节点说的就是master,对于工作节点,至少运行:

  • kubelet:负责Kubernetes主节点和工作节点之间通信的过程; 它管理Pod和机器上运行的容器
  • 容器运行时(如 Docker)负责从仓库中提取容器镜像,解压缩容器以及运行应用程序

image-20230209131147155

使用kubectl排查

  • kubectl get - 列出资源
  • kubectl describe - 显示有关资源的详细信息
  • kubectl logs - 打印 pod 和其中容器的日志
  • kubectl exec - 在 pod 中的容器上执行命令
  1. 查看你的pod信息:kubectl get pods

image-20230209131458536

  1. 查看pod的详细信息:包括地址、使用的端口、生命周期的事件列表
#这个地方好像查看的全部pod,应该也可以参看特定的一个pod详细信息
kubectl describe pods

image-20230209131912274

  1. 打印pod的日志
# -f参数表示实时打印pod日志,和 docker logs -f类似
kubectl logs -f kubernetes-bootcamp-77b6c98f86-2zz2m

image-20230209133201714

  1. 进入pod容器
#我用docker exec -it类似的命令进入,会有警告提示
kubectl exec -it kubernetes-bootcamp-77b6c98f86-2zz2m /bin/bash

#官方推荐使用的是:kubectl exec [POD] -- [COMMAND]
kubectl exec -it kubernetes-bootcamp-77b6c98f86-2zz2m -- bash

image-20230209133438723

image-20230209133659265

公开暴露我的应用

这段有很多新出现的概念

使用service

对于service

是一种抽象概念,定义了pod的逻辑集合和访问pod的协议

  • k8s集群中的每个pod都有唯一的ip地址,即使是同一个node下的pod
  • service使从属pod之间的松耦合成为可能
  • 尽管每个Pod都有一个唯一的IP地址,但是如果没有Service,这些IP不会暴露在集群外部。Service允许你的应用程序接收流量。Service也可以用在ServiceSpec标记type的方式暴露
    • ClusterIP(默认) - 在集群的内部IP上公开Service。这种类型使得Service只能从集群内访问
    • NodePort-使用 NAT 在集群中每个选定 Node 的相同端口上公开 Service 。使用: 从集群外部访问 Service。是 ClusterIP 的超集
    • LoadBalancer - 在当前云中创建一个外部负载均衡器(如果支持的话),并为 Service 分配一个固定的外部IP。是 NodePort 的超集
    • ExternalName - 通过返回带有该名称的 CNAME 记录,使用任意名称(由 spec 中的externalName指定)公开 Service。不使用代理。这种类型需要kube-dns的v1.7或更高版本

image-20230209135413479

  • Service 通过一组 Pod 路由通信,因为是一种抽象,所以它允许 Pod 死亡并在 k8s 中复制,而不会影响应用程序,在依赖的 Pod 之间进行发现和路由由 k8s service 处理的
  • Service 匹配一组 Pod 是使用标签 Label 和选择器 Selector ,它们是允许对 k8s 中的对象进行逻辑操作的一种分区原语
    • 标签是附加在对象上的键值对,可以多种方式使用
      • 指定用于开发、测试、生产的对象
      • 嵌入版本标签
      • 将对象进行分类
      • 标签是可以在创建时或者之后附加在对象上,可以随时修改

image-20230209135937802

发布我们的应用

创建一个service

#查看一下pod
kubectl get pods
#查看一下service
kubectl get services

image-20230209140527817

这里有一个默认的service,是在Minikube 启动集群时默认创建的,

#这里使用expose命令暴露我们最开始创建的这个pod试试
kubectl expose deployment/kubernetes-bootcamp --type="NodePort" --port 8080

image-20230209140830781

kubectl get services

现在创建了一个名字为kubernetes-bootcamp的运行服务,接收到一个唯一的集群IP、一个内部端口、一个外部端口(10.107.35.229 8080 32621)

image-20230209140921781

#了解一下更详细的信息
kubectl describe services/kubernetes-bootcamp

image-20230209141127219

#我们直接本地访问一下试试:minikube的ip+端口号(但是我还是不能直接用我的云主机的IP去访问)
#minikube ip 可以显示出minikube的地址,这应该是一个虚拟的东西,可能和minikube这个软件有关系
#导致这就相当于可以外部访问了
curl $(minikube ip):32621

image-20230209141530325

缩放我们的应用

扩缩概述

到现在为止,我们实验了通过 Deployment 创建 Pod,然后利用 Service 实现开放访问

  • 扩缩容是通过改变 Deployment 中的副本数量来实现的

实现概述图:

VeryCapture_20230209144338

扩展 Deployment 将创建新的 Pods,并将资源调度请求分配到可用资源的节点上

收缩将会改变 Pods 的数量,减少到所需的状态,收缩到0也是可以的,会终止所有已经部署的 Pods

多个Pods,就意味着同一个应用程序的多个实例,Service 可以用来实现他们之间的流量分配,使用的就是负载均衡器,上面我们实验已经涉及过,

操作我们的应用

查看我们的部署

kubectl get deployments

image-20230209145154623

  • NAME:k8s集群中部署的名称
  • READY:显示当前副本数与期望数的比值
  • UP-TO-DATE:显示更新以达到所需要状态的副本数
  • AVAILABLE:显示用户可以使用的应用程序的副本数
  • AGE:显示应用程序运行的时间

查看 ReplicaSet

kubectl get rs

image-20230209145526315

  • DESIRED:显示应用程序所需的副本数量,创建部署时候定义的,是所需的状态
  • CURRENT:显示当前正在运行的副本数
扩展应用

使用kubectl scale进行扩展

## kubectl scale 部署类型 名称 所需的副本数
kubectl scale deployments/kubernetes-bootcamp --replicas=4

image-20230209145952524

查看状态

扩展以后,就会有4个 Pod,而且拥有不同的 IP 地址,

kubectl get deployments
kubectl get pods -o wide

image-20230209150044369

查看一下更改日志

应该可以通过事件去查看

kubectl describe deployments

image-20230209150304154

检查一下负载均衡

查看一下描述

kubectl describe services/kubernetes-bootcamp

image-20230209150535316

缩小应用

我们将应用缩到2个

#还是使用前面的命令
kubectl scale deployments/kubernetes-bootcamp --replicas=2

检查一下

kubectl get deployments
kubectl get pods -o wide
##可以看到整个缩容过程

image-20230209150933830

更新我们的应用

滚动更新概述

在 k8s 中,更新操作时通过 Rolling Updates (滚动更新)完成的

滚动更新 允许通过使用新的实例逐步更新 Pod 实例,零停机进行 Deployment 更新。新的 Pod 将在具有可用资源的节点上进行调度

默认情况下,更新期间不可用的 pod 的最大值和可以创建的新 pod 数都是 1。这两个选项都可以配置为(pod)数字或百分比。 在 Kubernetes 中,更新是经过版本控制的,任何 Deployment 更新都可以恢复到以前的(稳定)版本

VeryCapture_20230209151840

与应用程序扩展类似,如果 Deployment 是公开的,服务将在更新期间仅对可用的 pod 进行负载均衡。可用 Pod 是应用程序用户可用的实例。

滚动更新允许以下操作:

  • 将应用程序从一个环境提升到另一个环境(通过容器镜像更新)
  • 回滚到以前的版本
  • 持续集成和持续交付应用程序,无需停机

更新回滚应用


更新应用版本

看下基础信息

kubectl get deployments
kubectl get pods
kubectl describe pods

#拉取一个v2的镜像或者直接改吧
docker tag registry.cn-beijing.aliyuncs.com/typ/kubernetes-bootcamp:v1 registry.cn-beijing.aliyuncs.com/typ/kubernetes-bootcamp:v2

image-20230209152601420

#看一下pod用的镜像信息
kubectl describe pods

image-20230209152642267

#更新到v2版本 使用set images命令(这个验证好像有点问题)
kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=registry.cn-beijing.aliyuncs.com/typ/kubernetes-bootcamp:v2

image-20230209152823453

验证更新

kubectl describe pods
##看图应该没问题

image-20230209153111480

回滚更新

这个地方我重头创建了一下这个应用,副本数还是4,版本用的v1,我通过docker命令重新将v1改成v2,好像升级不了应用

比如我们尝试更新一个版本到v10(其实没有这个版本的)

kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=registry.cn-beijing.aliyuncs.com/typ/kubernetes-bootcamp:v2

然后查看一下状态

kubectl get deployments
kubectl get pods

image-20230209154057179

可以看到有些Pod的状态是这个,说明镜像拉取有问题

#我们需要回滚
kubectl rollout undo deployments/kubernetes-bootcamp

image-20230209154210588

kubectl describe pods

image-20230209154514248

到现在,我已经走完官网的k8s基础知识的官方交互过程,已经知道了一些基础概念和用法,验证过了一些基本的应用操作场景,接下来我们将详细理解一下k8s基础架构

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值