一、Dubbo微服务概述

1.1: dubbo介绍

1.2: 部署内容

二、实验环境架构

2.1: 架构

1.1 架构图解

1.最上面一排为K8S集群外服务

1.1 代码仓库使用基于git的gitee

1.2 注册中心使用3台zk组成集群

1.3 用户通过ingress暴露出去的服务进行访问

2.中间层是K8S集群内服务

2.1 jenkins以容器方式运行,数据目录通过共享磁盘做持久化

2.2 整套dubbo微服务都以POD方式交付,通过zk集群通信

2.3 需要提供的外部访问的服务通过ingress方式暴露

3.最下层是运维主机层

3.1 harbor是docker私有仓库,存放docker镜像

3.2 POD相关yaml文件创建在运维主机特定目录

3.3 在K8S集群内通过nginx提供的下载连接应用yaml配置

1.2 交付说明:

docker虽然可以部署有状态服务,但如果不是有特别需要,还是建议不要部署有状态服务

K8S同理,也不建议部署有状态服务,如mysql,zk等。

因此手动将zookeeper创建集群提供给dubbo使用

2.2: 有状态服务和无状态服务

有状态---数据需要持久化,不能随意扩容

有状态软件也可以拆分成无状态(功能)和有状态部分(数据持久化)

三、部署zookeeper集群

3.1: zookeeper概述

3.2: 部署zookeeper

集群分布:7-11,7-12,7-21

zk是java服务,需要依赖jdk

3.2.1: Jdk下载

Zookeeper依赖于java环境

7-11,7-12,7-21

#上传解压

[root@hdss7-11 src]# mkdir /usr/java/ && tar xf /opt/src/jdk-8u221-linux-x64.tar.gz -C /usr/java/

#软链接

[root@hdss7-11 src]# ln -s /usr/java/jdk1.8.0_221/ /usr/java/jdk

3.2.2: java环境变量

cat >>/etc/profile <<'EOF'

#JAVA HOME

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

EOF

# 使环境变量生效

source /etc/profile

[root@hdss7-11 ~]# java -version

3.2.3: 二进制安装zookeeper

#下载地址

wget https://archive.apache.org/dist/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz

tar -zxf zookeeper-3.4.14.tar.gz -C /opt/

ln -s /opt/zookeeper-3.4.14/ /opt/zookeeper

创建zk配置文件:

cat >/opt/zookeeper/conf/zoo.cfg <<'EOF'

tickTime=2000

initLimit=10

syncLimit=5

dataDir=/data/zookeeper/data

dataLogDir=/data/zookeeper/logs

clientPort=2181

server.1=zk1.od.com:2888:3888

server.2=zk2.od.com:2888:3888

server.3=zk3.od.com:2888:3888

EOF

创建相关目录

mkdir -p /data/zookeeper/data

mkdir -p /data/zookeeper/logs

创建集群配置—myid

给每个zk不同的myid,以便区分主从

#7-11上

echo 1 > /data/zookeeper/data/myid

#7-12上

echo 2 > /data/zookeeper/data/myid

#7-21上

echo 3 > /data/zookeeper/data/myid

修改dns解析

到7.11上增加dns解析记录

vi /var/named/od.com.zone

...

zk1 A 10.4.7.11

zk2 A 10.4.7.12

zk3 A 10.4.7.21

systemctl restart named

#验证结果

~]# dig -t A zk1.od.com +short

10.4.7.11

将zk启动放进开机自启动

启动zk集群

在每台zk机器上都执行此操作

/opt/zookeeper/bin/zkServer.sh start

检查zk启动情况

~]# ss -ln|grep 2181

tcp LISTEN 0 50 :::2181 :::*

检查zk集群情况

[root@hdss7-11 ~]# /opt/zookeeper/bin/zkServer.sh status

ZooKeeper JMX enabled by default

Using config: /opt/zookeeper/bin/../conf/zoo.cfg

Mode: follower

[root@hdss7-12 ~]# /opt/zookeeper/bin/zkServer.sh status

ZooKeeper JMX enabled by default

Using config: /opt/zookeeper/bin/../conf/zoo.cfg

Mode: leader

[root@hdss7-21 ~]# /opt/zookeeper/bin/zkServer.sh status

ZooKeeper JMX enabled by default

Using config: /opt/zookeeper/bin/../conf/zoo.cfg

Mode: follower

准备java运行底包

运维主机上操作

四、部署jenkins服务配置ci流水线

4.1: 部署jenkins

准备镜像的操作在7.200运维机上完成jenkins镜像

下载官方镜像

docker pull jenkins/jenkins:2.190.3

docker tag jenkins/jenkins:2.190.3 harbor.od.com/public/jenkins:v2.190.3

docker push harbor.od.com/public/jenkins:v2.190.3

#生成密钥

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

#生成ssh密钥,dubbo项目使用git拉代码,走的ssh或者http,把私钥封装到jenkins镜像里,git服务器上放着公钥

cp /root/.ssh/id_rsa /data/dockerfile/jenkins/

自定义Dockerfile

cat >/data/dockerfile/jenkins/Dockerfile <<'EOF'

FROM harbor.od.com/public/jenkins:v2.190.3

#定义启动jenkins的用户

USER root

#修改时区为东八区

RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime &&\

echo
'Asia/Shanghai' >/etc/timezone

#加载用户密钥,使用ssh拉取dubbo代码需要

ADD id_rsa /root/.ssh/id_rsa

#加载运维主机的docker配置文件,里面包含登录harbor仓库的认证信息。

ADD config.json /root/.docker/config.json

