Oct 182021
 

skopeo,是一个容器搬运工具,我的用途主要是用来从国外hub,直接把镜像存放在我自己的私有仓库里。CentOS 7里带的版本很低,0.1x版本,目前github上的版本,已经到了1.5的版本。第一次编译go的软件,体验一下,对着文档来操作。在香港的阿里云机器上,很顺利搞定。

参考文章 镜像搬运工

SKOPEO_VERSION=v1.3.0
git clone --branch ${SKOPEO_VERSION} https://github.com/containers/skopeo
cd skopeo
BUILD_IMAGE=nixos/nix:2.3.12
docker run --rm -t -v $PWD:/build ${BUILD_IMAGE} \
sh -c "cd /build && nix build -f nix && cp ./result/bin/skopeo skopeo"

这个时候,就可以开始使用skopeo。

Sep 152021
 

其实在我经历过的环境,k8s安装,最大的问题都是在镜像的下载,怎么解决这个问题,都是老生常谈的问题。

  • docker hub
  • quay.io
  • k8s.gcr.io

基本就是涉及这3个仓库。解决的办法,其实就是做香港搞一台虚拟机,装上nexus,搞定。自己搭建,自己使用,稳定性就好很多。

Docker mirror

大家用docker久了,其实都会去设置docker的mirrors。目前国内好几个厂商提供的mirrors都还是比较好用,尤其是阿里云的。

我和大家一样,天真的认为,我设置quay,gcr的mirror,不就可以了嘛。docker本身的限制,只能设置docker hub的mirror。不能设置别的hub的mirror。这个其实在国外也很多人问过这样的问题。

国内厂商提供的mirror,例如quay的。

docker pull quay.io/prometheus/node-exporter:v0.18.1
# 替换成如下格式
docker pull quay-mirror.qiniu.com/prometheus/node-exporter:v0.18.1

Nexus proxy and group

Nexus,可以提供各个hub的proxy的功能,并且还能把这些hub,通过group的功能,统一用一个端口发布出来。

docker pull k8s.gcr.io/kube-proxy:v1.20.8

这个时候,你就需要改成

docker pull hub.chenshake.site/kube-proxy:v1.20.8

这样你去nexus搭建的仓库下载,如果没有,他会自动去上游下载。这个nexus做的还是非常智能。如果你下载quay的镜像

docker pull quay.io/coreos/flannel:v0.14.0

你只需要改成

docker pull hub.chenshake.site/coreos/flannel:v0.14.0

简单理解,就是nexus多做了一步,等于把所有的hub的镜像,都做了一个类似索引,帮你下载。如果有相同的名字,是有可能下载错误,或者下载的不是你需要的镜像。

docker pull hub.chenshake.site/nginx

结果你看一下镜像

