👈👈👈 欢迎点赞收藏关注哟
首先分享之前的所有文章 >>>> 😜😜😜
文章合集 : 🎁 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
这一段官方文档上面有很详细的介绍,以下是自己尝试的一些记录 :
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 : 用于定义敏感存储,如密码、证书等