#在jenkins容器内安装docker客户端,docker引擎用的是宿主机的docker引擎,安装后就可以使用docker命令了拉取上传harbor镜像

ADD get-docker.sh /get-docker.sh

# 跳过ssh时候输入yes的交互步骤,并执行安装docker

RUN echo
" StrictHostKeyChecking no" >/etc/ssh/ssh_config &&\

/get-docker.sh –mirror Aliyun

EOF

–mirror Aliyun
可以不写

获取docker.sh脚本:

curl -fsSL get.docker.com -o /data/dockerfile/jenkins/get-docker.sh

chmod u+x /data/dockerfile/jenkins/get-docker.sh

拷贝config.json文件:

cp /root/.docker/config.json /data/dockerfile/jenkins/

harbor中创建私有仓库infra

制作镜像

cd /data/dockerfile/jenkins/

docker build . -t harbor.od.com/infra/jenkins:v2.190.3

docker push harbor.od.com/infra/jenkins:v2.190.3

容器测试登录gitee

公钥信息(pub)粘贴进去,测试登录

[root@hdss7-200 jenkins]# docker run --rm harbor.od.com/infra/jenkins:v2.190.3 ssh -i /root/.ssh/id_rsa -T git@gitee.com

4.2: 准备jenkins运行环境

4.2.1: 专有名称空间和secret资源

创建专有namespace—为jenkins

创建专有名词空间infra的目录是将jenkins等运维相关软件放到同一个namespace下,便于统一管理以及和其他资源分开

[root@hdss7-21 opt]# kubectl create ns infra

#该空间将jenkins存进去

创建访问harbor的secret规则

三种secret

三种secret

Tls ,docker-register,token使用的

Secret用来保存敏感信息,例如密码、OAuth 令牌和 ssh key等,有三种类型:

1.Opaque:

base64 编码格式的 Secret,用来存储密码、密钥等,可以反解,加密能力弱

2.kubernetes.io/dockerconfigjson:

用来存储私有docker registry的认证信息。

3..kubernetes.io/service-account-token:

用于被serviceaccount引用,serviceaccout 创建时Kubernetes会默认创建对应的secret

前面dashborad部分以及用过了

创建

访问docker的私有仓库,必须要创建专有的secret类型,创建方法如下:

kubectl create secret docker-registry harbor \

--docker-server=harbor.od.com \

--docker-username=admin \

--docker-password=123456 \

-n infra

# 查看结果

~]# kubectl -n infra get secrets

NAME TYPE DATA AGE

default-token-rkg7q kubernetes.io/service-account-token 3 19s

harbor kubernetes.io/dockerconfigjson 1 12s

dashboar的查看

解释命令:
创建一条secret,资源类型是docker-registry,名字是 harbor
并指定docker仓库地址、访问用户、密码、仓库名

4.2.1: 准备nfs共享存储

将jenkins数据存放在k8s集群之外的共享存储

jenkins中一些数据需要持久化的,可以使用共享存储进行挂载:

这里使用最简单的NFS共享存储,因为k8s默认支持nfs模块

如果使用其他类型的共享存储

运维机部署NFS

#在200主机上

yum install nfs-utils -y

echo
'/data/nfs-volume 10.4.7.0/24(rw,no_root_squash)' >>/etc/exports

mkdir -p /data/nfs-volume/jenkins_home

systemctl start nfs

systemctl enable nfs

# 查看结果

~]# showmount -e

Export list for hdss7-200:

/data/nfs-volume 10.4.7.0/24

node节点安装nfs

yum install nfs-utils -y

4.2.3: 运维机创建jenkins资源清单

mkdir /data/k8s-yaml/jenkins

创建depeloy清单

有两个需要注意的地方:

  1. 挂载了宿主机的docker.sock
    使容器内的docker客户端可以直接与宿主机的docker引擎进行通信
  2. 在使用私有仓库的时候,资源清单中,一定要声明:

    imagePullSecrets:

    - name: harbor

cat >/data/k8s-yaml/jenkins/dp.yaml <<EOF

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 #卷名称,与容器的volume的名称一样

nfs: #nfs类型的卷

server: hdss7-200

path: /data/nfs-volume/jenkins_home

- name: docker #名字叫docker的卷

hostPath: #hostpath类型

path: /run/docker.sock #宿主机的文件,挂载到jenkins

type: ''

containers:

- name: jenkins

image: harbor.od.com/infra/jenkins:v2.190.3

imagePullPolicy: IfNotPresent #镜像拉取策略(awlays远程拉,never本地拉,ifnotpresent本地没有去远程仓库啦)

ports:

- containerPort: 8080

protocol: TCP

env: #环境变量

- name: JAVA_OPTS

value: -Xmx512m -Xms512m

volumeMounts:

- name: data

mountPath: /var/jenkins_home #data卷挂载到该容器路径

- name: docker

mountPath: /run/docker.sock

imagePullSecrets:

- name: harbor #叫harbor的secret(该镜像是私有的)

securityContext:

runAsUser: 0 #root启动jenkins

strategy:

type: RollingUpdate #滚动升级

rollingUpdate: #滚动升级方法升级jenkins

maxUnavailable: 1

maxSurge: 1

revisionHistoryLimit: 7 #留7份jenkins滚动版本

progressDeadlineSeconds: 600 #容器判定启动时间

EOF

解析:

声明拉取harbor镜像的secret

将容器的jenkins目录挂载到运维主机

将主机的/run/docker.sock挂载到容器中

选择jenkins升级方法为滚动升级

创建service清单

