2.1 | kubernetes: 在裸机 Linux 上安装 k8s 集群

在开始安装 k8s 必要的软件前,最理想的环境是能够自由访问外网,所以需要先准备好代理,这样在安装被墙软件、拉取被墙的镜像时方便很多,不用为这种意义不大的事情纠结。重命名系统名称hostnamectl set-hostname k8s-masterhostnamectl set-hostname k
阅读更多

Argo CD 创建 Application 时的逻辑分析

在 Argo CD 里面,同时提供了 HTTP 接口(Web UI)、gRPC 接口(Command CLI),但是只用到了一个端口,并且实现逻辑的代码是同一份代码,是怎么做到的呢?创建应用时都做了哪些操作逻辑?请求跟踪当在 Argo CD 的 Web UI 页面中,创建一个 Application
阅读更多

Argo CD 从入门教程来看其架构

本文的目标是能对 Argo CD 基本操作有一定的了解,同时可以对 Argo CD 的架构、组成有一定的认识。准备kubectlkubernetes 集群安装kubectl create namespace argocdkubectl apply -n argocd -f https://raw.g
阅读更多

如何在容器中对镜像进行操作

Docker VS Podman

由于只需要对镜像进行 pull、tag、push 操作,因此不需要全套的 Docker 服务,这里选择了 Podman。Podman 有一个子命令就是 buildah,它主要负责镜像相关的操作,这样会更加精简。

问题描述

在镜像中添加完 buildah 的依赖后,在容器中运行 buildah 时,报如下错误:
现象

解决方案

此问题的其中一个解决方案为:在宿主机中,修改 /proc/sys/user/max_user_namespaces 文件里面的值。但若采取此种方案,会导致线上环境 K8S 所在的宿主机,可能也要修改,这样的操作是不太可行的。

同事的踩坑经验:可以在 k8s 的 yaml 配置中,为 pod 开启特权模式,这样可以避免使用 user namespace。在 pod 定义处,添加配置,修改如下:

1
2
securityContext: 
privileged: true

修改后,buildah 在容器中不再报错。但对上面的修改,一方面持有安全疑虑,另一方面不太明白其中的原理。

为什么

为什么在本地的 K8S 环境中 rosco 执行没有问题?

图片

为什么将 pod 设置成特权模式之后便能正常执行 buildah?

  • 一篇比较具有参考价值的相关 issue。通过上述 issue 得知,即使使用 root 启动 buildah ,还是需要 user namespace 来获取相应的 capabilities
  • privileged 参数应该是会添加所有的 capabilities 到容器中(参考Docker文档)。

如何改进

只给 buildah 所需的 Linux capabilities,初步验证在 testing 运行 ok。

1
2
3
4
5
securityContext: 
# privileged: true
capabilities:
add:
- "SYS_ADMIN"

其中 CAP_SYS_ADMIN 的作用是:允许执行系统管理任务,如加载或卸载文件系统、设置磁盘配额等。

Argo CD Sync 同步操作逻辑梳理

sync 子命令做的事情就两件:从 git repo 拉取 Manifest、然后执行 kubectl apply。入口:app.go -> NewApplicationSyncCommand执行命令:argocd app sync aaa命令行客户端先创建一个 clientacdClient
阅读更多

1.2 | Kubernetes:容器技术

此文是一篇大杂烩,记录一些对我很有用处的新知识。主要包括容器相关概念、实现原理、相关标准等。最大的感触就是 Golang 才是云时代的语言,很多容器相关软件的开发语言是用的 Golang。Let's go!什么是容器容器就是将软件打包成标准化单元,以用于开发、交付和部署。简单说就是:容器可以被当做一
阅读更多

1.1 | kubernetes: 是什么和为什么

WHAT of kubernetes一套基于容器技术的分布式架构方案。基于 Google 的 Borg(内部使用超过10年) 系统实现资源管理的自动化、资源利用的最大化使用 kubernetes 可以减少开发成本(如服务治理、服务监控、故障处理等),将精力投入到业务开发中。开放平台,不限编程语言,模
阅读更多

0 | kubernetes:学习路线导览与记录

在之前的后端开发中,多多少少接触过一些 kubernetes 的内容,但是并未深入了解,在接触到 golang 编程以及 CD 发布系统的情形下,知道了 kubernetes 的强大之后,便开始找机会系统了解 kubernetes,因此了解 kubernetes 是一种不可多得的提升自我的方式,不论是从工作上、还是自我提升。

本文路线主要参照此教程给出的建议,记录遇到的问题以及对 kubernetes 的认识。

https://kubernetes.io/

8月第一周

本周目标

  • Kubernetes 的背景
  • 安装 Kubernetes 环境
  • Kubernetes 基本概念和使用方法

为什么会出现 kubernetes

学习任何系统的之前,了解其出现的背景和意义都是必不可少的,为什么会出现 Kubernetes?它解决了什么问题?有没有其他类似的系统?这里推荐阅读才云科技 CEO 张鑫在 2017 年文章《从风口浪尖到十字路口,写在 Kubernetes 两周年之际》。

以简易方式安装 kubernetes

推荐使用 minikubekind 部署一个本地环境,然后开始部署一个”真实”的应用(minikube 安装需要使用科学上网,或使用“国内版” minikube)。如果想一开始就挑战更高难度的安装方式(不推荐),可以使用 kubeadm 或者手动部署所有组件。关于安装,可以参考文档 lab1-installation

kubernetes 资源与概念

推荐熟练使用以下常用资源和概念:Pod、Node、Label、Event、Service、Configmap & Secret、Deployment、Namespace。相关学习可以参考文档 lab2-application-and-service

(可选)仅完成上述内容可能还不足以让我们非常熟悉 Kubernetes 的基本概念,下面列出其他可以参考的资料,大家也可以按照自己的方式去搜索相关的资料:

预期达到效果

  • 反复加深对上面资源的操作熟练度。如果你是第一次接触 Kubernetes,或者仅了解过一点 Kubernetes 的知识,那么基(ken)本(ding)是不明白 Kubernetes 底层到底发生了什么。请不要心急,姑且把它当成一个黑盒工具即可 ?。
  • 你可能会在网上看到更多的概念,如 PVC、Ingress、Priority 等。炼气阶段,请不要尝试学习过多的资源类型。Kubernetes 有非常多的概念和类似的资源,我们这里熟悉最核心的概念即可,否则易走火入魔 ?,切记。当我们打通任督二脉之时,所有的新概念都不过尔尔。