1. 获取 apollo 压缩包

https://github.com/ctripcorp/apollo/releases 下载预先打好的 zip 包:

  • apollo-1.6.1.zip
  • apollo-portal-1.6.1-github.zip
  • apollo-adminservice-1.6.1-github.zip
  • apollo-configservice-1.6.1-github.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就能下载

2. 解压 apollo 压缩包

在这里插入图片描述
进入当前文件夹,鼠标右键Git Bash Here

  • 将源码包中部署文件复制到自定义目录:
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

3. 构建 Docker 镜像并 Push 到阿里镜像站

用的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

4. 创建数据库

$ 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文件,就能自动创建两个数据库
在这里插入图片描述

5. 部署 Dev 环境 Apollo 组件

$ 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
5.1 修改service-apollo-config-server-dev.yaml
cat <<EOF> 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
5.2 修改 service-apollo-admin-server-dev.yaml
cat <<EOF> 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
5.3 部署
# 创建 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   <none>        8090/TCP         2m42s
service-apollo-config-server-dev   NodePort    10.98.137.183   <none>        8080:30002/TCP   2m42s
service-apollo-meta-server-dev     ClusterIP   None            <none>        8080/TCP         2m42s

访问config组件的注册中心可以看到两个服务都注册到了Eureka
在这里插入图片描述

如果想部署其他环境,类似于dev这样重复操作

6. 部署 Apollo Portal

$ 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只需部署一个

6.1 修改 service-apollo-portal-server.yaml
cat <<EOF> 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
6.2 部署
[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环境
在这里插入图片描述

6.3 访问 Apollo Portal 界面

在这里插入图片描述
默认账号密码:apollo admin

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