关于kubernetes:Kubernetes中部署Docker-registry271并通过containerd实现拉取镜像到应用Pod的部署

60次阅读

共计 4926 个字符,预计需要花费 13 分钟才能阅读完成。

这里次要介绍一下公有仓库 (HTTPS) 在 Kubernetes 中部署的问题,因为 Kubernetes 将弃用 docker,因而这里次要介绍以下应用 containerd 替换 docker 后如何从公有仓库拉取镜像并实现镜像的部署。

下载 registry2.7.1 的镜像文件

阐明:在应用 registry2.3.1 的话会有一个重大的问题,问题就是在 yaml 或者在命令行通过 ctr 和 crictl 命令拉取镜像时携带的 sha256 值和公有仓库中镜像存储的理论 sha256 不统一,因而会报找不到镜像的问题:not found: not found 的谬误,所以尽量应用 2.7.1 版本以上的镜像,并且 2.7.1 版本以上的仓库反对加密镜像的存储。

docker pull registry:2.7.1

生成证书文件

这里阐明一下:因为 containerd 默认的仓库为 docker.io,因而在创立公有仓库时应用 IP 地址才会在前面的操作中避开它主动连贯到默认仓库的问题,因而在制作证书的这步就要提前思考好该问题,因为在证书制作的过程中 CN 字段的值就要设置为 IP 地址。

# 在集群中某个节点找个地位新建一个文件夹
mkdir docker-registry
cd  docker-registry
mkdir certs
# 生成 2048 位的私钥,也能够生成 4096 位的,看本人需要
openssl genrsa -out Yuan.key 2048
# 生成证书申请文件
openssl req -new -key Yuan.key -subj "/CN=10.131.82.53" -out Yuan.csr
# 将 IP 地址写入一个文件,为了解决上述所说的那个问题
echo subjectAltName = IP:10.131.82.53>extfile.cnf
# 这里的 ca 我就应用了集群自带的,在 /etc/kubernetes/pki/ 下
openssl x509 -req  -in Yuan.csr -CA ca.crt -CAkey ca.key -CAcreateserial -extfile extfile.cnf -out Yuan.crt -days 5000  
# 查看证书信息
openssl x509 -in Yuan.crt -noout -text
# 将生存的证书信息追加到零碎的证书管理文件后
cat Yuan.crt >> /etc/pki/tls/certs/ca-bundle.crt

在大略两头的地位会看到一个相似下图的信息:

不然会报如下的谬误:

x509: cannot validate certificate for 10.131.82.53 because it doesn't contain any IP SANs

生成明码认证文件

yum install httpd-tools
mkdir auth
htpasswd -Bbn Yuan Abcd123456 > /home/docker-registry/auth/htpasswd

部署公有仓库

编写部署文件

docker-registry.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: docker-registry
  namespace: default
spec:
  selector:
    matchLabels:
      app: docker-registry
    spec:
      nodeSelector:
        kubernetes.io/hostname: master1
      containers:
      - name: docker-registry
        image: docker.io/library/registry:2.3.1
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 8443
        env:
        - name: REGISTRY_HTTP_ADDR
          value: "0.0.0.0:8443"
        - name: REGISTRY_HTTP_TLS_CERTIFICATE
          value: "/certs/Yuan.crt"
        - name: REGISTRY_HTTP_TLS_KEY
          value: "/certs/Yuan.key"
        - name: REGISTRY_AUTH
          value: "htpasswd"
        - name: REGISTRY_AUTH_HTPASSWD_PATH
          value: "/auth/htpasswd"
        - name: REGISTRY_AUTH_HTPASSWD_REALM
          value: "Registry Realm"
        volumeMounts:
        - name: reg-data
          mountPath: /vat/lib/registry
        - name: reg-auth
          mountPath: /auth
        - name: reg-certs
          mountPath: /certs
      volumes:
      - name: reg-data
        hostPath:
          path: /home/docker-registry/images
      - name: reg-auth
        hostPath:
          path: /home/docker-registry/auth
      - name: reg-certs
        hostPath:
          path: /home/docker-registry/certs
---
apiVersion: v1
kind: Service
metadata:
  name: docker-registry
  namespace: default
