如果yaml文件在你的机器上显示格式有问题
找一个在线yaml校验的地方,把格式改一下,就多一个空格或者少一个空格的问题
机器配置
1主2从,提前安装好k8s集群
192.168.10.106=n1
192.168.10.107=n2
192.168.10.108=m1
主节点安装nfs
yum install -y nfs-utils rpcbind
systemctl restart rpcbind
systemctl enable rpcbind
systemctl restart nfs
systemctl enable nfs
从节点安装nfs
yum -y install nfs-utils
systemctl enable nfs
在主节点创建dev命名空间
kubectl create ns dev
查看命名空间
kubectl get ns
创建nfs存储目录
下面的操作都是在主节点
创建nfs存储目录
mkdir -p /data/nfs/nacos/logs
mkdir -p /data/nfs/nacos/data
把目录暴露给内网访问,就是pod会访问这些目录
vi /etc/exports
/data/nfs/nacos/logs *(rw,sync,no_root_squash)
/data/nfs/nacos/data *(rw,sync,no_root_squash)
然后重启nfs-server
systemctl restart rpcbind
systemctl enable rpcbind
systemctl restart nfs
systemctl enable nfs
校验是否成功
showmount -e 192.168.10.108
创建日志和数据的pv和pvc
pvc会和pv绑定
pv会放在nfs serve存储
我们的pvc都是放在dev命名空间下的
vi nacos-pv-pvc.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: nacos-logs-pv
spec:
capacity:
# 申请的容量,生产环境注意修改
storage: 1Gi
accessModes:
- ReadWriteMany
nfs:
# nfs服务器地址和目录,注意修改为自己的
server: 192.168.10.108
path: /data/nfs/nacos/logs
# 存储类类型,我们使用nfs
storageClassName: "nfs"---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nacos-logs-pvc
namespace: dev
spec:
accessModes:
- ReadWriteMany
# 存储类类型,我们使用nfs
storageClassName: "nfs"
resources:
requests:
storage: 1Gi
volumeName: nacos-logs-pv---
apiVersion: v1
kind: PersistentVolume
metadata:
name: nacos-data-pv
spec:
capacity:
# 申请的容量,生产环境注意修改
storage: 1Gi
accessModes:
- ReadWriteMany
nfs:
# nfs服务器地址和目录,注意修改为自己的
server: 192.168.10.108
path: /data/nfs/nacos/data
# 存储类类型,我们使用nfs
storageClassName: "nfs"---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nacos-data-pvc
namespace: dev
spec:
accessModes:
- ReadWriteMany
# 存储类类型,我们使用nfs
storageClassName: "nfs"
resources:
requests:
# 申请的容量,生产环境注意修改
storage: 1Gi
volumeName: nacos-data-pv
执行
kubectl apply -f nacos-pv-pvc.yaml
查看pv和pvc
kubectl get pv
kubectl get pvc -n dev
创建configmap
jvm-xmn: jvm新生区的内存大小
jvm-xms: jvm永久区的最小大小
jvm-xmx: jvm永久区的最大大小
mode: nacos启动模式,因为是单点启动,所以设置为 standalone
mysql-database-num: nacos连接数据库的数量,设置为1
mysql-service-db-name: mysql当中nacos数据库的名字
mysql-service-db-param: nacos连接数据库的参数
mysql-service-host: mysql数据库的地址
mysql-service-port: mysql数据库的端口
mysql-service-user: 连接mysql的用户名
mysql-service-password: mysql的密码
spring-datasource-platform: nacos连接数据库的平台,只支持mysql
vi nacos-cm.yaml
apiVersion: v1
data:
jvm-xmn: 64m
jvm-xms: 128m
jvm-xmx: 128m
mode: standalone
mysql-database-num: "1"
mysql-service-db-name: nacos
mysql-service-db-param: characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false&serverTimezone=Asia/Shanghai
mysql-service-host: 192.168.10.104
mysql-service-password: "123456"
mysql-service-port: "13306"
mysql-service-user: root
spring-datasource-platform: mysql
kind: ConfigMap
metadata:
creationTimestamp: null
name: nacos-cm
namespace: dev
执行
kubectl apply -f nacos-cm.yaml
查看configmap
kubectl get cm -n dev
部署nacos
部署有状态的pod 和service
StatefulSet 就是动态显示pod后面的名字 例如-0,-1这种结尾
并且把之前的pvc进行和pod绑定
把configmap进行挂载
先把nacos对应的mysql数据初始化sql
/*
* Copyright 1999-2018 Alibaba Group Holding Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*//******************************************/
/* 表名称 = config_info */
/******************************************/
CREATE TABLE `config_info` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
`data_id` varchar(255) NOT NULL COMMENT 'data_id',
`group_id` varchar(128) DEFAULT NULL COMMENT 'group_id',
`content` longtext NOT NULL COMMENT 'content',
`md5` varchar(32) DEFAULT NULL COMMENT 'md5',
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
`src_user` text COMMENT 'source user',
`src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',
`app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
`tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
`c_desc` varchar(256) DEFAULT NULL COMMENT 'configuration description',
`c_use` varchar(64) DEFAULT NULL COMMENT 'configuration usage',
`effect` varchar(64) DEFAULT NULL COMMENT '配置生效的描述',
`type` varchar(64) DEFAULT NULL COMMENT '配置的类型',
`c_schema` text COMMENT '配置的模式',
`encrypted_data_key` text NOT NULL COMMENT '密钥',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info';/******************************************/
/* 表名称 = config_info_aggr */
/******************************************/
CREATE TABLE `config_info_aggr` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
`data_id` varchar(255) NOT NULL COMMENT 'data_id',
`group_id` varchar(128) NOT NULL COMMENT 'group_id',
`datum_id` varchar(255) NOT NULL COMMENT 'datum_id',
`content` longtext NOT NULL COMMENT '内容',
`gmt_modified` datetime NOT NULL COMMENT '修改时间',
`app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
`tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_configinfoaggr_datagrouptenantdatum` (`data_id`,`group_id`,`tenant_id`,`datum_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='增加租户字段';
/******************************************/
/* 表名称 = config_info_beta */
/******************************************/
CREATE TABLE `config_info_beta` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
`data_id` varchar(255) NOT NULL COMMENT 'data_id',
`group_id` varchar(128) NOT NULL COMMENT 'group_id',
`app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
`content` longtext NOT NULL COMMENT 'content',
`beta_ips` varchar(1024) DEFAULT NULL COMMENT 'betaIps',
`md5` varchar(32) DEFAULT NULL COMMENT 'md5',
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
`src_user` text COMMENT 'source user',
`src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',
`tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
`encrypted_data_key` text NOT NULL COMMENT '密钥',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_configinfobeta_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_beta';/******************************************/
/* 表名称 = config_info_tag */
/******************************************/
CREATE TABLE `config_info_tag` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
`data_id` varchar(255) NOT NULL COMMENT 'data_id',
`group_id` varchar(128) NOT NULL COMMENT 'group_id',
`tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id',
`tag_id` varchar(128) NOT NULL COMMENT 'tag_id',
`app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
`content` longtext NOT NULL COMMENT 'content',
`md5` varchar(32) DEFAULT NULL COMMENT 'md5',
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
`src_user` text COMMENT 'source user',
`src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_configinfotag_datagrouptenanttag` (`data_id`,`group_id`,`tenant_id`,`tag_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_tag';/******************************************/
/* 表名称 = config_tags_relation */
/******************************************/
CREATE TABLE `config_tags_relation` (
`id` bigint(20) NOT NULL COMMENT 'id',
`tag_name` varchar(128) NOT NULL COMMENT 'tag_name',
`tag_type` varchar(64) DEFAULT NULL COMMENT 'tag_type',
`data_id` varchar(255) NOT NULL COMMENT 'data_id',
`group_id` varchar(128) NOT NULL COMMENT 'group_id',
`tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id',
`nid` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'nid, 自增长标识',
PRIMARY KEY (`nid`),
UNIQUE KEY `uk_configtagrelation_configidtag` (`id`,`tag_name`,`tag_type`),
KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_tag_relation';/******************************************/
/* 表名称 = group_capacity */
/******************************************/
CREATE TABLE `group_capacity` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`group_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Group ID,空字符表示整个集群',
`quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值',
`usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量',
`max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值',
`max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数,,0表示使用默认值',
`max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值',
`max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量',
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_group_id` (`group_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='集群、各Group容量信息表';/******************************************/
/* 表名称 = his_config_info */
/******************************************/
CREATE TABLE `his_config_info` (
`id` bigint(20) unsigned NOT NULL COMMENT 'id',
`nid` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'nid, 自增标识',
`data_id` varchar(255) NOT NULL COMMENT 'data_id',
`group_id` varchar(128) NOT NULL COMMENT 'group_id',
`app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
`content` longtext NOT NULL COMMENT 'content',
`md5` varchar(32) DEFAULT NULL COMMENT 'md5',
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
`src_user` text COMMENT 'source user',
`src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',
`op_type` char(10) DEFAULT NULL COMMENT 'operation type',
`tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
`encrypted_data_key` text NOT NULL COMMENT '密钥',
PRIMARY KEY (`nid`),
KEY `idx_gmt_create` (`gmt_create`),
KEY `idx_gmt_modified` (`gmt_modified`),
KEY `idx_did` (`data_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='多租户改造';
/******************************************/
/* 表名称 = tenant_capacity */
/******************************************/
CREATE TABLE `tenant_capacity` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`tenant_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Tenant ID',
`quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值',
`usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量',
`max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值',
`max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数',
`max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值',
`max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量',
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='租户容量信息表';
CREATE TABLE `tenant_info` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
`kp` varchar(128) NOT NULL COMMENT 'kp',
`tenant_id` varchar(128) default '' COMMENT 'tenant_id',
`tenant_name` varchar(128) default '' COMMENT 'tenant_name',
`tenant_desc` varchar(256) DEFAULT NULL COMMENT 'tenant_desc',
`create_source` varchar(32) DEFAULT NULL COMMENT 'create_source',
`gmt_create` bigint(20) NOT NULL COMMENT '创建时间',
`gmt_modified` bigint(20) NOT NULL COMMENT '修改时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_tenant_info_kptenantid` (`kp`,`tenant_id`),
KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='tenant_info';CREATE TABLE `users` (
`username` varchar(50) NOT NULL PRIMARY KEY COMMENT 'username',
`password` varchar(500) NOT NULL COMMENT 'password',
`enabled` boolean NOT NULL COMMENT 'enabled'
);CREATE TABLE `roles` (
`username` varchar(50) NOT NULL COMMENT 'username',
`role` varchar(50) NOT NULL COMMENT 'role',
UNIQUE INDEX `idx_user_role` (`username` ASC, `role` ASC) USING BTREE
);CREATE TABLE `permissions` (
`role` varchar(50) NOT NULL COMMENT 'role',
`resource` varchar(128) NOT NULL COMMENT 'resource',
`action` varchar(8) NOT NULL COMMENT 'action',
UNIQUE INDEX `uk_role_permission` (`role`,`resource`,`action`) USING BTREE
);INSERT INTO users (username, password, enabled) VALUES ('nacos', '$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu', TRUE);
INSERT INTO roles (username, role) VALUES ('nacos', 'ROLE_ADMIN');
先创建service的yaml文件
vi nacos-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: nacos-svc
namespace: dev
labels:
app: nacos
spec:
ports:
- port: 8848
name: client
targetPort: 8848
# 如果你需要使用到NodePort或LoadBalancer暴露应用,那么你可以将这里打开
# nodePort: 30848
- port: 9848
name: client-rpc
targetPort: 9848
# nodePort: 30948
- port: 9849
name: raft-rpc
targetPort: 9849
# nodePort: 30849
- port: 7848
name: old-raft-rpc
targetPort: 7848
# nodePort: 30748
# 如果你需要使用到NodePort或LoadBalancer暴露应用,那么你需要注释掉clusterIP
# 这里写死虚拟ip,找一个不占用的虚拟ip 方便在springcloud的配置访问集群内虚拟ip
clusterIP: 172.16.32.2
selector:
app: nacos
# ClusterIP, NodePort, LoadBalancer
type: ClusterIP
# 如果你需要使用到NodePort或LoadBalancer暴露应用,那么你需要将这里改为ClientIP
# ClientIP, None
sessionAffinity: None
执行
kubectl apply -f nacos-svc.yaml
查看service信息
kubectl get svc -o wide -n dev
172.16.32.2 不要和别的ip冲突,如果有冲突在换一个地址
这个地址在springcloud项目的配置 会用到
在创建pod文件,有状态部署
vi nacos-pod.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: nacos
namespace: dev
spec:
selector:
matchLabels:
app: nacos
serviceName: nacos-svc
replicas: 1
template:
metadata:
labels:
app: nacos
spec:
terminationGracePeriodSeconds: 10
containers:
- name: nacos
image: nacos/nacos-server:v2.2.0
ports:
- containerPort: 8848
name: client
- containerPort: 9848
name: client-rpc
- containerPort: 9849
name: raft-rpc
- containerPort: 7848
name: old-raft-rpc
volumeMounts:
- name: nacos-data
mountPath: /home/nacos/data
- name: nacos-logs
mountPath: /home/nacos/logs
env:
- name: JVM_XMN
valueFrom:
configMapKeyRef:
key: jvm-xmn
name: nacos-cm
- name: JVM_XMS
valueFrom:
configMapKeyRef:
key: jvm-xms
name: nacos-cm
- name: JVM_XMX
valueFrom:
configMapKeyRef:
key: jvm-xmx
name: nacos-cm
- name: MODE
valueFrom:
configMapKeyRef:
key: mode
name: nacos-cm
- name: MYSQL_DATABASE_NUM
valueFrom:
configMapKeyRef:
key: mysql-database-num
name: nacos-cm
- name: MYSQL_SERVICE_DB_NAME
valueFrom:
configMapKeyRef:
key: mysql-service-db-name
name: nacos-cm
- name: MYSQL_SERVICE_DB_PARAM
valueFrom:
configMapKeyRef:
key: mysql-service-db-param
name: nacos-cm
- name: MYSQL_SERVICE_HOST
valueFrom:
configMapKeyRef:
key: mysql-service-host
name: nacos-cm
- name: MYSQL_SERVICE_PASSWORD
valueFrom:
configMapKeyRef:
key: mysql-service-password
name: nacos-cm
- name: MYSQL_SERVICE_PORT
valueFrom:
configMapKeyRef:
key: mysql-service-port
name: nacos-cm
- name: MYSQL_SERVICE_USER
valueFrom:
configMapKeyRef:
key: mysql-service-user
name: nacos-cm
- name: SPRING_DATASOURCE_PLATFORM
valueFrom:
configMapKeyRef:
key: spring-datasource-platform
name: nacos-cm
volumes:
- name: nacos-data
persistentVolumeClaim:
claimName: nacos-data-pvc
- name: nacos-logs
persistentVolumeClaim:
claimName: nacos-logs-pvc
执行
kubectl apply -f nacos-pod.yaml
查看pod信息
kubectl get pods -o wide -n dev
拉取镜像需要5分钟,可以通过下面的命令查看详细信息
kubectl describe pod nacos-0 -n dev
虽然部署了pod和service 但是只能在集群内部访问,不能在浏览器访问
所以需要ingress 暴漏service 才能在浏览器访问
ingress可以理解为nginx
用ingress暴露nacos的service,可以在浏览器访问地址
安装ingress
kubectl apply -f http://manongbiji.oss-cn-beijing.aliyuncs.com/ittailkshow/k8s/download/ingress-nginx-1.5.1.yaml
查看ingress暴露的端口号31266
kubectl get all -n ingress-nginx
创建ingress的nacos配置
service下面的name和要nacos的service的name一致
并且number也要和service的port一致
cat > ingress-nacos.yaml <<-'EOF'
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-nacos
namespace: dev
annotations:
#直接映射至根路径
ingress.kubernetes.io/rewrite-target: /
spec:
ingressClassName: nginx
rules:
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nacos-svc
port:
number: 8848
EOF
执行
kubectl apply -f ingress-nacos.yaml
查看ingress
kubectl get ingress -n dev
在浏览器通过ingress的31266端口访问nacos
随便找一个节点的ip访问都行
Springcloud配置nacos地址
在这里一定要注意,地址配置的是虚拟ip的地址,端口号必须是8848
就是在svc写死的地址
在idea是不能启动的,会报错,因为是集群内的地址,所以我们要把项目打包上传到服务器
spring.cloud.nacos.discovery.server-addr=172.16.32.2:8848
上传到服务器 启动之后,可以看到启动成功了
通过ingress暴露的端口访问naocs,可以看到服务已经注册上去了
http://192.168.10.108:31266/nacos
数据都会在nfs目录存储
配置nacos使用无头服务
就是集群ip 设置为None,使用service的名字nacos-svc去访问
clusterIP: None
nodePort 全部注释
在springcloud的项目配置 使用下面的配置信息,不需要输入8848端口
service的名字.命名空间.svc.cluster.local
spring.cloud.nacos.discovery.server-addr=nacos-svc.dev.svc.cluster.local
然后把项目部署到k8s中,使用ingress 对应的ip 去访问nacos
使用从节点ip访问,这时候就不能是主节点ip了
http://192.168.10.107:31266/nacos