主机名 | master | node1 | node2 |
---|---|---|---|
内存最低要求 | 2G | 2G | 4G |
主机IP | 192.168.229.187 | 192.168.229.209 | 192.168.229.210 |
服务 | k8s、registry | k8s | k8s、jenkins、gitlab |
在master上模拟一个web服务
环境准备好后,在master节点部署registry服务,将自定义镜像的v1版本上传到私有仓库中。其它2台node也需要加入registry服务。
要求:创建一个Deployment资源,replicas:2,镜像使用自定义镜像V1版本,然后创建一个SVC(type:NodePort,nodePort:30034)资源对象和此Deployment资源关联。
(1)在master上用docker容器运行registry私有仓库服务
下载需要的镜像
[root@master ~]# docker pull registry:2
(2)运行私有仓库服务
[root@master ~]# docker run -itd --name registry --restart=always -p 5000:5000 -v /registry:/var/lib/registry registry:2
(3)编辑docker的配置文件,指定私有仓库地址。
[root@master ~]# vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.229.187:5000
[root@master ~]# systemctl daemon-reload
[root@master ~]# systemctl restart docker
(4)把制作好的私有镜像传到master主机上
scp Desktop/私有镜像/httpd\:v1.tar [email protected]:/root
(5)上传私有仓库
[root@master ~]# docker load -i httpd\:v1.tar
[root@master ~]# docker push 192.168.229.187:5000/httpd:v1
(6)创建deployment资源和service资源
[root@master ~]# mkdir /opt/autoweb
[root@master ~]# cd /opt/autoweb/
[root@master autoweb]# vim myapp.yaml
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
name: myapp
spec:
replicas: 2
template:
metadata:
labels:
app: httpd
spec:
containers:
- name: myapp
image: 192.168.229.187:5000/httpd:v1
[root@master autoweb]# kubectl apply -f myapp.yaml
[root@master autoweb]# vim mysvc.yaml
kind: Service
apiVersion: v1
metadata:
name: mysvc
spec:
selector:
app: httpd
type: NodePort
ports:
- protocol: TCP
port: 80
targetPort: 80
nodePort: 30034
[root@master autoweb]# kubectl apply -f mysvc.yaml
(7)验证各资源的部署情况
[root@master autoweb]# kubectl get deployments.
NAME READY UP-TO-DATE AVAILABLE AGE
myapp 2/2 2 2 52s
[root@master autoweb]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 49d
mysvc NodePort 10.97.208.122 <none> 80:30034/TCP 38s
[root@master autoweb]# kubectl describe svc mysvc
...
Selector: app=httpd
Type: NodePort
IP: 10.97.208.122
Port: <unset> 80/TCP
TargetPort: 80/TCP
NodePort: <unset> 30034/TCP
Endpoints: 10.244.1.2:80,10.244.2.2:80
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>
[root@master autoweb]# curl 127.0.0.1:30034
111111
node2上部署JDK
关闭防火墙、selinux。
部署jenkins需要JDK(java环境)。提前准备好压缩包。
[root@node2 ~]# mkdir /opt/autoweb
[root@node2 ~]# cd /opt/autoweb
scp Desktop/AutoWeb.zip [email protected]:/opt/autoweb/
[root@node2 autoweb]# ls
AutoWeb.zip
[root@node2 autoweb]# unzip AutoWeb.zip
[root@node2 autoweb]# ls
AutoWeb AutoWeb.zip
[root@node2 autoweb]# cd AutoWeb/
[root@node2 AutoWeb]# ls
apache-tomcat-7.0.54.tar.gz jenkins-2.172-1.1.noarch.rpm
autoweb.docx jenkins-2.179-1.1.noarch.rpm
deployment-nginx.yaml jenkins.war
gitlab-ce-11.9.8-ce.0.el6.x86_64.rpm nginx-rc.yaml
gitlab-hook.hpi nginx-svc.yaml
gitlab-oauth.hpi plugins.tar.gz
gitlab-plugin.hpi ruby-runtime.hpi
jdk-8u131-linux-x64.tar.gz service-nginx.yaml
jdk-8u231-linux-x64.tar.gz 自动触发脚本.txt
[root@node2 AutoWeb]# tar zxf jdk-8u231-linux-x64.tar.gz
[root@node2 AutoWeb]# mv jdk1.8.0_231 /usr/java
[root@node2 AutoWeb]# 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@master AutoWeb]# source /etc/profile
[root@master AutoWeb]# java -version
java version "1.8.0_231"
Java(TM) SE Runtime Environment (build 1.8.0_231-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.231-b11, mixed mode)
node2上部署Jenkins
这里使用rpm包安装部署jenkins,当然也有其他的部署方式。
[root@node2 AutoWeb]# rpm -ivh jenkins-2.222-1.1.noarch.rpm
[root@node2 AutoWeb]# rpm -ql jenkins
/etc/init.d/jenkins
/etc/logrotate.d/jenkins
/etc/sysconfig/jenkins
/usr/lib/jenkins
/usr/lib/jenkins/jenkins.war
/usr/sbin/rcjenkins
/var/cache/jenkins
/var/lib/jenkins
/var/log/jenkins
[root@node2 AutoWeb]# rpm -qc jenkins
/etc/init.d/jenkins
/etc/logrotate.d/jenkins
/etc/sysconfig/jenkins
添加jenkins启动依赖的JDK路径
[root@node2 AutoWeb]# vim /etc/init.d/jenkins
...
83 /usr/bin/java
84 /usr/java/bin/java
85 "
...
重新加载配置文件,启动jenkins或者用:service jenkins start
[root@node2 AutoWeb]# systemctl daemon-reload
[root@node2 AutoWeb]# systemctl start jenkins
[root@node2 AutoWeb]# systemctl status jenkins
● jenkins.service - LSB: Jenkins Automation Server
Loaded: loaded (/etc/rc.d/init.d/jenkins; bad; vendor preset: disabled)
Active: active (running) since 日 2020-11-15 03:29:26 EST; 6s ago
Docs: man:systemd-sysv-generator(8)
Process: 33281 ExecStart=/etc/rc.d/init.d/jenkins start (code=exited, status=0/SUCCESS)
...
验证开启端口,然后去浏览器确认服务的运行
[root@node2 AutoWeb]# ss -lnt | grep 8080
LISTEN 0 50 [::]:8080 [::]:*
查看对应的管理员密码
[root@node2 AutoWeb]# cat /var/lib/jenkins/secrets/initialAdminPassword
daee7a8b9ae14edf835f11d71dd5cd2a
选择插件安装,考虑到安装速度的原因,选择全部不安装。
创建用户后选择保存并完成
可以设置一下jenkins用户和国内插件源,这里选择清华大学的。
[root@node2 AutoWeb]# cd /var/lib/jenkins/
[root@node2 jenkins]# vim /etc/sysconfig/jenkins
...
JENKINS_USER="root"
...
[root@node2 jenkins]# vim hudson.model.UpdateCenter.xml
[root@node2 AutoWeb]#
<?xml version='1.1' encoding='UTF-8'?>
<sites>
<site>
<id>default</id>
<url>https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json</url>
</site>
</sites>
jenkins启动完成之后,就本实验来说,除了支持中文的语言包之外,还需要和gitlab联动。需要支持Gitlab的三个包。
这里插件已经准备好了,直接解压即可
[root@node2 jenkins]# pwd
/var/lib/jenkins
[root@node2 jenkins]# mv plugins plugins.bak
[root@node2 jenkins]# mv /opt/autoweb/AutoWeb/plugins.tar.gz .
[root@node2 jenkins]# tar zxf plugins.tar.gz
重启服务,浏览器验证
[root@node2 jenkins]# service jenkins restart
Restarting jenkins (via systemctl): [ OK ]
部署gitlab
rpm包已经准备好,安装完依赖直接导入安装即可。
[root@node2 jenkins]# cd /opt/autoweb/AutoWeb
[root@node2 AutoWeb]# yum -y install curl policycoreutils openssh-server openssh-clients postfix git
[root@node2 AutoWeb]# systemctl start postfix
[root@node2 AutoWeb]# systemctl enable postfix
[root@node2 AutoWeb]# rpm -ivh gitlab-ce-11.9.8-ce.0.el6.x86_64.rpm
安装完成之后,需要将gitlab的默认端口进行更改,因为它的默认端口也是8080,和jenkins冲突。
[root@node2 AutoWeb]# vim /etc/gitlab/gitlab.rb
...
13 external_url 'http://192.168.229.210:90'
678 unicorn['listen'] = '127.0.0.1'
679 unicorn['port'] = 8088
...
启动gitlab服务,浏览器验证服务。
[root@node2 AutoWeb]# gitlab-ctl reconfigure
[root@node2 AutoWeb]# ss -lnt
...
LISTEN 0 511 *:90 *:*
...
配置jenkins和gitlab平台的联动
部署这两个服务的联动,需要经过ssh验证。
首先需要在gitlab上绑定jenkins服务器的ssh公钥,因为在同一台服务器上,所以自己给自己绑定,这里使用的是root用户的公私钥,切记生产环境是不允许随便用root的。
[root@node2 ~]# ssh-keygen -t rsa
[root@node2 ~]# cat ~/.ssh/id_rsa.pub
添加公钥后,在gitlab中创建一个项目。
可以使用git命令,在本地将项目clone下来验证查看
[root@node2 ~]# git clone http://192.168.229.210:90/root/test.git
[root@node2 ~]# ls
anaconda-ks.cfg images test
[root@node2 ~]# cat test/index.html
print "hello k8s!"[root@node2 ~]#
服务验证没有问题,在jenkins上操作。
此时如果直接添加会报错。添加完成后提示本地连接不了,因为gitlab默认设置不允许向自己发送web hook。
往下要修改gitlab&jenkins的设置。
开启jenkins的匿名访问功能,否则会报403。
现在再重新添加和jenkins的联动
测试和jenkins的连通性
报200正常。
当执行测试,其实就是手动触发了一下部署的shell脚本,这时shell脚本是不正确的,但这次测试可以帮助我们看到脚本运行结果。
可以根据输出结果优化脚本。
这里最后需要做的一个ssh是关于jenkins,注意,这里是从node2向master节点做免密登录。
[root@node2 ~]# ssh-copy-id [email protected]
最终脚本
#!/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.229.187:5000/httpd:v1 > "$JENKINS_HOME"/workspace/Dockerfile
echo COPY ./"$JOB_NAME"/* /usr/local/apache2/htdocs/ >> "$JENKINS_HOME"/workspace/Dockerfile
docker rmi 192.168.229.187:5000/httpd:v1
docker build -t 192.168.229.187:5000/httpd:v1 /"$JENKINS_HOME"/workspace/.
docker push 192.168.229.187:5000/httpd:v1
ssh [email protected] kubectl delete deployment myapp
ssh [email protected] kubectl apply -f /root/autoweb/myapp.yaml
根据镜像的默认下载策略判断,刚开始部署的Deployment资源,它使用的镜像标签为v1,所以他的默认下载策略为:IfNotPresent,所以要想使镜像实时更新,需要将myapp.yaml这个文件内的镜像下载策略改为:Always。
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
name: myapp
spec:
replicas: 2
template:
metadata:
labels:
app: httpd
spec:
containers:
- name: myapp
image: 192.168.229.187:5000/httpd:v1
imagePullPolicy: Always
在gitlab上执行push测试。