很早以前就想着把所学知识进行总结和归纳并把部分心得进行分享。
一直都以最近忙等段时间等诸多借口来搪塞自己,为自己的不安找寻借口。
最近在学习kubernetes(k8s)的相关知识,正好借此机会将学习内容进行整理。
本文将以以下几点进行概述,文中的概念摘录自kubernetes
内容的延申部分为个人总结及理解如有偏颇请指正。
- Docker介绍
- Kubernetes介绍
- Kubernetes的内部组件介绍
- Kubernetes基本概念
- Kubernetes的外部组件(组件较多,后续将对每个组件进行单独介绍)
Docker介绍
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,
然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口。
Docker架构:
Docker采用 C/S架构 Docker daemon 作为服务端接受来自客户的请求,并处理这些请求(创建、运行、分发容器)。 客户端和服务端既可以运行在一个机器上,也可通过 socket 或者RESTful API 来进行通信。
Docker的作用:
容器是一个抽象出来的系统,在使用中我们可以把程序与容器紧密的结合在一起,为部署带来方便,也解决了程序版本对依赖环境的烦恼,同一程序的不同版本可以封装成不同的镜像。相比于传统的虚拟机,容器更加轻便与小巧。
Kubernetes介绍
Kubernetes是谷歌开源的容器集群管理系统,是Google多年大规模容器管理技术Borg的 开源版本。
在 Docker 技术的基础上,为容器化的应用提供部署运行、资源调度、服务发现和动态伸缩等一系列完整功能,
提高了大规模容器集群管理的便捷性。
Kubernetes 特点有:
-基于容器的应用部署、维护和滚动升级
-负载均衡和服务发现
-跨机器和跨地区的集群调度
-自动伸缩,自动扩展
-自动替换,自动重启
-无状态服务和有状态服务
-广泛的Volume支持
-插件机制保证扩展性
Kubernetes的内部组件介绍
-
etcd保存了整个集群的状态;
-
apiserver提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和 发现等机制;
-
controller manager负责维护集群的状态,比如故障检测、自动扩展、滚动更新等;
-
scheduler负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上;
-
kubelet负责维护容器的生命周期,同时也负责Volume(CVI)和网络(CNI)的管 理;
-
Container runtime负责镜像管理以及Pod和容器的真正运行(CRI);
-
kube-proxy负责为Service提供cluster内部的服务发现和负载均衡
Kubernetes基本概念
在Kubernetes中,所有对象都使用manifest(yaml或json)来定义,比如一个简单的 nginx服务可以定义为nginx.yaml,它包含一个镜像为nginx的容器:
apiVersion: v1 #必选,版本号,例如v1
kind: Pod #必选,Pod
metadata: #必选,元数据
name: nginx #必选,Pod名称
namespace: default #Pod所属的命名空间,不写默认为default
labels: #自定义标签
app: nginx #自定义标签名字
spec: #必选,Pod中容器的详细定义
containers:
- name: nginx #必选,容器名称
image: nginx #必选,容器的镜像名称
imagePullPolicy: [Always | Never | IfNotPresent] #获取镜像的策略 Alawys表示下载镜像 IfnotPresent表示优先使用本地镜像,否则下载镜像,Nerver表示仅使用本地镜像
ports: #需要暴露的端口库号列表
- containerPort: 80 #容器需要监听的端口号
-
Node
Node是集群的工作节点,是Pod真正运行的主机,可以物理机,也可以是虚拟机。
-
Pod
Pod是一组紧密关联的容器集合,它们共享IPC、Network和UTC namespace,是 Kubernetes调度的基本单位。Pod的设计理念是支持多个容器在一个Pod中共享网络和 文件系统,可以通过进程间通信和文件共享这种简单高效的方式组合完成服务。
-
Namespace
Namespace是对一组资源和对象的抽象集合,比如可以用来将系统内部的对象划分为不 同的项目组或用户组。常见的pods, services, replication controllers和deployments等都 是属于某一个namespace的(默认是default),而node, persistentVolumes等则不属于 任何namespace。
namespace 不同的namespace可以理解为软件隔离层。 -
Service
Service是应用服务的抽象,通过labels为应用提供负载均衡和服务发现。匹配labels的 Pod IP和端口列表组成endpoints,由kube-proxy负责将服务IP负载均衡到这些 endpoints上。
pod提供的服务,可以通过pod所在集群中的ip:port进行访问,但是pods在集群中存在漂移和随机分配等问题,也就造成了服务的接口无法确定。接口不固定是我们不希望看到的,所以kubernetes实现了service,用户不需要关心后端pod接口的变化,只要访问service就可以直达后台pod。
-
Label
Label是识别Kubernetes对象的标签,以key/value的方式附加到对象上(key最长不能超 过63字节,value可以为空,也可以是不超过253字节的字符串)。
Label不提供唯一性,并且实际上经常是很多对象(如Pods)都使用相同的label来标志 具体的应用。
Label定义好后其他对象可以使用Label Selector来选择一组相同label的对象(比如 ReplicaSet和Service用label来选择一组Pod)。Label Selector支持以下几种方式:
1.等式,如 app=nginx 和 env!=production
2. 集合,如 env in (production, qa)
3.多个label(它们之间是AND关系),如 app=nginx,env=test -
Annotations
Annotations是key/value形式附加于对象的注解。不同于Labels用于标志和选择对象, Annotations则是用来记录一些附加信息,用来辅助应用部署、安全策略以及调度策略 等。比如deployment使用annotations来记录rolling update的状态。
Kubernetes的外部组件
- node_export 负责采集节点数据
- kube-state-metrics 监控集群内部资源
- ceph_export 负责监控存储系统
- prometheus
Prometheus是一个开源的服务监控系统,它通过HTTP协议从远程的机器收集数据并存储在本地的时序数据库上。
k8s中prometheus将收集以上export及kube-state-metrics 的数据,并进行简单展示。 - grafana
Grafana 是一个开箱即用的可视化工具,具有功能齐全的度量仪表盘和图形编辑器,有灵活丰富的图形化选项,可以混合多种风格,支持多个数据源特点。
promehteus虽然提供了数据展示功能,但是展示数据并不齐全,grafana的展示功能更加丰富。 - alertmanager
Alertmanager 主要用于接收 Prometheus 发送的告警信息,它支持丰富的告警通知渠道,而且很容易做到告警信息进行去重,降噪,分组,策略路由,是一款前卫的告警通知系统
以上所有组件为prometheus的周边组件为k8s提供了数据展示监控报警等功能,鉴于组件之多在k8s中集成时可以使用github上的开源项目prometheus-operator 可以直接部署prometheus 相关组件,也可以使用helm进行安装。
- dashboard
专门用来管理K8S集群,并可展示集群的状态
安装:
https://github.com/kubernetes/kubernetes
k8s源码中有部署dashboard的yaml文件
https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/dashboard
该目录即为dashboard的yaml文件,翻墙下载dashboard镜像,然后在集群中创建该目录下的相关文件即可。
service文件中默认为clusterIP无法被集群外部访问,将service改成nodeport YAML文件如下:
apiVersion: v1
kind: Service
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
creationTimestamp: 2019-02-14T09:26:22Z
labels:
addonmanager.kubernetes.io/mode: Reconcile
k8s-app: kubernetes-dashboard
kubernetes.io/cluster-service: "true"
name: kubernetes-dashboard1
namespace: kube-system
resourceVersion: "16194410"
selfLink: /api/v1/namespaces/kube-system/services/kubernetes-dashboard1
uid: 97d47603-303a-11e9-9135-525400312f14
spec:
clusterIP: 10.233.56.134
externalTrafficPolicy: Cluster
ports:
- nodePort: 30082 #开放的节点端口
port: 443 #CLUSTER-IP 端口
protocol: TCP
targetPort: 8443 #容器监控端口
selector:
k8s-app: kubernetes-dashboard
sessionAffinity: None
type: NodePort
status:
loadBalancer: {}