k8s学习笔记
该文章是我学习B站视频写的学习笔记
原视频在Kubernetes一小时轻松入门_哔哩哔哩_bilibili
目录
1. K8s简介
K8s即Kubernetes,是一个开源的容器编排平台,用于自动部署、扩展和管理容器化应用。
特点:
(1)具备容器编排的功能,通过配置文件定义应用程序的部署方式
(2)高可用:自动重建、删除功能
(3)可扩展性:自动根据需要扩展或缩减资源
K8s的主要功能
| 主要功能 | 详解 |
| 自我修复 | 在节点产生故障时,会保证预期的副本数量不会减少,会在产生故障的同时,停止健康 检查失败的容器并部署新的容器,保证上线服务不会中断 |
| 存储部署 | Kubernetes挂载外部存储系统,将这些存储作为集群资源的一部分来使用,增加存储使 用的灵活性 |
| 自动部署和回滚更新 | Kubernetes采用滚动更新策略更新应用,一次更新一个Pod,当更新过程中出现问题, Kubernetes会进行回滚更新,保证升级业务不受影响。 |
| 弹性伸缩 | Kubernetes可以使用命令或基于CPU使用情况,自动快速扩容和缩容应用程序,保证在 高峰期的高可用性和业务低档期回收资源,减少运行成本。 |
| 提供认证和授权 | 可以控制用户是否有权限使用API进行操作,精细化权限分配。 |
| 资源监控 | 工作节点中集成Advisor资源收集工具,可以快速实现对集群资源监控。 |
| 密匙和配置管理 | Kubernetes允许存储和管理敏感信息,例如密码,OAuth令牌和SSH密钥。您可以部署 和更新机密和应用程序配置,而无需重建容器映像,也不会在堆栈配置中暴露机密。 |
| 服务发现和负载均衡 | 为多个容器提供统一的访问入口(内部IP和一个DNS名称),并且将所有的容器进行负 载均衡,集群内应用可以通过DNS名称完成相互之间的访问。 |
2. K8s核心组件
(1)Node
集群中的一个节点,可以是物理机也可以是虚拟机
(2)Pod
Pod是Kubernetes 调度的最小可部署单位,一个 Pod 里通常包含一个或多个紧密相关的容器(同一个网络命名空间、共享卷等)。创建时自动分配IP地址(是一个集群内部IP,Pod之间可通过IP进行通信)。
Pod是在容器上加一层抽象,就可以将一个或多个容器组合在一起
一般来说一个Pod运行一个容器
注意:Pod不稳定,容易被销毁,销毁时需要重新创建,分配新IP。
(3)Service
将一组Pod组装成一个服务,Pod销毁时,Service的IP不变,所以不影响访问,Service会自动将请求转发到正常的Pod上,因此Service是对外暴露和稳定访问 Pod 的机制。
分为内部服务和外部服务;内部服务:不需要或不能暴露给外部的,只能集群内部访问,比如:MySQL服务、消息队列等;外部服务:需要暴露给外部的,比如:微服务的后端API接口,给用户提供的前端界面等。
外部服务类型:NodePort(对外指定端口,通过IP:端口形式访问服务);Ingress(入口):在集群外部与内部服务之间提供 HTTP/HTTPS 路由能力,通过完整域名访问。
(4)ConfigMap
ConfigMap是为了解决配置信息与应用程序耦合的问题,它可以将配置信息进行封装,可以在应用程序中读取和使用,以此将配置信息与应用程序的镜像分开,实现容器化应用程序的可移植性
ConfigMap避免配置变更带来的重新编译和部署问题
注意:ConfigMap中的配置信息是明文的,若要存储敏感信息如密码等可以采用Secret组件(使用的是Base64编码,而不是加密技术)
(5)Volume
可以将持久化存储的资源挂载到集群中的本地磁盘上,还可挂载到集群外部的远程存储上
(6)Deployment
可以定义和管理应用程序的副本数量以及更新策略,简化应用程序的部署和更新操作。可以理解为在Pod上加一层抽象,可以将一个或多个Pod组合在一起,这样就具有副本控制(定义和管理应用程序的副本数量,当有一个副本发生故障销毁时会自动创建新副本代替)、滚动更新(定义和管理应用程序的更新策略,逐渐将新版本替换掉旧版本,确保应用程序平滑升级)、自动扩缩容功能
(7)StatefulSet
可以定义和管理有状态的应用(如数据库)的副本数量,类似Deployment
注意:StatefulSet部署复杂,不是万能的
解决方法:有状态的应用可以选择在集群外单独部署
(8)Namespace
命名空间,Namespace 多用于实现多租户的资源隔离。Namespace 通过将集群内部的资源对象“分配”到不同的Namespace中,形成逻辑上分组的不同环境、项目、小组或用户组。
K8S 集群在启动后,会创建一个名为 default 的 Namespace,如果不特别指明 Namespace,创建的 Pod、RC、Service 都将被创建到 default 下。
当我们给每个租户创建一个 Namespace 来实现多租户的资源隔离时,还可以结合 K8S 的资源配额管理,限定不同租户能占用的资源,例如 CPU 使用量、内存使用量等。
3. Kubernetes架构
使用Master-Worker架构
通常一个k8s可能包括多个Node,Node间通过Service通信
Node组件
(1)kubelet kubelet 是 Master 在 Node 节点上的 Agent(代理),与 Master 密切协作,管理本机运行容器的生命周期(监控工作节点的运行情况,将结果汇报给apiserver),负责 Pod 对应的容器的创建、启停(管理和维护)等任务,实现集群管理的基本功能。从apiservice接收新的或修改过的Pod规范,确保容器按 Pod 规范(PodSpec)运行。
(2)kube-proxy 在 Node 节点上实现 Pod 网络代理(每个Node启动一个网络代理),实现 Kubernetes Service 的通信,维护网络规则和负载均衡工作。
(3)容器运行时:如docker engine,负责拉取镜像、创建容器、启动或停止容器等工作。应用程序使用容器运行时来运行
Master组件
Master 是 K8S 的集群控制节点,每个 K8S 集群里需要有一个 Master 节点来负责整个集群的管理和控制,基本上 K8S 所有的控制命令都是发给它,它来负责具体的执行过程。Master 节点通常会占据一个独立的服务器。
解决问题:如何调度不同Pod到不同的Node上;如何监控节点的状态;如何删除和创建一个节点

