Kubernetes 知识在于积累

  Kubernetes可以将应用随时随地整体迁移到云上,在服务高峰期将部分服务对应的Pod副本放入云中提升系统吞吐率,节省硬件投入,具备了很强的横向扩容能力。


浅谈docker到k8s转型

  我的技术网站最初是基于某开源java项目二开的(重点改前端和内容模块及数据库字段等),在采用docker架构部署的时候分为jdk环境的web容器和部署mysql容器,在同一个阿里云服务器中运行这两个容器,则需要把mysql容器的IP地址通过环境变量的方式注入到web容器,也需要将web容器的80和443端口映射给宿主机,以便于可以在外部访问。

  那么在Kubnetes中给mysql服务创建一个rc定义文件指定运行一个mysql pod实例,通过设定replicas值,当集群中运行的pod小于设定值则rc会通过定义好的pod模板生成新的pod,在master节点执行创建发布到集群中,通过观察pod的状态从pending到running由于pod的调度和创建需要一定时间,如果一直处于pending则需要具体查看原因了(查看Pod事件列表或实例事件列表,我遇到的原因是Pod 中 nodeSelector 指定了节点 Label,调度器只考虑调度 Pod 到包含该 Label 的 Node 上,当不存在符合该条件的 Node 时,Pod 将无法被调度);如法炮制,完成web应用的启动过程,需要注意的是jdk容器内使用环境变量MYSQL_SERVICE_HOST的值链接MySQL服务,创建对应的Service,通过配置type=NodePort 和 nodePort=80 开启NodePort方式的外网访问模式,并结合配置域名解析及SSL证书后进行访问。


k8s资源对象

节点、服务、存储卷都是资源对象,资源对象名称必须唯一;

  资源对象包含命名空间(实现多租户的资源隔离,默认default和kube-system)、标签(Taint和Toleration)、部署等,通常采用yaml格式定义声明一个资源对象保存在etcd数据库。

Questions:k8s 是怎么向后端实现存储过程的?

  所有的资源对象都可以通过api(kube-apiserver)进行操作。

  Master 是集群的管理控制节点,包含 kube-apiserver、kube-controller-manager、kube-scheduler(负责pod资源调度)。

  node节点作为工作负载节点运行一些由master分配的容器,当node节点发生故障时(Not Ready ),由master进行自动转移,这个过程就类似于vmware vshpere上vmware虚拟机故障自动飘到可用节点。node节点包含kubelet(负责pod对应容器的创建启停)和kube-proxy(Kubnetes Service 通信负载均衡 type=LoadBalancer , 这里我将这个负载均衡理解成通过iptables来实现的,如果这个pod是有多个副本,那么iptbales会把对service的请求转发给后端的某个pod)。

  监控到node资源不足等情况可以给node打Taint污点,后期新的容器就不会被master调度到该node。

[root@svvl-q916 ~]# kubectl get nodes # 查看集群中node信息
[root@svvl-q916 ~]# kubectl describe node k8s-node01 查看某个node信息
[root@svvl-q916 ~]# kubectl get pods --namespace=development # 将对象加入某个命名空间

  Service 一般是无状态的,比如我们单位某java项目下nginx后端转发负载运行的几个应用程序副本提供服务,也有少量的redis这种有状态的单实例服务,Service 创建后在负载均衡器中就会关联一个唯一的ClusterIP虚拟地址结合DNS将虚拟地址和服务名称完成绑定功能,我的技术网站最初就是通过这个虚拟IP和端口的方式对外进行服务的。

  Pod有普通和静态两个类型,静态pod存放在某个指定的node中运行(不推荐),普通pod通过存在etcd中通过调度到node上进行绑定,如果这个pod中存在某容器停止,会自动检测并重启,如果存在严重问题则会被调度到其他node节点运行。

  Deployment 负责创建具体的Pod实例。

[root@svvl-q916 ~]# kubectl create nginx-deployment.yaml # 创建 Deployment 对象
[root@svvl-q916 ~]# kubectl get deployments # 查看 Deployment 信息
[root@svvl-q916 ~]# kubectl get pods # 查看所创建的pod信息,便于排错
[root@svvl-q916 ~]# kubectl create nginx-service.yaml # 创建并定义一个service
[root@svvl-q916 ~]# kubectl get endpoints # 查看 nginx-service endpoint 列表,但并没有ClusterIP信息
[root@svvl-q916 ~]# kubectl get svc service -o yaml # 可以查看ClusterIP信息

后端存储

静态存储:
  Volume 是pod中被多个容器访问的共享目录,和 docker run 或者 Dockerfile 中 -v 跟容器路径类似,通常情况下一个容器 -v 一个路径,在k8s中被pod里的多个容器挂载路径使用,支持分布式文件系统。emptydir 适用临时空间临时目录,pod终止对应的数据也没有了,一般是使用node节点的存储或者共享存储等,适用常态化pod的运行,一般用于容器内应用的日志生成及生产数据等,这个是永久保存的,常态化的存储卷还有一般使用nfs、ceph将目录挂载到pod。

动态存储:
  PV(Persistent Volume),可以理解成网络存储对应的一块存储,和Volume类似,结合StorageClass(provisioner存储插件、parameters必要参数、reclaimProlicy回收策略)生成PVC(PV规格)使用。


未完待续...

Last Update : 2021-08-16 20:23:58 星期一

上一篇
下一篇