此处不阐述gitlab jenkins k8s harbor 安装过程
jenkins:工具集成平台
gitlab: 软件管理平台
部署这两个服务的联动,需要经过ssh验证。
1、首先我们需要在gitlab上绑定jenkins服务器的ssh公钥,这里我们使用的是root用户的公私钥,切记生产环境是不允许随便用root的
[root@jenkins ~]# ssh-keygen -t rsa
//然后不输入只回车会生成一对公私钥
默认在/root/.ssh/目录里
[root@jenkins ~]# cat /root/.ssh/id_rsa.pub
//查看公钥并复制
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDMA4+je3NsxZrF2v8TPLXJp1ejwy1YokXipEFyGVNo5IbtkiBDwBLOAl5i7yromY8YGgoNNriE2g89IM/44BGC5UDCokQ69Ze9Ta9Kynv3/1PDFXIABJJG0f6LsUqt0nKFaFoGz3ZuYAnl6AzLpXEic8DBDrsFk+UGrxvMfSEqHlYO2b7jRXE1HGRnqI/IcVB190cLT1kmBKi7hSqUNBc1cY6t3a6gGiBpp9tc8PW4r/RcLblhAL1LKx8x37NOZkqox8IMh3eM/wtWwAVFlI8XU+sz9akzJOVmd1ArT5Q4w8WA/uVHCDUGVI/fli/ZRv+mNZyF3EH26runctb5LkCT root@jenkins
使用git clone git@youIP:guohs/tomcat.git
安装插件
先进入到之前查看插件的地方
系统设置----插件管理—可用插件—搜索安装需要的插件gitlab-oauth、gitlab-plugin、 windows-slaves、ruby-runt ime、gitlab-hook
地址粘贴进去以后没有报错则没错
如有类似报错 是因为密钥认证关系
在gitlab的主机上生成ssh密钥对
[root@jenkins ~]# ssh-keygen -t rsa
//然后不输入只回车会生成一对公私钥
[root@jenkins ~]# cat /root/.ssh/id_rsa
//查看密钥并复制
下面的这个插件很重要,就是他实现自动化更新的webhook插件,安装过了就会有这条,然后点击这条下面出来的这些东西保持默认就行。同时注意复制
这个里面写的是jenkins构建时候会执行的shell脚本,这个是最重要的,就是他实现了下端kubernetes自动更新容器的操作。
#!/bin/bash
backupcode="/data/$JOB_NAME/$BUILD_NUMBER"
mkdir -p $backupcode #jenkins创建上述目录
chmod 644 "$JENKINS_HOME"/workspace/"$JOB_NAME"/*
rsync -acP "$JENKINS_HOME"/workspace/"$JOB_NAME"/* $backupcode #$JENKINS_HOME和$JOB_NAME同步最新消息
#ssh [email protected] sed -i 's/v1/v2/g' /data/deploy.yaml #更改镜像版本
echo From tomcat/jdk:8 > "$JENKINS_HOME"/workspace/Dockerfile
echo COPY ./"$JOB_NAME"/* /usr/local/apache-tomcat-8.5.38/webapps/ >> "$JENKINS_HOME"/workspace/Dockerfile
docker rmi 200.200.100.83/web/tomcat:v1
docker build -t 200.200.100.83/web/tomcat:v1 /"$JENKINS_HOME"/workspace/.
docker push 200.200.100.83/web/tomcat:v1
$JOB_NAME:项目名称
$BUILD_NUMBER:第几次构建
$JENKINS_HOME:jenkins的家目录
完事以后先别保存,首先复制一下上面的jenkins地址,然后去gitlab上绑定webhook
测试显示下图 的蓝条说明jenkins 已经连通了gitlab
好了,jenkins和gitlab 都已经互相的ssh通过了,然后我们最后需要做的一个ssh是关于jenkins
///注意,这里是从git和jenkins向master节点做免密登录。
vim /usr/lib/systemd/system/docker.service
vim /etc/docker/daemon.json
添加"insecure-registries":[“200.200.100.83”]中harbor主机设置的登录域名,这里的insecure参数如果是写在/usr/lib/systemd/system/docker.service中,如上面harbor主机那样,那么就直接修改/usr/lib/systemd/system/docker.service中该项配置即可,
systemctl daemon-reload
systemctl restart docker
docker-compose start //启动harbor服务
刚开始完k8s,总会遇到很多坑,因为是开源项目,版本总在更新,所以要时刻关注自己使用的版本有哪些不一样的命令和参数。
本次采坑是想让k8s可以在建立pod时可以到私库中拉取镜像。根据官网或网上资料,可以通过创建secret记录私库鉴权信息。具体做法如下:
首先在其中一个node上登录私有仓库(docker 访问私库的配置,这里不做描述)
docker login 200.200.100.83
登录成功后会在/root/.docker目录下生产config.json文件,然后执行如下命令:
cat /root/.docker/config.json | base64 -w 0
该命令会将你的认证信息通过base64编码,生成一个编码之后的字符串。
在kubernetes中的master节点中创建secret.yaml:
apiVersion: v1
data:
.dockerconfigjson: ewoJImF1dGhzIjogewoJCSIyMDAuMjAwLjEwMC44MyI6IHsKCQkJImF1dGgiOiAiWVdSdGFXNDZaM1Z2TkRJNSIKCQl9Cgl9LAoJIkh0dHBIZWFkZXJzIjogewoJCSJVc2VyLUFnZW50IjogIkRvY2tlci1DbGllbnQvMTkuMDMuOCAobGludXgpIgoJfQp9
kind: Secret
metadata:
name: harbor-registry ##自定义名字后面Deployment中引用
type: kubernetes.io/dockerconfigjson
在kubernetes中的master节点创建secret:
kubectl create -f secret.yaml
查看secret是否创建:
kubectl get secret
之后在创建其他元素的时候指定:imagesPullSecrets即可。
例如:
pod:
apiVersion: v1
kind: Pod
metadata:
name: redis-test
containers:
name: redis-test
image: my.registry/redis
imagePullSecrets:
name: myregistrykey
至此是网上和官网提供的可以让k8s启动pod时访问私库的方法。
很多人也是可以使用,但由于k8s一直在更新版本,网上很多资料都是建立在旧版本基础上进行验证,在新版本中一些参数有变更。
本次采坑就是在于编辑secret元素时type和date参数有变动,从k8s 1.8之后,kubernetes.io/dockercfg就变成kubernetes.io/dockerconfigjson,相对应 .dockercfg也变成.dockerconfigjson,所以在使用k8s 1.8以后版本创建secret时,元素要变成如下:
data:
.dockerconfigjson : ewoJImF1dGhzIjogewoJCSJidXMuZ2EiOiB7CgkJCSJhdXRoIjogIllXUnRhVzQ2WVdSdGFXNHhOVGszTlRNPSIKCQl9Cgl9Cn0=
type: kubernetes.io/dockerconfigjson
不然在创建完secret后,pod启动会报需要验证或者找不到镜像的错误,而无法正常使用镜像。
#vim deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: web
name: web
spec:
replicas: 3
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
imagePullSecrets:
- name: harbor-registry ##此处引用上面secret创建的名字
containers:
- image: 200.200.100.83/web/tomcat:v1
imagePullPolicy: Always
name: web
kubectl apply -f deployment.yaml
#vim deployment-svc.yaml
apiVersion: v1
kind: Service
metadata:
labels:
name: web
name: web
spec:
type: NodePort
ports:
- port: 80
targetPort: 80
nodePort: 31234
selector:
name: web
kubectl apply -f deployment-svc.yaml