文章目录
使用互动教程,你可以学习:
- 在集群上部署容器化应用程序
- 弹性部署
- 使用新的软件版本,更新容器化应用程序
- 调试容器化应用程序
官网交互教程:https://kubernetes.io/zh-cn/docs/tutorials/kubernetes-basics/
跟着官网学操作
- 创建一个k8s集群
- 部署应用程序
- 应用程序探索
- 应用外部可见
- 应用可扩展
- 应用的更新
创建一个k8s集群
还是利用我的云上环境进行操作
##先清理一下存在的环境
minikube delete --all
rm -rf ~/.minikube
- 查看一下minikube环境
#查看minikube版本
minikube version
#创建一个集群
minikube start --kubernetes-version=v1.23.3 --image-mirror-country='cn' --force
部署我们的应用
查看基础环境
#kubectl 版本
kubectl version
#查看k8s集群节点信息
kubectl get nodes
拉取需要的镜像
#官网拉取的镜像是gcr.io/google-samples/kubernetes-bootcamp:v1 国内不得行,就直接用国内的镜像替代
docker pull registry.cn-beijing.aliyuncs.com/typ/kubernetes-bootcamp:v1
创建应用
#基于镜像创建应用
kubectl create deployment kubernetes-bootcamp --image=registry.cn-beijing.aliyuncs.com/typ/kubernetes-bootcamp:v1
查看应用状态
kubectl get deployments
#显示正常
- 这个时候,k8s内部就运行了一个pod,在一个专用的、隔离的网络上,这个网络默认情况下,他们可以从同一个k8s集群内的其他pod和服务中看到,但是不能在该网络之外看到
创建代理
可以创建一个代理,将通信转发到集群范围的专用网络,新打开一个终端,执行代理命令
- 现在主机和k8s集群之间建立了连接
kubectl proxy
对k8s集群的操作
上一个步骤建立了k8s集群连接,可以尝试访问一下k8s API版本
curl http://localhost:8001/version
通过API访问Pod
API服务器将根据pod名称自动为每一个pod创建一个端点,该点是可以通过代理访问
#先获取pod名称
kubectl get pods
#再通过API访问Pod
curl http://localhost:8001/api/v1/namespaces/default/pods/kubernetes-bootcamp-77b6c98f86-2zz2m/
了解我们的应用
查看pod和工作节点
上面一个步骤,部署了一个应用,通过deployment
操作,k8s就添加了一个pod
来托管这个应用
pod是k8s抽象出来的,表示一组一个或多个应用容器,以及共享的资源(共享存储、网络等)
- pod中的容器共享IP地址和端口,始终位于同一位置并且共同调度,并在同一工作节点上的共享上下文中运行
- Pod是Kubernetes平台上的原子单元
- 当我们在Kubernetes上创建Deployment时,该Deployment会在其中创建包含容器的Pod(而不是直接创建容器)。每个Pod都与调度它的工作节点绑定,并保持在那里直到终止(根据重启策略)或删除。 如果工作节点发生故障,则会在集群中的其他可用工作节点上调度相同的Pod
Pod
工作节点
- pod总是运行在工作节点上
- 参与计算的k8s机器就是工作节点,可以是虚拟机,也可以是物理机
- 任意一个工作节点有主节点管理
- 工作节点可以有多个pod,主节点自动处理在集群的工作节点调度pod
这里说的工作节点,应该就是k8s集群中的node概念,主节点说的就是master,对于工作节点,至少运行:
- kubelet:负责Kubernetes主节点和工作节点之间通信的过程; 它管理Pod和机器上运行的容器
- 容器运行时(如 Docker)负责从仓库中提取容器镜像,解压缩容器以及运行应用程序
使用kubectl排查
- kubectl get - 列出资源
- kubectl describe - 显示有关资源的详细信息
- kubectl logs - 打印 pod 和其中容器的日志
- kubectl exec - 在 pod 中的容器上执行命令
- 查看你的pod信息:
kubectl get pods
- 查看pod的详细信息:包括地址、使用的端口、生命周期的事件列表
#这个地方好像查看的全部pod,应该也可以参看特定的一个pod详细信息
kubectl describe pods
- 打印pod的日志
# -f参数表示实时打印pod日志,和 docker logs -f类似
kubectl logs -f kubernetes-bootcamp-77b6c98f86-2zz2m
- 进入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
公开暴露我的应用
这段有很多新出现的概念
使用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或更高版本
- Service 通过一组 Pod 路由通信,因为是一种抽象,所以它允许 Pod 死亡并在 k8s 中复制,而不会影响应用程序,在依赖的 Pod 之间进行发现和路由由 k8s service 处理的
- Service 匹配一组 Pod 是使用标签 Label 和选择器 Selector ,它们是允许对 k8s 中的对象进行逻辑操作的一种分区原语
- 标签是附加在对象上的键值对,可以多种方式使用
- 指定用于开发、测试、生产的对象
- 嵌入版本标签
- 将对象进行分类
- 标签是可以在创建时或者之后附加在对象上,可以随时修改
- 标签是附加在对象上的键值对,可以多种方式使用
发布我们的应用
创建一个service
#查看一下pod
kubectl get pods
#查看一下service
kubectl get services
这里有一个默认的service,是在Minikube 启动集群时默认创建的,
#这里使用expose命令暴露我们最开始创建的这个pod试试
kubectl expose deployment/kubernetes-bootcamp --type="NodePort" --port 8080
kubectl get services
现在创建了一个名字为kubernetes-bootcamp的运行服务,接收到一个唯一的集群IP、一个内部端口、一个外部端口(10.107.35.229 8080 32621)
#了解一下更详细的信息
kubectl describe services/kubernetes-bootcamp
#我们直接本地访问一下试试:minikube的ip+端口号(但是我还是不能直接用我的云主机的IP去访问)
#minikube ip 可以显示出minikube的地址,这应该是一个虚拟的东西,可能和minikube这个软件有关系
#导致这就相当于可以外部访问了
curl $(minikube ip):32621
缩放我们的应用
扩缩概述
到现在为止,我们实验了通过 Deployment 创建 Pod,然后利用 Service 实现开放访问
- 扩缩容是通过改变 Deployment 中的副本数量来实现的
实现概述图:
扩展 Deployment 将创建新的 Pods,并将资源调度请求分配到可用资源的节点上
收缩将会改变 Pods 的数量,减少到所需的状态,收缩到0也是可以的,会终止所有已经部署的 Pods
多个Pods,就意味着同一个应用程序的多个实例,Service 可以用来实现他们之间的流量分配,使用的就是负载均衡器,上面我们实验已经涉及过,
操作我们的应用
查看我们的部署
kubectl get deployments
- NAME:k8s集群中部署的名称
- READY:显示当前副本数与期望数的比值
- UP-TO-DATE:显示更新以达到所需要状态的副本数
- AVAILABLE:显示用户可以使用的应用程序的副本数
- AGE:显示应用程序运行的时间
查看 ReplicaSet
kubectl get rs
- DESIRED:显示应用程序所需的副本数量,创建部署时候定义的,是所需的状态
- CURRENT:显示当前正在运行的副本数
扩展应用
使用kubectl scale
进行扩展
## kubectl scale 部署类型 名称 所需的副本数
kubectl scale deployments/kubernetes-bootcamp --replicas=4
查看状态
扩展以后,就会有4个 Pod,而且拥有不同的 IP 地址,
kubectl get deployments
kubectl get pods -o wide
查看一下更改日志
应该可以通过事件去查看
kubectl describe deployments
检查一下负载均衡
查看一下描述
kubectl describe services/kubernetes-bootcamp
缩小应用
我们将应用缩到2个
#还是使用前面的命令
kubectl scale deployments/kubernetes-bootcamp --replicas=2
检查一下
kubectl get deployments
kubectl get pods -o wide
##可以看到整个缩容过程
更新我们的应用
滚动更新概述
在 k8s 中,更新操作时通过 Rolling Updates (滚动更新)完成的
滚动更新 允许通过使用新的实例逐步更新 Pod 实例,零停机进行 Deployment 更新。新的 Pod 将在具有可用资源的节点上进行调度
默认情况下,更新期间不可用的 pod 的最大值和可以创建的新 pod 数都是 1。这两个选项都可以配置为(pod)数字或百分比。 在 Kubernetes 中,更新是经过版本控制的,任何 Deployment 更新都可以恢复到以前的(稳定)版本
与应用程序扩展类似,如果 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
#看一下pod用的镜像信息
kubectl describe pods
#更新到v2版本 使用set images命令(这个验证好像有点问题)
kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=registry.cn-beijing.aliyuncs.com/typ/kubernetes-bootcamp:v2
验证更新
kubectl describe pods
##看图应该没问题
回滚更新
这个地方我重头创建了一下这个应用,副本数还是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
可以看到有些Pod的状态是这个,说明镜像拉取有问题
#我们需要回滚
kubectl rollout undo deployments/kubernetes-bootcamp
kubectl describe pods
到现在,我已经走完官网的k8s基础知识的官方交互过程,已经知道了一些基础概念和用法,验证过了一些基本的应用操作场景,接下来我们将详细理解一下k8s基础架构