Ubantu docker学习笔记(十一)k8s基本操作

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: Ubantu docker学习笔记(十一)k8s基本操作

相信大家在前面的安装过程中,我们的k8s已经完成了一个超级具体的安装【是不是还是有点难度】,今天我们就在前面已经安装好的基础上来对我们K8s做一个基本操作的学习。

一、K8s介绍

Kubernetes(通常称为K8s,K8s是将8个字母“ubernete”替换为“8”的缩写)是一个以容器为中心的基础架构,可以实现在物理集群或虚拟机集群上调度和运行容器,提供容器自动部署、扩展和管理的开源平台。满足了应用程序在生产环境中的一些通用需求:应用实例副本、水平自动扩展、命名与发现、负载均衡、滚动升级、资源监控等。

Kubernetes 是一个可移植、可扩展的开源平台,用于管理容器化工作负载和服务,有助于声明式配置和自动化。它拥有庞大且快速发展的生态系统。

然后再来看看我们所需要了解到的专业术语

pod

pod可以理解为容器的外壳,它为容器做了一层抽象的封装,pod里面运行容器,pod的特点是可以将多个容器加入到同一个网络名称空间中。同一个pod可以共享储存卷。一个pod上无论是有一个容器还是有多个容器,一旦将此pod调度到某个node上运行时,这一个pod内的所有容器只能运行在同一个node上。

node

node是kubernetes集群中的工作节点,就是负责工作的。【我们在工作节点上join操作的那个】

node可以是任何形式的计算设备,能装k8s的集群代理程序,它都可以作为整个k8s集群一个成员。

标签选择器:

当大量的pod运行在一个集群中时,怎么批量进行管理呢?想只控制一部分的pod时又该如何?如何挑选和检测这些pod?有人会想到通过名称来识别容器,但是pod是随时删除和创建的,名称也会随着pod的删除和创建而发生改变。这样我们就给一类的pod进行分组,就是在创建pod时为其附上app的key的一个键值对,这样我们进行批量操作时可以通过检查pod中是否存在app的key,来实现对多个pod的控制,这样就会有一个新的问题了,怎么实现对多个标签的管理呢?这里我们就可以通过标签选择器组件来实现。标签选择器就是一种根据标签来过滤符合条件的资源对象的机制。

etcd 保存整个集群的状态;

apiserver 提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制;

controller manager 负责维护集群的状态,比如故障检测、自动扩展、滚动更新等;

scheduler 负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上;

kubelet 负责维护容器的生命周期,同时也负责Volume(CVI)和网络(CNI)的管理;

Container runtime 负责镜像管理以及Pod和容器的真正运行(CRI);

kube-proxy 负责为Service提供cluster内部的服务发现和负载均衡

核心组件

组件名称 作用
etcd 保存整个集群的状态
apiserver 提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制
controller manager 负责维护集群的状态,比如故障检测、自动扩展、滚动更新等
scheduler 负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上
kubelet 负责维护容器的生命周期,同时也负责Volume(CVI)和网络(CNI)的管理
Container runtime 负责镜像管理以及Pod和容器的真正运行(CRI)
kube-proxy 负责为Service提供cluster内部的服务发现和负载均衡

参考

k8s官网

接下来就开始今天的学习吧

二、容器编排

首先去检查我们所有组件的状态,这里要保证我们所有状态为1才可以进行操作

kubectl get pod --all-namespaces -o wide

2.1 部署应用

查看可用节点《确保位于可用状态》

kubectl get nodes

创建带有部署名称和应用程序镜像位置的部署

kubectl create deployment kubernetes-bootcamp --image=gcr.lank8s.cn/google-samples/kubernetes-bootcamp:v1 --replicas=1
创建一个名为kubernetes-bootcamp 的 deployment,运行 kubernetes-bootcamp 镜像
kubectl create deployment:创建部署 
--image :指定镜像

查看刚刚的创建的部署

kubectl get deployments

去查看pods

kubectl get pods

在Kubernetes内部运行的Pod是在一个私人隔离网络上运行的,默认情况下,同一Kubernetes集群内的其他pod和服务都可以看到pod。我们可以通过

窗口A:kubectl proxy
窗口B:curl http://localhost:8001/version

来建立主机和Kubernetes集群之间的连接

