Skip to content

Kubernetes

为什么会有Kubernetes这类技术的广泛应用?

我认为就一个原因:复制

软件,或者说程序是一种逻辑产品,而成品的软件如果复制起来,就相当于将单条电路转为集成电路,能发挥出规模效应

类比于单个肌肉细胞通过复制,规模化之后转为我们熟知的肌肉一样

但至于这个肌肉是舌头还是心脏,就较大程度上取决于先前的开发工作了

一般流程

  1. 创建配置并保存
  2. apply配置
  3. 查看服务状态

核心组件

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节点,也就是至少应有两台服务器或者虚拟机

环境搭建

  1. 环境搭建

    • minikube || k3s k3d kind

      • 轻量级k8s发行版,用于本地运行k8s

      • 本地运行单节点的集群

      • 适用于本地开发与测试

        *DockerDesktop自带minikube

        *minicube依赖kubectl

        *系统必须支持虚拟化

  2. 交互工具

    • kubect
      • 与集群进行交互(命令行),除此之外还可以使用webUI、API接口方式进行交互
  3. 网络代理

    --image-mirror-country=cn
  4. 常用命令 (命令行)

    查看 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>
  5. 调试相关命令

    通过curl测试
    	curl <x-ip>
    
    查看日志
    	cubectl logs <pod-name>
    
    进入pod的容器中,在容器中执行命令,切换到pod的容器
    	进入: kubectl exec -it <pod-name> -- /bin/bash
    	退出: exit
  6. 配置文件相关命令(配置文件)

    基于配置文件创建资源对象
    	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
  7. 命名空间

    指定-n xxx 相当于指定namespace
    
    不指定命名空间,默认都是在defaultnamsespace中执行

replicaset是什么

replica本身就是副本的意思, replicaset指的是副本集合
在kubernetes中, replicaset会在创建deployment的时候自动创建, 用于在deployment中对pod进行管理
在deployment配置项中,设置replicas的数量即可控制副本的数量

为什么会报错端口不正确

NodePort类型下,nodePort配置的范围必须在30000-32767之间

拓展

portainer