随手 : 不怎么优雅的 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 : 用于定义敏感存储,如密码、证书等
相关推荐
哎呦没17 分钟前
SpringBoot框架下的资产管理自动化
java·spring boot·后端
2401_8576009520 分钟前
SpringBoot框架的企业资产管理自动化
spring boot·后端·自动化
NiNg_1_2344 小时前
SpringBoot整合SpringSecurity实现密码加密解密、登录认证退出功能
java·spring boot·后端
Chrikk6 小时前
Go-性能调优实战案例
开发语言·后端·golang
幼儿园老大*6 小时前
Go的环境搭建以及GoLand安装教程
开发语言·经验分享·后端·golang·go
canyuemanyue6 小时前
go语言连续监控事件并回调处理
开发语言·后端·golang
杜杜的man6 小时前
【go从零单排】go语言中的指针
开发语言·后端·golang
南猿北者7 小时前
docker容器
docker·容器
二十雨辰7 小时前
[linux]docker基础
linux·运维·docker
customer088 小时前
【开源免费】基于SpringBoot+Vue.JS周边产品销售网站(JAVA毕业设计)
java·vue.js·spring boot·后端·spring cloud·java-ee·开源