(1)kube-apiserver 是集群的统一入口(所有请求首先经过它,再转发给对应组件进行处理),各组件协调者,以 HTTP Rest 提供接口服务(所有组件通过接口进行通信),所有对象资源的增、删、改、查和监听操作都交给 apiserver 处理后(确保只有经过认证和授权的用户才能访问集群中的资源)再提交给 Etcd 存储。
(2)kube-controller-manager 是 K8S 里所有资源对象的自动化控制中心,一个资源对应一个控制器,而 controller-manager 就是负责管理这些控制器的。
(3) kube-scheduler 监视新创建且未分配工作节点的Pod(监控节点的资源使用情况),并根据不同的需求将其分配到工作节点中。同时负责集群的资源调度、组件抽离。
(4)etcd 是一个分布式的,一致的 key-value 存储,主要用途是共享配置和服务发现,存储集群中所有对象的状态信息,比如 Pod、Service 等对象信息。不存储应用程序的数据。
(5)Cloud Controller Manager 云控制管理器,负责与云平台交互,提供一致的管理接口,使得用户可以在不同云平台中运行和管理应用程序
4. 使用Minikube搭建K8S环境
Minikube只能搭建只有一个节点的集群,适合开发、测试环境;一般来说,生产环境的集群需要多个节点,Minikube不适合生产环境