所以你可以做docker 配置mirror , 其他仓库,就是 hub.chenshake.site/*****

这样很大程度避免了这个问题。如果你决定构建自己的私有仓库,这个方案,就可以满足,但是需要你改变所有的镜像的地址,这也是一个很繁琐的事情。

Containerd 完美方案

现在都去docker化,但是对我来说,不用docker的理由就是这个,不能分别给hub设置不同的mirror。那么Containerd是可以完美的支持。

nexus的配置调整一下,dockerhub,gcr,quay的,proxy 模式,不使用group访问通过不同的端口来区分

你做contained 配置 /etc/containerd/config.toml

[plugins."io.containerd.grpc.v1.cri".registry]
      [plugins."io.containerd.grpc.v1.cri".registry.mirrors]
        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
          endpoint = ["https://hub.chenshake.site:8181"]
        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."k8s.gcr.io"]
          endpoint = ["https://hub.chenshake.site:8182"]
        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."gcr.io"]
          endpoint = ["https://hub.chenshake.site:8183"]
        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."ghcr.io"]
          endpoint = ["https://hub.chenshake.site:8184"]
        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."quay.io"]
          endpoint = ["https://hub.chenshake.site:8185"]

这个时候,你如果需要下载镜像。

crictl pull k8s.gcr.io/kube-apiserver:v1.20.8

什么都不需要修改,直接搞定。对于contained来说一定要注意

crictl 是使用contained的配置文件下载,你在配置文件里设置的mirror,是生效的。

如果你使用ctr,或者 nerdctl,去pull镜像,都是直接下载,无法设置mirror,也不会使用contained下的mirror设置。

Aug 302021
 

linux命令行经常输出一个表格的东西,我们需要取某列数据来使用,但是要去掉第一列。

下面的命令就是取第一列数据,第二列,就改成2就可以。

lsns -t net | awk '{print $1}'

如果希望去掉第一行数据,那么你就需要

lsns -t net | awk 'NR == 1 {next} {print $1}'

非常完美的去掉了第一行的数据。

Aug 132021
 

KubeOperator 是Fit2cloud 推出的k8s部署项目,代码在GitHub上,部署起来有点费劲。我基本都要依靠阿里云的香港节点,才能完成测试。

采用github的加速方式,实现在国内的安装。

#这里提供两个最常用的镜像地址:
https://github.com.cnpmjs.org
https://hub.fastgit.org

你需要把脚本的github替换一下。

curl -sSL https://github.com/KubeOperator/KubeOperator/releases/latest/download/quick_start.sh | sh

直接运行,你通常失败的概率是非常大的,而且下载下来,后续脚本会继续访问github,导致没法运行。

wget https://hub.fastgit.org/KubeOperator/KubeOperator/releases/latest/download/quick_start.sh

然后你需要对脚本进行一下修改,替换github.com 为hub.fastgit.org.

sed -i 's/github.com/hub.fastgit.org/g' quick_start.sh 
chmod +x quick_start.sh
./quick_start.sh

就这样搞定。

Aug 122021
 

最近搞HTTPS,顺便提升一下自己的docker水平。现在需要内网搭建一个Nexus服务器,用来mirror docker镜像。希望可以实现https访问nexus,而且是用域名。我肯定使用的是私有ip地址。

配置nexus 使用HTTP访问,有两种方式,一种就是前端加上Nginx,另外一种就是配置Nexus。我选择了使用配置Nexus。

DNSPod,创建一个主机,生成证书

申请ssl证书,下载到本地,上传到服务器上,证书里有一个Tomcat 目录,

 ll Tomcat/
总用量 12
-rw-r--r-- 1 root root   15 8月  12 12:18 keystorePass.txt
-rw-r--r-- 1 root root 6175 8月  12 12:18 nexus.chenshake.site.jks

默认官方nexus镜像,是不带https,那么你需要找一个支持HTTPS的镜像。

  • https://github.com/bradbeck/nexus-https

作者提供的镜像,使用自己签发的证书。我就直接利用这个镜像

mkdir -p /data/nexus/nexus-data
mkdir -p /data/nexus/nexus-ssl
chown -R 200 /data/nexus/nexus-data
chown -R 200 /data/nexus/nexus-ssl
docker run -d -p 8081:8081 -p 8443:8443 \
-v /data/nexus/nexus-data:/nexus-data \
-v /data/nexus/nexus-ssl:/opt/sonatype/nexus/etc/ssl \
--name nexus \
bradbeck/nexus-https

正常来说,你就会启动一个nexus的镜像,你可以尝试使用ip地址直接访问

  • http://ip:8081
  • https://ip:8443

用户名admin,密码已经不是以前的admin123,关于nexus的密码,已经是随机生成,我们给nexus挂的存储里,就能找到随机的密码。

cat /data/nexus/nexus-data/admin.password 
e43a80cd-7eda-49f1-8290-0d5a9155aad9

我希望使用dnspod签发的证书,来替换自己签发的证书。证书专门挂了一个目录

cd /data/nexus/nexus-ssl/
mv keystore.jks keystore.jks.save
cp /home/Tomcat/nexus.chenshake.site.jks ./keystore.jks

这样就更换了证书,还需要修改一下这个证书的密码,这个需要进入容器里修改

docker exec -it nexus /bin/bash
vi /opt/sonatype/nexus/etc/jetty/jetty-https.xml 

这里就是我下载证书的密码,替换掉。文件里默认的密码是:password

cat /home/Tomcat/keystorePass.txt 
qfyk296s170r4e2

全部替换

:%s/password/qfyk296s170r4e2/g

保存退出后。我们是修改了docker里面的文件,我们需要重新保存一下。commit后面的id,就是镜像运行的id号,docker ps查看。

docker commit 3a6b714db9ed shake/nexus33:v1.0

查看一下提交的情况

# docker images
REPOSITORY             TAG       IMAGE ID       CREATED          SIZE
shake/nexus33          v1.0      a3e34306a3ad   30 minutes ago   823MB
<none>                 <none>    710e75f478e3   40 minutes ago   850MB
bradbeck/nexus-https   latest    f2bdbff829e0   6 days ago       822MB
sonatype/nexus3        latest    84bed2486e46   7 days ago       655MB

把启动的docker nexus stop,删掉,重新启动

docker stop nexus
docker rm nexus

用定制过的镜像,重新启动

docker run -d -p 8081:8081 -p 8443:8443 \
-v /data/nexus/nexus-data:/nexus-data \
-v /data/nexus/nexus-ssl:/opt/sonatype/nexus/etc/ssl \
 --name nexus -d shake/nexus33:v1.0

如果可以正常启动,其实就说明都生效了。因为如果有问题,镜像就根本没法启动。

  • https://nexus.chenshake.site:8443

非常完美。

参考文章

  • https://zhuanlan.zhihu.com/p/63055844
  • https://devops.stackexchange.com/questions/9614/how-to-setup-docker-mirror-proxy-repository-in-nexus-repository-manageross-3-19
  • https://mtijhof.wordpress.com/2018/07/23/using-nexus-oss-as-a-proxy-cache-for-docker-images/
Aug 102021
 

当第一次听到这个,感觉就是这种需求是变态,把虚拟机的东西,搬到容器来搞。我也到外面转了一圈,当时真的没有那家容器厂商搞过这个。

后来看了一下文档,发现k8s官方真的有相应的功能。K8s 1.18的版本,已经是默认打开。

  • https://docs.qq.com/doc/DSkNYQWt4bHhva0F6
  • https://docs.openshift.com/container-platform/4.8/scalability_and_performance/using-topology-manager.html
  • https://imroc.cc/k8s/best-practice/single-numa-node/
  • https://builders.intel.com/docs/networkbuilders/topology-management-implementation-in-kubernetes-technology-guide.pdf

改天拿到机器来测试一下这个。