k8s进入pod中容器 mysql k8s pod 容器_nginx

容器化技术已经成为当前软件开发领域的又一次“运动”,并且让DevOps 有了更具体可落地可执行的工具,进而模糊了软件开发与运维的边界。通过自动化“软件交付”和“架构变更”的流程,来使得构建、测试、发布软件能够更加地快捷、频繁和可靠。

随着容器化进程不断推进,容器编排技术脱颖而出。在Kubernetes统治容器编排这一领域之前,其实也有很多容器编排方案,例如compose和Swarm,但是在运维大规模、复杂的集群时,这些方案基本已经捉襟见肘,无能为力了。

本文作为k8s技术的开篇,主要介绍k8s背景,架构和设计理念,让读者对k8s有个感性认识,后续会对k8s所涉及的技术进行详细介绍。

认知

Kubernetes(简称为k8s)是用于自动部署、扩展和管理容器化(containerized)应用程序的开源系统。(翻译自官网)

Kubernetes实际上是脱胎于google内部的集群编排管理系统Borg,很多设计都是从 Borg 中借鉴的,同时也对 Borg 的缺陷进行了改进,Kubernetes 目前是 Cloud Native Computing Foundation (CNCF) 的项目并且是很多公司管理分布式系统的解决方案。

灰度发布、蓝绿发布功能,适应当前企业应用软件快速迭代、快速发布的节奏;支持企业应用的弹性伸缩,自动重启,保证高可用的服务;提供完整的应用管理、网络管理、存储管理解决方案,大大减少企业软件应用的运维成本。

设计

k8s的设计理念可以从四个方面展开:

  • 声明式
  • 显式接口
  • 无侵入性
  • 可移植性

声明式: 与之相对应的是命令式,即通过开发语言java、python、go、c++等编写指令代码,进而完成某些目标或者效果。声明式,则是通过yaml或者json等描述性配置语言来定义某些资源对象状态,k8s通过controller方式来使某些资源对象的状态达到期望的状态。

可以看如下的例子:


apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: k8s.gcr.io/nginx:1.7.9
        ports:
        - containerPort: 80


spec:字段定义了该Deployment(k8s的控制器)的期望状态,k8s的controller(控制器)会不断调整对象状态,直到满足要求。

这种方式可以大大减少工作量,提升开发效率,并且便于维护,可以做到"有迹可循"。命令式的方式,比如编写shell脚本,可能执行完,这个状态就结束了,状态没有被记录,追溯比较困难。

总得来说,命令式更关注的是过程,而k8s的声明式强调的是定义期望的运行状态,即使错过了某些事件,最终也会通过yaml定义的状态使其自动满足定义。

显示接口:k8s的接口全部是显示定义的,遵循restfulAPI的设计规范,查看源码可以知道k8s的框架为go-restful。所有接口都可以直接调用,即使k8s的接口不满足要求,使用者仍然可以通crd(CustomResourceDefinitions)扩展k8sAPI,典型的案例如openshift。

无侵入性:k8s无入侵性接入方式,可以使每一个企业应用构建成镜像就可以在k8s集群内运行,不需要更改任何应用代码,k8s的应用就像被docker和k8s的pod(k8s对象)包裹了两层,进而为应用程序提供了容器化以及编排的能力。

可移植性:在微服务架构的世界里,所有的服务都是无状态的,而以前在内存中存储的数据、Session 等缓存,现在都会放到 Redis、ETCD 等数据库中存储,因此无法避免有状态的服务,而有状态服务在迁移过程中会造成一定的障碍。k8s同样提供了有状态服务的支持(statefulset),通过pv和pvc等资源声明数据的存储,用来屏蔽底层存储的差异性。比如可以采用对象存储nfs、cephfs等作为存储服务,使用者不用关心底层存储用的是什么,只需要声明pv和pvc来使用存储即可,从而服务的迁移反而变得容易了。

架构