2.2 了解应用

在上诉的实验中,我们创建了一个 Deployment ,k8s会添加一个Pod来对我们的应用进行管理。Deployment 具体的作用包括创建一个Pod副本集、控制Pod副本的版本、自动修复故障、提供回滚机制、调整 Pod 副本数量

同一个Pod下

共享存储

网络

容器信息

同一个pod下,可能会有多个容器,比如会有我们的jar和我们jar需要访问的数据库,在同一个节点处进行,彼此共享IP地址和主机。在Kubernetes中,不同的Pod被分配了不同的IP地址。这是因为每个Pod都被视为一个独立的实例,并且具有自己的网络标识符。当Kubernetes集群中的一个Pod创建时,它被分配了一个随机的IP地址,并且能够在整个Kubernetes集群范围内被唯一访问。每个Pod都会和他的工作节点绑定,直到终止, 如果工作节点发生故障,则会在集群中的其他可用工作节点上调度相同的 Pod。一个工作节点上存在多个pod。

当我们使用故障排查时可以通过如下命令执行

命令 作用
kubectl get 列出资源
kubectl describe 显示有关资源的详细信息
kubectl logs 打印 pod 和其中容器的日志
kubectl exec 在 pod 中的容器上执行命令

2.3 公开暴露应用

Kubernetes Pod 是转瞬即逝的。 Pod 实际上拥有 生命周期,当我们的Node挂掉之后,pod也会消亡,这个时候ReplicaSet 会自动地通过创建新的 Pod 驱动集群回到目标状态,但是我们在上面已经知道每一个pod的ip地址都不一样,当我们pod丢失或重新创建,需要一种方法自动去调整我们IP地址的变更。Service 匹配一组 Pod 是使用 标签(Label)和选择器(Selector)。

type 作用
ClusterIP (默认) 在集群的内部 IP 上公开 Service 。这种类型使得 Service 只能从集群内访问
NodePort 使用 NAT 在集群中每个选定 Node 的相同端口上公开 Service 。使用: 从集群外部访问 Service。是 ClusterIP 的超集
LoadBalancer 在当前云中创建一个外部负载均衡器(如果支持的话),并为 Service 分配一个固定的外部IP。是 NodePort 的超集
ExternalName 通过返回带有该名称的 CNAME 记录,使用任意名称(由 spec 中的externalName指定)公开 Service。不使用代理。这种类型需要kube-dns的v1.7或更高版本

创建服务

kubectl get services
kubectl expose deployment/kubernetes-bootcamp --type="NodePort" --port 8080
kubectl get services
#将 Deployment 对象 kubernetes-bootcamp 对应的 Pod 所提供的服务暴露出去,以便可以在 Kubernetes 集群外部访问该服务。
#将服务类型设置为 NodePort,这意味着服务将会绑定到每个节点的 IP 地址和随机端口上。这样,在集群外部可以使用任意一个节点的地址和端口来访问该服务。
#将服务的端口设置为 8080,这意味着在集群外部访问该服务时,需要使用 NodeIP:8080 的格式来指定访问的地址和端口。

访问

curl <node ip>:<port>

使用标签进行查看

kubectl describe deployment

kubectl get pods -l app=kubernetes-bootcamp
kubectl get services -l app=kubernetes-bootcamp

添加标签

export POD_NAME=$(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}')
#执行该命令后,可以使用 echo $POD_NAME 命令查看环境变量值,得到 Pod 的名称。这样,在后续操作中就可以直接使用 POD_NAME #环境变量来指定操作的 Pod,而不需要手动输入 Pod 的名称。
kubectl label pods $POD_NAME version=v1
#给指定pod添加标签
kubectl get pods -l version=v1

删除服务

kubectl get services
kubectl delete service -l app=kubernetes-bootcamp
kubectl get services
curl 172.20.10.4:30064 #可以看到已经连不上了
kubectl exec -ti $POD_NAME -- curl localhost:8080#我们只是关闭了外部端口,但是我们本机还是可以访问的

2.4 扩缩应用

在之前我们创建了一个 Deployment,然后通过 Service让其可以开放访问。Deployment 仅为跑这个应用程序创建了一个 Pod。当我们流量增加时,需要进行扩容来保证我们容器应用满足客户的需求。

