k8s交付dubbo微服务之部署Jenkins

Dubbo微服务

Dubbo是什么?

  • 阿里巴巴开源的,SOA服务化治理方案的核心框架

架构图

能够动态扩容的服务放在K8S集群里

ZK要放在K8S外面,因为ZK是有状态的服务,不适合放在K8S集群里

以无状态为荣,以有状态为耻

没有状态的意思是,可以随便漂移

因为K8S的pod可以自动漂移,如果有状态的话就麻烦了,因为有状态的服务有自己的高可用机制,并且可能存在数据持久化的问题。比如etcd,zk,mysql,mq,

开始部署zk

主机名 角色 IP
hdss7-11.host.com k8s代理节点1,zk1 10.4.7.11
hdss7-12.host.com k8s代理节点2,zk2 10.4.7.12
hdss7-21.host.com k8s运算节点1,zk3 10.4.7.21
hdss7-22.host.com k8s运算节点2,Jenkins 10.4.7.21
hdss7-200.host.com k8s运维节点(docker)仓库 10.4.7.200

部署zookeeper

下载jdk1.8到/opt/src目录,分别在7-11,7-12,7-21上操作

[root@hdss7-11 ~]# mkdir /opt/src /usr/java
[root@hdss7-11 ~]# cd /opt/src
[root@hdss7-11 src]# tar xf jdk-8u261-linux-x64.tar.gz -C /usr/java/
[root@hdss7-11 src]# cd /usr/java/
[root@hdss7-11 java]# ln -s jdk1.8.0_261/ /usr/java/jdk
[root@hdss7-11 java]# ll
lrwxrwxrwx 1 root  root   13 Aug 26 16:47 jdk -> jdk1.8.0_261/
drwxr-xr-x 8 10143 10143 273 Jun 18 14:59 jdk1.8.0_261

配置环境变量

[root@hdss7-11 java]# vim /etc/profile
export JAVA_HOME=/usr/java/jdk
export PATH=$JAVA_HOME/bin:$JAVA_HOME/bin:$PATH
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar

下载zookeeper到/opt/src目录下,分别在7-11,7-12,7-21上操作

[root@hdss7-11 src]# tar xf zookeeper-3.4.14.tar.gz -C /opt/
[root@hdss7-11 src]# cd ..
[root@hdss7-11 opt]# ln -s zookeeper-3.4.14/ zookeeper

创建相应的目录

[root@hdss7-11 opt]# mkdir -p /data/zookeeper/data /data/zookeeper/logs

创建zoo.cfg文件

[root@hdss7-11 conf]# pwd
/opt/zookeeper/conf
[root@hdss7-11 conf]# rm -rf zoo_sample.cfg

[root@hdss7-11 conf]# vim zoo.cfg

# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial 
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between 
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just 
# example sakes.
dataDir=/data/zookeeper/data
dataLogDir=/data/zookeeper/logs
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
server.1=zk1.od.com:2888:3888
server.2=zk2.od.com:2888:3888
server.3=zk3.od.com:2888:3888
#
# Be sure to read the maintenance section of the 
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1

修改named配置文件,序号前滚一个,添加zk的相关记录(这一步只在7-11上操作一遍即可)

               2020080106; serial
zk1              A 10.4.7.11
zk2              A 10.4.7.12
zk3              A 10.4.7.21

重启named

[root@hdss7-11 conf]# systemctl restart named
[root@hdss7-11 conf]# dig -t A zk1.od.com @10.4.7.11 +short
10.4.7.11

三台zk主机上添加myid文件7-1117-12的myid为27-21的为3,使之成为集群,为什么要这样改?请参考官方文档。

[root@hdss7-11 conf]# cd /data/zookeeper/data/
[root@hdss7-11 data]# echo 1 >> myid
[root@hdss7-12 data]# echo 2 >> myid
[root@hdss7-21 data]# echo 3 >> myid

启动并查看状态

[root@hdss7-11 data]# /opt/zookeeper/bin/zkServer.sh start
[root@hdss7-11 data]# /opt/zookeeper/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper/bin/../conf/zoo.cfg
Mode: follower

[root@hdss7-12 data]# /opt/zookeeper/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper/bin/../conf/zoo.cfg
Mode: leader

