Kubernetes
为什么会有Kubernetes这类技术的广泛应用?
我认为就一个原因:复制
软件,或者说程序是一种逻辑产品,而成品的软件如果复制起来,就相当于将单条电路转为集成电路,能发挥出规模效应
类比于单个肌肉细胞通过复制,规模化之后转为我们熟知的肌肉一样
但至于这个肌肉是舌头还是心脏,就较大程度上取决于先前的开发工作了
一般流程
- 创建配置并保存
- apply配置
- 查看服务状态
核心组件
Node:服务器 && 虚拟机
一个Node可以有多个pod
pod:最小调度单元,是一个或者多个APP容器的组合,一个pod一般只运行一个容器 / 高度耦合的多个容器
网络 && 存储 && 运行时配置
创建时会有内部的IP,pod之间通过内部ip进行通讯,其IP只能在集群内部访问
pod不稳定,在故障时,pod将被自动消除并创建新pod
svc(service):将一组pod封装为一个服务
服务包括内部服务和外部服务,其中外部服务拥有node:port类型,会在节点上开放一个端口,并将其映射到Service的IP的地址和端口上
通过svc的外部服务node:port来进行开发没有问题,但是当介入生产环境的域名时就不合适,需要切换到Igress
service的ip地址固定,外部APP通过ip访问svc,svc连接着多个pod,当某个pod故障后,即便pod的ip变化,服务本身也不受影响,svc会自动将请求转发到其它的ip上
--- 请求转发
Ingress:从集群外部访问集群内部的类似于guard的角色
通过Ingress配置转发规则->访问不同的Service && pod
通过Ingress配置域名,这样就可以将IP + Port的方式转换为域名方式
还可以配置负载均衡,SSL证书等
--- 避免了配置变更带来的重新编译和部署问题
ConfigMap:APP配置信息,将配置信息和应用程序本身分离,解耦
* 配置信息均为明文
比如,当后端数据库的端口等发生变化时,我们也只需要在ConfigMap中重写配置信息即可
Secret:将信息通过base64编码(非明文,但非加密
--- 数据持久化存储
Volumes:资源持久化——将资源挂载到磁盘上
--- 应用程序部署
无状态APP部署
Deployment:对pod进行抽象,多副本管理,达成一般APP的高可用
副本控制:始终保持指定数量的副本存在
滚动更新:控制APP的版本,达成版本的渐进式迭代,平滑升级
有状态APP部署
StatefulSet:针对数据库、缓存、消息队列等拥有状态的APP进行副本管理
另一种方法是将数据库单独部署,脱离集群
---
什么是sidecar
边车模式,在一个pod中放入多个容器,包括主容器和辅助容器,其中辅助容器就是边车
架构
k8s基于Master-Worker架构
Master用于管理,Worker用于干活
Master组件
kube-apiserver 集群的API接口,所有组件都通过这个接口通信, 是系统入口, 请求先经过apiserver再进行转发; 对资源控制授权和访问控制 scheduler 监控资源使用情况,将pod调度到合适的Node上运行 controller manager 监控资源对象(pod node service等)状态 etcd kv存储系统, 用于存储集群中资源对象的状态信息, 是集群资源对象的数据仓 (云)cloud controller manager 与云平台API交互
Worker组件——Node组件
1. kubelet 管理和维护pod / 监控worker node, 汇报给apiServer 2. kube-proxy 网络代理 / 负载均衡 3. container-runtime - Docker Engine - Containerd - CRI-O - Mirantis Container Runtime
什么是集群
基于MW的架构下,生产环境下的集群需要多个服务器或虚拟机才能保证高可用
应有相对应的至少一个Master节点和一个Worker节点,也就是至少应有两台服务器或者虚拟机
环境搭建
环境搭建
minikube || k3s k3d kind
轻量级k8s发行版,用于本地运行k8s
本地运行单节点的集群
适用于本地开发与测试
*DockerDesktop自带minikube
*minicube依赖kubectl
*系统必须支持虚拟化
交互工具
- kubect
- 与集群进行交互(命令行),除此之外还可以使用webUI、API接口方式进行交互
- kubect
网络代理
--image-mirror-country=cn
常用命令 (命令行)
查看 pod / service / deployment 信息 kubectl get nodes / pod / svc / deployment / replicaset 查看全部信息 kubectl get all 获取详细信息 cubectl describe pod / service / deployment <x-name> -------------------------------------------------------------- 创建并运行pod (pod一般不单独创建) kubectl run nginx --image=nginx pod的命名规则: deploymentName-replicaSetId-podId 暴露pod(集群内访问) kubectl get pod -o wide 创建service kubectl create service nginx-service 创建deployment kubectl create deployment nginx-dep --replicas=3 --image=nginx 创建并运行deployment(deployment下的组件一般都是kubernetes自动创建和管理) kubectl run deployment nginx-deployment --image=nginx 暴露deployment kubectl expose deployment <deployment-name> 编辑deployment配置文件 kubectl edit deployment <deployment-name> -------------------------------------------------------------- 删除各种资源对象, 以deploiyment为例 kubectl delete deployment <deployment-name>
调试相关命令
通过curl测试 curl <x-ip> 查看日志 cubectl logs <pod-name> 进入pod的容器中,在容器中执行命令,切换到pod的容器 进入: kubectl exec -it <pod-name> -- /bin/bash 退出: exit
配置文件相关命令(配置文件)
基于配置文件创建资源对象 kubectl create -f nginx-dev.yaml 基于配置文件创建或更新资源对象 kubectl apply -f nginx-dev.yaml 查看集群资源状况 kubectl get all 配置文件结构 apiVersion kind metadata spec selector matchlabels app replicas template metadata labels app spec containers name image ports containerport
命名空间
指定-n xxx 相当于指定namespace 不指定命名空间,默认都是在defaultnamsespace中执行
replicaset是什么
replica本身就是副本的意思, replicaset指的是副本集合
在kubernetes中, replicaset会在创建deployment的时候自动创建, 用于在deployment中对pod进行管理
在deployment配置项中,设置replicas的数量即可控制副本的数量
为什么会报错端口不正确
NodePort类型下,nodePort配置的范围必须在30000-32767之间
拓展
portainer