扩展 Deployment 将创建新的 Pods,并将资源调度请求分配到有可用资源的节点上,收缩 会将 Pods 数量减少至所需的状态。Kubernetes 还支持 Pods 的自动缩放。将 Pods 数量收缩到0也是可以的,但这会终止 Deployment 上所有已经部署的 Pods,扩缩是通过改变 Deployment 中的副本数量来实现的,一旦有了多个应用实例,就可以没有宕机地滚动更新。

Deployment 扩张

kubectl get deployments
kubectl get rs
#当前 Kubernetes 集群中所有 ReplicaSet(缩写为 RS)的列表。ReplicaSet 是 Kubernetes 中的一种控制器,用于确保在任何时间都有一个指定数量的 Pod 副本在运行。
kubectl scale deployments/kubernetes-bootcamp --replicas=4
#更改副本数量
kubectl get deployments
kubectl get pods -o wide
kubectl describe deployments/kubernetes-bootcamp

打开端口

kubectl expose deployment/kubernetes-bootcamp --type="NodePort" --port 8080
kubectl describe services/kubernetes-bootcamp

export NODE_PORT=$(kubectl get services/kubernetes-bootcamp -o go-template='{{(index .spec.ports 0).nodePort}}')
kubectl get nodes -o wide
curl 172.20.10.4:$NODE_PORT

Deployment 收缩

kubectl scale deployments/kubernetes-bootcamp --replicas=2
kubectl get deployments
kubectl get pods -o wide

2.4 滚动更新

用户希望应用程序始终可用,而开发人员则需要每天多次部署它们的新版本。在 Kubernetes 中,这些是通过滚动更新(Rolling Updates)完成的。 滚动更新 允许通过使用新的实例逐步更新 Pod 实例,零停机进行 Deployment 更新。新的 Pod 将在具有可用资源的节点上进行调度

滚动更新允许以下操作:

将应用程序从一个环境提升到另一个环境(通过容器镜像更新)

回滚到以前的版本

持续集成和持续交付应用程序,无需停机

kubectl get deployments
kubectl get pods
kubectl describe pods
#建立一个v2版本的
kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=jocatalin/kubernetes-bootcamp:v2
#之前的是curl 172.20.10.4:30064注意区分,而且版本是V1
curl 172.20.10.4:30417

更新

kubectl rollout status deployments/kubernetes-bootcamp
kubectl describe pods | grep image

版本回退

kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=gcr.lank8s.cn/google-samples/kubernetes-bootcamp:v10
kubectl get deployments
kubectl get pods
kubectl describe pods

kubectl rollout undo deployments/kubernetes-bootcamp
kubectl get pods
kubectl describe pods | grep images

三、Kubernetes 对象

apiVersion

创建该对象所使用的 Kubernetes API 的版本

kind

想要创建的对象的类别

metadata

帮助唯一标识对象的一些数据

spec

你所期望的该对象的状态

Pod

最小的可部署单元,代表一个或多个主进程运行的容器实例

Service

为一组 Pod 提供稳定的网络访问端点,可以根据选择器匹配到特定的 Pod

Deployment

管理 ReplicaSet 的更新,使其从旧版本无缝地滚动升级到新版本,确保应用程序的高可用性和零停机时间

ReplicaSet

确保总有指定数量的 Pod 实例在运行中,如果遇到故障则自动替换

Secret

存储敏感数据(如密码、证书)的对象,与 ConfigMap 类似也可以在 Pod 中使用环境变量或卷的形式挂载到容器中

Namespace

