环境准备
| IP | Hostname | 内核 | CPU | Memory |
|---|---|---|---|---|
| 10.240.0.3 | master | 3.10.0-1062 | 2 | 4G |
| 10.240.0.4 | node01 | 3.10.0-1062 | 2 | 4G |
| 10.240.0.5 | node02 | 3.10.0-1062 | 2 | 4G |
| 10.240.0.6 | node01 | 3.10.0-1062 | 2 | 4G |
准备k8s集群

部署eureka
cat > eureka.yaml << EOFapiVersion: v1kind: Servicemetadata:name: eurekalabels:app: eurekaspec:ports:- port: 8761name: eurekaclusterIP: Noneselector:app: eureka---apiVersion: v1kind: Servicemetadata:name: eureka-nodeportlabels:app: eureka-nodeportspec:type: NodePortports:- port: 8761name: eurekanodePort: 31820selector:app: eureka---apiVersion: apps/v1kind: StatefulSetmetadata:name: eurekaspec:serviceName: "eureka"replicas: 3selector:matchLabels:app: eurekatemplate:metadata:labels:app: eurekaspec:containers:- name: eurekaimage: freemanliu/eureka:v1.0.0ports:- containerPort: 8761resources:limits:# jvm会自动发现该限制memory: 2Gienv:- name: MY_POD_NAMEvalueFrom:fieldRef:fieldPath: metadata.name- name: JAVA_OPTSvalue: -XX:+UnlockExperimentalVMOptions-XX:+UseCGroupMemoryLimitForHeap-XX:MaxRAMFraction=2-XX:CICompilerCount=8-XX:ActiveProcessorCount=8-XX:+UseG1GC-XX:+AggressiveOpts-XX:+UseFastAccessorMethods-XX:+UseStringDeduplication-XX:+UseCompressedOops-XX:+OptimizeStringConcat- name: EUREKA_SERVERvalue: "http://eureka-0.eureka:8761/eureka/,http://eureka-1.eureka:8761/eureka/,http://eureka-2.eureka:8761/eureka/"- name: EUREKA_INSTANCE_HOSTNAMEvalue: ${MY_POD_NAME}.eurekapodManagementPolicy: "Parallel"EOF
kubectl apply -f eureka.yaml

访问ip:nodeport可以看到
部署apollo
下载git包
git clone https://github.com/ctripcorp/apollo.git

创建数据库
直接在master上部署数据库
wget -c https://dev.mysql.com/get/mysql80-community-release-el7-1.noarch.rpmrpm -ivh mysql80-community-release-el7-1.noarch.rpmyum -y install yum-utilsyum-config-manager --disable mysql80-communityyum-config-manager --enable mysql57-communityyum install mysql-community-server -y# 启动mysqlsystemctl start mysqld# 开机启动systemctl enable mysqld# 查看root临时密码grep 'temporary password' /var/log/mysqld.log# 使用mysql临时登录,修改root密码ALTER USER 'root'@'localhost' IDENTIFIED BY '123456@Abc';
配置mysql 参数
在/etc/my.cnf添加以下参数
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTIONskip-name-resolvelower_case_table_names = 1max_connections = 4000character-set-server = utf8mb4collation-server = utf8mb4_unicode_ciinit_connect='SET NAMES utf8mb4'skip-character-set-client-handshake = true[mysql]default-character-set = utf8mb4
重启mysql
systemctl restart mysqld
建库建表
mysql> source /root/apollo/scripts/sql/apolloconfigdb.sql
source /root/apollo/scripts/sql/apolloportaldb.sql
use apolloconfigdb;update ServerConfig set Value='http://eureka-0.eureka:8761/eureka/' where id=1;
修改configservice配置
vim /root/apollo/apollo-configservice/src/main/config/apollo-configservice.conf
LOG_FOLDER=/opt/logs/config/
只修改下面内容,调整日志目录
vim /root/apollo/apollo-configservice/src/main/config/application-github.properties
apollo.eureka.server.enabled=false
增加如下配置,禁用apollo的eureka,使用上面独立eureka集群
vim /root/apollo/apollo-configservice/src/main/resources/application.yml
file: /opt/logs/config/apollo-configservice.log
修改日志目录为config/apollo-configservice.conf中配置目录,指定文件名
vim /root/apollo/apollo-configservice/src/main/resources/bootstrap.yml
eureka:instance:homePageUrl: http://k8s-node-ip:30003# 修改此配置如下preferIpAddress: false# 增加此属性, 禁用apollo自带的eurekaapollo:eureka:server:enabled: false
只修改图vim /root/apollo/apollo-configservice/src/main/resources/bootstrap.yml中内容
vim /root/apollo/apollo-configservice/src/main/resources/configservice.properties
logging.file= /opt/logs/config/apollo-configservice.log
修改日志路径
vim /root/apollo/apollo-configservice/src/main/scripts/startup.sh
LOG_DIR=/opt/logs/config

