主題: 在k8s中集成Apollo配置中心
架構圖
一、配置中心概述
配置的幾種方式
本課講得是基於配置中心數據庫實現
配置管理的現狀
常見的配置中心
主講:k8s configmap,apollo
二、實戰k8s配置中心-configmap
2.1: 使用configmap管理應用配置
2.1.1: Configmap說明
configmap和secret
在K8S中,有兩種方式管理資源的配置,分別是configmap和secret,他們的最大區別是:
-
configmap用來管理明文配置
-
secret用來管理密文配置
0.1.2 怎么使用configmap
-
創建configmap資源
-
在deploy中定義congfigmap類型的volumes
-
在deoloy的containers中掛載此volumes
0.1.3 更新configmap配置的方法
單配置更新法:
-
修改configmap資源清單並應用
-
重啟使用該configmap資源的pod
多配置更換法:
-
准備多個configmap資源
-
修改dp中使用的configmap
-
重新apply該dp,pod會自動重啟
2.1.2: Configmap使用准備
清理資源
先將前面部署的3個dubbo服務的POD個數全部調整(scale)為0個,避免在應用configmap過程中可能的報錯,也為了節省資源
直接在dashboard上操作即可,
App命名空間--à生產者和消費者都伸縮成0
Dubbo-monitor也設置為0
拆分zk集群
分測試和生產環境了,將原來3台zk集群連接斷開,將zk1,和zk2做成單獨的zk使用,zk3關掉
主機名 |
角色 |
ip |
HDSS7-11.host.com |
zk1.od.com(Test環境) |
10.4.7.11 |
HDSS7-12.host.com |
zk2.od.com(Prod環境) |
10.4.7.12 |
先關閉zk集群
/opt/zookeeper/bin/zkServer.sh stop (3台zk集群全部關閉)
#刪除11,12節點上zookeeper上的數據和日志
[root@hdss7-12 ~]# rm /data/zookeeper/data/* -rf
[root@hdss7-12 ~]# rm /data/zookeeper/logs/* -rf
#修改配置文件.刪除與其他主機通信(11,12主機上)
保留如下這些
[root@hdss7-12 ~]# cat /opt/zookeeper/conf/zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/data/zookeeper/data
dataLogDir=/data/zookeeper/logs
clientPort=2181
重新開啟(11,12)
[root@hdss7-11 ~]# /opt/zookeeper/bin/zkServer.sh start
dubbo-monitor資源配置清單
老規矩,資源清單在7.200運維機上統一操作
cd /data/k8s-yaml/dubbo-monitor
configmap
創建comfigmap清單
cat >cm.yaml <<'EOF'
apiVersion: v1
kind: ConfigMap
metadata:
name: dubbo-monitor-cm
namespace: infra
data:
dubbo.properties: |
dubbo.container=log4j,spring,registry,jetty
dubbo.application.name=simple-monitor
dubbo.application.owner=OldboyEdu
dubbo.registry.address=zookeeper://zk1.od.com:2181
dubbo.protocol.port=20880
dubbo.jetty.port=8080
dubbo.jetty.directory=/dubbo-monitor-simple/monitor
dubbo.charts.directory=/dubbo-monitor-simple/charts
dubbo.statistics.directory=/dubbo-monitor-simple/statistics
dubbo.log4j.file=/dubbo-monitor-simple/logs/dubbo-monitor.log
dubbo.log4j.level=WARN
EOF
其實就是把dubbo-monitor配置文件中的內容用configmap語法展示出來了
當然最前面加上了相應的元數據信息
Configmap作為一個卷掛載到了容器里
deploy
cat >dp-cm.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
#----------------start---------------------------
volumeMounts:
- name: configmap-volume
mountPath: /dubbo-monitor-simple/conf
volumes:
- name: configmap-volume
configMap: #掛載到了configmap-volume目錄上,容器中目錄
name: dubbo-monitor-cm
#----------------end-----------------------------
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
注釋中的內容就是新增在原dp.yaml中增加的內容,解釋如下:
-
申明一個卷,卷名為configmap-volume
-
指定這個卷使用名為dubbo-monitor-cm的configMap
-
在containers中掛載卷,卷名與申明的卷相同
-
用mountPath的方式掛載到指定目錄
Umask使掛載只讀
創建資源並檢查
應用資源配置清單
kubectl apply -f http://k8s-yaml.od.com/dubbo-monitor/cm.yaml
kubectl apply -f http://k8s-yaml.od.com/dubbo-monitor/dp-cm.yaml
dashboard檢查創建結果
在dashboard中查看infra名稱空間中的configmap資源
然后檢查容器中的配置
kubectl -n infra exec -it dubbo-monitor-5b7cdddbc5-xpft6 bash
# 容器內
bash-4.3# cat /dubbo-monitor-simple/conf/dubbo.properties
dubbo.container=log4j,spring,registry,jetty
dubbo.application.name=simple-monitor
dubbo.application.owner=
dubbo.registry.address=zookeeper://zk1.od.com:2181
....
http://dubbo-monitor.od.com/status.html
檢查dubbo-monitor頁面的注冊信息
2.1.3: 更新configmap資源
多配置更新法
准備新configmap
再准備一個configmap叫cm-pro.yaml
cp cm.yaml cm-pro.yaml
# 把資源名字改成dubbo-monitor-cm-pro
sed -i 's#dubbo-monitor-cm#dubbo-monitor-cm-pro#g' cm-pro.yaml
# 把服務注冊到zk2.od.com上
sed -i 's#zk1#zk2#g' cm-pro.yaml
dashboard上修改zook地址
修改deploy配置
sed -i 's#dubbo-monitor-cm#dubbo-monitor-cm-pro#g' dp-cm.yaml
更新資源
# 應用新configmap
kubectl apply -f http://k8s-yaml.od.com/dubbo-monitor/cm-pro.yaml
# 更新deploy
kubectl apply -f http://k8s-yaml.od.com/dubbo-monitor/dp-cm.yaml
檢查配置是否更新
新的pod已經起來了
~]# kubectl -n infra get pod
NAME READY STATUS RESTARTS AGE
dubbo-monitor-c7fbf68b9-7nffj 1/1 Running 0 52s
進去看看是不是應用的新的configmap配置:
kubectl -n infra exec -it dubbo-monitor-5cb756cc6c-xtnrt bash
# 容器內
bash-4.3# cat /dubbo-monitor-simple/conf/dubbo.properties |grep zook
dubbo.registry.address=zookeeper://zk2.od.com:2181
看下dubbo-monitor的頁面:已經是zk2了。
掛載方式探討
monutPath掛載的問題
我們使用的是mountPath,這個是掛載整個目錄,會使容器內的被掛載目錄中原有的文件不可見,可以看見我們。
查看我們pod容器啟動的命令可以看見原來腳本中的命令已經無法對掛載的目錄操作了
如何單獨掛載一個配置文件:
只掛載單獨一個文件而不是整個目錄,需要添加subPath方法
單獨掛載文件演示
更新配置
在dp-cm.yaml的配置中,將原來的volume配置做一下更改
#----------------start---------------------------
volumeMounts:#卷掛載動作
- name: configmap-volume
mountPath: /dubbo-monitor-simple/conf
volumes:#聲明卷
- name: configmap-volume
configMap:
name: dubbo-monitor-cm
#----------------end-----------------------------
# 調整為
#----------------start---------------------------
volumeMounts:
- name: configmap-volume
mountPath: /dubbo-monitor-simple/conf
- name: configmap-volume
mountPath: /var/dubbo.properties
subPath: dubbo.properties
volumes:
- name: configmap-volume
configMap:
name: dubbo-monitor-cm
#----------------end-----------------------------
應用apply配置並驗證
kubectl apply -f http://k8s-yaml.od.com/dubbo-monitor/dp-cm.yaml
kubectl -n infra exec -it dubbo-monitor-5cb756cc6c-xtnrt bash
# 容器內操作
bash-4.3# ls -l /var/
total 4
drwxr-xr-x 1 root root 29 Apr 13 2016 cache
-rw-r--r-- 1 root root 459 May
10 10:02 dubbo.properties
drwxr-xr-x 2 root root 6 Apr 1 2016 empty
.....
根據文件創建configmap資源
[root@hdss7-22 conf]# kubectl create cm kubelet-cm --from-file=./kubelet.kubeconfig
三、Apollo配置中心介紹
3.1: 介紹
3.2: 架構
Client: dubbo-demo-custom,dubbo-demo-service
Apoll3兄弟:config service,admin service,portal
將dubbo的配置,寫到config DB
Portal:web界面,可以在頁面修改configdb中的配置數據
四、實戰交付apollo配置中心組件---configservice到k8s集群
Apollo的注冊中心
4.1: apollo-configservice安裝部署
4.1.1: 准備apollo-configservice軟件包
apollo-configservice軟件包下載地址:https://github.com/ctripcorp/apollo/releases/download/v1.5.1/apollo-configservice-1.5.1-github.zip
在運維主機200上執行
[root@mfyxw50 ~]# cd /opt/src
[root@mfyxw50 src]# wget https://github.com/ctripcorp/apollo/releases/download/v1.5.1/apollo-configservice-1.5.1-github.zip
[root@mfyxw50 src]# mkdir -p /data/dockerfile/apollo-configservice
[root@mfyxw50 src]# unzip apollo-configservice-1.5.1-github.zip -d /data/dockerfile/apollo-configservice/
[root@mfyxw50 src]# rm -fr /data/dockerfile/apollo-configservice/apollo-configservice-1.5.1-sources.jar #用不到
[root@hdss7-200 scripts]# rm /data/dockerfile/apollo-configservice/scripts/shutdown.sh -f #用不到
#apollo-configservice-1.5.1-sources.jar源碼包用不到
4.1.2: 安裝MariaDB數據庫
在數據庫主機HDSS7-11.host.com上:
注意:MySQL版本應為5.6或以上!
(1)添加MariaDB源
vi /etc/yum.repos.d/MariaDB.repo
[mariadb]
name = MariaDB
baseurl = https://mirrors.ustc.edu.cn/mariadb/yum/10.1/centos7-amd64/
gpgkey=https://mirrors.ustc.edu.cn/mariadb/yum/RPM-GPG-KEY-MariaDB
gpgcheck=1
(2)導入MariaDB證書
導入GPG-KEY
[root@hdss7-11 ~]# rpm --import https://mirrors.ustc.edu.cn/mariadb/yum/RPM-GPG-KEY-MariaDB
(3)生成緩存
[root@mfyxw10 ~]# yum makecache
(4)查看可用的MariaDB數據庫版本
[root@mfyxw10 ~]# yum list MariaDB-server --show-duplicates
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: mirrors.163.com
* extras: mirrors.ustc.edu.cn
* updates: mirrors.aliyun.com
Available Packages
MariaDB-server.x86_64 10.1.43-1.el7.centos mariadb
MariaDB-server.x86_64 10.1.44-1.el7.centos mariadb
MariaDB-server.x86_64 10.1.45-1.el7.centos mariadb
mariadb-server.x86_64 1:5.5.65-1.el7
(5)安裝MariaDB-Server 10.1.45版本
[root@mfyxw10 ~]# yum -y install MariaDB-server
(6)設置MariaDB配置文件
/etc/my.cnf.d/server.cnf文件內容如下
[root@mfyxw10 ~]# cat > /etc/my.cnf.d/server.cnf << EOF
#
# These groups are read by MariaDB server.
# Use it for options that only the server (but not clients) should see
#
# See the examples of server my.cnf files in /usr/share/mysql/
#
# this is read by the standalone daemon and embedded servers
[server]
# this is only for the mysqld standalone daemon
[mysqld]
character_set_server = utf8mb4
collation_server = utf8mb4_general_ci
init_connect = "SET NAMES 'utf8mb4'"
#
# * Galera-related settings
#
[galera]
# Mandatory settings
#wsrep_on=ON
#wsrep_provider=
#wsrep_cluster_address=
#binlog_format=row
#default_storage_engine=InnoDB
#innodb_autoinc_lock_mode=2
#
# Allow server to accept connections on all interfaces.
#
#bind-address=0.0.0.0
#
# Optional setting
#wsrep_slave_threads=1
#innodb_flush_log_at_trx_commit=0
# this is only for embedded server
[embedded]
# This group is only read by MariaDB servers, not by MySQL.
# If you use the same .cnf file for MySQL and MariaDB,
# you can put MariaDB-only options here
[mariadb]
# This group is only read by MariaDB-10.1 servers.
# If you use the same .cnf file for MariaDB of different versions,
# use this group for options that older servers don't understand
[mariadb-10.1]
EOF
/etc/my.cnf.d/mysql-clients.cnf文件內容如下
[root@mfyxw10 ~]# cat > /etc/my.cnf.d/mysql-clients.cnf << EOF
#
# These groups are read by MariaDB command-line tools
# Use it for options that affect only one utility
#
[mysql]
default-character-set = utf8mb4
[mysql_upgrade]
[mysqladmin]
[mysqlbinlog]
[mysqlcheck]
[mysqldump]
[mysqlimport]
[mysqlshow]
[mysqlslap]
EOF
(7)啟動MariaDB數據庫並添加至開機自啟
[root@mfyxw10 ~]# systemctl enable --now mariadb
[root@hdss7-11 ~]# systemctl start mysql
[root@hdss7-11 ~]# systemctl status mysql
[root@mfyxw10 ~]# netstat -tanlp | grep mysql #查看MariaDB的啟動端口
(8)設置MariaDB數據庫密碼
[root@mfyxw10 ~]# mysqladmin -uroot password #設置密碼:回車
[root@mfyxw10 ~]# mysql -uroot -p #輸入數據庫密碼登錄
MariaDB [(none)]> \s #檢查字符集
MariaDB [(none)]> drop database test;
MariaDB [(none)]> use mysql;
MariaDB [mysql]> delete from user where user='';
或都使用如下命令對MariaDB數據庫初始化設置
[root@mfyxw10 ~]# mysql_secure_installation
(9)登錄MariaDB數據庫查看編碼是否都是UTF-8
[root@mfyxw10 ~]# mysql -uroot -p
MariaDB [(none)]> \s
(10)下載並導入apollo數據庫初始化腳本
apollo的初始化數據腳本:https://raw.githubusercontent.com/ctripcorp/apollo/v1.5.1/scripts/db/migration/configdb/V1.0.0__initialization.sql
[root@mfyxw10 ~]# mysql -uroot -p < apolloconfig.sql
(11)查看apollo的數據庫及表
[root@mfyxw10 ~]# mysql -uroot -p
MariaDB [(none)]> show databases;
MariaDB [(none)]> use ApolloConfigDB;
MariaDB [ApolloConfigDB]> show tables;
(12)給數據庫用戶授予權限
[root@mfyxw10 ~]# mysql -uroot -p
Query OK, 0 rows affected (0.00 sec)
MariaDB [mysql]> select user,host from mysql.user;
+--------------+-------------------+
+--------------+-------------------+
| apolloconfig | 192.168.80.% |
+--------------+-------------------+
為什么寫"@"10.4.7.%"授權網段, 因為數據庫在11主機上,沒有做flannel,出網進網肯定是要用10.4.7網段才能訪問.
(13)修改ApolloConfigDB數據庫的值
[root@mfyxw10 ~]# mysql -uroot -p
MariaDB [(none)]> use ApolloConfigDB;
MariaDB [ApolloConfigDB]> select * from ServerConfig\G;
[root@mfyxw10 ~]# mysql -uroot -p
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
MariaDB [ApolloConfigDB]> select * from ServerConfig\G;
4.1.3: 解析域名
(1)在od.com域名的配置文件中添加mysql.od.com和config.od.com域名
[root@mfyxw10 ~]# cat > /var/named/od.com.zone << EOF
@ IN SOA dns.od.com. dnsadmin.od.com. (
harbor A 192.168.80.50 ;添加harbor記錄
dubbo-monitor A 192.168.80.100
(2)重啟DNS服務器服務
[root@mfyxw10 ~]# systemctl restart named
(3)測試域名解析
[root@hdss7-11 ~]# dig -t A config.od.com @10.4.7.11 +short 192.168.80.11
4.1.4: 制作apolloconfig的docker鏡像
(1)更新application-github.properties
spring.datasource.url = jdbc:mysql://mysql.od.com:3306/ApolloConfigDB?characterEncoding=utf8
spring.datasource.username = apolloconfig
spring.datasource.password = 123456
#apollo.eureka.server.enabled=true
#apollo.eureka.client.enabled=true
(2)更新startup.sh文件
[root@mfyxw50 ~]# cat > /data/dockerfile/apollo-configservice/scripts/startup.sh << EOF
SERVICE_NAME=apollo-configservice
## Adjust log dir if necessary
## Adjust server port if necessary
LOG_DIR=~/opt/logs/apollo-config-server
APOLLO_CONFIG_SERVICE_NAME=$(hostname -i)
SERVER_URL="http://${APOLLO_CONFIG_SERVICE_NAME}:${SERVER_PORT}"
## Adjust memory settings if necessary
## Only uncomment the following when you are using server jvm
#export JAVA_OPTS="$JAVA_OPTS -server -XX:-ReduceInitialCardMarks"
########### The following is the same for configservice, adminservice, portal ###########
if [[ -n "$JAVA_HOME" ]] && [[ -x "$JAVA_HOME/bin/java" ]]; then
elif type -p java > /dev/null 2>&1; then
elif [[ -x "/usr/bin/java" ]]; then
version=$("$javaexe" -version 2>&1 | awk -F '"' '/version/ {print $2}')
version=$(echo "$version" | awk -F. '{printf("%03d%03d",$1,$2);}')
# now version is of format 009003 (9.3.x)
if [ $version -ge 011000 ]; then
JAVA_OPTS="$JAVA_OPTS -Xlog:gc*:$LOG_DIR/gc.log:time,level,tags -Xlog:safepoint -Xlog:gc+heap=trace"
elif [ $version -ge 010000 ]; then
JAVA_OPTS="$JAVA_OPTS -Xlog:gc*:$LOG_DIR/gc.log:time,level,tags -Xlog:safepoint -Xlog:gc+heap=trace"
elif [ $version -ge 009000 ]; then
JAVA_OPTS="$JAVA_OPTS -Xlog:gc*:$LOG_DIR/gc.log:time,level,tags -Xlog:safepoint -Xlog:gc+heap=trace"
JAVA_OPTS="$JAVA_OPTS -XX:+UseParNewGC"
JAVA_OPTS="$JAVA_OPTS -Xloggc:$LOG_DIR/gc.log -XX:+PrintGCDetails"
printf "$(date) ==== Starting ==== \n"
echo "$(date) Failed to start $SERVICE_NAME.jar, return code: $rc"
[root@hdss7-200 scripts]# chmod u+x startup.sh
[root@hdss7-21 ~]# kubectl logs apollo-configservice-746fd46575-w8sns -n infra
(3)編寫Dockefile文件
[root@mfyxw50 ~]# cat > /data/dockerfile/apollo-configservice/Dockerfile << EOF
FROM harbor.od.com/base/jre8:8u112
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime &&\
echo "Asia/Shanghai" > /etc/timezone
ADD apollo-configservice-\${VERSION}.jar /apollo-configservice/apollo-configservice.jar
ADD config/ /apollo-configservice/config
ADD scripts/ /apollo-configservice/scripts
CMD ["/apollo-configservice/scripts/startup.sh"]
(4)制作docker鏡像
[root@mfyxw50 ~]# cd /data/dockerfile/apollo-configservice
(5)將制作好的docker鏡像上傳至私有倉庫
[root@mfyxw50 ~]# docker login harbor.od.com
[root@mfyxw50 ~]# docker push harbor.od.com/infra/apollo-configservice:v1.5.1
(6)查看私有倉庫中infra是否已經有apollo-configservice:v1.5.1
4.1.5: 提供apolloconfig配置資源清單
(1)創建存儲apolloconfig配置資源清單的目錄
[root@mfyxw50 ~]# mkdir -p /data/k8s-yaml/apollo-configservice
(2)添加配置資源清單
[root@mfyxw50 ~]# cat > /data/k8s-yaml/apollo-configservice/deployment.yaml << EOF
apiVersion: extensions/v1beta1
image: harbor.od.com/infra/apollo-configservice:v1.5.1
mountPath: /apollo-configservice/config
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
terminationGracePeriodSeconds: 30
schedulerName: default-scheduler
[root@mfyxw50 ~]# cat > /data/k8s-yaml/apollo-configservice/service.yaml << EOF
[root@mfyxw50 ~]# cat > /data/k8s-yaml/apollo-configservice/Ingress.yaml << EOF
apiVersion: extensions/v1beta1
serviceName: apollo-configservice
[root@mfyxw50 ~]# cat > /data/k8s-yaml/apollo-configservice/configmap.yaml << EOF
application-github.properties: |
spring.datasource.url = jdbc:mysql://mysql.od.com:3306/ApolloConfigDB?characterEncoding=utf8
spring.datasource.username = apolloconfig
spring.datasource.password = 123456
eureka.service.url = http://config.od.com/eureka
4.1.6: 應用apolloconfig配置資源清單
(1)應用apolloconfig配置資源清單
[root@mfyxw30 ~]# kubectl apply -f http://k8s-yaml.od.com/apollo-configservice/configmap.yaml
configmap/apollo-configservice-cm created
[root@mfyxw30 ~]# kubectl apply -f http://k8s-yaml.od.com/apollo-configservice/deployment.yaml
deployment.extensions/apollo-configservice created
[root@mfyxw30 ~]# kubectl apply -f http://k8s-yaml.od.com/apollo-configservice/service.yaml
service/apollo-configservice created
[root@mfyxw30 ~]# kubectl apply -f http://k8s-yaml.od.com/apollo-configservice/Ingress.yaml
ingress.extensions/apollo-configservice created
(2)查看apolloconfig的pod是否運行起來
[root@mfyxw30 ~]# kubectl get pod -n infra
NAME READY STATUS RESTARTS AGE
apollo-configservice-5f6555448-wssq5 1/1 Running 0 51s
dubbo-monitor-6676dd74cc-9hghb 1/1 Running 7 14d
dubbo-monitor-6676dd74cc-rd86g 1/1 Running 6 14d
jenkins-b99776c69-p6skp 1/1 Running 14 36d
4.1.7: 瀏覽器訪問config.od.com
4.2: apollo-configservice連接數據庫IP分析
五、交付apollo配置中心組件---adminservice到k8s集群
在Portal的web界面創建項目,寫入鍵值,相當於在dashboard修改了configmap中的配置
Portal會把數據傳遞給adminservice,adminservice又把數據存到configdb中
在pod的dp中指定獲取數據路徑.指定config.od.com.當刪除重建pod時會在這個地址讀取定義的變量數據
5.1: 部署apollo-adminservice軟件包
apollo-adminservice軟件包鏈接地址:https://github.com/ctripcorp/apollo/releases/download/v1.5.1/apollo-adminservice-1.5.1-github.zip
(1)下載軟件
[root@mfyxw50 ~]# cd /opt/src/
(2)解壓到指定的目錄
[root@mfyxw50 ~]# mkdir -p /data/dockerfile/apollo-adminservice
(3)刪除不使用的文件
[root@mfyxw50 ~]# rm -fr /data/dockerfile/apollo-adminservice/apollo-adminservice-1.5.1-sources.jar
[root@mfyxw50 ~]# rm -fr /data/dockerfile/apollo-adminservice/scripts/shutdown.sh
[root@mfyxw50 ~]# rm -fr /data/dockerfile/apollo-adminservice/apollo-adminservice.conf
5.2: 制作apollo-adminservice的Docker鏡像
(1)配置數據庫連接串
spring.datasource.url = jdbc:mysql://mysql.od.com:3306/ApolloConfigDB?characterEncoding=utf8
spring.datasource.username = apolloconfig
spring.datasource.password = 123456
(2)更新startup.sh文件
[root@mfyxw50 ~]# cat > /data/dockerfile/apollo-adminservice/scripts/startup.sh << EOF
SERVICE_NAME=apollo-adminservice
## Adjust log dir if necessary
LOG_DIR=/opt/logs/apollo-adminservice
## Adjust server port if necessary
APOLLO_ADMIN_SERVICE_NAME=\$(hostname -i)
# SERVER_URL="http://localhost:\${SERVER_PORT}"
SERVER_URL="http://\${APOLLO_ADMIN_SERVICE_NAME}:\${SERVER_PORT}"
## Adjust memory settings if necessary
## Only uncomment the following when you are using server jvm
#export JAVA_OPTS="\$JAVA_OPTS -server -XX:-ReduceInitialCardMarks"
########### The following is the same for configservice, adminservice, portal ###########
if [[ -n "\$JAVA_HOME" ]] && [[ -x "\$JAVA_HOME/bin/java" ]]; then
javaexe="\$JAVA_HOME/bin/java"
elif type -p java > /dev/null 2>&1; then
elif [[ -x "/usr/bin/java" ]]; then
version=\$("\$javaexe" -version 2>&1 | awk -F '"' '/version/ {print \$2}')
version=\$(echo "\$version" | awk -F. '{printf("%03d%03d",\$1,\$2);}')
# now version is of format 009003 (9.3.x)
if [ \$version -ge 011000 ]; then
elif [ \$version -ge 010000 ]; then
elif [ \$version -ge 009000 ]; then
JAVA_OPTS="\$JAVA_OPTS -XX:+UseParNewGC"
JAVA_OPTS="\$JAVA_OPTS -Xloggc:\$LOG_DIR/gc.log -XX:+PrintGCDetails"
printf "\$(date) ==== Starting ==== \n"
chmod 755 \$SERVICE_NAME".jar"
echo "\$(date) Failed to start \$SERVICE_NAME.jar, return code: \$rc"
(3)編寫apollo-adminservice的Dockerfile文件
[root@mfyxw50 ~]# cat > /data/dockerfile/apollo-adminservice/Dockerfile << EOF
FROM harbor.od.com/base/jre8:8u112
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime &&\
echo "Asia/Shanghai" > /etc/timezone
ADD apollo-adminservice-\${VERSION}.jar /apollo-adminservice/apollo-adminservice.jar
ADD config/ /apollo-adminservice/config
ADD scripts/ /apollo-adminservice/scripts
CMD ["/apollo-adminservice/scripts/startup.sh"]
(3)制作鏡像並推送
[root@mfyxw50 ~]# cd /data/dockerfile/apollo-adminservice
[root@mfyxw50 apollo-adminservice]# docker build . -t harbor.od.com/infra/apollo-adminservice:v1.5.1
[root@mfyxw50 ~]# docker login harbor.od.com
[root@mfyxw50 ~]# docker push harbor.od.com/infra/apollo-adminservice:v1.5.1
(4)登錄harbor查看是否已經上傳成功
5.3: 准備apollo-adminservice的資源配置清單
[root@mfyxw50 ~]# mkdir -p /data/k8s-yaml/apollo-adminservice
(1)Deployment.yaml文件內容如下
[root@mfyxw50 ~]# cat > /data/k8s-yaml/apollo-adminservice/deployment.yaml << EOF
apiVersion: extensions/v1beta1
image: harbor.od.com/infra/apollo-adminservice:v1.5.1
mountPath: /apollo-adminservice/config
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
terminationGracePeriodSeconds: 30
schedulerName: default-scheduler
(2)ConfigMap.yaml文件內容如下
[root@mfyxw50 ~]# cat > /data/k8s-yaml/apollo-adminservice/configmap.yaml << EOF
application-github.properties: |
spring.datasource.url = jdbc:mysql://mysql.od.com:3306/ApolloConfigDB?characterEncoding=utf8
spring.datasource.username = apolloconfig
spring.datasource.password = 123456
eureka.service.url = http://config.od.com/eureka
5.4: 應用apollo-adminservice資源配置清單
在master節點(mfyxw30.mfyxw.com或mfyxw40.mfyxw.com)任意一台操作
(1)應用資源配置清單
[root@mfyxw30 ~]# kubectl apply -f http://k8s-yaml.od.com/apollo-adminservice/deployment.yaml
deployment.extensions/apollo-adminservice created
[root@mfyxw30 ~]# kubectl apply -f http://k8s-yaml.od.com/apollo-adminservice/configmap.yaml
configmap/apollo-adminservice-cm created
(2)查看apollo-adminservice的pod是否運行成功
[root@mfyxw30 ~]# kubectl get pod -n infra
NAME READY STATUS RESTARTS AGE
apollo-adminservice-5cccf97c64-bhqzb 1/1 Running 0 72s
apollo-configservice-5f6555448-wwgsc 1/1 Running 1 2d17h
dubbo-monitor-6676dd74cc-9hghb 1/1 Running 11 17d
dubbo-monitor-6676dd74cc-rd86g 1/1 Running 10 17d
(3)瀏覽器訪問config.od.com是否出現有apollo-adminservice
六、交付apollo配置中心組件---portal到k8s集群
6.1: 執行apollo-portal數據庫腳本
(1)將apollo-portal數據庫腳本下載回來
(2)導入apollo-portal數據庫腳本
[root@mfyxw10 ~]# mysql -uroot -p < apolloportal.sql
(3)查看是否導入成功
[root@mfyxw10 ~]# mysql -uroot -p
MariaDB [(none)]> show databases; #Apollo-portal的數據庫名為:ApolloPortalDB
MariaDB [(none)]> use ApolloPortalDB; #切換至ApolloPortalDB數據庫
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
MariaDB [ApolloPortalDB]> show tables; #查看ApolloPortalDB數據庫下的數據表
(4)ApolloPortal數據庫授權
[root@mfyxw10 ~]# mysql -uroot -p
MariaDB [(none)]>flush privileges;
Query OK, 0 rows affected (0.00 sec)
(5)更新ApolloPortal數據表ServerConfig的Value
[root@mfyxw10 ~]# mysql -uroot -p
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 44
Server version: 10.1.45-MariaDB MariaDB Server
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> use ApolloPortalDB;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
MariaDB [ApolloPortalDB]> show tables;
MariaDB [ApolloPortalDB]> select * from ServerConfig\G;
[root@mfyxw10 ~]# mysql -uroot -p
MariaDB [(none)]> use ApolloPortalDB;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
6.2: 准備apollo-portal軟件
(1)下載apollo-portal軟件
[root@mfyxw50 ~]# cd /opt/src/
[root@mfyxw50 ~]# wget https://github.com/ctripcorp/apollo/releases/download/v1.5.1/apollo-portal-1.5.1-github.zip
(2)解壓apollo-portal軟件至相對應的目錄
[root@mfyxw50 ~]# mkdir /data/dockerfile/apollo-portal
[root@mfyxw50 ~]# unzip /opt/src/apollo-portal-1.5.1-github.zip -d /data/dockerfile/apollo-portal
(3)刪除apollo-portal目錄用不到的文件
[root@mfyxw50 ~]# rm -fr /data/dockerfile/apollo-portal/apollo-portal-1.5.1-sources.jar
[root@mfyxw50 ~]# rm -fr /data/dockerfile/apollo-portal/apollo-portal.conf
[root@mfyxw50 ~]# rm -fr /data/dockerfile/apollo-portal/scripts/shutdown.sh
(4)配置數據庫連接串
[root@mfyxw50 ~]# cat > /data/dockerfile/apollo-portal/config/application-github.properties << EOF
# DataSource
spring.datasource.url = jdbc:mysql://mysql.od.com:3306/ApolloPortalDB?characterEncoding=utf8
spring.datasource.username = apolloconfig
spring.datasource.password = 123456
EOF
(5)配置Portal的mate service(此處可以不修改,在configmap處已經引入了)
[root@mfyxw50 ~]# cat > /data/dockerfile/apollo-portal/config/apollo-env.properties << EOF
local.meta=http://localhost:8080
dev.meta=http://config.od.com:8080
fat.meta=http://fill-in-fat-meta-server:8080
uat.meta=http://fill-in-uat-meta-server:8080
lpt.meta=${lpt_meta}
pro.meta=http://fill-in-pro-meta-server:8080
EOF
(6)更新apollo-portal的startup.sh文件
[root@mfyxw50 ~]# cat > /data/dockerfile/apollo-portal/scripts/startup.sh << EOF
#!/bin/bash
SERVICE_NAME=apollo-portal
## Adjust log dir if necessary
LOG_DIR=/opt/logs/apollo-portal-server
## Adjust server port if necessary
SERVER_PORT=8080
APOLLO_PORTAL_SERVICE_NAME=\$(hostname -i)
# SERVER_URL="http://localhost:\$SERVER_PORT"
SERVER_URL="http://\${APOLLO_PORTAL_SERVICE_NAME}:\${SERVER_PORT}"
## Adjust memory settings if necessary
#export JAVA_OPTS="-Xms2560m -Xmx2560m -Xss256k -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=384m -XX:NewSize=1536m -XX:MaxNewSize=1536m -XX:SurvivorRatio=8"
## Only uncomment the following when you are using server jvm
#export JAVA_OPTS="\$JAVA_OPTS -server -XX:-ReduceInitialCardMarks"
########### The following is the same for configservice, adminservice, portal ###########
export JAVA_OPTS="\$JAVA_OPTS -XX:ParallelGCThreads=4 -XX:MaxTenuringThreshold=9 -XX:+DisableExplicitGC -XX:+ScavengeBeforeFullGC -XX:SoftRefLRUPolicyMSPerMB=0 -XX:+ExplicitGCInvokesConcurrent -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError -XX:-OmitStackTraceInFastThrow -Duser.timezone=Asia/Shanghai -Dclient.encoding.override=UTF-8 -Dfile.encoding=UTF-8 -Djava.security.egd=file:/dev/./urandom"
export JAVA_OPTS="\$JAVA_OPTS -Dserver.port=\$SERVER_PORT -Dlogging.file=\$LOG_DIR/$SERVICE_NAME.log -XX:HeapDumpPath=\$LOG_DIR/HeapDumpOnOutOfMemoryError/"
# Find Java
if [[ -n "\$JAVA_HOME" ]] && [[ -x "\$JAVA_HOME/bin/java" ]]; then
javaexe="\$JAVA_HOME/bin/java"
elif type -p java > /dev/null 2>&1; then
javaexe=\$(type -p java)
elif [[ -x "/usr/bin/java" ]]; then
javaexe="/usr/bin/java"
else
echo "Unable to find Java"
exit 1
fi
if [[ "\$javaexe" ]]; then
version=\$("\$javaexe" -version 2>&1 | awk -F '"' '/version/ {print \$2}')
version=\$(echo "\$version" | awk -F. '{printf("%03d%03d",\$1,\$2);}')
# now version is of format 009003 (9.3.x)
if [ \$version -ge 011000 ]; then
JAVA_OPTS="\$JAVA_OPTS -Xlog:gc*:\$LOG_DIR/gc.log:time,level,tags -Xlog:safepoint -Xlog:gc+heap=trace"
elif [ \$version -ge 010000 ]; then
JAVA_OPTS="\$JAVA_OPTS -Xlog:gc*:\$LOG_DIR/gc.log:time,level,tags -Xlog:safepoint -Xlog:gc+heap=trace"
elif [ \$version -ge 009000 ]; then
JAVA_OPTS="\$JAVA_OPTS -Xlog:gc*:\$LOG_DIR/gc.log:time,level,tags -Xlog:safepoint -Xlog:gc+heap=trace"
else
JAVA_OPTS="\$JAVA_OPTS -XX:+UseParNewGC"
JAVA_OPTS="\$JAVA_OPTS -Xloggc:\$LOG_DIR/gc.log -XX:+PrintGCDetails"
JAVA_OPTS="\$JAVA_OPTS -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=60 -XX:+CMSClassUnloadingEnabled -XX:+CMSParallelRemarkEnabled -XX:CMSFullGCsBeforeCompaction=9 -XX:+CMSClassUnloadingEnabled -XX:+PrintGCDateStamps -XX:+PrintGCApplicationConcurrentTime -XX:+PrintHeapAtGC -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=5M"
fi
fi
printf "\$(date) ==== Starting ==== \n"
cd \`dirname \$0\`/..
chmod 755 \$SERVICE_NAME".jar"
./\$SERVICE_NAME".jar" start
rc=\$?;
if [[ \$rc != 0 ]];
then
echo "\$(date) Failed to start \$SERVICE_NAME.jar, return code: \$rc"
exit \$rc;
fi
tail -f /dev/null
EOF
6.3: 制作Apollo-Portal的Docker鏡像
在運維主機(mfyxw50.mfyxw.com)上操作
(1)編寫Apollo-Portal的Docker文件
[root@mfyxw50 ~]# cat > /data/dockerfile/apollo-portal/Dockerfile << EOF
FROM harbor.od.com/base/jre8:8u112
ENV VERSION 1.5.1
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime &&\
echo "Asia/Shanghai" > /etc/timezone
ADD apollo-portal-\${VERSION}.jar /apollo-portal/apollo-portal.jar
ADD config/ /apollo-portal/config
ADD scripts/ /apollo-portal/scripts
CMD ["/apollo-portal/scripts/startup.sh"]
EOF
(2)制作Apollo-portal鏡像
[root@mfyxw50 ~]# cd /data/dockerfile/apollo-portal
[root@mfyxw50 apollo-portal]# docker build . -t harbor.od.com/infra/apollo-portal:v1.5.1
[root@mfyxw50 apollo-portal]# docker login harbor.od.com
[root@mfyxw50 apollo-portal]# docker push harbor.od.com/infra/apollo-portal:v1.5.1
6.4: 解析portal.od.com域名
在mfyxw10.mfyxw.com主機操作
(1)設置域名
[root@mfyxw10 ~]# cat > /var/named/od.com.zone << EOF
\$ORIGIN od.com.
\$TTL 600 ; 10 minutes
@ IN SOA dns.od.com. dnsadmin.od.com. (
;序號請加1,表示比之前版本要新
2020031312 ; serial
10800 ; refresh (3 hours)
900 ; retry (15 minutes)
604800 ; expire (1 week)
86400 ; minimum (1 day)
)
NS dns.od.com.
\$TTL 60 ; 1 minute
dns A 192.168.80.10
harbor A 192.168.80.50 ;添加harbor記錄
k8s-yaml A 192.168.80.50
traefik A 192.168.80.100
dashboard A 192.168.80.100
zk1 A 192.168.80.10
zk2 A 192.168.80.20
zk3 A 192.168.80.30
jenkins A 192.168.80.100
dubbo-monitor A 192.168.80.100
demo A 192.168.80.100
mysql A 192.168.80.10
config A 192.168.80.100
portal A 192.168.80.100
EOF
(2)重啟DNS服務
[root@mfyxw10 ~]# systemctl restart named
(3)測試解析
[root@mfyxw10 ~]# dig -t A portal.od.com @192.168.80.10 +short
192.168.80.100
6.5: 准備Apollo-portal資源配置文件
在運維主機mfyxw50.mfyxw.com上操作
(1)創建用於存放Apollo-portal資源配置文件目錄
[root@mfyxw50 ~]# mkdir -p /data/k8s-yaml/apollo-portal
(2)deployment.yaml文件內容如下:
[root@mfyxw50 ~]# cat > /data/k8s-yaml/apollo-portal/deployment.yaml << EOF
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
name: apollo-portal
namespace: infra
labels:
name: apollo-portal
spec:
replicas: 1
selector:
matchLabels:
name: apollo-portal
template:
metadata:
labels:
app: apollo-portal
name: apollo-portal
spec:
volumes:
- name: configmap-volume
configMap:
name: apollo-portal-cm
containers:
- name: apollo-portal
image: harbor.od.com/infra/apollo-portal:v1.5.1
ports:
- containerPort: 8080
protocol: TCP
volumeMounts:
- name: configmap-volume
mountPath: /apollo-portal/config
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
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
(3)service.yaml文件內容如下:
[root@mfyxw50 ~]# cat > /data/k8s-yaml/apollo-portal/service.yaml << EOF
kind: Service
apiVersion: v1
metadata:
name: apollo-portal
namespace: infra
spec:
ports:
- protocol: TCP
port: 8080
targetPort: 8080
selector:
app: apollo-portal
clusterIP: None
type: ClusterIP
sessionAffinity: None
EOF
(4)Ingress.yaml文件內容如下:
[root@mfyxw50 ~]# cat > /data/k8s-yaml/apollo-portal/Ingress.yaml << EOF
kind: Ingress
apiVersion: extensions/v1beta1
metadata:
name: apollo-portal
namespace: infra
spec:
rules:
- host: portal.od.com
http:
paths:
- path: /
backend:
serviceName: apollo-portal
servicePort: 8080
EOF
(5)ConfigMap.yaml文件內容如下:
[root@mfyxw50 ~]# cat > /data/k8s-yaml/apollo-portal/configmap.yaml << EOF
apiVersion: v1
kind: ConfigMap
metadata:
name: apollo-portal-cm
namespace: infra
data:
application-github.properties: |
# DataSource
spring.datasource.url = jdbc:mysql://mysql.od.com:3306/ApolloPortalDB?characterEncoding=utf8
spring.datasource.username = apolloportal
spring.datasource.password = 123456
app.properties: |
appId=100003173
apollo-env.properties: |
dev.meta=http://config.od.com
EOF
6.6: 應用Apollo-portal資源配置清單
在master節點(mfyxw30.mfyxw.com或mfyxw40.mfyxw.com)任意一台上執行即可
(1)應用Apollo-portal資源配置清單
[root@mfyxw30 ~]# kubectl apply -f http://k8s-yaml.od.com/apollo-portal/deployment.yaml
deployment.extensions/apollo-portal created
[root@mfyxw30 ~]#
[root@mfyxw30 ~]# kubectl apply -f http://k8s-yaml.od.com/apollo-portal/service.yaml
service/apollo-portal created
[root@mfyxw30 ~]#
[root@mfyxw30 ~]# kubectl apply -f http://k8s-yaml.od.com/apollo-portal/Ingress.yaml
ingress.extensions/apollo-portal created
[root@mfyxw30 ~]#
[root@mfyxw30 ~]# kubectl apply -f http://k8s-yaml.od.com/apollo-portal/configmap.yaml
configmap/apollo-portal-cm created
(2)查看Apollo-portal的pod是否正常啟動
[root@mfyxw30 ~]# kubectl get pod -n infra
NAME READY STATUS RESTARTS AGE
apollo-adminservice-5cccf97c64-bhqzb 1/1 Running 1 6h22m
apollo-configservice-5f6555448-7wxsp 1/1 Running 1 6h16m
apollo-portal-57bc86966d-jz5vg 1/1 Running 0 112s
dubbo-monitor-6676dd74cc-9hghb 1/1 Running 13 17d
dubbo-monitor-6676dd74cc-rd86g 1/1 Running 12 17d
jenkins-b99776c69-p6skp 1/1 Running 17 39d
6.7: 使用瀏覽器portal.od.com登錄
開源軟件都要改默認密碼
Apollo-portal默認的用戶為:apollo 密碼為:admin 第一次登錄后,強烈建議修改密碼,在此修改密碼為:admin123
在web界面修改數據庫數據
對應修改了數據庫鍵值如下
管理員工具-系統信息
七、實戰配置dubbo微服務接收apollo配置中心管理
7.1: Dubbo服務者連接apollo實戰
創建項目
新增配置
添加配置
#zk1是測試環境
發布配置
Jenkins-重新制作dubbo-service的harbor鏡像
#apollo分支編寫的參數變量是對應apollo注冊的參數
Jenkins-編寫拉取參數
修改dubbo-service的dp資源配置清單
cat dp.yaml
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:apollo_200805_1600 #新構建的鏡像地址
ports:
- containerPort: 20880
protocol: TCP
env:
- name: JAR_BALL
value: dubbo-server.jar
- name: C_OPTS #添加的新環境變量
value: -Denv=dev -Dapollo.meta=http://config.od.com #添加的新容器啟動參數
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
小結-apollo配置中心如何工作的
對應了dubbo-service服務提供者程序中如下2個變量
Register地址代表,服務注冊的zk數據庫地址,
Port代表,monitor探查dubbo-service服務狀態暴露的端口,如果這里改了(dubbo-monitor應當也該改地址)
#相當於以環境變量的方式,在程序啟動時中調用.
在Portal的web界面創建項目,寫入鍵值,相當於在dashboard修改了configmap中的配置
Portal會把數據傳遞給adminservice,adminservice又把數據存到configdb中
在pod的dp中指定獲取數據路徑.指定config.od.com.當刪除重建pod時會在這個地址讀取定義的變量數據
注: 可以在程序中實現apollo監聽器的方法,實現實時監聽apollo配置中心鍵值變化,實時reload生效,達到pod更新配置的效果
不需要,人為刪除pod重啟
八、apollo配置中心創建
和dubbo服務提供者一樣.重新制作dubbo-web的harbor鏡像(將配置環境變量化)
gitee-消費者代碼與apollo配置中心連接點
創建apollo配置中心
提交,再點一下發布
#開始構建
修改dubbo-demo-消費者dp資源清單
再次應用.apollo的配置就在pod里的項目生效了
九、實戰使用apollo配置中心管理測試環境和生產環境
8.1: Zk數據庫添加dns解析
8.2: 環境介紹
在實際企業環境,應該將測試環境和生產環境放到2個不同的k8s集群,而不是現在這樣以名稱空間區分
環境 |
命名空間 |
應用 |
測試環境(TEST) |
test |
apollo-config,apollo-admin,zk1,apolloconfigdb |
測試環境(TEST) |
test |
dubbo-demo-service,dubbo-demo-web |
生產環境(PROD) |
prod |
apollo-config,apollo-admin, apolloconfigdb |
生產環境(PROD) |
prod |
dubbo-demo-service,dubbo-demo-web,zk2 |
ops環境(infra)--共用 |
infra |
jenkins,dubbo-monitor,apollo-portal |
8.3: 創建測試環境
8.3.1: 環境准備
創建名稱空間和secret
1)首先停掉apollo3兄弟
創建test名稱空間
[root@hdss7-21 ~]# kubectl create ns test
namespace/test created
#在test名稱空間創建secret資源
[root@hdss7-21 ~]# kubectl create secret docker-registry harbor --docker-server=harbor.od.com --docker-username=admin --docker-password=123456 -n test
11主機創建apolloconfigdb測試庫
#修改apolloconfig.sql
[root@hdss7-11 ~]# vi apolloconfig.sql
[root@hdss7-11 ~]# mysql -uroot -p <apolloconfig.sql
查看創建的apolloconfig測試庫
#修改數據庫連接eruke信息,
#測試庫使用的地址改一下
MariaDB [ApolloConfigTestDB]> select * from ServerConfig\G;
MariaDB [(none)]> update ApolloConfigTestDB.ServerConfig set ServerConfig.Value="http://config-test.od.com/eureka" where ServerConfig.Key="eureka.service.url";
#添加數據庫訪問用戶授權
MariaDB [(none)]> grant SELECT,DELETE,UPDATE,INSERT on ApolloConfigTestDB.* to "apolloconfig"@"10.4.7.%" identified by "123456";
Query OK, 0 rows affected (0.00 sec)
創建測試環境資源清單目錄
[root@hdss7-200 k8s-yaml]# mkdir -pv test/{apollo-configservice,apollo-adminservice,dubbo-demo-service,dubbo-demo-consumer}
8.3.2: 測試環境發布apollo-configservice
將資源清單依次拷過來修改
[root@hdss7-200 apollo-configservice]# pwd
/data/k8s-yaml/test/apollo-configservice
[root@hdss7-200 apollo-configservice]# cp /data/k8s-yaml/apollo-configservice/* .
[root@hdss7-200 apollo-configservice]# ls
configmap.yaml deployment.yaml Ingress.yaml service.yaml
修改資源清單中(所有)
1.名稱空間改為test
2.修改config.od.com地址為config-test.od.com
3. spring.datasource.url = jdbc:mysql://mysql.od.com:3306/ApolloConfigTestDB?characterEncoding
應用資源配置清單
kubectl apply -f http://k8s-yaml.od.com/test/apollo-configservice/configmap.yaml
kubectl apply -f http://k8s-yaml.od.com/test/apollo-configservice/deployment.yaml
kubectl apply -f http://k8s-yaml.od.com/test/apollo-configservice/service.yaml
kubectl apply -f http://k8s-yaml.od.com/test/apollo-configservice/Ingress.yaml
8.3.3: 在測試環境發布apollo-adminservice
修改資源清單(configmap,dp)
名稱空間改成test
Configmap改:
eureka.service.url = http://config-test.od.com/eureka
spring.datasource.url = jdbc:mysql://mysql.od.com:3306/ApolloConfigTestDB?characterEncoding=utf8
應用資源配置清單:
kubectl apply -f http://k8s-yaml.od.com/test/apollo-adminservice/configmap.yaml
kubectl apply -f http://k8s-yaml.od.com/test/apollo-adminservice/deployment.yaml
8.3.4: 在測試環境發布dubbo-service
[root@hdss7-200 dubbo-demo-service]# pwd
/data/k8s-yaml/test/dubbo-demo-service
#修改資源清單
[root@hdss7-200 dubbo-demo-service]# vi dp.yaml
namespace: test
value: -Denv=fat -Dapollo.meta=http://config-test.od.com
#應用資源清單
[root@hdss7-21 ~]# kubectl apply -f http://k8s-yaml.od.com/test/dubbo-demo-service/dp.yaml
8.3.5: 在測試環境發布dubbo-cosumer
[root@hdss7-200 dubbo-demo-consumer]# cp /data/k8s-yaml/dubbo-consumer/*.yaml .
修改資源清單
namespace: test (ingress,dp,svc)
value: -Denv=dev -Dapollo.meta=http://config-test.od.com(dp)
- host: demo-test.od.com(ingress)
添加dns解析
demo-test A 10.4.7.10
[root@hdss7-11 ~]# systemctl restart named
應用資源配置清單
kubectl apply -f http://k8s-yaml.od.com/test/dubbo-demo-consumer/dp.yaml
kubectl apply -f http://k8s-yaml.od.com/test/dubbo-demo-consumer/svc.yaml
kubectl apply -f http://k8s-yaml.od.com/test/dubbo-demo-consumer/ingress.yaml
測試訪問
Demo-test.od.com/hello?name=xiao
8.4: 創建生產環境
8.4.1: 環境准備
創建名稱空間和secret
1)首先停掉apollo3兄弟
創建prod名稱空間
[root@hdss7-21 ~]# kubectl create ns prod
namespace/test created
#在prod名稱空間創建secret資源
[root@hdss7-21 ~]# kubectl create secret docker-registry harbor --docker-server=harbor.od.com --docker-username=admin --docker-password=123456 -n prod
11主機創建apolloconfigdb生產庫
創建生產環境的configdb
[root@hdss7-11 ~]# mysql -uroot -p <apolloconfig.sql
#修改數據庫連接eruke信息,
#生產庫使用的地址改一下
MariaDB [ApolloConfigTestDB]> select * from ServerConfig\G;
MariaDB [(none)]> update ApolloConfigProdDB.ServerConfig set ServerConfig.Value="http://config-prod.od.com/eureka" where ServerConfig.Key="eureka.service.url";
#添加數據庫訪問用戶授權
MariaDB [(none)]> grant SELECT,DELETE,UPDATE,INSERT on ApolloConfigProdDB.* to "apolloconfig"@"10.4.7.%" identified by "123456";
Query OK, 0 rows affected (0.00 sec)
創建生產環境資源清單目錄
[root@hdss7-200 k8s-yaml]# mkdir -pv prod/{apollo-configservice,apollo-adminservice,dubbo-demo-service,dubbo-demo-consumer}
8.4.2: 生產環境發布apollo-configservice
將資源清單依次拷過來修改
[root@hdss7-200 apollo-configservice]# pwd
/data/k8s-yaml/prod/apollo-configservice
[root@hdss7-200 apollo-configservice]# cp /data/k8s-yaml/test/apollo-configservice/* .
[root@hdss7-200 apollo-configservice]# sed -i 's/test/prod/g' ./* #替換成prod
再將連接的數據庫地址改掉
應用資源配置清單
kubectl apply -f http://k8s-yaml.od.com/prod/apollo-configservice/configmap.yaml
kubectl apply -f http://k8s-yaml.od.com/prod/apollo-configservice/deployment.yaml
kubectl apply -f http://k8s-yaml.od.com/prod/apollo-configservice/service.yaml
kubectl apply -f http://k8s-yaml.od.com/prod/apollo-configservice/Ingress.yaml
8.4.3: 在生產環境發布apollo-adminservice
修改資源清單(configmap,dp)
名稱空間改成prod
Configmap改:
eureka.service.url = http://config-prod.od.com/eureka
spring.datasource.url = jdbc:mysql://mysql.od.com:3306/ApolloConfigProdDB?characterEncoding=utf8
[root@hdss7-200 apollo-adminservice]# cp /data/k8s-yaml/test/apollo-adminservice/* .
[root@hdss7-200 apollo-adminservice]# sed -i 's/test/prod/g' ./* #不要這樣改,會把harbor地址改錯
手動修改數據庫地址,域名
應用資源配置清單
kubectl apply -f http://k8s-yaml.od.com/prod/apollo-adminservice/configmap.yaml
kubectl apply -f http://k8s-yaml.od.com/prod/apollo-adminservice/deployment.yaml
8.3.4: 在生產環境發布dubbo-service
添加dns解析
demo-prod A 10.4.7.10
[root@hdss7-11 ~]# systemctl restart named
修改資源配置清單
[root@hdss7-200 dubbo-demo-service]# cp /data/k8s-yaml/test/dubbo-demo-service/*.yaml .
namespace: prod
value: -Denv=pro -Dapollo.meta=http://apollo-configservice:8080 #此地址對應config-prod.od.com(apollo的service地址)
應用資源配置清單
[root@hdss7-21 ~]# kubectl apply -f http://k8s-yaml.od.com/prod/dubbo-demo-service/dp.yaml
8.3.5: 在生產環境發布dubbo-consumer
[root@hdss7-200 dubbo-demo-consumer]# cp /data/k8s-yaml/test/dubbo-demo-consumer/*.yaml .
修改資源配置清單
名稱空間
namespace: prod (ingress,dp,svc)
value: -Denv=pro -Dapollo.meta=http://config-prod.od.com
- host: demo-prod.od.com(ingress)
應用資源配置清單
kubectl apply -f http://k8s-yaml.od.com/prod/dubbo-demo-consumer/dp.yaml
kubectl apply -f http://k8s-yaml.od.com/prod/dubbo-demo-consumer/svc.yaml
kubectl apply -f http://k8s-yaml.od.com/prod/dubbo-demo-consumer/ingress.yaml
測試訪問
Demo-prod.od.com/hello?name=xiao
8.5: 公共部分
刪除ApolloConfigDB
11主機上,mysql
drop database ApolloConfigDB;
修改portaldb可支持的環境列表
MariaDB [ApolloPortalDB]> use ApolloPortalDB;
MariaDB [ApolloPortalDB]> update ServerConfig set value='fat,pro' where Id=1; #可支持的環境列表修改
修改apollo-portal的cm資源清單
[root@hdss7-200 apollo-portal]# vi /data/k8s-yaml/apollo-portal/configmap.yaml
修改標黃2行
應用cm資源清單
[root@hdss7-21 ~]# kubectl apply -f http://k8s-yaml.od.com/apollo-portal/configmap.yaml
添加dns解析(apollo-service)
刪除apollo-portaldb中的dev項目數據
MariaDB [ApolloPortalDB]> use ApolloPortalDB;
MariaDB [ApolloPortalDB]> truncate table AppNamespace;
MariaDB [ApolloPortalDB]> truncate table App;
重新啟動portaldb
Apollo配置中心配置微服務參數—dubbo服務提供者
登錄apollo-potral
系統參數---查詢apollo.portal.envs
配置apollo-連接dubbo微服務
#檢查admin service資源清單,發現harbor地址被替換錯了
#如果apollo開啟之前,項目創建有問題,需要刪除重建
添加測試環境參數
#添加對應環境的參數,添加完后點發布再編輯生產環境
#生產環境參數發布
Apollo配置中心配置微服務參數—dubbo服務消費者
創建項目
十、新代碼發版
Gitee提交消費者更改代碼
jenkins發布
修改測試環境消費者dp資源配置文件使用新版鏡像
測試環境測試新版鏡像,如果正常可以訪問
再將生產環境消費者dp資源配置文件使用新版鏡像(用測試環境做的鏡像包)
故障排查
1. dubbo的3個組件,提供者,消費者,發現者,他們通信的端口,zk地址需要保證一致性
2. dubbo的3個組件的啟動順序需要注意,monitor需要在后啟動,不然在web界面容易發現不了其他2個組件
3.apollo記得把之前的apolloconfigdb刪掉,其他配置要記得檢查
4. dubbo-monitor網站打不開,一定是zookeeper宕了.
5. 所有的問題都排查過了,發現dashboard上刪除掉的dp,在k8s上居然沒被刪掉
6.啟動順序,zk,portal,數據庫,apolloservice,apolloadmin,dubboservice,dubboconsumer
7.最好使用kubectl來初始啟動集群