陈沙克

Nov 242021
 

最近搬运了2次docker 镜像,有点体会。你肯定需要一台国外的机器才行。

如果有docker

docker pull ghcr.io/k8snetworkplumbingwg/multus-cni:stable
docker save ghcr.io/k8snetworkplumbingwg/multus-cni > ./multus-cni.tar
##把tar包下载到有docker服务的节点
docker load < ./multus-cni.tar
docker images

如果海外的机器上没有docker,那么有一个另外一种玩法

# 可以直接yum install,版本低,我是编译,1.3的版本
./skopeo --insecure-policy copy docker://ghcr.io/k8snetworkplumbingwg/multus-cni:stable docker-archive:multus-cni.tar

遗憾的是skopeo,还不能通过proxy去下载。

  • https://github.com/containers/skopeo/issues/1433

Nov 072021
 

其实现在大家都应该用的是64bit的系统,那么对于64bit的系统,你要同时把这两个文件的32bit和64bit,都装上才行。记录一下。

  • https://docs.microsoft.com/en-US/cpp/windows/latest-supported-vc-redist?view=msvc-170

把Visual Studio 2015, 2017, 2019, or 2022 x86和64的两个安装包都装一遍就可以解决这个问题。

VCRUNTIME140.DLL

https://www.dll-files.com/vcruntime140.dll.html

一定要把x86和x64,都装上,才能解决问题。

msvcp140.dll

这个也是一样的道理

https://www.sts-tutorial.com/download/msvcp140

-- 64-Bit Windows:
          - 32-Bit Version - C:\Windows\SysWOW64
          - 64-Bit Version - C:\Windows\System32

要下载两个文件,分别放到不同的地方,就可以。

Nov 012021
 

官方文档都很详细,ETCD编译,需要go的环境

  • https://golang.org/doc/install
  • https://etcd.io/docs/v3.5/quickstart/

过程倒是比较顺利

## 下载安装包
wget https://golang.org/dl/go1.17.2.linux-amd64.tar.gz
## 解压
rm -rf /usr/local/go && tar -C /usr/local -xzf go1.17.2.linux-amd64.tar.gz
##设置环境变量 
vi /etc/profile
## 增加一行
export PATH=$PATH:/usr/local/go/bin
#ssh退出再登录
go version
go version go1.17.2 linux/amd64

ETCD

git clone -b v3.5.0 https://github.com/etcd-io/etcd.git
cd etcd
./build.sh
## build 完成的安装包在bin的目录下
cd bin/

#查看编译出来的包
ls -la
总用量 74240
drwxr-xr-x  2 root root     4096 11月  1 09:26 .
drwxr-xr-x 20 root root     4096 11月  1 09:26 ..
-rwxr-xr-x  1 root root 31675675 11月  1 09:26 etcd
-rwxr-xr-x  1 root root 24202646 11月  1 09:26 etcdctl
-rwxr-xr-x  1 root root 20128729 11月  1 09:26 etcdutl
##查看版本
./etcd --version
etcd Version: 3.5.0
Git SHA: 946a5a6
Go Version: go1.17.2
Go OS/Arch: linux/amd64

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设置。

Sep 082021
 

其实用了k8s很久,但是很多概念的理解,有时候真的需要动手,才能真正理解。

官方文档提供的nginx的deployment模版,我修改一下,采用alpine镜像,副本的数量为1

nginx.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  namespace: default
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:alpine
        ports:
        - containerPort: 80

有几个地方需要留意

  • deployment 名字是 nginx-deployment, 后续你可以用 kubectl get svc 看到
  • labels, 标签是:nginx,
  • namespace 如果不指定,就是使用default,我这里专门加入,便于理解。
  • 部署pod的数量是1
  • nginx的alpine镜像,小很多,方便试验。
kubectl apply -f nginx.yaml 
kubectl get pod
kubectl get deployment
kubectl get svc
kubectl expose deployment nginx-deployment --type=NodePort --name=hello
kubectl get svc
kubectl describe svc hello