[root@hdss7-21 data]# /opt/zookeeper/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper/bin/../conf/zoo.cfg
Mode: follower

可以看到7-12成为了leader,其他两台节点成为了follower,继续查看端口

[root@hdss7-11 zookeeper]# netstat -nltp | grep 2181
tcp6       0      0 :::2181                 :::*                   LISTEN      63527/java
[root@hdss7-11 zookeeper]# bin/zkCli.sh -server localhost:2181netstat -nltp | grep 2181

重头戏——安装Jenkins

在运维主机上

[root@hdss7-200 ~]# docker pull jenkins/jenkins:2.190.3
[root@hdss7-200 ~]# docker images | grep jenkins
jenkins/jenkins           2.190.3          22b8b9a84dbe        9 months ago        568MB
[root@hdss7-200 ~]# docker tag 22b8b9a84dbe harbor.od.com/public/jenkins:v2.190.3
[root@hdss7-200 ~]# docker push !$

官方的jenkins镜像不能直接使用,需要做一定的配置

自定义Dockerfile

先生成公钥和私钥

[root@hdss7-200 ~]# ssh-keygen -t rsa -b 2048  -C "xxx@xx.xxx" -N "" -f /root/.ssh/id_rsa

USER是指使用root这个用户来操作

config.json是远程仓库的登录信息

ADD get-docker.sh /get-docker.sh:非常重要,要在Jenkins装一个docker的客户端?为什么要在Jenkins装一个docker的客户端,因为Jenkins要执行docker build,因为我们需要把镜像拉下来打包成jar包,打包完成之后要把它变成docker镜像,是需要依赖于docker引擎的,但是我们又不能在Jenkins安装docker引擎,只能依赖于宿主机的docker引擎。

echo " StrictHostKeyChecking no" >> /etc/ssh/ssh_config && get-docker.sh,这一步是优化客户端的config,取消指纹验证(yes/no)

[root@hdss7-200 ~]# cd /data/dockerfile
[root@hdss7-200 dockerfile]# mkdir jenkins
[root@hdss7-200 dockerfile]# cd jenkins/
[root@hdss7-200 jenkins]# vim Dockerfile

dockerfile文件内容

FROM harbor.od.com/public/jenkins:v2.190.3
USER root
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && 
    echo 'Asia/Shanghai' >/etc/timezone
ADD id_rsa /root/.ssh/id_rsa
ADD config.json /root/.docker/config.json
ADD get-docker.sh /get-docker.sh
RUN echo "    StrictHostKeyChecking no" >> /etc/ssh/ssh_config &&
    /get-docker.sh

拷贝私钥和config.json

[root@hdss7-200 jenkins]# cp /root/.docker/config.json .
[root@hdss7-200 jenkins]# ll
total 12
-rw------- 1 root root  238 Aug 26 18:16 config.json
-rw-r--r-- 1 root root  350 Aug 26 18:12 Dockerfile
-rw------- 1 root root 1679 Aug 26 18:15 id_rsa
[root@hdss7-200 jenkins]# curl -fsSL get.docker.com -o get-docker.sh
[root@hdss7-200 jenkins]# chmod +x get-docker.sh

在harbor.od.com页面创建infra这个私有仓库

开始构建docker镜像

[root@hdss7-200 jenkins]# docker build . -t harbor.od.com/infra/jenkins:v2.190.3
.........................................................
Successfully built d03c7e059f0d
Successfully tagged harbor.od.com/infra/jenkins:v2.190.3

这里会比较耗时,而且不容易成功,主要是网络的原因,如果一直卡住超过20分钟,基本可以选择重试了。

回顾构建制作Jenkins的docker镜像做了哪些事情
  • 设置了容器启动时使用的用户为root
  • 设置容器时区为东八区
  • 加入了ssh私钥(拉取git代码的两种方式,基于http和基于ssh)
  • 加入登录harbor的config文件
  • 修改了ssh客户端的配置
  • 安装了一个docker客户端

创建kubernetes命名空间

因为Jenkins也是要单独的放到k8s的名称空间,让它的名称空间只运行运维相关的的基础设施服务。

注意,现在要把Jenkins交付到infra空间,因为infra是私有仓库,它需要从harbor的私有仓库去拉取镜像,如果只是docker login是不够的,一定要做以下步骤。

