如何精简Docker镜像

精简Docker镜像的五种通用方法 精简 Docker 镜像的好处很多,不仅可以节省存储空间和带宽,还能减少安全隐患。优化镜像大小的手段多种多样,因服务所使用的基础开发语言不同而有差异。本文将介绍精简 Docker 镜像的几种通用方法。 精简 Docker 镜像大小的必要性 Docker 镜像由很多镜像层(Layers)组成(最多 127 层),镜像层依赖于一系列的底层技术,比如文件系统(filesystems)、写时复制(copy-on-write)、联合挂载(union mounts)等技术,你可以查看Docker 社区文档以了解更多有关 Docker 存储驱动的内容,这里就不再赘述技术细节。总的来说,Dockerfile 中的每条指令都会创建一个镜像层,继而会增加整体镜像的尺寸。 下面是精简 Docker 镜像尺寸的好处: 减少构建时间 减少磁盘使用量 减少下载时间 因为包含文件少,攻击面减小,提高了安全性 提高部署速度 五点建议减小Docker镜像尺寸 一、优化基础镜像 优化基础镜像的方法就是选用合适的更小的基础镜像,常用的 Linux 系统镜像一般有 Ubuntu、CentOs、Alpine,其中 Alpine 更推荐使用。大小对比如下: Alpine 是一个高度精简又包含了基本工具的轻量级 Linux 发行版,基础镜像只有 4.41M,各开发语言和框架都有基于 Alpine 制作的基础镜像,强烈推荐使用它。 查看上面的镜像尺寸对比结果,你会发现最小的镜像也有 4.41M,那么有办法构建更小的镜像吗?答案是肯定的,例如 http://gcr.io/google_containers/pause-amd64:3.1 镜像仅有 742KB。为什么这个镜像能这么小?在为大家解密之前,再推荐两个基础镜像: 1、scratch 镜像 scratch 是一个空镜像,只能用于构建其他镜像,比如你要运行一个包含所有依赖的二进制文件,如Golang 程序,可以直接使用 scratch Read more…

gitlab pipeline 自动构建

使用gitlab pipeline自动构建,需要为项目配置runner, 安装方法为:

构建一个docker:buildx镜像做测试 .gitlab-ci.yml:

  Dockerfile:

  运行时提示Got permission denied while trying to connect to the Docker daemon socket,解决方法: 在runner服务器上修改gitlab-runner用户加入docker组:

 

harbor v2.5.1安装

使用docker-compose来安装harbor v2.5.1,安装过程中有一些问题,下面记录一下: 下载离线安装包:

2. 准备docker-compose.yml和harbor.yml: docker-compose.yml:

