这里写目录标题
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
[博文3](