cat >/data/k8s-yaml/jenkins/svc.yaml <<EOF

kind: Service

apiVersion: v1

metadata:

name: jenkins

namespace: infra

spec:

ports:

- protocol: TCP

port: 80 #监听在clusterip上的端口,也就是service

targetPort: 8080 #容器端口

selector:

app: jenkins

EOF

创建ingress清单

cat >/data/k8s-yaml/jenkins/ingress.yaml <<EOF

kind: Ingress

apiVersion: extensions/v1beta1

metadata:

name: jenkins

namespace: infra

spec:

rules:

- host: jenkins.od.com

http:

paths:

- path: /

backend:

serviceName: jenkins

servicePort: 80

EOF

应用jenkins资源配置清单

kubectl create -f http://k8s-yaml.od.com/jenkins/dp.yaml

kubectl create -f http://k8s-yaml.od.com/jenkins/svc.yaml

kubectl create -f http://k8s-yaml.od.com/jenkins/ingress.yaml

#启动时间很长,等待结果

kubectl get pod -n infra

查看日志,最终显示完整启动,

配置dns解析

vi /var/named/od.com.zone

jenkins A 10.4.7.10

# 重启服务

systemctl restart named

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

10.4.7.10

验证jenkins容器状态—重要

docker exec -it 8ff92f08e3aa /bin/bash

# 查看用户

whoami

# 查看时区

date

# 查看是否能用宿主机的docker引擎

docker ps

# 看是否能免密访问gitee

ssh -i /root/.ssh/id_rsa -T git@gitee.com

# 是否能访问是否harbor仓库

docker login harbor.od.com

#因为在jenkins容器中安装了docker客户端,挂载了与宿主机通信额socket文件,所以可以在容器执行容器命令

登录jenkins

查看登录密码

[root@hdss7-200 jenkins]# cat /data/nfs-volume/jenkins_home/secrets/initialAdminPassword

1e13eed72e2e426ab160746c3685b29a

#跳过插件

#配置管理员用户

admin

admin123

替换jenkins插件源

cd /data/nfs-volume/jenkins_home/updates

sed -i 's#http:\/\/updates.jenkins-ci.org\/download#https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins#g' default.json

sed -i 's#http:\/\/www.google.com#https:\/\/www.baidu.com#g' default.json

Jenkins初始化

浏览器访问http://jenkins.od.com,使用前面的密码进入jenkins

进入后操作:

跳过安装自动安装插件的步骤

在manage jenkins->Configure Global Security菜单中设置

2.1 允许匿名读:勾选allow anonymous read access

2.2 允许跨域:勾掉prevent cross site request forgery exploits

搜索并安装蓝海插件blue ocean

设置用户名密码为admin:admin123

安全访问优化

安装pipine

小结

4.3: 安装部署maven

4.3.1: 二进制安装

200主机

#下载地址

https://archive.apache.org/dist/maven/maven-3/3.6.2/binaries/apache-maven-3.6.2-bin.tar.gz

#下载解压

wget https://archive.apache.org/dist/maven/maven-3/3.6.1/binaries/apache-maven-3.6.1-bin.tar.gz

mkdir
/data/nfs-volume/jenkins_home/maven-3.6.1-8u232

tar -zxf apache-maven-3.6.1-bin.tar.gz -C /data/nfs-volume/jenkins_home/maven-3.6.1-8u232

cd /data/nfs-volume/jenkins_home/maven-3.6.1-8u232/apache-maven-3.6.1

