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-11为1,7-12的myid为2,7-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
继续安装失败的插件即可。