修改adminservier配置
vim /root/apollo/apollo-adminservice/src/main/config/apollo-adminservice.conf
LOG_FOLDER=/opt/logs/admin/
修改日志路径
vim /root/apollo/apollo-adminservice/src/main/config/application-github.properties
apollo.eureka.server.enabled=false
增加如下配置,禁用apollo的eureka,使用上面独立eureka集群
vim /root/apollo/apollo-adminservice/src/main/resources/adminservice.properties
logging.file= /opt/logs/admin/apollo-adminservice.log

vim /root/apollo/apollo-adminservice/src/main/resources/application.yml
file: /opt/logs/admin/apollo-adminservice.log

vim /root/apollo/apollo-adminservice/src/main/resources/bootstrap.yml
eureka:instance:# 修改此配置如下 28091端口号在第十步中说明 k8s-node-ip替换为自己k8s节点iphomePageUrl: http://k8s-node-ip:28091# 修改此配置如下preferIpAddress: false# 增加此属性, 禁用apollo自带的eurekaapollo:eureka:server:enabled: false

vim /root/apollo/apollo-adminservice/src/main/scripts/startup.sh
LOG_DIR=/opt/logs/admin

修改portal配置
vim /root/apollo/apollo-portal/src/main/config/apollo-portal.conf
LOG_FOLDER=/opt/logs/portal/

vim /root/apollo/apollo-portal/src/main/resources/application.yml
file: ~opt/logs/portal/apollo-portal.log

vim /root/apollo/apollo-portal/src/main/scripts/startup.sh
LOG_DIR=/opt/logs/portal

修改Dockerfile内容
vim /root/apollo/scripts/apollo-on-kubernetes/apollo-config-server/Dockerfile
ENV APOLLO_ADMIN_SERVICE_NAME=“service-apollo-admin-server.apollo”

vim /root/apollo/scripts/apollo-on-kubernetes/apollo-config-server/scripts/startup-kubernetes.sh
LOG_DIR=/opt/logs/config

vim /root/apollo/scripts/apollo-on-kubernetes/apollo-admin-server/Dockerfile
ENV APOLLO_PORTAL_SERVICE_NAME=“service-apollo-portal-server.apollo”

vim /root/apollo/scripts/apollo-on-kubernetes/apollo-admin-server/scripts/startup-kubernetes.sh
LOG_DIR=/opt/logs/admin

vim /root/apollo/scripts/apollo-on-kubernetes/apollo-portal-server/Dockerfile
ENV APOLLO_PORTAL_SERVICE_NAME=“service-apollo-portal-server.apollo”