spec:
  type: NodePort
  ports:
  - port: 8443
    targetPort: 8443
    nodePort: 443
    protocol: TCP
  selector:
    app: docker-registry

部署公有仓库

kubectl apply -f docker-registry.yaml
#如果报错如下
Invalid value: 443: provided port is not in the valid range. The range of valid ports is 30000-32767
#解决办法为批改 apiserver 的启动参数
vim /etc/kubernetes/manifests/kube-apiserver.yaml
# 增加如下配置
- --service-node-port-range=1-65535

curl 拜访仓库

# 查看仓库信息
curl -k -u Yuan:Abcd123456 -X GET https://10.131.82.53:443/v2/_catalog

在另一台机器 docker 登陆

docker login 10.131.82.53:443 -u Yuan -p Abcd123456
# 报错如下
Error response from daemon: Get https://10.131.82.53:443/v2/: x509: certificate signed by unknown authority
# 解决办法如下
vi /etc/docker/daemon.json
# 增加
{"insecure-registries": ["10.131.82.53:443"]
}
systemctl daemon-reload
systemctl restart docker
# push 镜像到仓库
docker tag nginx:v1 10.131.82.53:443/nginx:v1
docker push 10.131.82.53:443/nginx:v1

# 从仓库 pull 镜像
docker pull 10.131.82.53:443/nginx:v1

curl 查看仓库中的镜像

# 查看仓库中镜像
curl -k -u Yuan:Abcd123456 -X GET https://10.131.82.53:443/v2/nginx/tags/list

ctr 命令 push 镜像(crictl 没有 push 命令)

# 查看本地仓库的镜像
ctr -n k8s.io i ls -q
# 任意选一个批改 tag
ctr -n k8s.io tag docker.io/foo-apiserver:latest 10.131.82.53:443/foo-apiserver:latest
# push 镜像到仓库
ctr -n k8s.io push 10.131.82.53:443/foo-apiserver:latest -k --user Yuan:Abcd123456

ctr 命令 pull 镜像

# 从仓库 pull 镜像
ctr i pull 10.131.82.53:443/foo-apiserver:latest --user Yuan:Abcd123456

crictl 命令 pull 镜像

# 从仓库 pull 镜像
crictl pull 10.131.82.53:443/foo-apiserver:latest --creds Yuan:Abcd123456
# 如果应用 registry2.3.1 版本镜像仓库时会报错如下
pulling image: rpc error:  code = NotFound desc = failed to pull and unpack image: ...sha256:2f...... not found: not found
# 因为 crictl 命令无奈跳过 ssl 认证,因而会报错如下
x509: certificate signed by unknown authority
# 则须要批改 /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://registry-1.docker.io"]
        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."10.131.82.53:443"]
          endpoint = ["https://10.131.82.53:443"]
      [plugins."io.containerd.grpc.v1.cri".registry.configs]
        [plugins."io.containerd.grpc.v1.cri".registry.configs."10.131.82.53:443".tls]
          insecure_skip_verify = true
       [plugins."io.containerd.grpc.v1.cri".registry.configs]
         [plugins."io.containerd.grpc.v1.cri".registry.configs."10.131.82.53:443".auth]
           username = "Yuan"
           password = "Abcd123456"

至此,咱们曾经实现了根本所有的验证工作,上面就写一个 yaml 文件验证一下咱们搭建的公有仓库是否能失常提供服务

部署利用验证公有仓库

编写部署利用的 Pod 的 yaml 文件

pod-pull-test.yaml

apiVersion: v1
kind: Pod
metadata:
  name: pod-pull-test
spec:
  nodeSelector:
    kubernetes.io/hostname: master1
  containers:
  - name: pod-pull-test
    image: 10.131.82.53:443/nginx:v1
    imagePullPolicy: Always
  imagePullSecrets:
  - name: registrykey

其中最初两行是拜访仓库的服务地址及认证信息

kubectl create secret docker-registry registrykey --docker-server=10.131.82.53:443 --docker-username=Yuan --docker-password=Abcd123456 --docker-email=Yuan_sr@163.com

通过执行 kubectl apply -f pod-pull-test.yaml 即可从公有仓库拉取镜像部署利用

正文完
 0