在任意一个运算节点(7-21,7-22)

[root@hdss7-21 ~]# kubectl create secret docker-registry harbor --docker-server=harbor.od.com --docker-username=admin --docker-password=Harbor12345 -n infra

然后去dashboard查看

一般来讲,secret资源分为三种类型。

  • generate:通用型
  • docker-registry
  • TLS型的

准备共享存储

体验k8s pod资源是如何共享数据的,因为有些运算节点的服务需要持久化数据的,比如Jenkins,然后我们把持久化的数据挂在运算节点外边,这样不论是Jenkins在哪个运算节点启动,它挂的数据都在外边。

运维主机,以及所有运算节点上:

yum install nfs-utils -y

在运维主机上

[root@hdss7-200 jenkins]# vim /etc/exports

/data/nfs-volume 10.4.7.0/24(rw,no_root_squash)

[root@hdss7-200 jenkins]# mkdir /data/nfs-volume
[root@hdss7-200 jenkins]# systemctl start nfs
[root@hdss7-200 jenkins]# systemctl enable nfs
Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.

怎么能够使用这个nfs呢?

是在Jenkins的资源配置清单里

[root@hdss7-200 jenkins]# cd /data/k8s-yaml/
[root@hdss7-200 k8s-yaml]# mkdir jenkins

开始准备Jenkins的资源配置清单,需要deployment、service、ingress配置清单

dp.yaml

kind: Deployment
apiVersion: extensions/v1beta1
metadata:
  name: jenkins
  namespace: infra
  labels: 
    name: jenkins
spec:
  replicas: 1
  selector:
    matchLabels: 
      name: jenkins
  template:
    metadata:
      labels: 
        app: jenkins 
        name: jenkins
    spec:
      volumes:
      - name: data
        nfs: 
          server: hdss7-200
          path: /data/nfs-volume/jenkins_home
      - name: docker
        hostPath: 
          path: /run/docker.sock
          type: ''
      containers:
      - name: jenkins
        image: harbor.od.com/infra/jenkins:v2.190.3
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 8080
          protocol: TCP
        env:
        - name: JAVA_OPTS
          value: -Xmx512m -Xms512m
        volumeMounts:
        - name: data
          mountPath: /var/jenkins_home
        - name: docker
          mountPath: /run/docker.sock
      imagePullSecrets:
      - name: harbor
      securityContext: 
        runAsUser: 0
  strategy:
    type: RollingUpdate
    rollingUpdate: 
      maxUnavailable: 1
      maxSurge: 1
  revisionHistoryLimit: 7
  progressDeadlineSeconds: 600

可以看到上面,用到了nfs卷,server是7-200,而且也指定了path

    spec:
      volumes:
      - name: data
        nfs: 
          server: hdss7-200
          path: /data/nfs-volume/jenkins_home

还有一个docker卷,挂载的是hostPath,也就是本机,有可能是7-21,也有可能是7-22,看schedule安排在哪个节点上。而挂载的目录是/run/docker.sock,是Jenkins pod里面的/run/目录下的,这是把docker server socket挂载进来了。

这样Jenkins的docker客户端就能够和宿主机的docker服务端进行socket通信。

      - name: docker
        hostPath: 
          path: /run/docker.sock
          type: ''

而这个imagePullPolicy,有三个选项

  • always:无论如何都要去远程仓库拉镜像
  • never:无论如何都不去拉
  • IfNotPresent:本地不存在则去远程仓库拉

而imagePullSecrets则是上面使用陈述式资源管理命令所创建的secret的名字

kubectl create secret docker-registry harbor ......
        imagePullPolicy: IfNotPresent
        
      imagePullSecrets:
      - name: harbor

svc.yaml

kind: Service
apiVersion: v1
metadata: 
  name: jenkins
  namespace: infra
spec:
  ports:
  - protocol: TCP
    port: 80
    targetPort: 8080
  selector:
    app: jenkins

targetPort: 8080,这是容器里跑的端口

port: 80,监听在cluster-ip的端口,相当于是把容器的8080端口映射到了集群网络的80端口

因此,这个80端口要和下面的ingress的端口要匹配上。

ingress.yaml

