1 部署SpringBoot项目 (1)得到Spring Boot项目的image,这块之前Docker中聊过,就不具体展开,镜像已经推送到阿里仓库
1 registry.cn-hangzhou.aliyuncs.com/jack-kubernetes/ springboot-demo-image
(2)编写springboot-demo.yaml文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 apiVersion: apps/v1 kind: Deployment metadata: name: springboot-demo spec: selector: matchLabels: app: springboot-demo replicas: 1 template: metadata: labels: app: springboot-demo spec: containers: - name: springboot-demo image: registry.cn-hangzhou.aliyuncs.com/jack-kubernetes/springbootdemo-image ports: - containerPort: 8080 --- apiVersion: v1 kind: Service metadata: name: springboot-service spec: ports: - port: 80 protocol: TCP targetPort: 8080 selector: app: springboot-demo --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: springboot-ingress annotations: kubernetes.io/ingress.class: nginx spec: rules: - host: springboot.jack.com http: paths: - pathType: Prefix path: / backend: service: name: springboot-service port: number: 80
(3)根据yaml文件创建资源并查看
1 2 kubectl apply -f springboot-demo.yaml kubectl get all
(4)在win上配置hosts文件
1 192.168.0.52 springboot.jack.com
(5)浏览器访问
1 http:// springboot.jack.com/K8s
2 Windows上准备 (1)修改代码,即更新项目
1 2 3 4 5 @RequestMappiing("/k8s") String k8s () throws Exception{ String hostAddress = InetAddress.getLocalHost().getHostAddress(); return "Hello k8s, 当前服务的地址是:" + hostAddress; }
(2)安装配置Git
1 2 3 4 5 6 (1)下载安装git[略] (2)配置并生成ssh_key git config --global user.name "hiourearth" git config --global user.email "hiourearth@gmail.com" ssh-keygen -t rsa -C "hiourearth@gmail.com" (3)打开C:\Users\Jack\.ssh,查看id_rsa.pub文件中的值
3 搭建并配置Gitlab
使用192.168.0.8 这台机器
https://about.gitlab.com/install/#centos-7
(1)说明:安装gitlab的机器至少要有4G的内存,因为gitlab比较消耗内存
(2)安装必要的依赖并配置
1 2 3 4 5 sudo yum install -y curl policycoreutils-python openssh-server sudo systemctl enable sshd sudo systemctl start sshd sudo firewall-cmd --permanent --add-service=http sudo systemctl reload firewalld
(3)添加gitlab仓库地址
1 2 3 4 5 6 7 8 9 cd /etc/yum.repos.d/ vim gitlab-ce.repo [gitlab-ce] name=Gitlab CE Repository baseurl=https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el$releasever / gpgcheck=0 enabled=1
(4)设置gitlab域名并安装
1 sudo EXTERNAL_URL="https://gitlab.jack.com" yum install -y gitlab-ce
(5)配置windows的hosts文件
(6)访问:https://gitlab.jack.com
(7)查看root账号的密码,后面可以修改一下
1 cat /etc/gitlab/initial_root_password
(8)gitlab常见操作
1 2 3 4 5 (1)vim /etc/gitlab/gitlab.rb 找到对应修改内容 (2)gitlab-ctl reconfigure 重新加载一下配置 (3)gitlab-ctl status 查看gitlab状态 (4)sudo gitlab-ctl stop 停止gitlab (5)sudo gitlab-ctl start 开启gitlab
4 项目关联Gitlab (1)将公钥上传到gitlab:右上角->Preferences->SSH Keys
(2)在gitlab上创建名称为“springboot-demo”的project
(3)将本地项目push到gitlab上
1 2 3 4 5 6 7 git init git add . git commit -m "first commit" git remote add jack-gitlab git@gitlab.jack.com:root/springboot-demo.git git remote -v git push -u jack-gitlab master
5 安装配置Jenkins
因为后面需要在jenkins的目录下创建文件执行,所以选择K8s集群中的一台node作为Jenkins的安装机器,比如这里选用w2,也就是192.168.0.53
官网:https://jenkins.io/
(1)下载jenkins.war
(2)运行jenkins
1 2 3 nohup java -jar jenkins.war --httpPort=8888 & lsof -i:8888tail -f nohup.out
(3)浏览器访问:192.168.0.53:8888
1 2 密码: cat /root/ .jenkins/secrets/i nitialAdminPassword 然后会等待一会,包括镜像拉取以及插件安装[选择推荐的插件]
(4)新建用户
(5)配置Jenkins URL
(7)配置java maven和git等:Dashboard-> Manage Jenkins-> Global Tool Configuration
1 2 3 4 5 6 git config --global user.name "hiourearth" git config --global user.email "hiourearth@gmail.com" ssh-keygen -t rsa -C "hiourearth@gmail.com" cat /root/.ssh/id_rsa.pub
6 准备Docker Hub和K8s集群 (1)Docker Hub:直接使用阿里容器镜像仓库,在w2这台机器上登录一下
1 sudo docker login --username=hiourearth registry.cn-hangzhou.aliyuncs.com
(2)K8s集群:就用之前搭建的3台机器组成的K8s集群
(3)目前的环境:
1 2 3 4 Gitlab : git@gitlab.jack.com:root/springboot-demo.gitJenkins : 192.168.2.53:8888 Docker hub: hiourearthK8s cluster: 192.168.0.51 52 53
7 Jenkins拉取项目 (1)创建Jenkins的Task
(2)在w2上配置hosts: vim /etc/hosts
1 2 3 192.168.0.8 gitlab.jack.com ssh -T git@gitlab.jack.com
(3)流水线中编写拉取代码的脚本,然后点击“保存”
1 2 3 4 5 6 node { def mvnHome stage('Git Pull' ) { // for display purposes git 'git@gitlab.jack.com:root/springboot-demo.git' } }
(4)来到“Dashboard”,并点击执行按钮
(5)到w2这台机器上,观察/root/.jenkins/workspace目录,看看项目是否拉取成功
1 cat /root/.jenkins/workspace/springbootdemo/src/main/java/com/jack/springbootdemo/SpringbootDemoApplication.java
8 Jenkins Maven打包 (1)新增一个脚本语句
1 2 3 4 5 6 7 8 9 node { def mvnHome stage('Git Pull' ) { // for display purposes git 'git@gitlab.jack.com:root/springboot-demo.git' } stage('Maven Build' ) { sh "mvn clean package" } }
(2)观察worspace目录下是否生成target文件
9 构建和push镜像 (1)来到w2上的workspace目录:cd /root/.jenkins/workspace
(2)在scripts目录下准备一个文件,名称为springboot-demo-build-image.sh
1 2 mkdir /root/.jenkins/workspace/scripts/ vim /root/.jenkins/workspace/scripts/springboot-demo-build-image.sh
(3)编辑sh文件
1 2 3 4 5 6 7 8 9 10 11 12 13 cd ../springboot-democat <<EOF > Dockerfile FROM openjdk:8-jre-alpine COPY target/springboot-demo-0.0.1-SNAPSHOT.jar springboot-demo.jar ENTRYPOINT ["java","-jar","springboot-demo.jar"] EOF echo "Dockerfile created successfully!" docker build -t registry.cn-hangzhou.aliyuncs.com/jack-kubernetes/springbootdemo-image . docker push registry.cn-hangzhou.aliyuncs.com/jack-kubernetes/springboot-demoimage
(4)踩坑经验
1 2 3 4 5 6 7 8 9 10 11 12 13 /root/.jenkins/workspace/scripts/springboot-demo-build-image.sh: Permission deniedchmod +x /root/.jenkins/workspace/scripts/springboot-demo-build-image.sh Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running? systemctl start docker systemctl enable docker docker login --username=hiourearth registry.cn-hangzhou.aliyuncs.com
(5)jenkins上添加脚本
1 2 3 4 5 6 7 8 9 10 11 12 node { def mvnHome stage('Git Pull' ) { // for display purposes git 'git@gitlab.jack.com:root/dockerfile-demo.git' } stage('Maven Build' ) { sh "mvn clean package" } stage('Build Image' ) { sh "/root/.jenkins/workspace/scripts/springboot-demo-build-image.sh" } }
(6)jenkins构建,并查看阿里镜像仓库
10 K8s拉取镜像并运行 (1)在/root/.jenkins/workspace/scripts/目录下创建springboot-demo.yaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 apiVersion: apps/v1 kind: Deployment metadata: name: springboot-demo spec: selector: matchLabels: app: springboot-demo replicas: 1 template: metadata: labels: app: springboot-demo spec: containers: - name: springboot-demo image: registry.cn-hangzhou.aliyuncs.com/jack-kubernetes/springbootdemo-image ports: - containerPort: 8080 --- apiVersion: v1 kind: Service metadata: name: springboot-service spec: ports: - port: 80 protocol: TCP targetPort: 8080 selector: app: springboot-demo --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: springboot-ingress annotations: kubernetes.io/ingress.class: nginx spec: rules: - host: springboot.jack.com http: paths: - pathType: Prefix path: / backend: service: name: springboot-service port: number: 80
(2)在/root/.jenkins/workspace/scripts/目录创建K8s-deploy-springboot-demo.sh
1 2 3 kubectl delete -f /root/.jenkins/workspace/scripts/springboot-demo.yaml kubectl apply -f /root/.jenkins/workspace/scripts/springboot-demo.yamlecho "K8s deploy success!"
(3)踩坑经历
1 2 3 4 5 6 7 8 /root/.jenkins/workspace/scripts/K8s-deploy-springboot-demo.sh: Permission deniedchmod +x /root/.jenkins/workspace/scripts/K8s-deploy-springboot-demo.sh 切换到master上,cd ~ ---> cat .kube/config --->复制内容 切换到worker02上 cd ~ ---> 新建文件 .kube/config --->粘贴内容
(4)增加Jenkins中的脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 node { def mvnHome stage('Git Pull' ) { // for display purposes git 'git@gitlab.jack.com:root/springboot-demo.git' } stage('Maven Build' ) { sh "mvn clean package" } stage('Build Image' ) { sh "/root/.jenkins/workspace/scripts/springboot-demo-build-image.sh" } stage('K8S Deploy' ) { sh "/root/.jenkins/workspace/scripts/K8s-deploy-springboot-demo.sh" } }
(5)jenkins构建,并查看K8s集群中image和资源
1 2 3 kubectl get pods kubectl get deploy kubectl get service
(6)浏览器访问
1 http:// springboot.jack.com/K8s
11 webhook测试自动化部署 (1)当用户进行git push提交代码到github时,能够通知jenkins自动构建
注意:jenkins的ip一定要是gitlab能够访问到的地址
(2)打开jenkins中springboot-demo pipeline,构建触发器,记录下触发器的地址:http://192.168.0.53:8888/project/springboot-demo
(3)在gitlab上配置webhook的地址,即jenkins对应的触发器地址: http://192.168.0.53:8888/project/springboot-demo,然后点击下方的“Add webhook”
(4)当提示“Url is blocked: Requests to the local network are not allowed”,需要做一下设置,以 root账号登录gitlab,然后再配置一下第(2)步
(5)安装Jenkins插件
Dashboard-> Manage Jenkins-> Manage Plugins-> 可选插件
搜索 : gitlab plugin和gitlab hook 并安装
(6)因为是测试环境,所以暂时可以先不配置jenkins需要的token,也就是说在Jenkins中取消Gitlab Server的认证
Dashboard-> Manage Jenkins-> Configure System
(7)测试一下Push Event
(8)整体测试
打开idea工程,更改代码,git add/commit/push,观察springboot-demo构建任务的变化,最终通过浏览器访问springboot.jack.com