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

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

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

一. 前言

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

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

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

java 复制代码
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/...

java 复制代码
// 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 <SECRET_NAME> --from-file=<KEY>=<FILE_PATH>
// - 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

扩展点一 : 通过文件导入

java 复制代码
// 集群主节点中通过 config.json 生成 secret
kubectl create secret generic regcred \
    --from-file=.dockerconfigjson=<path/to/.docker/config.json> \
    --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 测试

java 复制代码
// 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

PS : 为什么会失败

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

java 复制代码
// 查询拉取的镜像包
# 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   <none>           <none>
quickdemotest-6cb56cd9f9-mczf5   1/1     Running            0             18m    172.18.0.3   izuf60v56wumor1xcrenckz   <none>           <none>

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

四. Kubernetes deployment 中进行配置

java 复制代码
// 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 中的变量替换,这里可以忽略

总结

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

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

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

  • Deployment : 用于定义一个应用的部署配置,包括副本数等
  • Pod :用于定义 Pod 单元,创建和管理 Pod 副本
  • Secret : 用于定义敏感存储,如密码、证书等
相关推荐
爱勇宝3 小时前
第 1 章:别把“需求文档”当成真正的需求
前端·后端·程序员
IT_陈寒8 小时前
闭包陷阱让我加了两天班,JavaScript你真行
前端·人工智能·后端
程序员老油条8 小时前
WSL2 + Docker Desktop:Windows 下的完美 Java 开发环境
java·windows·docker·wsl2
易协同低代码9 小时前
通达OA核心类库TD类深度解析
后端
Gopher_HBo9 小时前
Go语言学习笔记(十八)Gin处理Session
后端
谭光志9 小时前
工具塞满上下文窗口怎么办?深度拆解 AI Agent Tool Search 按需加载实现原理
前端·后端·ai编程
她说..10 小时前
Java 默认值设置方式
java·开发语言·后端·springboot
foggyprojects10 小时前
从0开始,一句话启动AI DataAgent
后端·数据分析·ai编程
郡杰10 小时前
一些基础和问题解决
后端
陈随易10 小时前
前端项目部署只要30秒
前端·后端·程序员