k8s架构采用的比较传统的c/s架构模式,一切都基于分布式的存储系统,客户端通过RESTfulApi接口于集群进行通信。由下图可知,k8s集群是一组 Master 节点和一系列的 Worker 节点组成,总体包含两种角色,一个是Master节点,负责集群调度、对外接口、访问控制、对象的生命周期维护等工作;另一个是Node节点,负责维护容器的生命周期,例如创建、删除、停止Docker容器,负责容器的服务抽象和负载均衡等工作。


k8s进入pod中容器 mysql k8s pod 容器_Pod_02


Master节点重要组件包括:

  • kube-apiserver:提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制,也是唯一一个与 etcd 集群通信的组件;
  • kube-controller-manager:集群内部的管理控制中心,负责维护集群的状态,比如故障检测、自动扩展、滚动更新等;
  • kube-scheduler:集群中的调度器,按照调度策略完成Pod在集群的中的调度和分配;
  • etcd:k8s对象资源的持久化存储,保存k8s集群的状态,是k8s的数据中心;
  • cloud-controller-manager:云控制器管理器负责与任何云服务进行集成;

Node 节点主要组件:

  • kubelet:负责维护容器的生命周期,同时也负责Volume(CVI)和网络(CNI)的管理
  • kube-proxy:负责为Service提供cluster内部的服务发现和负载均衡
  • Container Runtime:负责镜像管理以及Pod和容器的真正运行(CRI)

Addons(插件):

  • kubedns or coredns: 负责集群内部dns解析,现在官方推荐coredns
  • dashboard: k8s管理ui
  • cadvisor: 负责集群内部容器监控
  • efk: 负责集群内部应用日志收集,主要包括Elasticsearch,Fluentd,Kibana

....

实现原理

读到此处,读者对k8s已经有了感性的了解和认识,清楚了k8s的实现架构和设计理念,下面简单介绍k8s的涉及到的概念和实现原理。

  • 资源对象:可以简单认为是k8s抽象出来的概念,k8s最基本的三个对象是 Pod (可以翻译成容器组、Service(服务)、 Namespace(命名空间)。Pod对象作为k8s集群内部运行的最小单位,可以简单的理解成是一个最小的运行进程。service是为一组具有相同功能的Pod提供一个统一的入口地址,是将请求进行负载分发到后端的各个Pod上的控制器,可以理解成把 Service 加上的一组 Pod 称作是一个微服务。Namespace可以理解成对资源的隔离与分配,逻辑上区分不同项目、小组或用户组,便于不同的分组在共享使用整个集群的资源的同时还能被分别管理。
  • 控制器:其实是用于创建和管理 Pod 的实例,能够在集群的层级提供复制、发布以及健康检查的功能,这些控制器其实都运行在 Kubernetes 集群的主节点上。

k8s对象结构体可以抽象成如下定义,以pod为例:


type Pod struct {
        metav1.TypeMeta `json:",inline"`
	// Standard object's metadata.
	// More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata
	// +optional
	metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"`

	// Specification of the desired behavior of the pod.
	// More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#spec-and-status
	// +optional
	Spec PodSpec `json:"spec,omitempty" protobuf:"bytes,2,opt,name=spec"`

	// Most recently observed status of the pod.
	// This data may not be up to date.
	// Populated by the system.
	// Read-only.
	// More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#spec-and-status
	// +optional
	Status PodStatus `json:"status,omitempty" protobuf:"bytes,3,opt,name=status"`
	
}


可以看出k8s的对象都包括对象元数据,Spec(期望),Status(运行状态),k8s的控制器根据对象定义的期望状态,不断的监听调整集群中对象的状态,使其达到期望的状态,后续章节会详细介绍控制器的原理。

总结

作为k8s入门介绍,本文主要从k8s的背景、设计理念、实现原理等方面展开,同时也介绍了k8s作为容器编排系统为当下企业的软件发展的意义,后续会具体展开k8s如何在企业落地。本篇完!

参考文献

1Kubernetes Components

2 Pod Overview

3 Services

4 What is Kubernetes?