📅 2021-06-02
前面我们简单理解了Containerd的架构,本节来看一下Containerd是如何存储镜像和容器的,涉及到内容包括如何镜像存储和RootFS。
从pull镜像到启动容器
#
Containerd的配置文件中有如下两项配置:
1root = /var/lib/containerd
2state = "/run/containerd"
root配置的目录是用来保存持久化数据的目录,包括content
, snapshot
, metadata
和runtime
。
下面在一台测试的服务器上,删除所有的镜像和容器后,再执行下面的命令重新初始化一下这些目录,以准备后边的实验。
...📅 2021-06-01
最近跨网段配置k8s calico网络遇到了问题,简短记录一下解决过程。
测试环境本地的物理服务器上有一个k8s集群,版本是1.20,calico网络组件版本为3.17。
现在需要往这个k8s集群中添加2个新的node节点,新的节点在本地Openstack的虚拟机上。
Openstack虚拟机的网络和测试环境物理服务器之间网络已经打通,但属于不同的网段,
已在Openstack中安全组中配置了允许物理机服务器网段所有TCP协议进入。
...📅 2021-05-24
起因
#
近日使用团队内部一直在维护的ansible role playbook初始化一个新的k8s集群(v1.19)时遇到了问题,kubectl get node
命令显示各个节点一直是NotReady状态,同时各节点上的kubelet日志一直报下面的错误:
1... kubelet.go:2209] node "node1" not found
2... reflector.go:127] k8s.io/client-go/informers/factory.go:134: Failed to watch *v1.Node: failed to list *v1.Node: nodes "node1" is forbidden: User "system:node:node1" cannot list resource "nodes" in API group "" at the cluster scope
3... failed to ensure node lease exists, will retry in 7s, error: leases.coordination.k8s.io "node1" is forbidden: User "system:node:node1" cannot get resource "leases" in API group "coordination.k8s.io" in...mespace "kube-node-lease"
4... kubelet_node_status.go:470] Error updating node status, will retry: error getting node "node1": nodes "node1" is forbidden: User "system:node:node1" cannot get resource "nodes" in API group "" at the cluster scope
从日志中初步分析是kubelet对apiserver的访问权限问题引起,由于使用这个ansible role是团队内部一直在维护的,目前管理着线上线下共4套k8s集群,一直没有这个问题出现。于是初步怀疑已有的4套集群是经历了各个历史版本逐步升级到1.19的,这个过程中可能k8s给自动做了相关的配置兼容性,
现在初始化的这个新集群因为是全新安装,可能我们的ansible playbook生成的配置已经不正确了。
...📅 2021-05-23
前面我们从实际操作角度学习了containerd,部署了containerd,并学习使用了ctr, crictl, nerdctl等命令行工具,体验了容器镜像的构建、拉取、推送,容器的启动和管理,并结合containerd容器学习了容器隔离性和资源限制背后的技术namespace和cgroups。在积累了这些实际操作的经验之后,本节一起来从概念角度学习一下Containerd的架构,进一步加深理解。本节学习内容主要来自Containerd的官方文档Containerd Architecture。
...📅 2021-05-22
go-elasticsearch
是ES官方提供的Go语言客户端。本文将结合ES 7.12对这个库做一个基本入门使用的演示。
1.开发环境准备
#
创建一个空的项目,并使用go moudles引入go-elasticsearch
的依赖:
1mkdir go-es-showcase
2cd go-es-showcase
3go mod init go-es-showcase
4export GOPROXY="https://goproxy.io"
5go get github.com/elastic/go-elasticsearch/v7@v7.12.0
6go get github.com/stretchr/testify
这里基于go testing单元测试编码风格来演示对go-elasticsearch
这个库的使用。
首先在项目的根目录下创建一个名称为go_esclient_test.go
,并演示一下如何创建客户端:
...📅 2021-05-21
ES为提供了一套HTTP RESTful API,开发和运维人员可以直接调用这些API来配置和访问ES服务。
这些API的功能十分丰富,从集群监控、运维管理到应用开发所需的索引、文档相关操作。本文将从应用开发的角度整理ES应用开发人员应该熟练掌握的API。
1.索引的创建、修改和删除
#
创建索引PUT /<index-name>
,例:
...📅 2021-05-10
本节我们一起来了解一下容器资源隔离性技术namespace。
namespace即命名空间,主要用来做访问隔离,针对一类资源进行抽象封装给一个容器使用,对于这类资源,每个容器都有自己的抽象,它们之间彼此不可见实现了访问隔离,例如PID namespace用来隔离进程号,User namespace用来隔离用户和用户组。
...📅 2021-05-09
本节我们一起来了解一下容器的资源限制技术CGroups。CGroups即Linux Control Group其作用是限制一组进程可以使用的资源上限(CPU、内存等)。
1.CGroups的基本概念
#
学习CGroup需要先了解几个CGroup的基本概念:
- Task: 在cgroup中,task可以理解为一个进程,但这里的进程和一般意义上的OS进程不太一样,实际上是进程ID和线程ID列表,后边再讨论
- CGroup: 即控制组。一个控制组就是一组按照某种标准划分的Tasks。可以理解为资源限制是以进程组为单位实现的,一个进程加入到某个控制组后,就会受到相应配置的资源限制。
- Hierarchy: cgroup的层级组织关系,cgroup以树形层级组织,每个cgroup子节点默认继承其父cgroup节点的配置属性。这样每个Hierarchy在初始化会有root cgroup
- Subsystem: 即子系统,更准确的表述应该是资源控制器(Resource Controller)更合适一些。子系统表示具体的资源配置,如CPU使用,内存占用等。Subsystem附加到Hierarchy上后可用。
当前的cgroup有两个版本v1和v2,据说是随着越来越多的特性被加入导致cgroups v1变得难以维护,从linux kernel 3.1开始了cgroups v2的开发,v2到linux kernel4.5才正式稳定可用。
...📅 2021-05-07
1.容器核心技术和Docker的创新:镜像技术
#
容器技术主要包括Cgroup
和Namesapce
这两个内核级别的特性。
Cgroup是control group的缩写即控制组,主要用来做资源控制,可以将一组进程放到一个控制组里,通过给这个控制组分配可用资源,达到控制这组进程可用资源的目的,对不同资源的具体管理是由各个子系统分工完成的,例如cpu控制cpu使用率,memory控制内存的使用上限等等。
Namespace即命名空间,主要用来做访问隔离,针对一类资源进行抽象封装给一个容器使用,对于这类资源,每个容器都有自己的抽象,它们之间彼此不可见实现了访问隔离,例如PID namespace用来隔离进程号,User namespace用来隔离用户和用户组,linux共有6种命名空间。
另外,容器还需要rootfs
实现文件系统隔离。rootfs是一个容器启动时其内部进程可见的文件系统,在容器内用户视角下修改文件时,一般会采用Copy-On-Write(COW)机制。镜像的本质就是一个rootfs。
...📅 2021-05-06
对于用惯了docker cli的用户来说,containerd的命令行工具ctr使用起来不是很顺手,此时别慌,还有另外一个命令行工具项目nerdctl可供我们选择。
nerdctl是一个与docker cli风格兼容的containerd的cli工具。
nerdctl已经作为子项目加入了containerd项目,它的github地址是https://github.com/containerd/nerdctl
,而且从最近的nerdctl 0.8开始,nerdctl直接兼容了docker compose的语法(不包含swarm),
这很大提高了直接将containerd作为本地开发、测试和单机容器部署使用的体验。本来k8s后续将不再支持dockershim,docker在k8s社区的地位急剧下降,现在单机直接使用containerd易用性也不断被完善,也许docker的辉煌已经远去了。
...