k8s部署高可用配置中心apollo-手动验证成功

开发 前端
在前一篇文章中简单地介绍了《5分钟通过docker快速部署并使用apollo配置中心》,用户可以快速地了解到配置中心apollo的基本使用,但是在生产环境中我们往往需要高可用的部署配置中心,这样我们就得有k8s来进行部署。

前言

在前一篇文章中简单地介绍了《5分钟通过docker快速部署并使用apollo配置中心》,用户可以快速地了解到配置中心apollo的基本使用,但是在生产环境中我们往往需要高可用的部署配置中心,这样我们就得有k8s来进行部署。在apollo的官方文档中有关于k8s部署的文章(https://github.com/ctripcorp/apollo/tree/master/scripts/apollo-on-kubernetes),但是在执行的过程中是会遇到一定的坑的。包括实际部署中遇到的,镜像的制作、portal服务的多实例支持、ingress的创建都没有说到,本人在部署的过程中已经全部解决以上问题,希望可以帮到没有部署过的用户。

部署成功页面

下面是部署完成后,访问apollo的登录页面

 

k8s部署高可用配置中心apollo-手动验证成功

登录页面

输入用户名密码:apollo/admin,部署环境完成portal页面图

 

k8s部署高可用配置中心apollo-手动验证成功
部署完成apollo后页面

k8s的dashboard部署页面,本文部署了dev, fat, pro三个环境。

 

k8s部署高可用配置中心apollo-手动验证成功
部署环境完成k8s后dashboard图

部署过程

本文在部署的时候使用了当前最新的apollo版本为:1.7.1,所以下面的所有构建也是基于当前版本的。

一、构建镜像

首先从git上下载源码,可以从github下载:https://github.com/ctripcorp/apollo;也可以从gitee下载:https://gitee.com/nobodyiam/apollo,国内的会快一点。然后进入到目录

  1. /scripts/apollo-on-kubernetes 

去构建镜像。

1、 直接使用编译的的包进行安装,获取 apollo 压缩包

可以直接从官网下载,因为github实在是太慢了。建议直接从我的百度云下载。

A、下载比较慢,直接用我百度云

  • 链接:https://pan.baidu.com/s/1eLL2ocYE1uzXcvzO2Y3dNg
  • 提取码:nfvm

B、从 https://github.com/ctripcorp/apollo/releases 下载预先打好的 java 包

 

  1. (1)进入scripts/apollo-on-kubernetes/ 
  2.  
  3. 执行 wget https://github.com/ctripcorp/apollo/releases/download/v1.7.1/apollo-portal-1.7.1-github.zip 
  4.  
  5. (2)进入scripts/apollo-on-kubernetes/ 
  6.  
  7. 执行 wget https://github.com/ctripcorp/apollo/releases/download/v1.7.1/apollo-adminservice-1.7.1-github.zip 
  8.  
  9. (3)进入scripts/apollo-on-kubernetes/ 
  10.  
  11. 执行 wget https://github.com/ctripcorp/apollo/releases/download/v1.7.1/apollo-configservice-1.7.1-github.zip 

2、解压压缩包, 获取程序 jar 包

不要忘记重命名,把版本号去掉。

 

  1. 解压 apollo-portal-1.7.1-github.zip 
  2. 获取 apollo-portal-1.7.1.jar, 重命名为 apollo-portal.jar, 放到 scripts/apollo-on-kubernetes/apollo-portal-server 
  3. 解压 apollo-adminservice-1.7.1-github.zip 
  4. 获取 apollo-adminservice-1.7.1.jar, 重命名为 apollo-adminservice.jar, 放到 scripts/apollo-on-kubernetes/apollo-admin-server 
  5. 解压 apollo-configservice-1.7.1-github.zip 
  6. 获取 apollo-configservice-1.7.1.jar, 重命名为 apollo-configservice.jar, 放到 scripts/apollo-on-kubernetes/apollo-config-server 

3、构建镜像

注意:因为许多地方都要同时改,在构建的时候要确定命名空间,我使用zizai。

要构建如下的镜像:alpine-bash-3.8-image,apollo-config-server,apollo-admin-server和apollo-portal-server,对应的镜像文件,在对应的目录下:

 

k8s部署高可用配置中心apollo-手动验证成功

构建镜像要去到对应的Dockerfile同级目录下去执行。

例如,去到scripts/apollo-on-kubernetes/apollo-config-server下执行:

  1. docker build -t apollo-config-server:v1.7.1 . 

注意,总共要构建4个镜像。整体的思路是:先构建镜像,然后打tag,再推到仓库里去。

在对应目录下,总结整体脚本如下:

 

  1. alpine-bash-3.8-image的镜像: 
  2. docker build -t alpine-bash:3.8 . 
  3. docker tag alpine-bash:3.8  hub.thinkinpower.net/zizai/alpine-bash:3.8 
  4. docker push hub.thinkinpower.net/zizai/alpine-bash:3.8 
  5.  
  6. apollo对应的镜像: 
  7. docker build -t apollo-config-server:v1.7.1 . 
  8. docker tag apollo-config-server:v1.7.1  hub.xx.net/zizai/apollo-config-server:v1.7.1 
  9. docker push hub.xx.net/zizai/apollo-config-server:v1.7.1 
  10.  
  11. docker build -t apollo-admin-server:v1.7.1 . 
  12. docker tag apollo-admin-server:v1.7.1  hub.xx.net/zizai/apollo-admin-server:v1.7.1 
  13. docker push hub.xx.net/zizai/apollo-admin-server:v1.7.1 
  14.  
  15. docker build -t apollo-portal-server:v1.7.1 . 
  16. docker tag apollo-portal-server:v1.7.1  hub.thinkinpower.net/zizai/apollo-portal-server:v1.7.1 
  17. docker push hub.thinkinpower.net/zizai/apollo-portal-server:v1.7.1 

二、部署apollo到kubernetes

1、创建数据库脚本

说明一下:

  • 在实际的生产环境使用中,通过分布式存储来实现的磁盘在mysql这种IO密集性应用中,性能问题会显得非常突出。所以在实际应用中,一般不会把mysql这种应用直接放入kubernetes中管理,而是使用专用的服务器来独立部署。而像web这种无状态应用依然会运行在kubernetes当中,这个时候web服务器要连接kubernetes管理之外的数据库,有两种方式:一是直接连接数据库所在物理服务器IP,另一种方式就是借助kubernetes的Endpoints直接将外部服务器映射为kubernetes内部的一个服务。

我们使用外面的mysql作为数据库,不会将mysql部署到k8s里。

执行目录scripts/apollo-on-kubernetes/db下的脚本。Apollo服务端共需要两个数据库:ApolloPortalDB和ApolloConfigDB。每一个配置的config一个数据库脚本,portal一个数据库脚本。数据库脚本见:https://github.com/ctripcorp/apollo/tree/master/scripts/apollo-on-kubernetes/db,在git里已经有。如果apollo 开启了 4 个环境, 即 dev、test-alpha、test-beta、prod, 在MySQL 中导入 scripts/apollo-on-kubernetes/db 下的文件。

 

k8s部署高可用配置中心apollo-手动验证成功

2、部署k8s的yaml文件

官网的yaml可以下载修改就可以了,因为我用自己的仓库的镜像,并且多次测试,我主要有如下的修改:

(1)配置文件要删除掉安全提示:

 

  1. securityContext:  
  2. privileged: true 

(2)添加仓库的密钥:

 

  1. imagePullSecrets:  
  2. name: registry-harbor 

(3)下面修改为每次都拉镜像:Always

  1. imagePullPolicy: Always 

(4)添加mysql的配置信息

我只用3个环境,需要修改的文件如图:

 

k8s部署高可用配置中心apollo-手动验证成功

因为修改得比较多,我将在下面列出每一个文件。我只拿开发环境apollo-env-dev的作为一个示例,其它的只是对应修改就可以了。在执行的时候,建议大家从下面的(3)、(2)、(1)的顺序执行下面的文件。

(1)、service-apollo-admin-server-dev.yaml

 

  1. --- 
  2. # configmap for apollo-admin-server-dev 
  3. kind: ConfigMap 
  4. apiVersion: v1 
  5. metadata: 
  6.   namespace: zizai 
  7.   name: configmap-apollo-admin-server-dev 
  8. data: 
  9.   application-github.properties: | 
  10.     spring.datasource.url = jdbc:mysql://service-mysql-for-apollo-dev-env.zizai:3306/DevApolloConfigDB?characterEncoding=utf8 
  11.     spring.datasource.username = admin 
  12.     spring.datasource.password = mysql-admin 
  13.     eureka.service.url = http://statefulset-apollo-config-server-dev-0.service-apollo-meta-server-dev:8080/eureka/,http://statefulset-apollo-config-server-dev-1.service-apollo-meta-server-dev:8080/eureka/,http://statefulset-apollo-config-server-dev-2.service-apollo-meta-server-dev:8080/eureka/ 
  14.  
  15. --- 
  16. kind: Service 
  17. apiVersion: v1 
  18. metadata: 
  19.   namespace: zizai 
  20.   name: service-apollo-admin-server-dev 
  21.   labels: 
  22.     app: service-apollo-admin-server-dev 
  23. spec: 
  24.   ports: 
  25.     - protocol: TCP 
  26.       port: 8090 
  27.       targetPort: 8090 
  28.   selector: 
  29.     app: pod-apollo-admin-server-dev 
  30.   type: ClusterIP 
  31.   sessionAffinity: ClientIP 
  32.  
  33. --- 
  34. kind: Deployment 
  35. apiVersion: apps/v1 
  36. metadata: 
  37.   namespace: zizai 
  38.   name: deployment-apollo-admin-server-dev 
  39.   labels: 
  40.     app: deployment-apollo-admin-server-dev 
  41. spec: 
  42.   replicas: 3 
  43.   selector: 
  44.     matchLabels: 
  45.       app: pod-apollo-admin-server-dev 
  46.   strategy: 
  47.     rollingUpdate: 
  48.       maxSurge: 1 
  49.       maxUnavailable: 1 
  50.     type: RollingUpdate 
  51.   template: 
  52.     metadata: 
  53.       labels: 
  54.         app: pod-apollo-admin-server-dev 
  55.     spec: 
  56.       imagePullSecrets:           # dokcer仓库密码,不需要的可以去掉 
  57.         - name: registry-harbor 
  58.       affinity: 
  59.         podAntiAffinity: 
  60.           preferredDuringSchedulingIgnoredDuringExecution: 
  61.           - weight: 100 
  62.             podAffinityTerm: 
  63.               labelSelector: 
  64.                 matchExpressions: 
  65.                 - key: app 
  66.                   operator: In 
  67.                   values
  68.                   - pod-apollo-admin-server-dev 
  69.               topologyKey: kubernetes.io/hostname 
  70.        
  71.       volumes: 
  72.         - name: volume-configmap-apollo-admin-server-dev 
  73.           configMap: 
  74.             name: configmap-apollo-admin-server-dev 
  75.             items: 
  76.               - key: application-github.properties 
  77.                 path: application-github.properties 
  78.        
  79.       initContainers: 
  80.         - image: hub.thinkinpower.net/zizai/alpine-bash:3.8 
  81.           imagePullPolicy: Always 
  82.           namecheck-service-apollo-config-server-dev 
  83.           command: ['bash''-c'"curl --connect-timeout 2 --max-time 5 --retry 60 --retry-delay 1 --retry-max-time 120 service-apollo-config-server-dev.zizai:8080"
  84.        
  85.       containers: 
  86.         - image: hub.thinkinpower.net/zizai/apollo-admin-server:v1.7.1 
  87.           imagePullPolicy: Always 
  88.           name: container-apollo-admin-server-dev 
  89.           ports: 
  90.             - protocol: TCP 
  91.               containerPort: 8090 
  92.           volumeMounts: 
  93.             - name: volume-configmap-apollo-admin-server-dev 
  94.               mountPath: /apollo-admin-server/config/application-github.properties 
  95.               subPath: application-github.properties 
  96.            
  97.           env: 
  98.             - name: APOLLO_ADMIN_SERVICE_NAME 
  99.               value: "service-apollo-admin-server-dev.zizai" 
  100.            
  101.           readinessProbe: 
  102.             tcpSocket: 
  103.               port: 8090 
  104.             initialDelaySeconds: 10 
  105.             periodSeconds: 5 
  106.            
  107.           livenessProbe: 
  108.             tcpSocket: 
  109.               port: 8090 
  110.             initialDelaySeconds: 120 
  111.             periodSeconds: 10 
  112.            
  113.       dnsPolicy: ClusterFirst 
  114.       restartPolicy: Always 

(2)、service-apollo-config-server-dev.yaml

 

  1. --- 
  2. # configmap for apollo-config-server-dev 
  3. kind: ConfigMap 
  4. apiVersion: v1 
  5. metadata: 
  6.   namespace: zizai 
  7.   name: configmap-apollo-config-server-dev 
  8. data: 
  9.   application-github.properties: | 
  10.     spring.datasource.url = jdbc:mysql://service-mysql-for-apollo-dev-env.zizai:3306/DevApolloConfigDB?characterEncoding=utf8 
  11.     spring.datasource.username = admin 
  12.     spring.datasource.password = mysql-admin 
  13.     eureka.service.url = http://statefulset-apollo-config-server-dev-0.service-apollo-meta-server-dev:8080/eureka/,http://statefulset-apollo-config-server-dev-1.service-apollo-meta-server-dev:8080/eureka/,http://statefulset-apollo-config-server-dev-2.service-apollo-meta-server-dev:8080/eureka/ 
  14.  
  15. --- 
  16. kind: Service 
  17. apiVersion: v1 
  18. metadata: 
  19.   namespace: zizai 
  20.   name: service-apollo-meta-server-dev 
  21.   labels: 
  22.     app: service-apollo-meta-server-dev 
  23. spec: 
  24.   ports: 
  25.     - protocol: TCP 
  26.       port: 8080 
  27.       targetPort: 8080 
  28.   selector: 
  29.     app: pod-apollo-config-server-dev 
  30.   type: ClusterIP 
  31.   clusterIP: None 
  32.   sessionAffinity: ClientIP 
  33.  
  34. --- 
  35. kind: Service 
  36. apiVersion: v1 
  37. metadata: 
  38.   namespace: zizai 
  39.   name: service-apollo-config-server-dev 
  40.   labels: 
  41.     app: service-apollo-config-server-dev 
  42. spec: 
  43.   ports: 
  44.     - protocol: TCP 
  45.       port: 8080 
  46.       targetPort: 8080 
  47.       nodePort: 30002 
  48.   selector: 
  49.     app: pod-apollo-config-server-dev  
  50.   type: NodePort 
  51.   sessionAffinity: ClientIP 
  52.  
  53. --- 
  54. kind: StatefulSet 
  55. apiVersion: apps/v1 
  56. metadata: 
  57.   namespace: zizai 
  58.   name: statefulset-apollo-config-server-dev 
  59.   labels: 
  60.     app: statefulset-apollo-config-server-dev 
  61. spec: 
  62.   serviceName: service-apollo-meta-server-dev 
  63.   replicas: 3 
  64.   selector: 
  65.     matchLabels: 
  66.       app: pod-apollo-config-server-dev 
  67.   updateStrategy: 
  68.     type: RollingUpdate 
  69.   template: 
  70.     metadata: 
  71.       labels: 
  72.         app: pod-apollo-config-server-dev 
  73.     spec: 
  74.       imagePullSecrets:           # dokcer仓库密码,不需要的可以去掉 
  75.         - name: registry-harbor 
  76.       affinity: 
  77.         podAntiAffinity: 
  78.           preferredDuringSchedulingIgnoredDuringExecution: 
  79.           - weight: 100 
  80.             podAffinityTerm: 
  81.               labelSelector: 
  82.                 matchExpressions: 
  83.                 - key: app 
  84.                   operator: In 
  85.                   values
  86.                   - pod-apollo-config-server-dev 
  87.               topologyKey: kubernetes.io/hostname 
  88.  
  89.       volumes: 
  90.         - name: volume-configmap-apollo-config-server-dev 
  91.           configMap: 
  92.             name: configmap-apollo-config-server-dev 
  93.             items: 
  94.               - key: application-github.properties 
  95.                 path: application-github.properties 
  96.        
  97.       containers: 
  98.         - image: hub.thinkinpower.net/zizai/apollo-config-server:v1.7.1 
  99.           imagePullPolicy: Always 
  100.           name: container-apollo-config-server-dev 
  101.           ports: 
  102.             - protocol: TCP 
  103.               containerPort: 8080 
  104.           volumeMounts: 
  105.             - name: volume-configmap-apollo-config-server-dev 
  106.               mountPath: /apollo-config-server/config/application-github.properties 
  107.               subPath: application-github.properties 
  108.            
  109.           env: 
  110.             - name: APOLLO_CONFIG_SERVICE_NAME 
  111.               value: "service-apollo-config-server-dev.zizai" 
  112.            
  113.           readinessProbe: 
  114.             tcpSocket: 
  115.               port: 8080 
  116.             initialDelaySeconds: 10 
  117.             periodSeconds: 5 
  118.            
  119.           livenessProbe: 
  120.             tcpSocket: 
  121.               port: 8080 
  122.             initialDelaySeconds:  120 
  123.             periodSeconds: 10 
  124.            
  125.       dnsPolicy: ClusterFirst 
  126.       restartPolicy: Always 

(3)、service-mysql-for-apollo-dev-env.yaml

 

  1. --- 
  2. # 为外部 mysql 服务设置 service 
  3. kind: Service 
  4. apiVersion: v1 
  5. metadata: 
  6.   namespace: zizai 
  7.   name: service-mysql-for-apollo-dev-env 
  8.   labels: 
  9.     app: service-mysql-for-apollo-dev-env 
  10. spec: 
  11.   ports: 
  12.     - protocol: TCP 
  13.       port: 3306 
  14.       targetPort: 3306 
  15.   type: ClusterIP 
  16.   sessionAffinity: None 
  17.  
  18. --- 
  19. kind: Endpoints 
  20. apiVersion: v1 
  21. metadata: 
  22.   namespace: zizai 
  23.   name: service-mysql-for-apollo-dev-env 
  24. subsets: 
  25.   - addresses: 
  26.       - ip: 10.29.254.48 
  27.     ports: 
  28.       - protocol: TCP 
  29.         port: 3306 

3、添加Ingress

官网给的示例是用k8s的NodePort来访问,但是在实际中,我们用会用Ingress来访问Portal。

注意:因为我们在部署portal的时候是多实例的,所以Ingress要添加保持会话,要不页面会登录不了,进入不了portal页面。具体为:

 

  1. metadata: 
  2.   annotations: 
  3.     nginx.ingress.kubernetes.io/affinity: "cookie"  # 解决会话保持 
  4.     nginx.ingress.kubernetes.io/session-cookie-name"route" 
  5.     nginx.ingress.kubernetes.io/session-cookie-expires: "172800" 
  6.     nginx.ingress.kubernetes.io/session-cookie-max-age: "172800" 

ingress的代码示例为如下:

 

  1. apiVersion: extensions/v1beta1 
  2. kind: Ingress 
  3. metadata: 
  4.   name: zizai-apollo-portal 
  5.   namespace: zizai 
  6.   annotations: 
  7.     nginx.ingress.kubernetes.io/affinity: "cookie"  # 解决会话保持 
  8.     nginx.ingress.kubernetes.io/session-cookie-name"route" 
  9.     nginx.ingress.kubernetes.io/session-cookie-expires: "172800" 
  10.     nginx.ingress.kubernetes.io/session-cookie-max-age: "172800" 
  11.  
  12. spec: 
  13.   rules: 
  14.     - host: zizai-apollo-portal.test.thinkinpower.net 
  15.       http: 
  16.         paths: 
  17.           - path: / 
  18.             backend: 
  19.               serviceName: service-apollo-portal-server 
  20.               servicePort: 8070 

4、配置nginx

添加nginx访问到Ingress里:

nginx配置文件:zizai-apollo-portal.test.thinkinpower.net.conf

 

  1. server { 
  2.   listen     80; 
  3.   server_name  zizai-apollo-portal.test.thinkinpower.net; 
  4.   access_log  /data/logs/nginx/zizai-apollo-portal.test.thinkinpower.net.access.log  main; 
  5.   error_log  /data/logs/nginx/zizai-apollo-portal.test.thinkinpower.net.error.log; 
  6.   root   /data/webapps/zizai-apollo-portal.test.thinkinpower.net/test/static
  7.   index  index.html index.htm; 
  8.   client_max_body_size 50m; 
  9.  
  10.  
  11.   location   / { 
  12.     proxy_set_header Host $http_host; 
  13.     proxy_set_header X-Real-IP $remote_addr; 
  14.     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
  15.     proxy_pass http://kubernetes;  # 指向集群的 
  16.   } 
  17.  

这样就可以根据域名:http://zizai-apollo-portal.test.thinkinpower.net 访问portal了。

(1)创建的部署:

 

k8s部署高可用配置中心apollo-手动验证成功

(2)创建的有部署副本:

 

k8s部署高可用配置中心apollo-手动验证成功

(3)创建的service:

 

k8s部署高可用配置中心apollo-手动验证成功

(4)创建的ingress:

 

k8s部署高可用配置中心apollo-手动验证成功

(5)创建的配置字典:

 

k8s部署高可用配置中心apollo-手动验证成功

三、简单使用

本文章将只有简单的使用,后面会有文章介绍详细的使用,需要的可以在本文留言。

1、创建项目

 

k8s部署高可用配置中心apollo-手动验证成功

2、选择一个环境添加变量timeout

 

k8s部署高可用配置中心apollo-手动验证成功

3、如果是在添加环境的过程中,刷新页面会有“添加补缺环境”的提示

 

k8s部署高可用配置中心apollo-手动验证成功
添加补缺环境

就这样实现了k8s部署高可能的apollo。有建议的可以在评论区留言。谢谢!

责任编辑:未丽燕 来源: 今日头条
相关推荐

2019-09-09 09:53:52

K8s集群架构

2024-05-21 13:03:45

2023-09-06 08:12:04

k8s云原生

2023-08-04 08:19:02

2022-04-22 13:32:01

K8s容器引擎架构

2023-12-21 21:09:47

2021-11-04 07:49:58

K8SStatefulSetMySQL

2023-02-27 07:40:00

2022-01-02 08:42:50

架构部署容器

2023-07-10 07:22:16

2023-07-11 07:12:21

Hadoop部署mysql

2023-11-06 07:16:22

WasmK8s模块

2021-08-05 07:28:26

K8sNFS ProvisiSubdir

2022-09-07 09:22:36

SpringBootWeb

2022-01-22 21:38:19

K8SRedisRedis clus

2021-11-29 08:48:00

K8S KubernetesAirflow

2019-11-27 16:34:00

配置

2023-08-29 10:27:32

2023-05-25 21:38:30

2023-08-03 08:36:30

Service服务架构
点赞
收藏

51CTO技术栈公众号