Kubernetes(1)

1.概念

1.1 什么是 Kubernetes

我们只到Docker应用容器引擎,使得服务的创建、销毁、移植等变得十分快捷、方便。Kubernate可以理解为管理、编排容器的工具,管理多个应用(集群规模)的创建、部署、服务、扩容缩容、更新等等。就是类似于Docker-compose的功能。

除集群规模管理外,k8s可以更快的更新新版本,打包应用,更新的时候可以做到不用中断服务,服务器故障不用停机,从开发环境到测试环境到生产环境的迁移极其方便,一个配置文件搞定,一次生成image,到处运行

1.2 Kubernetes 在哪些地方使用

我们在企业生产过程中能够的使用步骤一般是:

  • 创建集群:master管理、监控,node打工人

  • 部署应用:通过k8s的方式(默认容器是docker),即在yaml文件中指定容器镜像等配置

  • 发布应用:部署完应用后必须发布才能被外部访问,因为此时的ip地址只有同一个集群才能访问

  • 扩展应用:比如遇上双11等活动对机器进行扩容,过后再进行缩容。

  • 更新应用:有新版本了,滚动更新,根据新的image创建一个pod,分配各种资源,然后自动负载均衡,删除老的pod,然后继续更新,不会中断服务; 更新错了怎么办,不会影响生产业务,回滚就好了

1.3 master

Kubernetes 可以管理大规模的集群,使集群中的每一个节点彼此连接,能够像控制一台单一的计算机一样控制整个集群。

master 是集群的"大脑",负责管理整个集群:像应用的调度、更新、扩缩容等。

master上包含组件:

  • kube-apiserver : 集群入口,所有操作都经过此
  • kube-controller-manager :所有资源的控制中心
  • kube-scheduler :具体负责资源调度的进程
1.4 node

就是具体"干活"的,一个Node一般是一个虚拟机或物理机,它上面事先运行着 docker 服务和 kubelet 服务( Kubernetes 的一个组件),当接收到 master 下发的"任务"后,Node 就要去完成任务(用docker 运行一个指定的应用)

node上包含的组件:

  • kubelet :node上的Agent,负责pod对应容器的创建、启停等,听master指挥干活并随时汇报。
  • kube-proxy : 在Node节点上实现Pod网络代理,实现Kubernetes Service的通信和负载均衡机制的重要组件。
  • docker : Docker引擎,负责本机的容器的创建和管理工作
1.5 Etcd

Etcd是Kubernetes提供默认的键值存储系统,保存所有集群数据,使用时需要为Etcd数据提供备份计划

在这里插入图片描述

1.6 对象
1.6.1 Pod

集群调度的最小单元,Pod 是一组容器(当然也可以只有一个)。容器本身就是一个小盒子了,Pod 相当于在容器上又包了一层小盒子。所以Pod里的容器有如下特点:

  • 可以直接通过 volume 共享存储。
  • 有相同的网络空间,通俗点说就是有一样的ip地址,有一样的网卡和网络设置。
  • 多个容器之间可以“了解”对方,比如知道其他人的镜像,知道别人定义的端口等。
1.6.2 Service

即服务发现,不管Deployment的Pod有多少个,不管它是更新、销毁还是重建,Service总是能发现并维护好它的ip列表。

Service通过标签Label,知道其负责了哪几个Pod。这样就更加灵活,使其和Deployment解耦开来

1.6.3 Volume

Volume(存储卷)Volume是Pod中能够被多个容器共享的磁盘目录。

Kubernetes提供了非常丰富的Volume类型:

  • emptyDir:临时空间,Pod分配到Node时创建,无须指定宿主主机上对应的目录,在Kubernetes会自动分配当前Node的一个目录,当Pod被移除时,emptyDir中的数据也会永久删除。
  • hostPath:为Pod挂载宿主主机上的文件或目录。用于数据永久保存。在不同的Node上具有相同配置的Pod,可能会因为宿主机上的目录和文件不同而导致Volume上的目录和文件的访问结果不一致。
  • gcePersistentDisk:使用谷歌公有云提供的永久磁盘。数据永久保存。
  • NFS:NFS 是 Network File System 的缩写,即网络文件系统。Kubernetes 中通过简单地配置就可以挂载 NFS 到 Pod 中,而 NFS 中的数据是可以永久保存的,同时 NFS 支持同时写操作。
1.6.4 Namespace

命名空间,Namespace在很多情况下用于实现多租户的资源隔离。Namespace通过集群内部的资源对象"分配"到不同的Namespace中,形成逻辑上分组的不同项目,便于不同的分组共享使用整个集群的资源的同时还能被分别管理。

1.6.5 Deployment

通过Kubernetes的 Deployment 的配置文件去描述应用,比如应用叫什么名字、使用的镜像名字、要运行几个实例、需要多少的内存资源、cpu 资源等等。即应用管理者,是用于部署应用的对象。不会单独创建一个pod资源对象,而是创建Deployment对象,通过Deployment来管理pod。

