随手 : 不怎么优雅的 K8S 拉取 Docker 私服镜像流程

2023年 10月 6日 70.3k 0

👈👈👈 欢迎点赞收藏关注哟

首先分享之前的所有文章 >>>> 😜😜😜
文章合集 : 🎁 juejin.cn/post/694164…
Github : 👉 github.com/black-ant
CASE 备份 : 👉 gitee.com/antblack/ca…

一. 前言

对于非专业运维来说,处理这些基础设施的时候还是很吃力了,陆陆续续的躺了不少坑,不记下来太对不起花的时间了。

二. 基于命令的私服拉取方式

如果是基于 DevOps 纯 Docker 部署的方式下,一般在执行脚本或者容器中配置即可,这种方式局限性大 :

echo "--- 登录 Docker 私服"
echo $DOCKER_PASSWORD | docker login --username $DOCKER_USERNAME --password-stdin registry.cn-hangzhou.aliyuncs.com

echo "--- 拉取私服镜像"
docker pull registry.cn-hangzhou.aliyuncs.com/antblack/quick_demo:${CI_COMMIT_ID}

echo "--- 运行 Docker 容器"
docker run -p 8080:8080 -d registry.cn-hangzhou.aliyuncs.com/antblack/quick_demo:${CI_COMMIT_ID}

三. Kubernetes 中手动配置 secret 拉取

3.1 创建好 Secret

这一段官方文档上面有很详细的介绍,以下是自己尝试的一些记录 :

kubernetes.io/zh-cn/docs/…

// S1 : 和上面一样,首先登录
echo $DOCKER_PASSWORD | docker login --username $DOCKER_USERNAME --password-stdin registry.cn-hangzhou.aliyuncs.com

// S2 : 登录后,会生成一个 config.json 
# cat ~/.docker/config.json
{
    "auths": {
        "registry.cn-hangzhou.aliyuncs.com": {
            "auth": "MTAxNjk123DQ3OUB123S5jb206e123123IUAxOTk1MDgyNA=="
        }
    }
}

// S3 : 创建 secret 配置 ,这种方式不要登录后再去生成 config 文件
// kubectl create secret generic  --from-file==
// - regcred 为 Secret 名称 ,后续会用到
kubectl create secret generic regcred 
  --docker-server= 
  --docker-username= 
  --docker-password= 
  --docker-email=

// 录入结果 :
secret/regcred created

// S4 : 查看录入数据 :
# kubectl get secret regcred --output=yaml
apiVersion: v1
data:
  .dockerconfigjson: eyJhdXRocyI6eyJyZWdpc3RyeS5jbi1oYW5nemhvdS5hbGl5d2342345jb20vYW50YmxhY2svcXVpY2tfZGVtbyI6eyJ1c2VybmFtZSI6IjEwMTY5MzA0NzlAc1432423dvcmQiOiJ6emchQD123UwODI0IiwiZW1haWwiOiIxMDE2OTMwNDc5QHFxLmNvbSIsImF1dGgiOiJNVEF4Tmprek1EUTNPVUJ4Y1M1amIyMDZlbnBuSVVBeE9UazFNRGd5TkE9PSJ9fX0=
kind: Secret
metadata:
  creationTimestamp: "2023-10-06T02:54:47Z"
  name: regcred
  namespace: default
  resourceVersion: "36226"
  uid: 36b8b113-86e3-48a3-80f7-0be4a76f2936
type: kubernetes.io/dockerconfigjson



// S5 : 查看dockerconfigjson 编码的数据
kubectl get secret regcred --output="jsonpath={.data..dockerconfigjson}" | base64 --decode

扩展点一 : 通过文件导入

// 集群主节点中通过 config.json 生成 secret
kubectl create secret generic regcred 
    --from-file=.dockerconfigjson= 
    --type=kubernetes.io/dockerconfigjson

扩展点二 : 更复杂的配置方式

  • --generator=secret/v1beta1/service-account-token:生成一个与 ServiceAccount 相关的 Secret,包含了用于访问 Kubernetes API 的令牌
  • --append-hash:创建一个带有随机哈希的 Secret 名称。这可以确保 Secret 名称在多次创建时是唯一的
  • --type=TYPE:指定 Secret 的类型。默认值是 "Opaque",通用的 Secret 类型。其他可能的值包括 "kubernetes.io/basic-auth"、"kubernetes.io/dockerconfigjson"
  • --dry-run=client:执行命令的预演版本,不会实际创建 Secret,而只是验证配置是否有效
  • --from-file=KEY=FILE:从文件中导入数据到 Secret。
  • --from-literal=KEY=VALUE:从命令行直接指定数据项

3.2 手动拉取 Image 测试


// S1 : 创建 pods 配置 ,创建一个 pods 配置,关联上面的 secret 配置
apiVersion: v1
kind: Pod
metadata:
  name: private-reg
spec:
  containers:
  - name: private-reg-container
    image: registry.cn-hangzhou.aliyuncs.com/antblack/quick_demo
  imagePullSecrets:
  - name: regcred

// S2 : 创建上述文件后上传
touch my-private-reg-pod.yaml
vim my-private-reg-pod.yaml
[录入S4的数据]


// S3 : 导入配置
kubectl apply -f my-private-reg-pod.yaml

// S4 : 查看配置
kubectl get pod private-reg
kubectl describe pod private-reg

image.png

PS : 为什么会失败

PS: 这里由于我的 JAR_NAME 是变量,所以启用时会发生异常,但是拉取镜像实际上是成功了

// 查询拉取的镜像包
# kubectl get pods -o wide
NAME                             READY   STATUS             RESTARTS      AGE    IP           NODE                      NOMINATED NODE   READINESS GATES
private-reg                      0/1     CrashLoopBackOff   6 (73s ago)   7m4s   172.18.0.4   izuf60v56wumor1xcrenckz              
quickdemotest-6cb56cd9f9-mczf5   1/1     Running            0             18m    172.18.0.3   izuf60v56wumor1xcrenckz              

// 查询镜像启动失败的原因
# kubectl logs private-reg 
Error: Unable to access jarfile .jar


image.png

四. Kubernetes deployment 中进行配置

// S1 : Deployment 配置文件
apiVersion: apps/v1
kind: Deployment
metadata:
  name: ${appName}
  labels:
    app: ${appName}
spec:
  replicas: ${pods}
  selector:
    matchLabels:
      app: ${appName}
  template:
    metadata:
      labels:
        app: ${appName}
    spec:
      containers:
        - name: ${imageName}
          image: ${commitId}
          imagePullPolicy: Always
          ports:
            - name: http
              containerPort: 8080
              protocol: TCP
          env:
            - name: JAR_NAME
              value: ${jarName}
      imagePullSecrets:
        - name: regcred
  • 上文第二步创建了一个 regcred 的 secret ,配置文件中的 imagePullSecrets 即为关键
  • ${} 是 DevOps 中的变量替换,这里可以忽略

image.png

总结

太菜了,摸索了半天才好不容易跑通 , 不确定是否还有其他的解决方式 , 总的来说就2个步骤 :

  • 创建 K8S 对应的 secret 文件
  • 在使用 Docker 私域的场景中配置 imagePullSecrets

补充知识点 : Deployment 文件的几种类型

  • Deployment : 用于定义一个应用的部署配置,包括副本数等
  • Pod :用于定义 Pod 单元,创建和管理 Pod 副本
  • Secret : 用于定义敏感存储,如密码、证书等

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论