从 https://github.com/ctripcorp/apollo/releases 下载预先打好的 zip 包:
# 下载 Apollo 源码
$ wget https://github.com/ctripcorp/apollo/archive/v1.6.1.zip
# 下载 Apollo Admin Server
$ wget https://github.com/ctripcorp/apollo/releases/download/v1.6.1/apollo-adminservice-1.6.1-github.zip
# 下载 Apollo Config Service
$ wget https://github.com/ctripcorp/apollo/releases/download/v1.6.1/apollo-configservice-1.6.1-github.zip
# 下载 Apollo Portal
$ wget https://github.com/ctripcorp/apollo/releases/download/v1.6.1/apollo-portal-1.6.1-github.zip
在服务器下载速度很慢,也可以用浏览器下载,直接输入上面地址https......zip
就能下载
16872@DESKTOP-TEOEPLI MINGW64 ~/Desktop/apollo
$ ls
apollo-1.6.1.zip apollo-configservice-1.6.1-github.zip
apollo-adminservice-1.6.1-github.zip apollo-portal-1.6.1-github.zip
# 解压源码包
$ unzip apollo-1.6.1.zip
# 创建用于部署的自定义文件夹
$ mkdir ./deploy
# 将部署文件和脚本复制到自定义 deploy 目录
$ cp -R ./apollo-1.6.1/scripts/apollo-on-kubernetes/* ./deploy
deploy
目录下对应的文件夹下:# 解压各个组件压缩包
$ unzip -o apollo-configservice-1.6.1-github.zip -d ./deploy/apollo-config-server/
$ unzip -o apollo-adminservice-1.6.1-github.zip -d ./deploy/apollo-admin-server/
$ unzip -o apollo-portal-1.6.1-github.zip -d ./deploy/apollo-portal-server/
# 应用 Jar 重命名
$ mv ./deploy/apollo-config-server/apollo-configservice-1.6.1.jar ./deploy/apollo-config-server/apollo-configservice.jar
$ mv ./deploy/apollo-admin-server/apollo-adminservice-1.6.1.jar ./deploy/apollo-admin-server/apollo-adminservice.jar
$ mv ./deploy/apollo-portal-server/apollo-portal-1.6.1.jar ./deploy/apollo-portal-server/apollo-portal.jar
用的win10
构建需要安装Docker Toolbox
,此时打开
# 登录阿里云
$ docker login -u=xxxxxx@qq.com -p xxxxxx registry.cn-shanghai.aliyuncs.com
# 构建 alpine 镜像
$ docker build -t registry.cn-shanghai.aliyuncs.com/wanfei/alpine-bash:3.8 ./deploy/alpine-bash-3.8-image
# 构建 config-service 镜像
$ docker build -t registry.cn-shanghai.aliyuncs.com/wanfei/apollo-config-server:v1.6.1 ./deploy/apollo-config-server
# 构建 admin-server
$ docker build -t registry.cn-shanghai.aliyuncs.com/wanfei/apollo-admin-server:v1.6.1 ./deploy/apollo-admin-server
# 构建 portal 镜像
$ docker build -t registry.cn-shanghai.aliyuncs.com/wanfei/apollo-portal-server:v1.6.1 ./deploy/apollo-portal-server
# push镜像
$ docker push registry.cn-shanghai.aliyuncs.com/wanfei/alpine-bash:3.8
$ docker push registry.cn-shanghai.aliyuncs.com/wanfei/apollo-config-server:v1.6.1
$ docker push registry.cn-shanghai.aliyuncs.com/wanfei/apollo-admin-server:v1.6.1
$ docker push registry.cn-shanghai.aliyuncs.com/wanfei/apollo-portal-server:v1.6.1
$ ls ./deploy/db/
config-db-dev/ config-db-test-alpha/ portal-db/
config-db-prod/ config-db-test-beta/
因为我只需要部署dev
环境,所以只需部署下面两个sql,如果有其他环境,其他环境文件夹下的sql
也要部署
$ ls ./deploy/db/config-db-dev/
apolloconfigdb.sql
$ ls ./deploy/db/portal-db/
apolloportaldb.sql
数据库部署在腾讯云服务器k8s
集群上,等会apollo也会部署在这个集群,使用Navicat
直接运行这两个sql
文件,就能自动创建两个数据库
$ ls ./deploy/kubernetes/apollo-env-dev/
service-apollo-admin-server-dev.yaml service-mysql-for-apollo-dev-env.yaml
service-apollo-config-server-dev.yaml
cat < service-apollo-config-server-dev.yaml
---
# configmap for apollo-config-server-dev
# Configmap 文件,注意修改数据库配置、用户名、密码参数
kind: ConfigMap
apiVersion: v1
metadata:
namespace: sre
name: configmap-apollo-config-server-dev
data:
application-github.properties: |
# 连接数据库地址修改为 mysql.course (service名称 + namespace)
spring.datasource.url = jdbc:mysql://mysql.course:3306/DevApolloConfigDB?characterEncoding=utf8
spring.datasource.username = root
spring.datasource.password = root
# 如果下面的 replicas: 3 ,这里不用修改,我只需要一个副本,这里只需要一个eureka,删除后面两个
eureka.service.url = http://statefulset-apollo-config-server-dev-0.service-apollo-meta-server-dev:8080/eureka/
---
kind: Service
apiVersion: v1
metadata:
namespace: sre
name: service-apollo-meta-server-dev
labels:
app: service-apollo-meta-server-dev
spec:
ports:
- protocol: TCP
port: 8080
targetPort: 8080
selector:
app: pod-apollo-config-server-dev
type: ClusterIP
clusterIP: None
sessionAffinity: ClientIP
---
kind: Service
apiVersion: v1
metadata:
namespace: sre
name: service-apollo-config-server-dev
labels:
app: service-apollo-config-server-dev
spec:
ports:
- protocol: TCP
port: 8080
targetPort: 8080
nodePort: 30002
selector:
app: pod-apollo-config-server-dev
type: NodePort
sessionAffinity: ClientIP
---
kind: StatefulSet
apiVersion: apps/v1
metadata:
namespace: sre
name: statefulset-apollo-config-server-dev
labels:
app: statefulset-apollo-config-server-dev
spec:
serviceName: service-apollo-meta-server-dev
# 修改副本为1
replicas: 1
selector:
matchLabels:
app: pod-apollo-config-server-dev
updateStrategy:
type: RollingUpdate
template:
metadata:
labels:
app: pod-apollo-config-server-dev
spec:
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: app
operator: In
values:
- pod-apollo-config-server-dev
topologyKey: kubernetes.io/hostname
volumes:
- name: volume-configmap-apollo-config-server-dev
configMap:
name: configmap-apollo-config-server-dev
items:
- key: application-github.properties
path: application-github.properties
containers:
# 修改镜像为上面的阿里云镜像
- image: registry.cn-shanghai.aliyuncs.com/wanfei/apollo-config-server:v1.6.1
securityContext:
privileged: true
imagePullPolicy: IfNotPresent
name: container-apollo-config-server-dev
ports:
- protocol: TCP
containerPort: 8080
volumeMounts:
- name: volume-configmap-apollo-config-server-dev
mountPath: /apollo-config-server/config/application-github.properties
subPath: application-github.properties
env:
- name: APOLLO_CONFIG_SERVICE_NAME
# 如果不是在 sre 命名空间下,这里要修改 .sre 为新的命名空间
value: "service-apollo-config-server-dev.sre"
readinessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 10
periodSeconds: 5
livenessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 120
periodSeconds: 10
dnsPolicy: ClusterFirst
restartPolicy: Always
EOF
cat < service-apollo-admin-server-dev.yaml
---
# configmap for apollo-admin-server-dev
kind: ConfigMap
apiVersion: v1
metadata:
namespace: sre
name: configmap-apollo-admin-server-dev
data:
application-github.properties: |
# 修改数据库连接地址,账号,密码,和eureka注册地址
spring.datasource.url = jdbc:mysql://mysql.course:3306/DevApolloConfigDB?characterEncoding=utf8
spring.datasource.username = root
spring.datasource.password = root
eureka.service.url = http://statefulset-apollo-config-server-dev-0.service-apollo-meta-server-dev:8080/eureka/
---
kind: Service
apiVersion: v1
metadata:
namespace: sre
name: service-apollo-admin-server-dev
labels:
app: service-apollo-admin-server-dev
spec:
ports:
- protocol: TCP
port: 8090
targetPort: 8090
selector:
app: pod-apollo-admin-server-dev
type: ClusterIP
sessionAffinity: ClientIP
---
kind: Deployment
apiVersion: apps/v1
metadata:
namespace: sre
name: deployment-apollo-admin-server-dev
labels:
app: deployment-apollo-admin-server-dev
spec:
# 修改副本为1
replicas: 1
selector:
matchLabels:
app: pod-apollo-admin-server-dev
strategy:
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
type: RollingUpdate
template:
metadata:
labels:
app: pod-apollo-admin-server-dev
spec:
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: app
operator: In
values:
- pod-apollo-admin-server-dev
topologyKey: kubernetes.io/hostname
volumes:
- name: volume-configmap-apollo-admin-server-dev
configMap:
name: configmap-apollo-admin-server-dev
items:
- key: application-github.properties
path: application-github.properties
initContainers:
# 修改镜像为上面的阿里云镜像
- image: registry.cn-shanghai.aliyuncs.com/wanfei/alpine-bash:3.8
name: check-service-apollo-config-server-dev
# 注意这里的 sre 命名空间,如果不是部署在 sre 命名空间,这里需要修改
command: ['bash', '-c', "curl --connect-timeout 2 --max-time 5 --retry 60 --retry-delay 1 --retry-max-time 120 service-apollo-config-server-dev.sre:8080"]
containers:
# 修改镜像为上面的阿里云镜像
- image: registry.cn-shanghai.aliyuncs.com/wanfei/apollo-admin-server:v1.6.1
securityContext:
privileged: true
imagePullPolicy: IfNotPresent
name: container-apollo-admin-server-dev
ports:
- protocol: TCP
containerPort: 8090
volumeMounts:
- name: volume-configmap-apollo-admin-server-dev
mountPath: /apollo-admin-server/config/application-github.properties
subPath: application-github.properties
env:
- name: APOLLO_ADMIN_SERVICE_NAME
# 注意这里的 sre 命名空间,如果不是部署在 sre 命名空间,这里需要修改
value: "service-apollo-admin-server-dev.sre"
readinessProbe:
tcpSocket:
port: 8090
initialDelaySeconds: 10
periodSeconds: 5
livenessProbe:
tcpSocket:
port: 8090
initialDelaySeconds: 120
periodSeconds: 10
dnsPolicy: ClusterFirst
restartPolicy: Always
EOF
# 创建 sre 命名空间
[root@master apollo]# kubectl create ns sre
[root@master apollo]# ls
service-apollo-admin-server-dev.yaml service-apollo-config-server-dev.yaml
[root@master apollo]# kubectl apply -f .
# 等待一段时间
[root@master apollo]# kubectl get pods -n sre
NAME READY STATUS RESTARTS AGE
deployment-apollo-admin-server-dev-5557bdd578-zswr6 1/1 Running 0 2m23s
statefulset-apollo-config-server-dev-0 1/1 Running 0 2m23s
[root@master apollo]# kubectl get svc -n sre
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service-apollo-admin-server-dev ClusterIP 10.100.117.32 8090/TCP 2m42s
service-apollo-config-server-dev NodePort 10.98.137.183 8080:30002/TCP 2m42s
service-apollo-meta-server-dev ClusterIP None 8080/TCP 2m42s
访问config
组件的注册中心可以看到两个服务都注册到了Eureka
如果想部署其他环境,类似于
dev
这样重复操作
$ ls ./deploy/kubernetes/
apollo-env-dev/ apollo-env-test-alpha/ kubectl-apply.sh
apollo-env-prod/ apollo-env-test-beta/ service-apollo-portal-server.yaml
Portal
只需部署一个
cat < service-apollo-portal-server.yaml
---
# configmap for apollo-portal-server
kind: ConfigMap
apiVersion: v1
metadata:
namespace: sre
name: configmap-apollo-portal-server
data:
application-github.properties: |
# 修改数据库连接地址,账号,密码
spring.datasource.url = jdbc:mysql://mysql.course:3306/ApolloPortalDB?characterEncoding=utf8
# mysql username
spring.datasource.username = root
# mysql password
spring.datasource.password = root
apollo-env.properties: |
# 因为只部署了一个 dev ,其他三个环境的注释了
dev.meta=http://service-apollo-config-server-dev.sre:8080
# fat.meta=http://service-apollo-config-server-test-alpha.sre:8080
# uat.meta=http://service-apollo-config-server-test-beta.sre:8080
# pro.meta=http://service-apollo-config-server-prod.sre:8080
---
kind: Service
apiVersion: v1
metadata:
namespace: sre
name: service-apollo-portal-server
labels:
app: service-apollo-portal-server
spec:
ports:
- protocol: TCP
port: 8070
targetPort: 8070
# nodePort: 30001
selector:
app: pod-apollo-portal-server
type: ClusterIP
# portal session 保持
sessionAffinity: ClientIP
---
# 添加 ingress 提供外部服务,不使用 NodePort
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
namespace: sre
name: apollo-portal
annotations:
kubernetes.io/ingress.class: "nginx"
kubernetes.io/tls-acme: "true"
spec:
tls:
- hosts:
- apollo.wanfei.wang
secretName: apollo-tls
rules:
- host: apollo.wanfei.wang
http:
paths:
- path: '/'
backend:
serviceName: service-apollo-portal-server
servicePort: 8070
---
kind: Deployment
apiVersion: apps/v1
metadata:
namespace: sre
name: deployment-apollo-portal-server
labels:
app: deployment-apollo-portal-server
spec:
# 修改为1 个实例
replicas: 1
selector:
matchLabels:
app: pod-apollo-portal-server
strategy:
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
type: RollingUpdate
template:
metadata:
labels:
app: pod-apollo-portal-server
spec:
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: app
operator: In
values:
- pod-apollo-portal-server
topologyKey: kubernetes.io/hostname
volumes:
- name: volume-configmap-apollo-portal-server
configMap:
name: configmap-apollo-portal-server
items:
- key: application-github.properties
path: application-github.properties
- key: apollo-env.properties
path: apollo-env.properties
initContainers:
# 确保 admin-service 正常提供服务
# 修改为上面的阿里云镜像
- image: registry.cn-shanghai.aliyuncs.com/wanfei/alpine-bash:3.8
name: check-service-apollo-admin-server-dev
command: ['bash', '-c', "curl --connect-timeout 2 --max-time 5 --retry 60 --retry-delay 1 --retry-max-time 120 service-apollo-admin-server-dev.sre:8090"]
# 因为只部署了一个 dev, 下面的检测都注释掉
# - image: alpine-bash:3.8
# name: check-service-apollo-admin-server-alpha
# command: ['bash', '-c', "curl --connect-timeout 2 --max-time 5 --retry 60 --retry-delay 1 --retry-max-time 120 service-apollo-admin-server-test-alpha.sre:8090"]
# - image: alpine-bash:3.8
# name: check-service-apollo-admin-server-beta
# command: ['bash', '-c', "curl --connect-timeout 2 --max-time 5 --retry 60 --retry-delay 1 --retry-max-time 120 service-apollo-admin-server-test-beta.sre:8090"]
# - image: alpine-bash:3.8
# name: check-service-apollo-admin-server-prod
# command: ['bash', '-c', "curl --connect-timeout 2 --max-time 5 --retry 60 --retry-delay 1 --retry-max-time 120 service-apollo-admin-server-prod.sre:8090"]
containers:
# 更改为你的 docker registry 下的 image
- image: registry.cn-shanghai.aliyuncs.com/wanfei/apollo-portal-server:v1.6.1
securityContext:
privileged: true
imagePullPolicy: IfNotPresent
name: container-apollo-portal-server
ports:
- protocol: TCP
containerPort: 8070
volumeMounts:
- name: volume-configmap-apollo-portal-server
mountPath: /apollo-portal-server/config/application-github.properties
subPath: application-github.properties
- name: volume-configmap-apollo-portal-server
mountPath: /apollo-portal-server/config/apollo-env.properties
subPath: apollo-env.properties
env:
- name: APOLLO_PORTAL_SERVICE_NAME
# 注意这里的 sre 命名空间,如果不是部署在 sre 命名空间,这里需要修改
value: "service-apollo-portal-server.sre"
readinessProbe:
tcpSocket:
port: 8070
initialDelaySeconds: 10
periodSeconds: 5
livenessProbe:
tcpSocket:
port: 8070
# 120s 内, server 未启动则重启 container
initialDelaySeconds: 120
periodSeconds: 15
dnsPolicy: ClusterFirst
restartPolicy: Always
EOF
[root@master apollo]# kubectl apply -f service-apollo-portal-server.yaml
[root@master apollo]# kubectl get pods -n sre
NAME READY STATUS RESTARTS AGE
deployment-apollo-admin-server-dev-5557bdd578-zswr6 1/1 Running 0 23m
deployment-apollo-portal-server-56c47fcc6-756j5 1/1 Running 0 90s
statefulset-apollo-config-server-dev-0 1/1 Running 0 23m
如果报错Get admin server address from meta server failed. env: PRO, meta server address:http://apollo.meta
解决办法:去数据库删除下面表的其他环境,只保留dev
,因为这里只部署了dev
环境