发开人员→gitlab→jenkins→registry→kubernetes→docker
思路:从开发人员上传代码到gitlab托管代码以后,jenkins自动pull下来然后做成镜像上传至registry私有仓库,同时发指令给kubernetes使他关闭旧容器,然后重新启用新的docker镜像并做成容器对外提供服务。
——————————————————————————————————
秉着从下到上的顺序,我们从kubernetes开始部署。kubernetes在这个架构里扮演者管理容器集群的角色,然而我们所要做到的,就是让kubernetes能够自动控制并管理docker的容器集群。
首先我们需要做一个registry私有仓库,可以选择任意一台服务器都可以,这里我们选择kubernetes-master作为registry私有仓库。
在kubernetes-master上进行操作:
先去阿里云下载个镜像链接,创建自己的镜像仓库
# docker run -d --restart=always -p 5000:5000 registry:2
#同时将所有节点的私有仓库指定到kubernetes-master上
在”/etc/docker/“目录下的"daemon.json"文件里,如果没有则创建”daemon.json“文件。在文件中写入:
{ "insecure-registries":["192.168.1.103:5000"] }
# systemctl restart docker #这一步做好了以后就可以在私有仓库pull镜像了
可以做一个测试
tag 是给镜像打标记,打上标记以后才可以上传 ,上传了以后也可以在任意服务器上pull下载
然后重要的地方到了,建立 yaml配置文件让kubernetes自己控制容器集群。
vim nginx-rc.yaml
Version: v1 #版本
kind: ReplicationController #类型,是rc类型,控制pod模板
metadata: #标记,里面写的是这个rc的名字
name: nginx
spec: #rc的命名空间,里面包含所有pod
replicas: 2 #开启pod模板数量
template: #pod的配置
metadata: #pod的标记
labels: #用于集群内识别pod的暗号
name: nginx
spec: #pod的命名空间
containers: #容器配置
- name: nginx #容器的名字
image: 192.168.1.103:5000/nginx #容器的镜像,这里我们用的是自己的私有仓库镜像
ports: #暴露的容器的端口,并不是服务器的端口
- containerPort: 80
一定要注意缩进,因为是用python的语言编辑的,所以一定要注意缩进。
# kubectl create -f nginx-rc.yaml #创建rc模板。然后静静的等待5-10分钟或者更短。
# kubectl get rc
# kubectl get pod
# kubectl describe pod #这几条是查看命令,可以观察pod的情况
这个时候就已经可以去node节点上访问容器了,在节点上看看状态
然后访问容器
可是容器的ip只能在容器本机上访问,集群内的其他主机和集群外的主机都没办法访问,这个时候就需要将容器的端口映射到服务器上的端口了,所以需要做一个service的模板。service 模板可以将容器的端口映射到服务器的端口上,并且可以固定映射在服务器上的端口。
#vim nginx-service.yaml
apiVersion: v1
kind: Service #类型是service
metadata:
labels: #这里的标记一定要和nginx-rc的标记对照,因为kubernetes
name: nginx 靠这个识别身份
name: nginx
namespace: default
spec:
type: NodePort #类型是节点端口,就是映射的端口
ports:
- port: 80
targetPort: 80 #这个是容器的端口
nodePort: 31230 #这个是容器在服务器上映射的端口,可以通过这个端口访问
selector:
name: nginx #作用同上面的labels
# kubectl create -f nginx-service.yaml
# kubectl describe service #查看service的映射,如下图
这个时候就可以尝试访问node节点的31230端口了,同时我们发现,这个service还有轮循的功能。自带负载均衡的效果。
ok kubernetes 完毕, 开始配置 jenkins+gitlab联动
——————————————————————————————————
jenkins:工具集成平台
gitlab: 软件托管平台
部署这两个服务的联动,需要经过ssh验证。
首先我们需要在gitlab上绑定jenkins服务器的ssh公钥,因为是在同一台服务器上,所以就自己给自己绑定,这里我们使用的是root用户的公私钥,切记生产环境是不允许随便用root的
# ssh-kengen -t rsa
然后不输入只回车会生成一对公私钥
默认在/root/.ssh/
复制这个公钥,然后登陆gitlab,点击右上角的设置
在这里扔进去刚才拷贝的公钥保存就行了。
我们先在gitlab上创建一个代码仓库 点击 new project
输入一个仓库的名字 权限选择公共的(public)然后直接点击创建
点击新建一个new.file
写入代码,起一个名字然后保存
创建好了以后复制下面的ssh地址,然后在本地测试一下是否可用
# git clone git@192.168.1.101:root/test.git
如果可以用,则打开jenkins
点击新建
地址粘贴进去以后没有报错则没错
下面的这个插件很重要,就是他实现自动化更新的webhook插件,安装过了就会有这条,然后点击这条下面出来的这些东西保持默认就行。同时注意复制
这个里面写的是jenkins构建时候会执行的shell脚本,这个是最重要的,就是他实现了下端kubernetes自动更新容器的操作。
以下是里面的内容,如有不懂,请自行参考官方文档解读,上面黄色圈内的是对变量的解释可以参照
#!/bin/bash
backupcode="/data/backcode/$JOB_NAME/$BUILD_NUMBER"
mkdir -p $backupcode
chmod 644 "$JENKINS_HOME"/workspace/"$JOB_NAME"/*
rsync -acP "$JENKINS_HOME"/workspace/"$JOB_NAME"/* $backupcode
echo From 192.168.1.103:5000/nginx > "$JENKINS_HOME"/workspace/Dockerfile
echo COPY ./"$JOB_NAME"/* /usr/share/nginx/html/ >> "$JENKINS_HOME"/workspace/Dockerfile
docker rmi 192.168.1.103:5000/nginx
docker build -t 192.168.1.103:5000/nginx /"$JENKINS_HOME"/workspace/.
docker push 192.168.1.103:5000/nginx
ssh root@192.168.1.103 kubectl delete rc nginx
ssh root@192.168.1.103 kubectl create -f nginx.yaml
完事以后先别保存,首先复制一下上面的jenkins地址,然后去gitlab上绑定webhook
保存,登陆gitlab,点击下图这个设置
点击下图这个,然后粘贴地址,保存
浏览区下拉,到这个位置,可以看到绑定了jenkins地址,然后点击test测试一下是否连通
测试显示下图 的蓝条说明jenkins 已经连通了gitlab
好了,jenkins和gitlab 都已经互相的ssh通过了,然后我们最后需要做的一个ssh是关于jenkins对kubernetes-master的免密登陆,因为我们执行的jenkins 的shell里面有需要免密登陆kubernetes-master的操作,所以还是需要对jenkins做一个免密登陆kubernetes的ssh验证。
首先我们去kubernetes-master
# vim /etc/ssh/sshd_config
解除这个地方的 注释,然后写入能够访问到本机的地址 如果ssh不成功则把地址改为0.0.0.0。如果第59行本来就没有注释则不用重启服务
# systemctl restart sshd
然后去jenkins上复制之前已经有的 ssh公钥
复制 然后扔到kuernetes-master 的 /root/.ssh/authorized_keys 里面,如果没有这个文件则vim 写进去。注意路径!!( ssh 前面有个点)
然后从jenkins上测试一下(不要在乎ip,因为我重新获取的ip,239是kubernetes-master)
一个小细节,测试一下jenkins 可不可以下载kubernetes-master 上面 registry的镜像(因为我重新获取的ip,所以jenkins+gitlab ip :192.168.1.101 master ip : 192.168.1.239 node ip : 192.168.1.64)
# docker pull 192.168.1.239:5000/nginx
好了,环境全部部署完毕!!!。开始测试
测试的方法很简单,就是在gitlab上新建代码,删除代码,修改代码,都会触发webhook进行自动部署。最终会作用在所有的nginx容器中,也就是我们的web服务器。。
这里我修改了之前建立的 index.html文件 保存以后,就打开浏览器 一直访问kubernetes-node 里面的容器了
# firefox 192.169.1.64:31230
这个时候没变 还是之前的, 按F5 多刷新几次以后就成了下图
再试一次
架构完成!
后记: 关于 kubernetes 还有好几种集群管理方法。我们这次用的 rc模板 就是其中之一, 其他的还有pod 模板 和 deployment 模板, 这些都是功能很强大的集群调度模板。 还有更多功能待开发。。。。