mv ./* ..

查看jenkins-jdk版本

#修改maven打包镜像地址

Settings文件是全局生效的,pom.xml文件是写在编译的目录里.pom文件优先级更高

[root@hdss7-200 conf]# vi /data/nfs-volume/jenkins_home/maven-3.6.1-8u232/conf/settings.xml

<mirror>

<id>nexus-aliyun</id>

<mirrorOf>*</mirrorOf>

<name>Nexus aliyun</name>

<url>http://maven.aliyun.com/nexus/content/groups/public</url>

</mirror>

更换maven的编译环境的jdk版本

3.6版本maven默认是使用环境变量jdk版本

200中进入Jenkins挂载目录中下载jdk1.7

Maven编译jdk版本相关的3个文件

/data/nfs-volume/jenkins_home/maven-3.6.1-8u232/conf/settings.xml

/data/nfs-volume/jenkins_home/workspace/dubbo-demo/dubbo-demo-service/3/pom.xml

/data/nfs-volume/jenkins_home/maven-3.6.1-8u232/bin/mvn

五、交付dubbo服务提供者到k8s

5.1: 制作dubbo微服务的镜像

5.1.1: 准备jre底包(7版本有一个7u80)

[root@hdss7-200 jre8]# docker pull docker.io/stanleyws/jre8:8u112 #老王docker官方的镜像

[root@hdss7-200 jre8]# docker images |grep jre

stanleyws/jre8 8u112 fa3a085d6ef1 2 years ago 363MB

[root@hdss7-200 jre8]# docker tag fa3a085d6ef1 harbor.od.com/public/jre:8u112

[root@hdss7-200 jre8]# docker push harbor.od.com/public/jre:8u112

5.1.2: 自定义dockerfile

root@hdss7-200 dockerfile]# mkdir jre8

[root@hdss7-200 dockerfile]# cd jre8/

[root@hdss7-200 jre8]# pwd

/data/dockerfile/jre8

自定义dockerfile,基于java环境的类似centos镜像(harbor.od.com/public/jre:8u112)

[root@hdss7-200 jre8]# vi Dockfile

FROM harbor.od.com/public/jre:8u112

RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime &&\

echo
'Asia/Shanghai' >/etc/timezone

ADD config.yml /opt/prom/config.yml

ADD jmx_javaagent-0.3.1.jar /opt/prom/

WORKDIR /opt/project_dir

ADD entrypoint.sh /entrypoint.sh

CMD ["/entrypoint.sh"]

#workdir—>要求工作目录为/opt/project_dir

Dockerfile中的WORKDIR指令用于指定容器的一个目录,容器启动时执行的命令会在该目录下执行,相当于设置了容器的工作目录。

5.1.3: 准备dockerfile提交的文件

1.准备java-agent的jar包(监控软件需要用到)

[root@hdss7-200 jre8]# wget https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/0.3.1/jmx_prometheus_javaagent-0.3.1.jar -O jmx_javaagent-0.3.1.jar

#通过这个jar包,取jvm信息(监控信息)

2.准备config.yml和

[root@hdss7-200 jre8]# vi config.yml

---

rules:

- pattern: '.*'

3.准备entrypoint.sh

[root@hdss7-200 jre8]# vi entrypoint.sh

#!/bin/sh

M_OPTS="-Duser.timezone=Asia/Shanghai -javaagent:/opt/prom/jmx_javaagent-0.3.1.jar=$(hostname -i):${M_PORT:-"12346"}:/opt/prom/config.yml"

#$(hostname -i)pod的ip

#):${M_PORT:-"12346"}:/端口12346,M_PORT变量默认值为- 12346,如果给了值,就用新值

#/opt/prom/config.yml 指定监控规则配置文件

C_OPTS=${C_OPTS}

#阿波罗监控用

JAR_BALL=${JAR_BALL}

#将当前容器环境变量中叫JAR_BALL环境变量存到变量中去(由资源配置清单提供变量)

exec
java -jar ${M_OPTS}
${C_OPTS}
${JAR_BALL}

#jar的包,exec把当前entrypoint进程权给java了.

[root@hdss7-200 jre8]# chmod +x entrypoint.sh #加权限

5.1.4: 建立base仓库,准备上传构建的新基础镜像

构建dubbo微服务的底包并推到harbor仓库

[root@hdss7-200 jre8]# docker
build . -t
harbor.od.com/base/jre8:8u112

[root@hdss7-200 jre8]# docker
push
harbor.od.com/base/jre8:8u112

5.2: dubbo-service-使用Jenkins进行持续构建交付服务的提供者

5.2.1: Jenkins创建流水线

5.2.2: Jenkins构建项目的10个参数

jenkins流水线配置的java项目的十个常用参数:

参数名

作用

举例或说明

app_name

项目名

dubbo_demo_service

image_name

docker镜像名

app/dubbo-demo-service

git_repo

项目的git地址

https://x.com/x/x.git

git_ver

项目的git分支或版本号

master

add_tag

镜像标签8位+常用时间戳

191203_1830

mvn_dir

执行mvn编译的目录

./

target_dir

编译产生包的目录

./target

mvn_cmd

编译maven项目的命令

mvc clean package -Dmaven.

base_image

项目的docker底包

不同的项目底包不一样,下拉选择

maven

maven软件版本

不同的项目可能maven环境不一样

mvn clean package -Dmaven.test.skip=true

base/jre7:7u80

base/jre8:8u112

3.6.1-8u232

3.2.5-8u045

2.2.1-6u025

5.2.3: Pipeline Script

上面定义的参数,在script中使用了

pipeline {

agent any

stages {

stage('pull') { //get project code from repo

steps {

sh "git clone ${params.git_repo} ${params.app_name}/${env.BUILD_NUMBER} && cd ${params.app_name}/${env.BUILD_NUMBER} && git checkout ${params.git_ver}"

}

}

stage('build') { //exec mvn cmd

steps {

sh "cd ${params.app_name}/${env.BUILD_NUMBER} && /var/jenkins_home/maven-${params.maven}/bin/${params.mvn_cmd}"

}

}

stage('package') { //move jar file into project_dir

steps {

sh "cd ${params.app_name}/${env.BUILD_NUMBER} && cd ${params.target_dir} && mkdir project_dir && mv *.jar ./project_dir"

}

}

stage('image') { //build image and
push to registry

steps {

writeFile file: "${params.app_name}/${env.BUILD_NUMBER}/Dockerfile", text: """FROM harbor.od.com/${params.base_image}

ADD ${params.target_dir}/project_dir /opt/project_dir"""

sh "cd ${params.app_name}/${env.BUILD_NUMBER} && docker build -t harbor.od.com/${params.image_name}:${params.git_ver}_${params.add_tag} . && docker push harbor.od.com/${params.image_name}:${params.git_ver}_${params.add_tag}"

}

}

}

}

解析

Jenkins的初始目录是在/data/nfs-volume/jenkins_home/workspace/

#注意:

参数base_image,是容器运行的基础环境,可以有2个版本,1.7jdk,1.8jdk

docker pull harbor.od.com:180/base/jre8:8u112 ---对应这个地址

#参数:maven,针对了不同mvn打包版本--à对应不同编译jdk(需要下载)

Pom文件

#在代码目录中

5.2.4: 声明参数-构建

mvn clean package -Dmaven.test.skip=true

clean清除本地缓存

package 不保留在本地,install 保留在本地

-e 只输出错误

-q 静默输出

添加app仓库(私有)

开始构建

小结:---------------------

整个jenkins构建流程

首先: 制作dubbo微服务基础镜像base

1.使用k8s集群里的jenkins容器,创建了一个流水线

2.流水线:拉取了gitee上的dubbo-demo-service的java源码包,并使用maven编译,该maven已经在200主机挂载的jenkins目录的maven目录中修改了settings文件的打包阿里地址

3.打包完源码包后,使用jenkins容器的docker给包打个标签,推送到harbor仓库

4.下一步是创建资源配置清单,使用这个镜像包,安装到k8s集群

5.3: dubbo-service创建资源配置清单制作pod

准备资源清单

创建清单操作都在7.200上操作

创建depeloy清单

[root@hdss7-200 dubbo-server]# mkdir /data/k8s-yaml/dubbo-server

cat>/data/k8s-yaml/dubbo-server/dp.yaml <<EOF

kind: Deployment

apiVersion: extensions/v1beta1

metadata:

name: dubbo-demo-service

namespace: app

labels:

name: dubbo-demo-service

spec:

replicas: 1

selector:

matchLabels:

name: dubbo-demo-service

template:

metadata:

labels:

app: dubbo-demo-service

name: dubbo-demo-service

spec:

containers:

- name: dubbo-demo-service

image: harbor.od.com/app/dubbo-demo-service:master_191201_1200

ports:

- containerPort: 20880

protocol: TCP

env:

- name: JAR_BALL #传递给容器启动时的脚本变量-à环境变量

value: dubbo-server.jar

imagePullPolicy: IfNotPresent

imagePullSecrets:

- name: harbor
#secret名称

restartPolicy: Always

terminationGracePeriodSeconds: 30 #启动超时时间

securityContext:

runAsUser: 0 #0代表root方式启动

schedulerName: default-scheduler

strategy:

type: RollingUpdate

rollingUpdate:

maxUnavailable: 1

maxSurge: 1

revisionHistoryLimit: 7

progressDeadlineSeconds: 600

EOF

应用资源配置清单

创建K8S资源的操作,在任意node节点上操作即可

创建app名称空间

kubectl create namespace app

创建secret资源

我们的业务镜像是harbor中的私有项目,所以需要创建docker-registry的secret资源:

kubectl -n app \

create secret docker-registry
harbor
\

--docker-server=harbor.od.com \

--docker-username=admin \

--docker-password=123456

应用资源清单

kubectl apply -f http://k8s-yaml.od.com/dubbo-server/dp.yaml

3分钟后检查启动情况

# 检查pod是否创建:

~]# kubectl -n app get pod

NAME READY STATUS RESTARTS AGE

dubbo-demo-service-79574b6879-cxkls 1/1 Running 0 24s

# 检查是否启动成功:

~]# kubectl -n app logs dubbo-demo-service-79574b6879-cxkls --tail=2

Dubbo server started

Dubbo 服务端已经启动

到zk服务器检查是否有服务注册

sh /opt/zookeeper/bin/zkCli.sh

[zk: localhost:2181(CONNECTED) 0] ls /

[dubbo, zookeeper]

[zk: localhost:2181(CONNECTED) 1] ls /dubbo

[com.od.dubbotest.api.HelloService]

#zookeeper没有做开机自启动

到此---dubbo-server服务交付成功(provider)

六、交付dubbo-monitor服务到k8s集群

dobbo-monitor源码地址: https://github.com/Jeromefromcn/dubbo-monitor.git

dubbo-monitor是监控zookeeper状态的一个服务,另外还有dubbo-admin,效果一样

6.1: 制作dobbo-monitor镜像

制作镜像在管理机7.200上操作

下载源码

cd /opt/src

wget https://github.com/Jeromefromcn/dubbo-monitor/archive/master.zip

yum -y install unzip

unzip dubbo-monitor-master.zip

mv dubbo-monitor-mster /data/dockerfile/dubbo-monitor

cd /data/dockerfile/dubbo-monitor

修改配置文件:

直接覆盖它原始的配置

其实它原本就没什么内容,只是修改了addr,端口,目录等

cat >dubbo-monitor-simple/conf/dubbo_origin.properties <<'EOF'

dubbo.container=log4j,spring,registry,jetty

dubbo.application.name=dubbo-monitor

dubbo.application.owner=OldboyEdu

dubbo.registry.address=zookeeper://zk1.od.com:2181?backup=zk2.od.com:2181,zk3.od.com:2181

dubbo.protocol.port=20880

dubbo.jetty.port=8080

dubbo.jetty.directory=/dubbo-monitor-simple/monitor

dubbo.statistics.directory=/dubbo-monitor-simple/statistics

dubbo.charts.directory=/dubbo-monitor-simple/charts

dubbo.log4j.file=logs/dubbo-monitor.log

dubbo.log4j.level=WARN

EOF

优化monitor启动脚本

# 修改jvm资源限制(非必须)

sed -i '/Xmx2g/ s#128m#16m#g' ./dubbo-monitor-simple/bin/start.sh

sed -i '/Xmx2g/ s#256m#32m#g' ./dubbo-monitor-simple/bin/start.sh

sed -i '/Xmx2g/ s#2g#128m#g' ./dubbo-monitor-simple/bin/start.sh

sed -i '/Xmx1g/ s#2g#128m#g' ./dubbo-monitor-simple/bin/start.sh

# 修改nohup为exec不能改,去掉改行最后的&符号

sed -ri 's#^nohup(.*) &#exec\1#g' ./dubbo-monitor-simple/bin/start.sh

# 删除exec命令行后面所有行

sed -i '66,$d' ./dubbo-monitor-simple/bin/start.sh

#复制到/data/dockerfile文件夹

[root@hdss7-200 ~]# cp -a dubbo-monitor /data/dockerfile/

[root@hdss7-200 dubbo-consumer]# cat /data/dockerfile/dubbo-monitor/Dockerfile

FROM jeromefromcn/docker-alpine-java-bash
#使用的是官方docker镜像

MAINTAINER Jerome Jiang

COPY dubbo-monitor-simple/ /dubbo-monitor-simple/

CMD /dubbo-monitor-simple/bin/start.sh

构建并上传

docker build . -t harbor.od.com/infra/dubbo-monitor:latest

docker push harbor.od.com/infra/dubbo-monitor:latest

6.2: 创建资源配置清单

准备目录

mkdir /data/k8s-yaml/dubbo-monitor

cd /data/k8s-yaml/dubbo-monitor

创建deploy资源文件

cat >dp.yaml <<EOF

kind: Deployment

apiVersion: extensions/v1beta1

metadata:

name: dubbo-monitor

namespace: infra

labels:

name: dubbo-monitor

spec:

replicas: 1

selector:

matchLabels:

name: dubbo-monitor

template:

metadata:

labels:

app: dubbo-monitor

name: dubbo-monitor

spec:

containers:

- name: dubbo-monitor

image: harbor.od.com/infra/dubbo-monitor:latest

ports:

- containerPort: 8080

protocol: TCP

- containerPort: 20880

protocol: TCP

imagePullPolicy: IfNotPresent

imagePullSecrets:

- name: harbor

restartPolicy: Always

terminationGracePeriodSeconds: 30

securityContext:

runAsUser: 0

schedulerName: default-scheduler

strategy:

type: RollingUpdate

rollingUpdate:

maxUnavailable: 1

maxSurge: 1

revisionHistoryLimit: 7

progressDeadlineSeconds: 600

EOF

创建service资源文件

cat >svc.yaml <<EOF

kind: Service

apiVersion: v1

metadata:

name: dubbo-monitor

namespace: infra

spec:

ports:

- protocol: TCP

port: 8080

targetPort: 8080

selector:

app: dubbo-monitor

EOF

创建ingress资源文件

cat >ingress.yaml <<EOF

kind: Ingress

apiVersion: extensions/v1beta1

metadata:

name: dubbo-monitor

namespace: infra

spec:

rules:

- host: dubbo-monitor.od.com

http:

paths:

- path: /

backend:

serviceName: dubbo-monitor

servicePort: 8080

EOF

6.3: 创建dubbo-miniotr服务

应用资源配置清单

在任意node节点

kubectl apply -f http://k8s-yaml.od.com/dubbo-monitor/dp.yaml

kubectl apply -f http://k8s-yaml.od.com/dubbo-monitor/svc.yaml

kubectl apply -f http://k8s-yaml.od.com/dubbo-monitor/ingress.yaml

验证:

~]# kubectl -n infra get pod

NAME READY STATUS RESTARTS AGE

dubbo-monitor-d9675688c-sctsx 1/1 Running 0 29s

jenkins-7cd8b95d79-6vrbn 1/1 Running 0 3d2h

添加dns解析

这个服务是有web页面的,创建了ingress和service资源的,所以需要添加dns解析

vi /var/named/od.com.zone

dubbo-monitor        A 10.4.7.10

重启并验证

systemctl
restart
named

dig
-t
A
dubbo-monitor.od.com @10.4.7.11 +short

访问monitor的web页面

访问dubbo-monitor.od.com

这里已经可以看到我们之前部署的dubbo-demo-service服务了,启动了两个进程来提供服务。
至此,dubbo-monitor监控服务已经部署完成。

七、交付dubbo服务消费者到k8s集群

7.1: 构建docker镜像

7.1.1: 获取私有仓库代码

之前创建的dubbo-service是微服务的提供者,现在创建一个微服务的消费者

使用git@gitee.com:noah-luo/dubbo-demo-web.git这个私有仓库中的代码构建消费者

先从https://gitee.com/sunx66/dubbo-demo-service这里fork到自己仓库,在设为私有

并修改zk的配置

7.1.2: 配置流水线

之前已经在jenkins配置好了流水线,只需要填写参数就行了。

参数名

参数值

app_name

dubbo-demo-consumer

image_name

app/dubbo-demo-consumer

git_repo

https://gitee.com/jinmuyan222/dubbo-demo-web.git

git_ver

master

add_tag

191201_1800

mvn_dir

./

target_dir

./dubbo-client/target

mvn_cmd

mvn clean package -e -q -Dmaven.test.skip=true

base_image,harbor-base镜像地址

base/jre8:8u112

maven

3.6.1

#Target_dir目录为编译完成项目后,产生的jar/war包所在的目录,需要问写代码的人

或者看下git包的目录

https://gitee.com/jinmuyan222/dubbo-demo-web.git

可以将/root/.m2./repository挂载出来,防止pod重启丢失了

7.1.3: 查看构建结果

如果构建不报错,则应该已经推送到harbor仓库中了,这时我们直接再给镜像一个新tag,以便后续模拟更新

docker tag \

harbor.od.com/app/dubbo-demo-consumer:master_200506_1430 \

harbor.od.com/app/dubbo-demo-consumer:master_200510_1430

docker push harbor.od.com/app/dubbo-demo-consumer:master_200510_1430

查看harbor仓库

7.2: 准备资源配置清单

先准备目录

mkdir /data/k8s-yaml/dubbo-consumer

cd /data/k8s-yaml/dubbo-consumer

创建deploy资源清单

cat >dp.yaml <<EOF

kind: Deployment

apiVersion: extensions/v1beta1

metadata:

name: dubbo-demo-consumer

namespace: app

labels:

name: dubbo-demo-consumer

spec:

replicas: 1

selector:

matchLabels:

name: dubbo-demo-consumer

template:

metadata:

labels:

app: dubbo-demo-consumer

name: dubbo-demo-consumer

spec:

containers:

- name: dubbo-demo-consumer

image: harbor.od.com/app/dubbo-demo-consumer:master_191201_1800

ports:

- containerPort: 8080

protocol: TCP

- containerPort: 20880

protocol: TCP

env:

- name: JAR_BALL

value: dubbo-client.jar

imagePullPolicy: IfNotPresent

imagePullSecrets:

- name: harbor

restartPolicy: Always

terminationGracePeriodSeconds: 30

securityContext:

runAsUser: 0

schedulerName: default-scheduler

strategy:

type: RollingUpdate

rollingUpdate:

maxUnavailable: 1

maxSurge: 1

revisionHistoryLimit: 7

progressDeadlineSeconds: 600

EOF

创建service资源清单

cat >svc.yaml <<EOF

kind: Service

apiVersion: v1

metadata:

name: dubbo-demo-consumer

namespace: app

spec:

ports:

- protocol: TCP

port: 8080

targetPort: 8080

selector:

app: dubbo-demo-consumer

EOF

创建ingress资源清单

cat >ingress.yaml <<EOF

kind: Ingress

apiVersion: extensions/v1beta1

metadata:

name: dubbo-demo-consumer

namespace: app

spec:

rules:

- host: dubbo-demo.od.com

http:

paths:

- path: /

backend:

serviceName: dubbo-demo-consumer

servicePort: 8080

EOF

创建K8S资源

应用资源配置清单:

kubectl apply -f http://k8s-yaml.od.com/dubbo-consumer/dp.yaml

kubectl apply -f http://k8s-yaml.od.com/dubbo-consumer/svc.yaml

kubectl apply -f http://k8s-yaml.od.com/dubbo-consumer/ingress.yaml

# 查看容器启动成功没

~]# kubectl get pod -n app

NAME READY STATUS RESTARTS AGE

dubbo-demo-consumer-b8d86bd5b-wbqhs 1/1 Running 0 6s

dubbo-demo-service-79574b6879-cxkls 1/1 Running 0 4h39m

验证启动结果

查看log,是否启动成功:

kubectl -n app logs --tail=2 dubbo-demo-consumer-b8d86bd5b-wbqhs

Dubbo client started

Dubbo 消费者端启动

检查dubbo-monitor是否已经注册成功:

添加dns解析

vi /var/named/od.com.zone

dubbo-demo        A 10.4.7.10

# 重启服务

systemctl restart named

# 验证

~]# dig -t A dubbo-demo.od.com @10.4.7.11 +short

10.4.7.10

访问解析

浏览器访问http://dubbo-demo.od.com/hello?name=lg

消费者端源码

提供者端源码

访问地址:dubbo-demo.od.com/hello?name=lg

7.3: 模拟版本升级

接下来我们模拟升级发版,之前已经用同一个镜像打了不同的tag并推送到从库
当然正常发版的顺序是:

修改dp.yaml资源配置清单

修改harbor镜像仓库中对应的tag版本:

sed -i 's#master_200506_1430#master_200510_1430#g' dp.yaml

应用修改后的资源配置清单

当然也可以在dashboard中进行在线修改:

kubectl apply -f http://k8s-yaml.od.com/dubbo-consumer/dp.yaml
~]# kubectl -n app  get pod
NAME                                   READY   STATUS    RESTARTS   AGE
dubbo-demo-consumer-84f75b679c-kdwd7   1/1     Running   0          54s
dubbo-demo-service-79574b6879-cxkls    1/1     Running   0          4h58m

使用浏览器验证

使用浏览器验证:http://dubbo-demo.od.com/hello?name=lg
在短暂的超时后,即可正常访问
至此,我们一套完成的dubbo服务就已经交付到k8s集群当中了,并且也演示了如何发版。

小结:-----------------

八、实战维护dubbo微服务

8.1: 项目发布

Add_tag 就是check out 的分支,镜像版本名称

在dashboard改拉取的镜像版本

8.2: 项目回滚

8.3: 小结-----------

左边持续集成,右边持续部署

8.4: 宿主机宕机测试

  1. 当一台宿主机宕,跑在该宿主机的服务将无法访问
  2. 此时监控软件判断到该宿主机宕了
  3. 监控触发脚本,kubectl delete node hdss7-21(相当于人为确认该主机宕了)
  4. K8s集群会自动将宕机节点的服务转移 .
  5. 前面的10节点上的负载均衡宕机节点也需要注释掉.
  6. Reload nginx

#宕机的主机恢复后,supervisor会自动开启所有系统服务,

再将标签打上(没什么用)

在宕机节点,开启扩充服务,再将之前转移的服务删掉

#为什么必须删除宕机节点,才能恢复?

宕机节点,k8s集群会认为他是短暂不可达.所以没恢复.

九、集群3个服务小结-------------------

提供者为什么没有svc和ingress资源?没用到,

Zk注册服务相当于dns,消费者找到注册中心,查看有没有helloworld服务,有的话,注册中心会给消费者

服务提供者的pod-ip(snat规则优化用到了,给的源地址),消费者再找到提供者ip,完成服务调用.

如果注册中心注册的不是pod-ip,而是集群ip,则服务提供者会用到svc资源.

Monitor说明问题了(snat规则优化用到了)

k8s-1-交付dubbo微服务的更多相关文章

  1. 交付Dubbo微服务到kubernetes集群

    1.基础架构 1.1.架构图 Zookeeper是Dubbo微服务集群的注册中心 它的高可用机制和k8s的etcd集群一致 java编写,需要jdk环境 1.2.节点规划 主机名 角色 ip hdss ...

  2. (转)实验文档2:实战交付一套dubbo微服务到kubernetes集群

    基础架构 主机名 角色 ip HDSS7-11.host.com k8s代理节点1,zk1 10.4.7.11 HDSS7-12.host.com k8s代理节点2,zk2 10.4.7.12 HDS ...

  3. 8.实战交付一套dubbo微服务到k8s集群(1)之Zookeeper部署

    1.基础架构 主机名 角色 ip HDSS7-11.host.com K8S代理节点1,zk1 10.4.7.11 HDSS7-12.host.com K8S代理节点2,zk2 10.4.7.12 H ...

  4. 实战交付一套dubbo微服务到k8s集群(1)之Zookeeper部署

    基础架构 主机名 角色 IP地址 mfyxw10.mfyxw.com K8S代理节点1,zk1 192.168.80.10 mfyxw20.mfyxw.com K8S代理节点2,zk2 192.168 ...

  5. Docker 系列七(Dubbo 微服务部署实践).

    一.前言 之前我们公司部署服务,就是大家都懂的那一套(安装JDK.Tomcat —> 编译好文件或者打war包上传 —> 启动Tomcat),这种部署方式一直持续了很久,带来的问题也很多: ...

  6. ZooKeeper分布式专题与Dubbo微服务入门

    第1章 分布式系统概念与ZooKeeper简介对分布式系统以及ZooKeeper进行简介,使得大家对其有大致的了解1-1 zookeeper简介1-2 什么是分布式系统1-3 分布式系统的瓶颈以及zk ...

  7. 使用Redis为注册中心的Dubbo微服务架构(基于SpringBoot)

    title: 使用Redis为注册中心的Dubbo微服务架构(基于SpringBoot) date: 2019-07-30 14:06:29 categories: 架构 author: mrzhou ...

  8. Dubbo 微服务系列(03)服务注册

    Dubbo 微服务系列(03)服务注册 [TOC] Spring Cloud Alibaba 系列目录 - Dubbo 篇 1. 背景介绍 图1 Dubbo经典架构图 注:本图来源 Dubbo官方架构 ...

  9. 使用 Skywalking 对 Kubernetes(K8s)中的微服务进行监控

    1. 概述 老话说的好:任何成功都不是轻易得来的,是不断地坚持与面对的结果. 言归正传,之前我们聊了 SpringCloud 开发的微服务是如何部署在  Kubernetes(K8s)集群中的,今天我 ...

随机推荐

  1. ctfhub技能树—web前置技能—http协议—请求方式

    打开靶机环境(每次打开都要30金币,好心疼啊) 题目描述为"请求方式" HTTP的请求方式共有八种 1.OPTIONS 返回服务器针对特定资源所支持的HTTP请求方法,也可以利用向 ...

  2. 翻译 - ASP.NET Core 基本知识 - 中间件(Middleware)

    翻译自 https://docs.microsoft.com/en-us/aspnet/core/fundamentals/middleware/?view=aspnetcore-5.0 中间件是集成 ...

  3. Gulp4.0入门和实战

    gulp4.0入门和实战 我最近遇到需要优化web的性能的任务,然后就捣鼓了一些对资源文件优化压缩的方案.由于之前的项目中有使用到gulp,所以在需要处理的web项目中也优先使用这个技术. 先聊聊gu ...

  4. Android 中使用 config.gradle

    各位同学大家好,当然了如果不是同学,那么大家也同好.哈哈. 大家知道config.gradle 是什么吗?我也不知道.开个完笑,其实config.gradle 就是我们为了统一gradle 中的各种配 ...

  5. 写给 Linux 初学者的一封信

    大家好,我是肖邦. 这篇文章是写给 Linux 初学者的,我会分享一些作为初学者应该知道的一些东西,这些内容都是本人从事 Linux 开发工作多年的心得体会,相信会对初学者有所帮助.如果你是 Linu ...

  6. 消息队列之activeMQ

    1.activeMQ的主要功能 实现高可用.高伸缩.高性能.易用和安全的企业级面向消息服务的系统 异步消息的消费和处理 控制消息的消费顺序 可以和Spring/springBoot整合简化编码 配置集 ...

  7. JavaScript小记

    JavaScript小记 1. 简介 1. 语言描述 JavaScript 是一门跨平台.面向对象的弱类型动态脚本编程语言 JavaScript 是一门基于原型.函数先行的语言 JavaScript ...

  8. Java运算符及包机制

    Java中的运算符及包机制 算术运算符:+ - * / % ++ -- 赋值运算符:=,+=,-=,*=,/= 关系运算符:>,<,>=,<=,==,!=,instanceof ...

  9. 前端知识(二)01-NPM包管理器-谷粒学院

    目录 一.简介 二.使用npm管理项目 1.项目初始化 2.修改npm镜像 3.npm install命令的使用 4.其它命令 一.简介 什么是NPM NPM全称Node Package Manage ...

  10. 使用bandit对目标python代码进行安全函数扫描

    技术背景 在一些对python开源库代码的安全扫描中,我们有可能需要分析库中所使用到的函数是否会对代码的执行环境造成一些非预期的影响.典型的例如python的沙箱逃逸问题,通过一些python的第三方 ...