概述
这是一个Kubernetes系列文章,主要将我所学过,所使用过的经验、使用方法等记录在此。将会持续更新。
系列文章更新到这里,终于是要面对kubernetes这座大山了,不过别着急,我们一点一点来学习。
介绍
什么是kubernetes。kubernetes因k和s中间有8个字母得名k8s。kubernetes是Google团队发起的一个开源项目,目标是管理多个主机容器,实现自动化运维的目的,包括自动部署,扩展,升级,回退应用等。主要编写语言为Go语言。
由于二进制安装实在复杂和众所周知的原因无法下载,所以二进制安装可以在后续的文章中作为兴趣部署介绍。这里放上我写的shell安装k8s的脚本GitHub地址:k8s二进制安装脚本。根据readme来放置所需文件和目录。对应版本为1.17版本的安装脚本。同时也附上百度云的二进制文件:
k8s二进制文件-度盘-密码:awwd。
除了二进制安装之外,官方也提供了几种简单的部署方式:
1、Minikube
2、kubeadm
3、Rancher(生产环境)
4、二进制安装(生产环境)
最后两种都已是成熟的产品,可以用于生产环境。
k8s整体架构

上图中的每个进程或名词,我们一个一个来解释:
k8s的服务进程
Master:代表一台或多台服务器,一般为奇数,上面运行的k8s进程有:
- etcd:一个key-value的数据库,类似redis。它记录整个集群的实时数据,如果集群崩溃或集群被删除,那么可以通过etcd中保存的集群数据来恢复。一般安装在Master节点上,保障高可用也为奇数个数。
- Controller Manager:Master节点上运行的k8s服务进程。负责监控工作节点上的Pod(容器、Agent,一个概念)的生命周期和运行状态。
- API Server:是和管理员做交互的进程。是所有交互命令的入口,也是集群中的网关,集群认证都需要经过它。
- Scheduler:调度器,负责接收API Server发来的指令,根据用户设置的调度策略,将Pod调度到工作节点上.
Node:代表一台或多台服务器,运行服务的机器,上面运行的k8s进程有:
- kubelet:负责监控容器的状态和负责管理Pod。
- Container Runtime:负责下载和运行容器。
- Networking:运行了kube proxy进程,负责集群的负载均衡和内部的服务发现,是通过IPVS规则转发至service的一个虚拟IP,然后重定向到具体的Pod中。
另外,还有很多可选插件可以安装,主要分为网络、可视化、服务发现三类:
- 网络类:
主要有cni、Flannel、Cilium这几种。一般情况下,小型系统用Flannel,中大型用cni。 - 服务发现类:
有两种:CoreDNS和Ingress。一般来说,CoreDNS用于整个集群的DNS服务,Ingress用于外网代理,一般两个都部署。 - 可视化:
主要是官方出品的Dashboard。不过由于界面和功能相对较少,一般选择使用rancher等第三方界面。
上面具体介绍了在k8s集群中的机器上所运行的每个进程的说明和主要工作。那么,接下来,需要说明的是运行在k8s集群中的东西了。
k8s里的服务

上图中介绍了k8s中具体运行的服务,我们一个一个解释:
- Pods:k8s集群的最小调度单位,可以简单理解为一个容器,但是这个叫做Pod的容器里面,可以运行一个或多个服务,比如一个Pod里运行一个nginx一个tomcat都可以,但是一般不这么做。
- Lables:顾名思义,就是标签的意思,以key=value的形式附加在每个对象上,用于区分一组或一类的服务。比如,测试环境的服务,就可以打一个lables为:app=test。
- Deployment:Pod的逻辑组,Deployment是k8s的一个资源对象,通过yaml文件来定义,它可以提供滚动更新、回滚、升级、多副本等功能。
这里的逻辑组并不是说将多个Pod加入到一个Deployment中。而是Deployment可以控制创建多少个同样的Pod在其他工作节点上,以实现多副本高可用。而且,Deployment支持滚动升级和回滚。
Deployment需要两个东西:一个是Pod模版,一个是Lables标签。 - Service:使应用暴露出来,每个Pod都有独立的IP和生命周期,如何感知各个Pod的变化,就需要Service里。Service有自己独立的虚拟IP。
我们创建了Pod之后,这个Pod是只能在集群内访问的,如何放集群外部访问,那么也需要Service了。
Service也是k8s的一种资源对象,可以通过yaml文件区定义Pod的逻辑组,可以让Pod暴露在网络中。简单示例如下图:

三个Pod通过lable关联到一个Service中。Service有四种模式,在下面有讲解。 - Volume:和Docker中的Volume一样,也是数据卷的意思,挂载Pod中的数据。
- StatefulSet:适合合持久性的应用程序。负责有状态应用的控制。
- Namespace:命名空间,是逻辑上划分的独立空间,可以把一类应用划分到一个Namespace中去。上面的pods, services,deployments这些都可以选择一个Namespace,默认为default空间。
Service有四种暴露模式:
- ClusterIP:默认模式,又分为两种:
1)普通Service:k8s为Service分配一个集群内部的可访问虚拟ClusterIP,以实现集群内部访问,是最常见的方式。
2)Headless Service:不会分配ClusterIP,也不通过kube-proxy做负载均衡,而是通过DNS来访问。DNS会将headless service的后端直接解析为IP列表,主要提供StatefulSet使用。 - nodePort:将service的port映射到节点上的某个端口,可实现集群外访问。
- LoadBalancer:和nodePort类似,这种模式还会向所使用的公有云申请一个负载均衡器,实现集群外通过LB访问服务。
- ExternalName:Service的特例,主要面向运行在集群外部的服务,可以把集群外部的服务映射进k8s集群,来为集群内部提供服务。
概念先讲述到这里,最后,附上yaml到示例文件方便对照以上内容:
apiVersion: v1 --定义版本,有k8s给出
kind: Namespace --资源对象,可以是Namespace、deployments、services等
metadata:
name: nginx-demo --Pod名称
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-nginx
namespace: nginx-demo --命名空间
labels: --标签
app: nginx-rel
spec:
replicas: 2 --多副本,指定有多少个
template:
metadata:
creationTimestamp: null
labels:
app: nginx
spec:
containers:
- image: nginx --使用的镜像,可以是官方的,也可以是自建的镜像仓库里的
imagePullPolicy: Always --镜像拉取策略,有三种[Always | Never | IfNotPresent] Always:总是下载。Never:使用本地镜像。IfNotPresent:优先本地,如果没有则下载。
name: nginx --容器名称
ports:
- containerPort: 80 --监听的端口号
protocol: TCP --端口协议
volumeMounts: --数据卷
- name: container-vol --数据卷的名称
mountPath: /var/log/nginx --容器内目录挂载
volumes:
- name: container-vol --对应上面的name属性:container-vol
hostPath: --表明挂载的主机上的目录
path: /data/nginx/log --具体的目录
---
apiVersion: v1
kind: Service
metadata:
name: my-nginx
namespace: nginx-demo
spec:
selector:
app: nginx-rel
type: NodePort
ports:
- port: 80
targetPort: 80 --容器内的要映射的端口
nodePort: 30080 --在主机上映射的端口号,会在主机上开一个30080的端口,访问30080端口就相当于访问到这个Pod的80端口。
最后修改时间:2020-08-18 10:52:23
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