虚拟集群的一种抽象,用于将资源隔离和分组,让不同的团队可以共享同一个 Kubernetes 环境

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
29天前
|
Kubernetes 监控 Docker
Docker Compose与Kubernetes的比较
【6月更文挑战第11天】本文探讨了Docker Compose与Kubernetes在容器编排中的角色。Docker Compose适合简单部署和开发环境,提供一键启动多容器的便利;而Kubernetes则适用于大规模生产环境,具备自动化运维、集群管理和负载均衡等功能。Python在容器编排中扮演重要角色,示例代码展示了如何使用Python的Docker SDK和Kubernetes客户端进行部署、扩展和日志管理。通过Python,开发者可以实现自定义监控、自动水平扩展和实时日志监控等高级功能,增强了容器编排的灵活性和自动化。
53 1
Docker Compose与Kubernetes的比较
|
2月前
|
Kubernetes 开发者 Docker
构建高效微服务架构:Docker与Kubernetes的协同应用
【5月更文挑战第30天】 在当今软件开发领域,微服务架构已成为实现系统模块化、提升可维护性及扩展性的关键策略。本文深入探讨了如何通过Docker容器化技术和Kubernetes集群管理,共同构建一个既高效又可靠的后端微服务环境。我们将剖析Docker和Kubernetes的核心功能,以及它们如何相辅相成,支撑起现代化的云原生应用程序部署和管理。文章还将提供具体实践案例,帮助开发者理解将理论应用于实际开发过程中的步骤和考虑因素。
|
7天前
|
运维 Kubernetes 负载均衡
docker、docker compose、k8s有什么区别?
Docker 这个东西所扮演的角色,容易理解,它是一个容器引擎,也就是说实际上我们的容器最终是由Docker创建,运行在Docker中,其他相关的容器技术都是以Docker为基础,它是我们使用其他容器技术的核心。
39 1
|
13天前
|
存储 监控 安全
Docker Compose:轻松实现容器编排的利器
【7月更文挑战第2天】 1. **基础与概念**:服务(多容器实例)、网络(灵活通信)、卷(数据持久化)和配置(安全管理)。 2. **实战指南**:安装Compose,编写`docker-compose.yml`文件,启动应用,并介绍依赖、环境变量、健康检查和数据持久化。 3. **最佳实践**:环境隔离、CI/CD集成、资源管理、日志监控、安全策略及案例分析,展示完整应用栈搭建。
36 1
|
18天前
|
jenkins 持续交付 开发者
利用Docker容器化部署应用的实战指南
【6月更文挑战第27天】本文详述Docker应用部署,涵盖Docker基本概念、安装、镜像制作及运行。通过编写Dockerfile构建镜像,使用`docker build`、`run`、`push`及`stop`命令管理。集成CI/CD工具如Jenkins,实现自动化构建、测试和部署,提升开发效率与部署质量。Docker助力轻量级、可移植的微服务架构。
|
1月前
|
Ubuntu 应用服务中间件 Linux
Docker基本操作命令
Docker 允许用户基于现有的容器或通过 Dockerfile 自定义镜像。Dockerfile 是一个文本文件,包含了创建镜像所需的所有命令。 命令: docker build [OPTIONS] PATH PATH:Dockerfile 所在的路径 OPTIONS:构建过程中的可选参数,如 -t 用于标记镜像名和标签 例如,使用当前目录的 Dockerfile 来构建镜像,并标记为 my_image:latest: docker build -t my_image:latest . 以上是 Docker 基础命令的简介,通过这些命令,你可以开始探索 Docker 的强大功能,并将其
40 2
|
1月前
|
运维 Kubernetes 持续交付
Docker与Kubernetes:容器化技术的黄金搭档
【6月更文挑战第10天】Docker和Kubernetes是容器化技术的黄金组合,Docker提供轻量级、可移植的容器引擎,简化应用部署,而Kubernetes作为容器编排系统,实现自动化部署、扩展和管理,确保高可用性和可扩展性。两者的协作使得容器化应用更高效、可靠,共同推动软件开发和运维的创新。
|
1月前
|
Shell Docker 容器
深入探索Docker容器管理:常用命令一览(1)
深入探索Docker容器管理:常用命令一览(1)
|
1月前
|
NoSQL 应用服务中间件 nginx
Docker 的基本操作
在这个快速发展的技术时代 , 我们经常面临着应用部署的复杂性、环境差异以及不同操作系统之间的兼容性问题 . 这些问题不仅消耗大量时间 , 还可能导致项目延期和成本增加 . Docker 的出现解决了我们在应用部署过程中遇到的障碍和挑战 . 通过将应用程序及其依赖环境封装在一个轻量级的、可移植的容器中 , Docker 不仅简化了开发和部署流程 , 还确保了不同环境间的无缝衔接和一致性 .
257 0
|
1月前
|
Kubernetes 应用服务中间件 API
docker-desktop启动k8s
docker-desktop启动k8s
30 0