kubernetes介绍

    很早以前就想着把所学知识进行总结和归纳并把部分心得进行分享。
    一直都以最近忙等段时间等诸多借口来搪塞自己,为自己的不安找寻借口。
    最近在学习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进行安装。

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: {}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值