k8s交付實戰-架構說明並准備zk集群
1 交付的服務架構圖:
1.1 架構圖解
- 最上面一排為K8S集群外服務
1.1 代碼倉庫使用基於git的gitee
1.2 注冊中心使用3台zk組成集群
1.3 用戶通過ingress暴露出去的服務進行訪問 - 中間層是K8S集群內服務
2.1 jenkins以容器方式運行,數據目錄通過共享磁盤做持久化
2.2 整套dubbo微服務都以POD方式交付,通過zk集群通信
2.3 需要提供的外部訪問的服務通過ingress方式暴露 - 最下層是運維主機層
3.1 harbor是docker私有倉庫,存放docker鏡像
3.2 POD相關yaml文件創建在運維主機特定目錄
3.3 在K8S集群內通過nginx提供的下載連接應用yaml配置
1.2 交付說明:
docker雖然可以部署有狀態服務,但如果不是有特別需要,還是建議不要部署有狀態服務
K8S同理,也不建議部署有狀態服務,如mysql,zk等。
因此手動將zookeeper創建集群提供給dubbo使用
2 部署ZK集群
集群分布:7-11,7-12,7-21
zk是java服務,需要依賴jdk
2.1 二進制安裝JDK
jdk請自行下載,只要是1.8版本的就可以,rpm安裝或二進制安裝均可:
2.1.1 解壓jdk
mkdir /opt/src
mkdir /usr/java
cd /opt/src
tar -xf jdk-8u221-linux-x64.tar.gz -C /usr/java/
ln -s /usr/java/jdk1.8.0_221/ /usr/java/jdk
2.1.2 寫入環境變量
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
java version "1.8.0_221"
Java(TM) SE Runtime Environment (build 1.8.0_221-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.221-b11, mixed mode)
2.2 二進制安裝zk
2.2.1 下載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
2.2.2 創建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.zq.com:2888:3888
server.2=zk2.zq.com:2888:3888
server.3=zk3.zq.com:2888:3888
EOF
創建相關目錄
mkdir -p /data/zookeeper/data
mkdir -p /data/zookeeper/logs
2.2.3 創建集群配置
給每個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
2.2.4 修改dns解析
到7.11
上增加dns解析記錄
vi /var/named/zq.com.zone
...
zk1 A 10.4.7.11
zk2 A 10.4.7.12
zk3 A 10.4.7.21
#驗證結果
~]# dig -t A zk1.zq.com +short
10.4.7.11
2.3 啟動zk集群
2.3.1 啟動zookeeper
在每台zk機器上都執行此操作
/opt/zookeeper/bin/zkServer.sh start
2.3.2 檢查zk啟動情況
~]# ss -ln|grep 2181
tcp LISTEN 0 50 :::2181 :::*
2.3.3 檢查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
到此,zookeeper集群就搭建好了。
3 准備java運行底包
運維主機上操作
3.1 拉取原始底包
docker pull stanleyws/jre8:8u112
docker tag fa3a085d6ef1 harbor.zq.com/public/jre:8u112
docker push harbor.zq.com/public/jre:8u112
3.2 制作新底包
mkdir -p /data/dockerfile/jre8/
cd /data/dockerfile/jre8/
3.2.1 制作dockerfile
cat >Dockerfile <<'EOF'
FROM harbor.zq.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 ["sh","/entrypoint.sh"]
EOF
3.2.2准備dockerfile需要的文件
添加config.yml
此文件是為后面用普羅米修斯監控做准備的
cat >config.yml <<'EOF'
---
rules:
- pattern: '.*'
EOF
下載jmx_javaagent,監控jvm信息:
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
創建entrypoint.sh啟動腳本:
使用exec 來運行java的jar包,能夠使腳本將自己的pid 為‘1’ 傳遞給java進程,避免docker容器因沒有前台進程而退出。並且不要加&符。
cat >entrypoint.sh <<'EOF'
#!/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"
C_OPTS=${C_OPTS}
JAR_BALL=${JAR_BALL}
exec java -jar ${M_OPTS} ${C_OPTS} ${JAR_BALL}
EOF
3.2.3 構建底包並上傳
在harbor中創建名為base
的公開倉庫,用來存放自己自定義的底包
docker build . -t harbor.zq.com/base/jre8:8u112
docker push harbor.zq.com/base/jre8:8u112