kind: Ingress
apiVersion: extensions/v1beta1
metadata: 
  name: jenkins
  namespace: infra
spec:
  rules:
  - host: jenkins.od.com
    http:
      paths:
      - path: /
        backend: 
          serviceName: jenkins
          servicePort: 80

创建jenkins目录

[root@hdss7-200 jenkins]# mkdir /data/nfs-volume/jenkins_home

回到运算节点7-21上

[root@hdss7-21 ~]# kubectl apply -f http://k8s-yaml.od.com/jenkins/dp.yaml
[root@hdss7-21 ~]# kubectl apply -f http://k8s-yaml.od.com/jenkins/svc.yaml
[root@hdss7-21 ~]# kubectl apply -f http://k8s-yaml.od.com/jenkins/ingress.yaml

查看pod资源

[root@hdss7-21 ~]# kubectl get all -n infra
NAME                           READY   STATUS    RESTARTS   AGE
pod/jenkins-54b8469cf9-vqw62   1/1     Running   0          66s


NAME              TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
service/jenkins   ClusterIP   192.168.7.170   <none>        80/TCP    55s


NAME                      READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/jenkins   1/1     1            1           67s

NAME                                 DESIRED   CURRENT   READY   AGE
replicaset.apps/jenkins-54b8469cf9   1         1         1       66s

可以看到挂载目录jenkins_home目录已经有文件了,包括初始化的用户名和密码

[root@hdss7-200 jenkins]# cd /data/nfs-volume/jenkins_home/
[root@hdss7-200 jenkins_home]# 
[root@hdss7-200 jenkins_home]# 
[root@hdss7-200 jenkins_home]# ll
total 36
-rw-r--r--  1 root root 1643 Aug 27 11:39 config.xml
-rw-r--r--  1 root root   50 Aug 27 11:37 copy_reference_file.log
-rw-r--r--  1 root root  156 Aug 27 11:37 hudson.model.UpdateCenter.xml
-rw-------  1 root root 1712 Aug 27 11:37 identity.key.enc
-rw-r--r--  1 root root    7 Aug 27 11:37 jenkins.install.UpgradeWizard.state
-rw-r--r--  1 root root  171 Aug 27 11:37 jenkins.telemetry.Correlator.xml
drwxr-xr-x  2 root root    6 Aug 27 11:37 jobs
drwxr-xr-x  3 root root   19 Aug 27 11:37 logs
-rw-r--r--  1 root root  907 Aug 27 11:37 nodeMonitors.xml
drwxr-xr-x  2 root root    6 Aug 27 11:37 nodes
drwxr-xr-x  2 root root    6 Aug 27 11:37 plugins
-rw-r--r--  1 root root   64 Aug 27 11:37 secret.key
-rw-r--r--  1 root root    0 Aug 27 11:37 secret.key.not-so-secret
drwx------  4 root root  265 Aug 27 11:37 secrets
drwxr-xr-x  2 root root   67 Aug 27 11:39 updates
drwxr-xr-x  2 root root   24 Aug 27 11:37 userContent
drwxr-xr-x  3 root root   56 Aug 27 11:37 users
drwxr-xr-x 11 root root 4096 Aug 27 11:37 war

通过web页面——右边导航栏容器组——jenkins-xxxx-xxxx——右上角日志

修改dns记录,修改的内容如下

[root@hdss7-11 ~]# vim /var/named/od.com.zone

               2020080107; serial
jenkins          A 10.4.7.10

检查

[root@hdss7-11 ~]# dig -t A jenkins.od.com @10.4.7.11 +short
10.4.7.10

访问jenkins页面,安装插件可以先跳过,后续可以手动安装。如果没有跳出来修改密码的界面,需要在这里修改密码为admin123

修改配置

勾选该选项,允许匿名用户来访问

下面这里取消打勾,产生的结果是允许跨域请求。

点击save进行保存。

安装plugins

点击Manage Plugins

然后点击下面的download and install after restart,之后会来到这个页面

最后,只要有success字样,就算安装成功。

如果没有安装成功,重新回到之前的页面,重新搜索并选择blue ocean,然后点击下面的download and install after restart继续安装失败的插件即可。

原文地址:https://www.cnblogs.com/liuhuan086/p/13571662.html