• 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继续安装失败的插件即可。

  • 相关阅读:
    Node Express4.x 片段视图 partials
    SVG知识难点
    MongoDB的安装和配置成服务的三种方法和一些难点
    git的使用
    单击获取索引的两种方式
    IOTA初识
    开始写博客啦
    虚拟化技术
    可信计算概论
    负载均衡
  • 原文地址:https://www.cnblogs.com/liuhuan086/p/13571662.html
Copyright © 2020-2023  润新知