Minikube搭建和运行一个简版的k8s集群环境,kubectl(命令行工具)与集群交互

5. Kubernetes在线环境
在线环境的k8s不稳定,需要稳定的k8s建议使用自己本地部署的
6. kubectl常用命令
可以在Kubernetes kubectl 命令表 _ Kubernetes(K8S)中文文档_Kubernetes中文社区
kubectl 是 Kubernetes 的命令行工具,用于管理 Kubernetes 集群。
(1)集群信息
- 查看集群信息
kubectl cluster-info
- 查看节点状态
kubectl get nodes
- 查看 Kubernetes 版本
kubectl version
(2)资源管理
查看资源
- 查看所有命名空间的 Pod
kubectl get pods -A
- 查看指定命名空间的资源(如
default)
kubectl get pods -n default
- 查看所有资源(Pods、Deployments、Services 等)
kubectl get all
- 查看详细信息(如 Pod)
kubectl describe pod <pod-name> -n <namespace>
创建/删除资源
- 通过 YAML 文件创建资源
kubectl apply -f deployment.yaml
- 删除资源
kubectl delete -f deployment.yaml
kubectl delete pod <pod-name> -n <namespace>
(3)Pod 操作
- 查看 Pod 日志
kubectl logs <pod-name> -n <namespace>
- 进入 Pod 的 Shell
kubectl exec -it <pod-name> -n <namespace> -- /bin/bash
- 查看 Pod 的详细信息
kubectl describe pod <pod-name> -n <namespace>
(4)Deployment 操作
- 查看 Deployment
kubectl get deployments -n <namespace>
- 扩缩容 Deployment
kubectl scale deployment <deployment-name> --replicas=3 -n <namespace>
- 更新 Deployment(如镜像版本)
kubectl set image deployment/<deployment-name> <container-name>=<new-image> -n <namespace>
- 回滚 Deployment
kubectl rollout undo deployment/<deployment-name> -n <namespace>
(5)Service 操作
- 查看 Service
kubectl get svc -n <namespace>
- 暴露 Deployment 为 Service
kubectl expose deployment <deployment-name> --port=80 --target-port=8080 --type=NodePort -n <namespace>
(6)调试与故障排查
- 查看事件(Events)
kubectl get events -n <namespace>
- 查看资源使用情况(需安装 metrics-server)
kubectl top nodes
kubectl top pods -n <namespace>
- 端口转发(访问 Pod 内部端口)
kubectl port-forward <pod-name> 8080:80 -n <namespace>
(7)配置管理
- 查看 ConfigMap
kubectl get configmaps -n <namespace>
- 查看 Secret
kubectl get secrets -n <namespace>
(8)其他常用命令
- 查看 API 资源列表
kubectl api-resources
- 查看当前上下文(Context)
kubectl config current-context
- 切换上下文(如切换到不同集群)
kubectl config use-context <context-name>
总结
这些命令覆盖了 kubectl 的常见使用场景,适用于日常 Kubernetes 集群管理。如果需要更详细的帮助,可以使用:
kubectl --help
kubectl <command> --help # 如 kubectl get --help
一般来说不会单独创建一个Pod,而是通过创建它的上层对象如Deploment来自动创建Pod
一个简单的创建例子

7. YAML配置文件的使用
如果所有配置项都在命令行操作比较麻烦,因此一般将配置项放在配置文件中,使用配置文件创建和管理资源对象
下面是一个配置文件的例子
replicas:3表示有三个副本
使用create命令应用配置文件的内容,k8s会创建资源对象

删除资源对象

可以选择使用apply命令应用配置文件的内容,将内容应用到集群中,k8s会创建或更新资源对象

8. 配置和公开服务
一个服务配置的例子

常用服务类型

9. 使用Portainer管理集群
Portainer提供一个可视化的界面管理集群资源对象
通过官网配置文件获取
-n 指定命名空间即命名空间为portainer
![]()
更多推荐




所有评论(0)