harbor.yml文件需要更改hostname, 监听port, 如果不开启ssl, 则注释掉https, 更改harbor_admin_password,和data_volume

  执行完docker-compose up -d后, 容器全部启来了, 但是再执行docker-compose down后, 再执行install.sh,或up启动,发现有几个问题: docker-compose up启动报错: Creating harbor-log … error ERROR: for harbor-log Cannot start service log: driver failed programming external connectivity on endpoint harbor-log (cb1338bb88ec65aba9727cb1e7656e6c44b3705095121e27ab9240a66cda1ef1): (iptables failed: iptables –wait -t filter Read more…

vscode配置代理

配置代理,让vscode和git飞起来 对于 git, 只需要用下面的明亮就可以了

  如果想要取消:

  但是如果是vscode,同样也是通过首选项->设置->搜索proxy,然后可以输入上面的proxy。速度就飞了。。 或者可以这样:

  当然,自备梯子

编译安装jq

编译安装jq   #下载源码 git clone https://github.com/stedolan/jq.git cd jq git checkout jq-1.6 # 拉取子模块 git submodule update –init #生成makefile.in文件 autoreconf -fi #生成makefile ./configure –with-oniguruma=builtin –prefix=/usr/local #编译 make

「Docker Buildx」- 构建“跨平台”镜像

使用Buildx 在x86架构centos上构建支持多架构镜像, 首先, 要确保内核大于4.0 升级内核版本

卸载旧内核

安装docker:

  开启特性: /etc/systemd/system/docker.service.d/docker-options.conf 中加入: –experimental=true \ 可以添加私有仓库的ssl证书到buildx容器内

  启动交叉编译: 方式1:

方式2 : 也可以安装qemu:

    如构建ntp构建: docker buildx build –platform linux/amd64,linux/arm64 -t chrony . 如果想将构建好的镜像保存在本地,可以将 type 指定为 docker,但必须分别为不同的 CPU 架构构建不同的镜像,不能合并成一个镜像,即: docker buildx build –platform linux/amd64,linux/amd64-t chrony -o type=docker . docker Read more…

通过ansible获取文件的几种方式

通过ansible获取文件的几种方式: 通过lookup读取ansible管理节点上的的内容, 并将其内容赋值给变量。如: 获取管理节点上的ssh key:

  fetch 模块的作用就是”Fetches a file from remote nodes,fetch为”拿来”之意,当我们需要将受管主机中的文件拉取到ansible主机时,则可以使用此模块,  可以从远端将文件拉取到本地, 如获取k8s master节点上的ca证书到本地:

  使用cat测试到变量 slurp 模块用于拉取远端文件的 base64 码, 可通过b64decode进行解码   任务: 获取etcd主机的ssl文件信息注册到变量, 用来生成etcdkeeper配置文件, 首先用cat来获取: tasks/main.yml:

  结果发现, 生成的配置里, 换行符都被换成了空格 尝试使用slurp模块:

  结果换行符都保留了下来, 格式正确.  

Kubernetes高可用性的考虑

Kubernetes高可用性的考虑 高可用性考虑因素 本文档包含了社区提供的关于设置高可用性Kubernetes集群的注意事项。如果有什么地方不完整、不清楚或者需要更多的信息,请随时留言。 概述 当创建生产集群时,高可用性是必须的(集群在某些控制平面或工作节点失效时仍能保持运行的能力)。对于工作节点,假设有足够多的节点。也要在规划和设置集群时,需要考虑到控制平面节点和etcd实例的冗余。 kubeadm支持设置多个控制平面和多etcd集群。 但仍有一些方面需要考虑和设置,这些方面并不是Kubernetes本身的一部分,因此项目文档中没有涉及。本文档提供了一些额外的信息和例子,在用kubeadm规划和引导HA集群时很有用。 软件负载均衡的选项 当创建一个具有多个控制平面的集群时,可以将API Server实例放在负载均衡后面,可以在运行kubeadm init时使用–control-plane-endpoint选项让新集群使用它来实现更高的可用性。 当然,负载均衡器本身也应该是高度可用的。这通常是通过给负载均衡器增加冗余来实现的。为此,设置一个管理虚拟IP的主机集群,每台主机运行一个负载均衡器的实例,这样在其他主机处于待机状态时,总是使用当前持有vIP的主机上的负载均衡器。 在某些环境中,例如在具有专用负载均衡组件(例如由某些云提供商提供)的数据中心中,该功能可能已经可用。如果没有,可以使用用户管理的负载均衡。在这种情况下,在启动集群之前需要做一些准备工作。 由于这不是Kubernetes或kubeadm的一部分,所以必须单独处理。在下面的章节中,我们给出了一些例子,当然也有可能是其他几十种可能的配置。 keepalived 和 haproxy 对于从虚拟IP提供负载均衡,keepalived和haproxy的组合已经存在了很长时间,可以说是众所周知、久经考验。 keepalived提供了一个由可配置的健康检查管理的虚拟IP。由于虚拟IP的实施方式,协商虚拟IP的所有主机必须在同一IP子网中。 haproxy服务可以配置为简单的基于流的负载平衡,从而允许TLS终止由其后面的API服务器实例处理。 这种组合既可以作为操作系统上的服务运行,也可以作为控制平面主机上的静态Pods运行。两种情况下的服务配置是相同的。 keepalived配置 keepalived配置由两个文件组成:服务配置文件和健康检查脚本,该脚本将定期被调用,以验证持有虚拟IP的节点是否仍在运行。 这些文件位于/etc/keepalived目录中。但请注意,有些 Linux 发行版可能会把它们放在其他地方。下面的配置已经成功地用于keepalived1.3.5版本。

  bash变量样式中有一些占位符需要填写: ${STATE}设置一个主机是MASTER,其他主机是BACKUP,因此虚拟IP最初将分配给MASTER。 ${INTERFACE}是参与协商虚拟IP的网络接口,例如eth0。 ${ROUTER_ID}对于所有keepalived集群主机来说,应该是相同的,同时在同一子网的所有集群中是唯一的。许多发行版将其值预先配置为51。 ${PRIORITY} master上的优先级应高于backups。因此,101和100就足够了。 ${AUTH_PASS} 对所有keepalived集群主机而言,应该是相同的,例如42。 ${APISERVER_VIP}是keepalived集群主机之间协商的虚拟IP地址。 上面的 keepalived 配置使用了一个健康检查脚本/etc/keepalived/check_apiserver.sh,负责确保在持有虚拟IP的节点上,API服务器是可用的。这个脚本可以是这样的。

  bash变量样式中有一些占位符需要填写: ${APISERVER_VIP}是keepalived集群主机之间协商的虚拟IP地址。 ${APISERVER_DEST_PORT} Kubernetes与API服务器对话的端口。 haproxy配置 haproxy配置由一个文件组成:服务配置文件,它在/etc/haproxy目录中。但请注意,有些Linux发行版可能会把它们放在其他地方。以下配置已经成功地用于haproxy2.1.4版本

  同样,在bash变量样式中有一些占位符需要替换: ${APISERVER_DEST_PORT} Kubernetes与API服务器对话的端口。 ${APISERVER_SRC_PORT} API服务器实例使用的端口。 ${HOST1_ID}第一个负载均衡的API服务器主机的符号名称。 ${HOST1_ADDRESS}第一个负载均衡API服务器主机的可解析地址(DNS名、IP地址)。 Read more…

使用kube-vip做kubespray的apiserver的HA

使用kubespray搭建k8s集群, 如果没有外部LB做高可用的话, 对于node节点, kubespray默认为通过选择nginx或haproxy做apiserver的HA, 在master节点上, 是用127.0.0.1:6443来访问本机的apiserver, 而且程序调用apiserver时也没有做HA, 传统HA方式会搭建keepalived和haproxy, 本次是通过kube-vip来做HA 这是kube-vip官方对于ha的架构文档: https://github.com/kube-vip/kube-vip/blob/main/kubernetes-control-plane.md https://kube-vip.io/architecture/ 尝试着按照官方方法来运行: https://kube-vip.io/install_static/ , 始终失败, 由于docker run –network host –rm ghcr.io/kube-vip/kube-vip:v0.3.8 manifest pod的方式生成的配置默认是用的/etc/kubernetes/admin.conf来做backend的, 但是kubespray init集群时也是用的admin.conf来做认证的, 这就陷入了死循环. 后来通过直接配置文件的方式来做成功了. 参考: https://github.com/kube-vip/kube-vip/blob/main/kubernetes-control-plane.md https://www.codeleading.com/article/58065570523/ ansible如下: 注: 其中,templates/kube-vip.yaml.j2这个文件是通过这个来生成的: docker run –network host –rm 172.20.48.169:81/yks/kube-vip:v0.3.9 sample config | sudo tee /etc/kubernetes/manifests/kube-vip.yaml kubespray定义的默认k8s apiserver监听端口为6443(变量: kube_apiserver_port), 这里kube-vip定义的vip绑定的域名是k8s.apiserver.io, Read more…

用sed命令进行整段替换

sed 整段插入: 下面是一个xml文件 1.txt:

需求: 要在匹配</actions>字段后插入如下整段内容:

方法一:

  方法二:

  参考: https://stackoverflow.com/questions/6684487/sed-replace-with-variable-with-multiple-lines https://www.coder.work/article/2570180