实验环境
IP | 主机名 |
---|---|
192.168.3.101 | k8s-master1 |
192.168.3.102 | k8s-master2 |
192.168.3.103 | k8s-master3 |
192.168.3.104 | k8s-worker1 |
192.168.3.105 | k8s-worker2 |
192.168.3.106 | k8s-worker3 |
192.168.3.107 | k8s-jenkins |
192.168.3.108 | k8s-registry |
192.168.3.109 | k8s-gitlab |
192.168.3.220/192.168.3.109 | gitlab |
总体流程: |
---|
- 在开发机开发代码后提交到gitlab
- 之后通过webhook插件触发jenkins进行构建,jenkins将代码打成docker镜像,push到docker-registry
- 之后将在k8s-master上执行rc、service的创建,进而创建Pod,从私服拉取镜像,根据该镜像启动容器
一.验证k8s群集是否搭建好!
root@k8s-master1 docker.yml# kubectl get node
二. 部署私有仓库(192.168.3.108)
1.基于docker部署
代码语言:txt复制首先部署docker
yum install -y yum-utils device-mapper-persistent-data lvm2
wget -O /etc/yum.repos.d/aliyun.base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
yum -y install docker-ce-18.09.9-3.el7
# 启动docker,并设置docker开机自启
systemctl start docker && systemctl enable docker
# 配置加速,并设置驱动
cat << EOF > /etc/docker/daemon.json
{
"registry-mirrors": [
"https://dockerhub.azk8s.cn",
"https://hub-mirror.c.163.com"
]
}
EOF
javascript:;
# 加载daemon并重启docker
systemctl daemon-reload && systemctl restart docker
代码语言:txt复制##下载registry镜像
docker pull registry
##基于registry镜像,启动一台容器
docker run -itd --name registry -p 5000:5000 --restart=always registry:latest
##修改仓库地址
vim /usr/lib/systemd/system/docker.service #13行修改
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.3.108:5000
##重启docker
systemctl daemon-reload && systemctl restart docker.service
##验证registry是否安装成功
##把容器重命名一个标签
docker pull httpd
docker tag httpd:latest 192.168.3.108:5000/web:v1
docker tag httpd:latest 192.168.3.108:5000/web:v2
docker ps
##上传容器到私有仓库
docker push 192.168.3.108:5000/web:v1
docker push 192.168.3.108:5000/web:v2
代码语言:txt复制##将集群中的所有docker都加入私有仓库(k8s-master2 k8s-master3 k8s-worker1 k8s-worker2 k8s-worker3 k8s-jenkins)
vim /usr/lib/systemd/system/docker.service #13行修改
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.3.108:5000
##重启docker
systemctl daemon-reload && systemctl restart docker.service
##测试下载
docker pull 192.168.3.108:5000/web:v1
然后重要的地方到了,建立 yaml配置文件让kubernetes自己控制容器集群。
用来模拟我们部署的服务
代码语言:txt复制[root@localhost master]# vim deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: web
spec:
replicas: 2
selector:
matchLabels:
name: web
template:
metadata:
labels:
name: web
spec:
containers:
- name: web
image: 192.168.3.108:5000/web:v1
imagePullPolicy: Always
ports:
- containerPort: 80
[root@localhost master]# kubectl apply -f deploy.yaml
可是容器的ip只能在容器本机上访问,集群内的其他主机和集群外的主机都没办法访问,这个时候就需要将容器的端口映射到服务器上的端口了,所以需要做一个service的模板。service 模板可以将容器的端口映射到服务器的端口上,并且可以固定映射在服务器上的端口。
代码语言:txt复制[root@localhost master]# vim deploy-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
[root@localhost master]# kubectl apply -f deploy-svc.yaml
访问一下http://192.168.1.21:31234/
三. gitlab和jenkins加入私有仓库(192.168.3.107)
1.安装docker
代码语言:txt复制yum install -y yum-utils device-mapper-persistent-data lvm2
wget -O /etc/yum.repos.d/aliyun.base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
yum -y install docker-ce-18.09.9-3.el7
# 启动docker,并设置docker开机自启
systemctl start docker && systemctl enable docker
# 配置加速,并设置驱动
cat << EOF > /etc/docker/daemon.json
{
"registry-mirrors": [
"https://dockerhub.azk8s.cn",
"https://hub-mirror.c.163.com"
]
}
EOF
javascript:;
# 加载daemon并重启docker
systemctl daemon-reload && systemctl restart docker
2.git和jenkins加入私有仓库
代码语言:txt复制vim /usr/lib/systemd/system/docker.service #13行修改
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.3.108:5000
##重启docker
systemctl daemon-reload && systemctl restart docker.service
##测试下载
docker pull 192.168.3.108:5000/web:v1
3.jenkins服务器向k8smaster做免密登录
代码语言:txt复制[root@k8s-jenkins ~]# ssh-keygen -t rsa
[root@k8s-jenkins ~]# ssh-copy-id 192.168.3.101
四.安装jenkins(192.168.3.107)
1.创建Jenkins挂载目录并授权权限
代码语言:txt复制[root@jenkins ~]# tar -zxf jdk-8u231-linux-x64.tar.gz
[root@jenkins ~]# mv jdk1.8.0_131 /usr/java
#注意 这里有位置敏感,不要多一个“/”
[root@jenkins ~]# vim /etc/profile #在最下面写
export JAVA_HOME=/usr/java
export JRE_HOME=/usr/java/jre
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
[root@jenkins ~]# source /etc/profile
//环境变量生效
[root@jenkins ~]# java -version
//验证环境变量
2. 安装tomcat
代码语言:txt复制[root@jenkins ~]# tar -zxf apache-tomcat-7.0.54.tar.gz
[root@jenkins ~]# mv apache-tomcat-7.0.54 /usr/local/tomcat7
[root@jenkins ~]# cd /usr/local/tomcat7/webapps/
[root@jenkins webapps]# rm -rf *
[root@jenkins webapps]# cp /root/jenkins.war . #这几步是jenkins的包放进了tomcat里
[root@jenkins webapps]# vim /usr/local/tomcat7/conf/server.xml
//修改tomcat的字符集
代码语言:txt复制[root@jenkins webapps]# cd /usr/local/tomcat7/bin/
[root@jenkins bin]# vim catalina.sh
export CATALINA_OPTS="-DJENKINS_HOME=/data/jenkins"
export JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true -Dhudson.ClassicPluginStrategy.noBytecodeTransformer=true"
//这两行添加的是jenkins的家目录位置,这个很重要
[root@jenkins bin]# ./catalina.sh start //启动tomcat
浏览器访问: 192.168.3.107:8080/jenkins
jenkins搭建完成
搜索:GitLab
五.安装gitlab(192.168.3.109)
1.安装依赖包
代码语言:txt复制yum -y install curl policycoreutils openssh-server openssh-clients postfix git
systemctl enable sshd
systemctl start sshd
systemctl enable postfix
systemctl start postfix
2.安装gitlab-ce
代码语言:txt复制[root@git ~]# cat> /etc/yum.repos.d/gitlab-ce.repo<< EOF
[gitlab-ce]
name=Gitlab CE Repository
baseurl=https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/
gpgcheck=0
enabled=1
EOF
[root@git ~]# yum makecache
[root@git ~]# yum -y install gitlab-ce
[root@git ~]# vim /etc/gitlab/gitlab.rb
external_url 'http://192.168.3.109:90' ##修改端口是为了防止端口冲突,因为80默认是http服务的
unicorn['listen'] = '127.0.0.1'
unicorn['port'] = 3000 ##端口, unicorn默认是8080 也是tomcat的端口
[root@git ~]# gitlab-ctl reconfigure ##启动gitlab,这个过程可能会有点慢
3.验证
打开浏览器访问:192.168.3.109:90
在网页配置用户密码后则安装完毕。用户默认root,这里让设置一个密码再登录,这里设置12345.com(相对较短的密码不让设置)
如果忘记密码就看这个网址:https://www.jianshu.com/p/9ae417bdb969
六.jenkins和gitlab相互关联
jenkins:持续集成平台
gitlab: 代码管理平台
部署这两个服务的联动,需要经过ssh验证。
1、首先我们需要在gitlab上绑定jenkins服务器的ssh公钥,这里我们使用的是root用户的公私钥,切记生产环境是不允许随便用root的
(1)jenkins(192.168.3.107)
代码语言:txt复制##然后不输入只回车会生成一对公私钥
[root@jenkins ~]# ssh-keygen -t rsa
默认在/root/.ssh/目录里
代码语言:txt复制##查看公钥并复制
[root@jenkins ~]# cat /root/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCpbdFCMKM7i5jEd2nP222pvr Bts7NbUjHS/r5Um7QV1RYaFjE0dqVNgRlhajXs6SUva07dEhpaqIbAKs zfWU4wgWkclVheWNxsUfTP5Wd1al3l8D2t7 r9FJ3ulIqlsXcbR i4r2NjE 8X2KlSbippsJki9ZmgbDXo6dXHc3pA9TA6U8Wy603V3yQOJ6PbGC0x/eDuAx1QkF30U5m9B5fmYWSI3jPCOtifWHWWCOHVK3A1m5UaEFOSeCO6XHAJVTzkfhB0QkK0NsNBaa9b0U2sK11C9MjKAfq4JucLT/5YFWyqu0PFKfUGAlIdicG1mewnScL9ikb02nssfysmhT root@k8s-jenkins
(2)gitlab(192.168.3.109)
创建一个仓库
输入一个仓库的名字,权限选择公共的(public)然后直接点击创建
输入文件内容并提交
验证拉去代码是否成功:
代码语言:txt复制[root@git ~]# mkdir /k8s
[root@git ~]# cd /k8s
[root@git xgp]# git clone git@192.168.3.109:root/k8s ##克隆xgp-demo仓库到本地
[root@git xgp]#cd k8s
[root@git xgp]#cat README.md
print: "hello word!!!"
(3).安装插件
先进入到之前查看插件的地方
系统设置----插件管理--- 安装一下插件:gitlab-oauth、gitlab-plugin、 windows-slaves、ruby-runt ime、gitlab-hook,
注意:我这边是安装成功的,所以没有了,所有的都安装完成,就可以构建任务了
(4)构建项目
添加git仓库地址
jenkins主机生成ssh密钥
代码语言:txt复制##然后不输入只回车会生成一对公私钥
[root@jenkins ~]# ssh-keygen -t rsa
##查看密钥并复制
[root@jenkins ~]# cat /root/.ssh/id_rsa
jenkins和git需要关联上
选择授权的用户
这个里面写的是jenkins构建时候会执行的shell脚本,这个是最重要的,就是他实现了下端kubernetes自动更新容器的操作。
代码语言:txt复制#!/bin/bash
backupcode="/data/backcode/$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 root@192.168.3.101 sed -i 's/v1/v2/g' /root/app/deploy.yaml #更改镜像版本
echo From 192.168.3.108:5000/web:v1 > "$JENKINS_HOME"/workspace/Dockerfile
echo COPY ./"$JOB_NAME"/* /usr/local/apache2/htdocs/ >> "$JENKINS_HOME"/workspace/Dockerfile
docker rmi 192.168.3.108:5000/web:v1
docker build -t 192.168.3.108:5000/web:v1 /"$JENKINS_HOME"/workspace/.
docker push 192.168.3.108:5000/web:v1
ssh root@192.168.3.101 kubectl delete deployment web
ssh root@192.168.3.101 kubectl apply -f /root/app/deploy.yaml
$JOB_NAME:项目名称
$BUILD_NUMBER:第几次构建
$JENKINS_HOME:jenkins的家目录
完事以后先别保存,首先复制一下上面的jenkins地址,然后去gitlab上绑定webhook
保存,登陆gitlab,点击下图这个设置
因为不可以本地使用的webhook
下面是解决方法
再次添加webhook
回到Jenkins开启匿名访问权限
好了,jenkins和gitlab 都已经互相的ssh通过了,然后我们最后需要做的一个ssh是关于jenkins
注意,这里是从gitlab和jenkins向master节点做免密登录。
///注意,这里是从git和jenkins向master节点做免密登录。
代码语言:txt复制[root@k8s-jenkins ~]# ssh-keygen -t rsa
[root@gitlab ~]# ssh-copy-id root@192.168.3.101
[root@k8s-jenkins ~]# ssh-keygen -t rsa
[root@jenkins ~]# ssh-copy-id root@192.168.3.101
好了,环境全部部署完毕!!!。开始测试
五、测试
测试的方法很简单,就是在gitlab上新建代码,删除代码,修改代码,都会触发webhook进行自动部署。最终会作用在所有的nginx容器中,也就是我们的web服务器。
这里我修改了之前建立的 index.html文件 保存以后,就打开浏览器 一直访问kubernetes-node 里面的容器了
访问一下http://192.168.3.101:31234/
如果没有变,应该注意查看是否在jenkins上构建完成,等以小会就可以了。
构建成功