1.6.6 ReplicaSet

ReplicaSet 实现了 Pod 的多副本管理。使用 Deployment 时会自动创建 ReplicaSet,也就是说 Deployment 是通过 ReplicaSet 来管理 Pod 的多个副本,所以我们通常不需要直接使用 ReplicaSet。

2.项目部署

在这里插入图片描述

  • 服务器上有Docker和相关镜像的前提下

  • 创建Deployment的YAML描述文件,根据yaml文件创建服务和集群

kubectl create deployment countgame --image=192.168.137.110:5000/countgame:0.91 --dry-run -o yaml  > deploy.yaml
# pod的最基础的yaml文件最少需要以下的几个参数
apiVersion: v1 # API版本号,注意:具有多个,不同的对象可能会使用不同API
kind: Pod  # 对象类型,pod
metadata:  # 元数据
name: string # POD名称
namespace: string # 所属的命名空间
spec: # specification of the resource content(资源内容的规范)
containers: # 容器列表
      - name: string # 容器名称
image: string # 容器镜像

在这里插入图片描述

  • 创建Deployment对象

    kubectl apply -f deploy.yaml 
    
  • 创建了Deployment对象再查看pod

    kubectl get pods
    

在这里插入图片描述

​ x修改 spec.replicas为3之后再查看,就有三个pod。

  • 查看pod启动日志

    kubectl logs +pod的name
    

此时集群内部已经可以访问项目了。··············

  • 使集群对外部提供服务,创建service关联,对外暴露ip提供服务

    运行pod ip是docker网桥的IP地址段进行分配的,通常是一个虚拟的二层网络,外部网络并没有办法访问,并且,pod ip是随时会变的,不是固定的,k8s引入了Service的概念,通过Service管理这些pod,Service创建后的Service IP是固定的。但是Service IP(Cluster IP)是一个虚拟的IP,由Kubernetes管理和分配P地址,外部网络无法访问。k8s有三种方式暴露Service给外部网络访问。

在这里插入图片描述

3.Serivce暴露ip方式

3.1 NodePort

在k8s上可以给Service设置成NodePort类型,这样的话可以让Kubernetes在其所有节点上开放一个端口给外部访问(所有节点上都使用相同的端口号), 并将传入的连接转发给作为Service服务对象的pod。这样我们的pod就可以被外部请求访问到

在这里插入图片描述

  • 创建serivice的yaml文件

    kubectl expose deployment countgame --port=8082 --target-port=8082 --type=NodePort -o yaml --dry-run > svc.yaml
    

    参数:

    1.countgame 为指定的service对象名称
    2.- -port 是指service暴露在cluster ip上的端口,通过:port 访问集群内部service的入口
    3.- -target-port指 对应pod容器里面监听的端口
    4.- -type=NodePort , :nodePort 是提供给集群外部客户访问service的入口
    5.–dry-run表示测试不在k8s运行(不会具体执行该命令)
    6.-o yaml 生成yaml格式
    7.最后面的 “> deploy.yaml” 表示将生成yaml内容输出到deploy.yaml文件

    配置文件内容基本如下:

在这里插入图片描述

  • 创建Service对象

    #创建service
    kubectl apply -f svc.yaml
    #查看service
    kubectl get svc
    #查看service关联的pod
    kubectl describe svc coutgame
    

在这里插入图片描述

在这里插入图片描述

  • 可以看到service名称为countgame的service的对外端口为11413,会把通过这个端口访问的请求转发到service对象关联的pod对象的8082端口上 。访问192.168.137.110:11413/countgame/user/toGame可以访问项目

  • 缺点: 服务一旦多起来,NodePort 在每个节点上开启的端口会及其庞大,而且难以维护,所以生产环境不建议这么使用

3.2 LoadBalane

LoadBalane是上面通过NodePort暴露外部访问的一个优化,增加了一个负载均衡器,上面的NodePort是所有节点都开放一个端口,直接给外部访问,并没有Node节点的负载均衡。LoadBalane则是在上面的基础上增加了一层,只提供一个公网ip给外部访问,外部访问这个ip再负载均衡分发给Node节点的Pod

在这里插入图片描述

部署起来和上述NodePort界面差不多。kind参数变为LoadBalane

  • 缺点: 每一个用 LoadBalancer 暴露的服务都会有它自己的 IP 地址和端口,不能做到一个ip地址就可以访问所有服务。
3.3 Ingress

采用 NodePort 方式暴露服务面临问题是,服务一旦多起来,NodePort 在每个节点上开启的端口会及其庞大,而且难以维护;如果采用LoadBalane,每个服务都得开放一个公网IP,也会很庞大。这时候Ingress暴露服务就是一种很合适的方案。可以通过一个Ingress暴露多个服务。

在这里插入图片描述

参考:博文1

博文2

[博文3](

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值