DevOps-持续集成持续部署二
时间:2023-05-02 15:07:01
实践(K8s自动化构建NodeJS、JAVA项目)
整套流程
1. 代码仓库创建项目 2. 开发代码逻辑 3. push 到 gitlab 后执行构建 3.1 自动构建 3.1.1 获取分支使用自己的变量 Env.gitlabBranch 3.2 手动构建 3.2.1 获取分支使用 BRANCH (需要创建) 3.3 定时构建 4. jenkins 调k8s 创建 pod 执行构建 4.1 代码编译 4.2 代码扫描 5. 根据 Dockerfile 产生我们想要的镜像 5.1 放用项目的根目录 5.1.1 需要代码 TAG 5.1.2 需要 Dockerfile --- 放在项目根目录中 5.1.3 需要 Harbor 地址 5.1.4 需要 Harbor registry 5.1.5 需要 应用名称 5.2 放在 gitlab 统一管理 5.3 每个 job 配置单独的变量 5.3.1 jar、war 放入
基本镜像 5.3.2 html 放入 nginx 5.3.3 js 放入工作目录 node server.js 6. push 镜像到镜像仓库 7. jenkins slave kubelet 运行 set 命令 更新我们的镜像 7.1 只更新镜像 7.2 helm 更新 8. 判断程序是否启动 8.1 -w 参数去判断 8.2 写脚本来判断 9. 程序启动后,调用测试job(若有自动化测试,第八步可以取消)
流水线不建: 1. jenkins 调用镜像仓库接口,返回镜像 tag 2. 选择对应的 tag 发布到其他环境
创建JOB(Blue Ocean 下创建jenkinsfile中文不能有,否则不能保存)
注意:jenkinsfile中文不能保存,否则不能保存,需要修改jenkins配置让blueocean支持中文
手动获取设置在上面branch,现在设置自动触发获取,后期增加判断,只执行其中一个
Jenkinsfile
pipeline {
agent {
kubernetes {
cloud 'kubernetes-default' // 集群名 slaveConnectTimeout 1200 yaml ''' // 引用yaml文件 apiVersion: v1 kind: Pod metadata: name: jenkins spec: containers:
- args
:
[\'
$
(
JENKINS_SECRET
)\'
, \'
$
(
JENKINS_NAME
)\'
]
image
:
'registry.cn-beijing.aliyuncs.com/citools/jnlp:alpine'
name
: jnlp
imagePullPolicy
: IfNotPresent
volumeMounts
:
- mountPath
:
"/etc/localtime"
name
:
"volume-2"
readOnly
:
false
- mountPath
:
"/etc/hosts"
name
:
"volume-hosts"
readOnly
:
false
- command
:
-
"cat"
env
:
- name
:
"LANGUAGE"
value
:
"en_US:en"
- name
:
"LC_ALL"
value
:
"en_US.UTF-8"
- name
:
"LANG"
value
:
"en_US.UTF-8"
// nodejs使用镜像
image
:
"registry.cn-beijing.aliyuncs.com/citools/node:php7.1-node10"
imagePullPolicy
:
"IfNotPresent"
name
:
"build"
tty
:
true
volumeMounts
:
- mountPath
:
"/etc/localtime"
name
:
"volume-2"
readOnly
:
false
- mountPath
:
"/root/.m2/"
name
:
"volume-maven-repo"
readOnly
:
false
- mountPath
:
"/etc/hosts"
name
:
"volume-hosts"
readOnly
:
false
- command
:
-
"cat"
env
:
- name
:
"LANGUAGE"
value
:
"en_US:en"
- name
:
"LC_ALL"
value
:
"en_US.UTF-8"
- name
:
"LANG"
value
:
"en_US.UTF-8"
image
:
"registry.cn-beijing.aliyuncs.com/citools/kubectl:self-1.17"
imagePullPolicy
:
"IfNotPresent"
name
:
"kubectl"
tty
:
true
volumeMounts
:
- mountPath
:
"/etc/localtime"
name
:
"volume-2"
readOnly
:
false
- mountPath
:
"/var/run/docker.sock"
name
:
"volume-docker"
readOnly
:
false
- mountPath
:
"/mnt/.kube/"
name
:
"volume-kubeconfig"
readOnly
:
false
- mountPath
:
"/etc/hosts"
name
:
"volume-hosts"
readOnly
:
false
- command
:
-
"cat"
env
:
- name
:
"LANGUAGE"
value
:
"en_US:en"
- name
:
"LC_ALL"
value
:
"en_US.UTF-8"
- name
:
"LANG"
value
:
"en_US.UTF-8"
image
:
"registry.cn-beijing.aliyuncs.com/citools/docker:19.03.9-git"
imagePullPolicy
:
"IfNotPresent"
name
:
"docker"
tty
:
true
volumeMounts
:
- mountPath
:
"/etc/localtime"
name
:
"volume-2"
readOnly
:
false
- mountPath
:
"/var/run/docker.sock"
name
:
"volume-docker"
readOnly
:
false
- mountPath
:
"/etc/hosts"
name
:
"volume-hosts"
readOnly
:
false
restartPolicy
:
"Never"
securityContext
:
{
}
volumes
:
- hostPath
:
path
:
"/var/run/docker.sock"
name
:
"volume-docker"
- hostPath
:
path
:
"/usr/share/zoneinfo/Asia/Shanghai"
name
:
"volume-2"
- hostPath
:
path
:
"/etc/hosts"
name
:
"volume-hosts"
- name
:
"volume-maven-repo"
hostPath
:
path
:
"/opt/m2"
// java默认目录
- name
:
"volume-kubeconfig"
secret
:
secretName
:
"multi-kube-config"
// 存放集群yaml信息
'''
}
} stages
{
stage
(
'pulling Code'
)
{
parallel
{
stage
(
'pulling Code'
)
{
when
{
expression
{
env
.gitlabBranch
==
null
}
} steps
{
git
(branch
:
"${BRANCH}"
,
credentialsId
:
'310275da-b864-4f65-9d02-8963529b34ea'
,
url
:
"${REPO_URL}"
)
}
}
stage
(
'pulling Code by trigger'
)
{
when
{
expression
{
env
.gitlabBranch
!=
null
}
} steps
{
git
(url
:
"${REPO_URL}"
,
branch
: env
.gitlabBranch
,
credentialsId
:
'310275da-b864-4f65-9d02-8963529b34ea'
)
}
}
}
}
stage
(
'initConfiguration'
)
{
steps
{
script
{
CommitID
=
sh
(returnStdout
:
true
,
script
:
"git log -n 1 --pretty=format:'%h'"
)
.
trim
(
) CommitMessage
=
sh
(returnStdout
:
true
,
script
:
"git log -1 --pretty=format:'%h : %an %s'"
)
.
trim
(
) def curDate
=
sh
(script
:
"date '+%Y%m%d-%H%M%S'"
,
returnStdout
:
true
)
.
trim
(
)
TAG
= curDate
[
0.
.14
]
+
"-"
+ CommitID
+
"-"
+
BRANCH
}
}
}
stage
(
'Building'
)
{
parallel
{
stage
(
'Building'
)
{
steps
{
container
(name
:
'build'
)
{
sh
""" echo
"Building Project..." $
{
BUILD_COMMAND
}
"""
}
}
}
stage
(
'Scan Code'
)
{
steps
{
sh
'echo "Scan Code"'
}
}
}
}
stage
(
'Build image'
)
{
steps
{
withCredentials
(
[
usernamePassword
(credentialsId
:
'bb2328f7-aac8-404c-9c66-77058a525fcf'
,
passwordVariable
:
'Password'
,
usernameVariable
:
'Username'
)
]
)
{
container
(name
:
'docker'
)
{
sh
""" docker build
-t $
{
HARBOR_ADDRESS
}
/$
{
REGISTRY_DIR
}
/$
{
IMAGE_NAME
}
:$
{
TAG
}
. docker login
-u $
{
Username
}
-p $
{
Password
} $
{
HARBOR_ADDRESS
} docker push $
{
HARBOR_ADDRESS
}
/$
{
REGISTRY_DIR
}
/$
{
IMAGE_NAME
}
:$
{
TAG
}
"""
}
}
}
}
stage
(
'Deploy'
)
{
when
{
expression
{
DEPLOY
!=
"false"
}
} steps
{
container
(name
:
'kubectl'
)
{
sh
""" cat $
{
KUBECONFIG_PATH
}
>
/tmp
/
1
.yaml
/usr
/local
/bin
/kubectl config use
-context $
{
CLUSTER
}
--kubeconfig
=
/tmp
/
1
.yaml
export
KUBECONFIG
=
/tmp
/
1
.yaml
/usr
/local
/bin
/kubectl
set image $
{
DEPLOY_TYPE
}
-l $
{
DEPLOY_LABEL
} $
{
CONTAINER_NAME
}
=$
{
HARBOR_ADDRESS
}
/$
{
REGISTRY_DIR
}
/$
{
IMAGE_NAME
}
:$
{
TAG
}
-n $
{
NAMESPACE
}
"""
}
}
}
} environment
{
CommitID
=
'' CommitMessage
=
''
TAG
=
''
}
}
Jenkins 调用k8s集群
需要使用Jenkins的kubernetes-plugin
如果Jenkins服务器在kubernetes集群之外,我们准备以下文件才能从外面连接到kubernetes集群。
制作集群证书
- 获取证书
[root@master pki]# cat /root/.kube/config
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUMvakNDQWVhZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRJeU1EWXhNVEExTkRBME9Wb1hEVE15TURZd09EQTFOREEwT1Zvd0ZURVRNQkVHQTFVRQpBeE1LYTNWaVpYSnVaWFJsY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBS0ZqCk0yYWxQV3pEbHhGUzZ0QTVMcnZQSGQ0UzJCVXZPQ3ZITDl1VlkyUG5wZVZnN3ZET2czUXF4d1lXTWlTQWVZaDcKcUtzVWxuV0l4d1FnUmQwbGN2b3djL3pSSkxIOWRxR0gvOHFWSVMzWXdOUzFCWm1OaEJpVy9JZ042UmV3NW5tMwpPZFQ3Rm9EYWc4VE9IWkdHbzVLNU13akwrdER2aVR1V2g3SXlsRnNOcHlmYjBkaE15cXlRc1NMSUczcXpRWlRTCnNhUnlMN1ZSOS9VRGgxekUU2dNaUtpYnozNDQzY2QKR1BGZGdCU2xkYzdKT2tqUXFpUGE4d1dpcHFOWUJIRlJNc2RNM2dOT3FRT1ByRlNMWXpUUit4RDI3YXZqZ3VBeQoyaXlqRE5lS05KM1FHZ0trTnF1N0k4Q2JBQ1VsMG9scjN5VWNSdFl2TU1FSXZla0syMXNsK3N6Z3A2VHprWmFjCkxKNDBvV2c2aVhFMG5IdG5hclY3SkhyRzQyMkh0a2JtR2dRclJEQUpERkU1MGFLMWNqSVFRNnRjSURLV05NNVQKZDNrPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
server: https://10.0.12.14:6443
name: kubernetes
contexts:
- context:
cluster: kubernetes
namespace: jenkins
user: kubernetes-admin
name: kubernetes-admin@kubernetes
current-context: kubernetes-admin@kubernetes
kind: Config
preferences: {
}
users:
- name: kubernetes-admin
user:
client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURJVENDQWdtZ0F3SUJBZ0lJSzJueWUweFdUc0V3RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFR0ExVUUKQXhNS2EzVmlaWEp1WlhSbGN6QWVGdzB5TWpBMk1URXdOVFF3TkRsYUZ3MHlNekEyTVRFd05UUXdOVEZhTURReApGekFWQmdOVkJBb1REbk41YzNSbGJUcHRZWE4wWlhKek1Sa3dGd1lEVlFRREV4QnJkV0psY201bGRHVnpMV0ZrCmJXbHVNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJQVFIL0JBSXdBREFmQmdOVkhTTUVHREFXZ0JUTkFSbjFhenJSVlhxODFvZEtmdjkvNklIeQo2ekFOQmdrcWhraUc5dzBCQVFzRkFBT0NBUUVBamlwS20zTnFFVHcrSWVJdStIQWJVZWVNYWVIWDJtU2VOazNiCkRPaDMrYlJvL0RON0g0SjZFZmw0N1dKajN6ZkVRWThlSDBHUEFqbjN2VHR5OEFQM0t0V3FzVXErZTRJRWFFNE8KTG9uZWYzYTdkdDNMYWk1cmFoTU5veEdjbnArUEdBTDlLcXRWcFRsKzFKbmtlZVIyOTFOZTN6bXQrZktuSk16dQp2eVYvUy9DY1d2NnBJbm1hYjN1aDJRaFZMTlp5VWJKaC9leDg4bmJZVDZiNHRCZ2EzTytjQ0t0TytNK1RONTJhClEyaGRmRnNDcWpJS3RodmcydkcyenZzblRJRkRRaVI5VFFUZkJZVWdaM0NERU5lRU9kUlRTbUVhdU5peWl2L0kKVFBpbkRqbDEvd0FlSFNISnBxeU9wU1l3WXpvSlBvMS8zWEtDTHBjTmZHcXpFWXRkekE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFcEFJQkFBS0NBUUVBK2N2RlFOMnc5b0Y5Z3RBdDRPYkY1NWs3Vll4Z3ljVTBVVnlRcGNQYkFRdG1iellDCno1WXBJNGlBSFZldnJxVGNwOTJndlp0ajdVNk1nc2s5U3B1dDNPSHYzbENsdDV1Z091V0Y5bW1IdDVYUHNBeHEKVnpsOHMxdFhxVDZwM2IrRVZhWVWNWQW9HQkFQelgKRDFvOFIxenAvTmVEQUFJZTFvYWR6SmJWalZ5bUFRd1BBNzZXbmhrV3JPNkVzR2thZnFZWStmdTUzYzhJcm5XcgpMNy9RaFdlU0UyZkJOTUZ6dXkrdTU2YWRXa1drVTBHWHN0eUs2ejBXcG1LYXVWQmtQaVJtZ2RyTWlEWUdRNE5GCk1CK2tCMDF5UUtiVFArU3R1Mm9zVHo4aWQxaTdJYUFOR2NhdlpNaEhBb0dCQVBYdHpXSDFjMjErYXI3WDB3ZjIKbGJoUnZnTWxTN01rRUV1b1FqeGNSRkx4cklsV3ZoRG9wT0xWYUFjczByRlJVMkdJR3hkcHVBdDhveVVNV1RQdwpWZFFsL3dPWmExM0V3Ykk3QWlYNVg1S2d3eHRjbkxrVlBBL1ZhYnFHeE1BTHJDT0I1d3dtWXZvTTRwaVNCTWkrCjRDYmp2bHFRdytvbUlDZFk0OHpQR3JTWkFvR0FkQUZrVE4xOVRKY2E1L0oxN1lNaW9HOEVNR3hZeUpwdHZvK2gKQXkvdDU4cnNteDhNSlp6L1lNdnkzbGtmK042ZDFPVXZLazNNOTRFaElDaVlRTzROZzBvM2hNMkxYb3FQbkhleQptOWV0S01FY28vOGphVXdrNnVTUlRjY3I4OFdaOGorclhja1BoS3dZRjdLekRRUGRDbEM4SjFaejlhVWVQMlhqClhyS1loZjhDZ1lBazZkTFlRWFpaaGExUVg1UzhMNjkrV1R5Y0k5aTNxVW1QckxZbkNsTjZzU2FFOTVXT3BNWDgKVnFTRnRZNEl5d0VHeFZvS05HblcrTnFMVTd3VU9OOGJNZ2FtUHBxMm1VbUlKdi9LZWYyb2wwS3VEZlRTSnNUawpORFh1TGo0N1lTdHQrd05YdVhHMUkrMTQzNXR1MThhSDI4b25VZ1dvN0ZvZ0FVay8xQ3FCT2c9PQotLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQo=
- 将certificate-authority-data的内容复制出来在本地制作kube-ca.crt
mkdir ~/kube-cert
[root@master pki]# echo LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUMvakNDQWVhZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRJeU1EWXhNVEExTkRBME9Wb1hEVE15TURZd09EQTFOREEwT1Zvd0ZURVRNQkVHQTFVRQpBeE1LYTNWaVpYSnVaWFJsY3pDQVE81cDJEajA1ZFZLYkFTZ2xPWjlIRXIzcUprdFBEb1VuCmFGSUdZR01Ra0tpVTA2UUxYbjNrRGk4SzkycngvR3lxdzk5NWdHSEJQcitEUFhmc0ZUU2dNaUtpYnozNDQzY2QKR1BGZGdCU2xkYzdKT2tqUXFpUGE4d1dpcHFOWUJIRlJNc2RNM2dOT3FRT1ByRlNMWXpUUit4RDI3YXZqZ3VBeQoyaXlqRE5lS05KM1FHZ0trTnF1N0k4Q2JBQ1VsMG9scjN5VWNSdFl2TU1FSXZla0syMXNsK3N6Z3A2VHprWmFjCkxKNDBvV2c2aVhFMG5IdG5hclY3SkhyRzQyMkh0a2JtR2dRclJEQUpERkU1MGFLMWNqSVFRNnRjSURLV05NNVQKZDNrPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg== | base64 -d > ~/kube-cert/kube-ca.crt
- 将client-certificate-data的内容复制出来在本地制作kube-client.crt
[root@master pki]# echo LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURJVENDQWdtZ0F3SUJBZ0lJSzJueWUweFdUc0V3RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFR0ExVUUKQXhNS2EzVmlaWEp1WlhSbGN6QWVGdzB5TWpBMk1URXdOVFF3TkRsYUZ3MHlNekEyTVRFd05UUXdOVEZhTURReApGekFWQmdOVkJBb1REbk41YzNSbGJUcHRZWE4wWlhKek1Sa3dGd1lEVlFRREV4QnJkV0psY201bGRHVnpMV0ZrCmJXbHVNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0R5OEFQM0t0V3FzVXErZTRJRWFFNE8KTG9uZWYzYTdkdDNMYWk1cmFoTU5veEdjbnArUEdBTDlLcXRWcFRsKzFKbmtlZVIyOTFOZTN6bXQrZktuSk16dQp2eVYvUy9DY1d2NnBJbm1hYjN1aDJRaFZMTlp5VWJKaC9leDg4bmJZVDZiNHRCZ2EzTytjQ0t0TytNK1RONTJhClEyaGRmRnNDcWpJS3RodmcydkcyenZzblRJRkRRaVI5VFFUZkJZVWdaM0NERU5lRU9kUlRTbUVhdU5peWl2L0kKVFBpbkRqbDEvd0FlSFNISnBxeU9wU1l3WXpvSlBvMS8zWEtDTHBjTmZHcXpFWXRkekE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg== | base64 -d > ~/kube-cert/kube-client.crt
- 将client-key-data的内容复制出来在本地制作kube-client.key
[root@master pki]# echo LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFcEFJQkFBS0NBUUVBK2N2RlFOMnc5b0Y5Z3RBdDRPYkY1NWs3Vll4Z3ljVTBVVnlRcGNQYkFRdG1iellDCno1WXBJNGlBSFZldnJxVGNwOTJndlp0ajdVNk1nc2s5U3B1dDNPSHYzbENsdDV1Z091V0Y5bW1IdDVYUHNBeHEKVnpsOHMxdFhxVDZwM2IrRVZhWVBsTUN1dTZENGZUTmRCR2szNThTMUpjeGppRlpRT1pObWpBMHc4YlpoaGV0OQo1Y3JwZEx4emozWlAvK0lQeEZlK3dCRjdMUGJicFc1WVA1OXVyaKQXkvdDU4cnNteDhNSlp6L1lNdnkzbGtmK042ZDFPVXZLazNNOTRFaElDaVlRTzROZzBvM2hNMkxYb3FQbkhleQptOWV0S01FY28vOGphVXdrNnVTUlRjY3I4OFdaOGorclhja1BoS3dZRjdLekRRUGRDbEM4SjFaejlhVWVQMlhqClhyS1loZjhDZ1lBazZkTFlRWFpaaGExUVg1UzhMNjkrV1R5Y0k5aTNxVW1QckxZbkNsTjZzU2FFOTVXT3BNWDgKVnFTRnRZNEl5d0VHeFZvS05HblcrTnFMVTd3VU9OOGJNZ2FtUHBxMm1VbUlKdi9LZWYyb2wwS3VEZlRTSnNUawpORFh1TGo0N1lTdHQrd05YdVhHMUkrMTQzNXR1MThhSDI4b25VZ1dvN0ZvZ0FVay8xQ3FCT2c9PQotLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQo= | base64 -d > ~/kube-cert/kube-client.key
- 创建证书,创建证书需要设置密码,设置的密码不要忘记
[root@master pki]# openssl pkcs12 -export -out ~/kube-cert/kube-cert.pfx -inkey ~/kube-cert/kube-client.key -in ~/kube-cert/kube-client.crt -certfile ~/kube-cert/kube-ca.crt
Enter Export Password:
Verifying - Enter Export Password:
[root@master kube-cert]# ll
total 16
-rw-r--r-- 1 root root 1099 Jul 4 14:39 kube-ca.crt
-rw-r--r-- 1 root root 3221 Jul 4 14:43 kube-cert.pfx # jenkins 需要的
-rw-r--r-- 1 root root 1147 Jul 4 14:40 kube-client.crt
-rw-r--r-- 1 root root 1679 Jul 4 14:42 kube-client.key
此时我们创建了4个文件:kube-ca.crt、kube-cert.pfx、kube-client.crt、kube-client.key,其中kube-ca.crt的文件内容在创建Jenkins连接到kubernetes集群时需要用,kube-cert.pfx需要上传到Jenkins的凭据配置中
新建全局凭证
password 为创建pfx文件时输入的密码
jenkins添加集群设置
打开集群内通讯的端口50000(默认)
需要注意
Kubernetes 地址:kubernetes服务地址,也就是apiserver的地址,一般是master节点NodeIP+6443端口,证书里会含合法的地址列表,比如10.1.0.1, 192.168.122.3, centos7-k8s-master, kubernetes, kubernetes.default, kubernetes.default.svc, kubernetes.default.svc.cluster.local,我的Jenkins服务器和kubernetes集群不在一个网段,所以我在Host文件加入了192.168.0.10 centos7-k8s-master,然后在192.168.0.10里做了端口映射ssh -CfNg -L 6443:192.168.122.3:6443 root@127.0.0.1,才能验证通过。
创建jenkinsfile中所用集群配置对应的secret和namespace和标签等
[root@master kube-cert]# kubectl create ns java-test --kubeconfig=./multi-cluster.yaml
namespace/java-test created
[root@master kube-cert]# kubectl create secret generic multi-kube-config --from-file=/root/kube-cert/multi-cluster.yaml
secret/multi-kube-config created
[root@master kube-cert]# kubectl get secrets
NAME TYPE DATA AGE
default-token-z8qwx kubernetes.io/service-account-token 3 3m33s
multi-kube-config Opaque 1 4s
[root@master kube-cert]# kubectl label node worker-1 build=true
node/worker-1 labeled
# 配置镜像仓库secret
[root@master kube-cert]# docker-registry NAME --docker-username=user --docker-password=password --docker-email=email [--docker-server=string] [--from-literal=key1=value1] [--dry-run]
[root@master kube-cert]# docker login --username=条约音符 registry.cn-hangzhou.aliyuncs.com
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
使用的nodejs-demo下载地址
元器件数据手册
、IC替代型号,打造电子元器件IC百科大全!