vim /root/apollo/scripts/apollo-on-kubernetes/apollo-portal-server/scripts/startup-kubernetes.sh
LOG_DIR=/opt/logs/portal
执行编译脚本
sh /root/apollo/scripts/build.sh
复制jar包
unzip /root/apollo/apollo-adminservice/target/apollo-adminservice-1.8.0-SNAPSHOT-github.zip -d /root/apollo-adminservice
cp /root/apollo-adminservice/apollo-adminservice-1.8.0-SNAPSHOT.jar /root/apollo/scripts/apollo-on-kubernetes/apollo-admin-server/apollo-adminservice.jar
unzip /root/apollo/apollo-configservice/target/apollo-configservice-1.8.0-SNAPSHOT-github.zip -d /root/apollo-configservice
cp /root/apollo-configservice/apollo-configservice-1.8.0-SNAPSHOT.jar /root/apollo/scripts/apollo-on-kubernetes/apollo-config-server/apollo-configservice.jar
unzip /root/apollo/apollo-portal/target/apollo-portal-1.8.0-SNAPSHOT-github.zip -d /root/apollo-portal
cp /root/apollo-portal/apollo-portal-1.8.0-SNAPSHOT.jar /root/apollo/scripts/apollo-on-kubernetes/apollo-portal-server/apollo-portal.jar
编译成镜像并push到dockerhub
cd /root/apollo/scripts/apollo-on-kubernetes/apollo-admin-server/
docker build -t tanmgweiwow/apollo-adminservice:v1.0 .
docker push tanmgweiwow/apollo-adminservice:v1.0
cd /root/apollo/scripts/apollo-on-kubernetes/apollo-config-server/
docker build -t tanmgweiwow/apollo-configservice:v1.0 .
docker push tanmgweiwow/apollo-configservice:v1.0
cd /root/apollo/scripts/apollo-on-kubernetes/apollo-portal-server/
docker build -t tanmgweiwow/apollo-portal:v1.0 .
docker push tanmgweiwow/apollo-portal:v1.0
编写k8s yaml文件
cat > apollo-config-server.yaml << EOFkind: ConfigMapapiVersion: v1metadata:namespace: apolloname: configmap-apollo-config-server-devdata:application-github.properties: |spring.datasource.url = jdbc:mysql://35.201.132.33:3306/apolloconfigdb?characterEncoding=utf8spring.datasource.username = rootspring.datasource.password = 123456@Abceureka.service.url = http://eureka-0.eureka.default:8761/eureka/,http://eureka-1.eureka.default:8761/eureka/,http://eureka-2.eureka.default:8761/eureka/---kind: ServiceapiVersion: v1metadata:namespace: apolloname: service-apollo-meta-server-devlabels:app: service-apollo-meta-server-devspec:ports:- protocol: TCPport: 8080 # 设定Serivce对外提供服务的端口targetPort: 8080 # 设定容器(Pod)的端口,即Pod网络的端口nodePort: 30003 # 将meta-server服务对节点外开发,让开发机器也能访问到k8s中的apolloselector:app: pod-apollo-config-server-devtype: NodePortsessionAffinity: ClientIP---kind: StatefulSetapiVersion: apps/v1metadata:namespace: apolloname: statefulset-apollo-config-server-devlabels:app: statefulset-apollo-config-server-devspec:serviceName: service-apollo-meta-server-dev # 声明它属于哪个Headless Service.replicas: 1selector:matchLabels:app: pod-apollo-config-server-dev # has to match .spec.template.metadata.labelsupdateStrategy:type: RollingUpdatetemplate:metadata:labels:app: pod-apollo-config-server-dev # has to match .spec.selector.matchLabelsspec:volumes:- name: volume-configmap-apollo-config-server-devconfigMap:name: configmap-apollo-config-server-devitems:- key: application-github.propertiespath: application-github.propertiescontainers:- image: tanmgweiwow/apollo-configservice:v1.0 # 这里需要改成自己打的镜像securityContext:privileged: trueimagePullPolicy: IfNotPresentname: container-apollo-config-server-devports:- protocol: TCPcontainerPort: 8080resources:limits:memory: 512Mi #限制内存为512MvolumeMounts:- name: volume-configmap-apollo-config-server-devmountPath: /apollo-config-server/config/application-github.propertiessubPath: application-github.propertiesenv:- name: APOLLO_CONFIG_SERVICE_NAMEvalue: "service-apollo-config-server-dev.apollo"readinessProbe:tcpSocket:port: 8080initialDelaySeconds: 10periodSeconds: 5livenessProbe:tcpSocket:port: 8080initialDelaySeconds: 120periodSeconds: 10dnsPolicy: ClusterFirstrestartPolicy: AlwaysEOF
cat > apollo-admin-server.yaml << EOFkind: ConfigMapapiVersion: v1metadata:namespace: apolloname: configmap-apollo-admin-server-devdata:application-github.properties: |spring.datasource.url = jdbc:mysql://35.201.132.33:3306/apolloconfigdb?characterEncoding=utf8spring.datasource.username = rootspring.datasource.password = 123456@Abceureka.service.url = http://eureka-0.eureka.default:8761/eureka/,http://eureka-1.eureka.default:8761/eureka/,http://eureka-2.eureka.default:8761/eureka/---kind: ServiceapiVersion: v1metadata:namespace: apolloname: service-apollo-admin-server-devlabels:app: service-apollo-admin-server-devspec:ports:- protocol: TCPport: 8090 # 设定Serivce对外提供服务的端口targetPort: 8090 # 设定容器(Pod)的端口,即Pod网络的端口nodePort: 28091selector:app: pod-apollo-admin-server-devtype: NodePortsessionAffinity: ClientIP---kind: DeploymentapiVersion: apps/v1metadata:namespace: apolloname: deployment-apollo-admin-server-devlabels:app: deployment-apollo-admin-server-devspec:replicas: 1selector:matchLabels:app: pod-apollo-admin-server-dev # has to match .spec.template.metadata.labelsstrategy:rollingUpdate:maxSurge: 1maxUnavailable: 1type: RollingUpdatetemplate:metadata:labels:app: pod-apollo-admin-server-dev # has to match .spec.selector.matchLabelsspec:volumes:- name: volume-configmap-apollo-admin-server-devconfigMap:name: configmap-apollo-admin-server-devitems:- key: application-github.propertiespath: application-github.propertiescontainers:- image: tanmgweiwow/apollo-adminservice:v1.0securityContext:privileged: trueimagePullPolicy: IfNotPresentname: container-apollo-admin-server-devports:- protocol: TCPcontainerPort: 8090resources:limits:memory: 512MivolumeMounts:- name: volume-configmap-apollo-admin-server-devmountPath: /apollo-admin-server/config/application-github.propertiessubPath: application-github.propertiesenv:- name: APOLLO_CONFIG_SERVICE_NAMEvalue: "service-apollo-admin-server-dev.apollo"readinessProbe:tcpSocket:port: 8090initialDelaySeconds: 10periodSeconds: 5livenessProbe:tcpSocket:port: 8090initialDelaySeconds: 120periodSeconds: 10dnsPolicy: ClusterFirstrestartPolicy: AlwaysEOF
cat > apollo-portal-server.yaml << EOF---# configmap for apollo-portal-serverkind: ConfigMapapiVersion: v1metadata:namespace: apolloname: configmap-apollo-portal-serverdata:# 数据库通过ip连接 【改成自己的数据库连接】application-github.properties: |spring.datasource.url = jdbc:mysql://35.201.132.33:3306/apolloportaldb?characterEncoding=utf8spring.datasource.username = rootspring.datasource.password = 123456@Abcapollo-env.properties: |dev.meta=http://statefulset-apollo-config-server-dev-0.service-apollo-meta-server-dev:8080# 资源限制,现在只使用dev环境# fat.meta=http://statefulset-apollo-config-server-fat-0.service-apollo-meta-server-fat:28080,http://statefulset-apollo-config-server-fat-1.service-apollo-meta-server-fat:28080,http://statefulset-apollo-config-server-fat-2.service-apollo-meta-server-fat:28080# uat.meta=http://service-apollo-config-server-test-beta.sre:8080# pro.meta=http://service-apollo-config-server-prod.sre:8080---kind: ServiceapiVersion: v1metadata:namespace: apolloname: service-apollo-portal-serverlabels:app: service-apollo-portal-serverspec:ports:- protocol: TCPport: 8070targetPort: 8070nodePort: 30001selector:app: pod-apollo-portal-servertype: NodePortsessionAffinity: ClientIP# 这里使用Deployment---kind: DeploymentapiVersion: apps/v1metadata:namespace: apolloname: deployment-apollo-portal-serverlabels:app: deployment-apollo-portal-serverspec:replicas: 1selector:matchLabels:app: pod-apollo-portal-serverstrategy:rollingUpdate:maxSurge: 1maxUnavailable: 1type: RollingUpdatetemplate:metadata:labels:app: pod-apollo-portal-serverspec:volumes:- name: volume-configmap-apollo-portal-serverconfigMap:name: configmap-apollo-portal-serveritems:- key: application-github.propertiespath: application-github.properties- key: apollo-env.propertiespath: apollo-env.propertiescontainers:- image: tanmgweiwow/apollo-portal:v1.0 # 更改为你的 docker registry 下的 imagesecurityContext:privileged: trueimagePullPolicy: IfNotPresentname: container-apollo-portal-serverports:- protocol: TCPcontainerPort: 8070resources:limits:memory: 512MivolumeMounts:- name: volume-configmap-apollo-portal-servermountPath: /apollo-portal-server/config/application-github.propertiessubPath: application-github.properties- name: volume-configmap-apollo-portal-servermountPath: /apollo-portal-server/config/apollo-env.propertiessubPath: apollo-env.propertiesenv:- name: APOLLO_PORTAL_SERVICE_NAMEvalue: "service-apollo-portal-server.apollo"readinessProbe:tcpSocket:port: 8070initialDelaySeconds: 10periodSeconds: 5livenessProbe:tcpSocket:port: 8070initialDelaySeconds: 120periodSeconds: 15dnsPolicy: ClusterFirstrestartPolicy: AlwaysEOF
kubectl create ns apollokubectl apply -f apollo-config-server.yamlkubectl apply -f apollo-admin-server.yamlkubectl apply -f apollo-portal-server.yaml

访问portal
nodeip:30001
账号密码 apollo/admin
