通过 operator 快速在k8s上构建 nacos 集群

3 篇文章 0 订阅

nacos-operator

nacos-operator 项目,快速在 K8s 上面部署构建 nacos。

与 nacos-k8s 的项目区别

https://github.com/nacos-group/nacos-k8s.git

优点

  • 通过 operator 快速构建 nacos 集群,指定简单的 cr.yaml 文件,既可以实现各种类型的 nacos 集群 (数据库选型、standalone/cluster 模式等)
  • 增加一定的运维能力,在 status 中增加对 nacos 集群状态的检查、自动化运维等 (后续扩展更多功能)

快速开始

git clone https://github.com/nacos-group/nacos-k8s.git
cd nacos-k8s/operator
# 直接使用helm方式安装operator
helm install nacos-operator ./chart/nacos-operator 

# 如果没有helm, 使用kubectl进行安装, 默认安装在default下面
kubectl apply -f chart/nacos-operator/nacos-operator-all.yaml

启动单实例,standalone 模式

查看 cr 文件

cat config/samples/nacos.yaml
apiVersion: nacos.io/v1alpha1
kind: Nacos
metadata:
  name: nacos
spec:
  type: standalone
  image: nacos/nacos-server:1.4.1
  replicas: 1
# 安装demo standalone模式
kubectl apply -f config/samples/nacos.yaml

查看 nacos 实例

kubectl get nacos
NAME    REPLICAS   READY     TYPE         DBTYPE   VERSION   CREATETIME
nacos   1          Running   standalone            1.4.1     2021-03-14T09:21:49Z

kubectl get pod  -o wide
NAME                 READY   STATUS    RESTARTS   AGE    IP               NODE        NOMINATED NODE   READINESS GATES
nacos-0   1/1     Running   0          84s    10.168.247.38    slave-100   <none>           <none>

kubectl get nacos nacos -o yaml
...
status
  conditions:
  - instance: 10.168.247.38
    nodeName: slave-100
    podName: nacos-0
    status: "true"
    type: leader
  phase: Running
  version: 1.4.1

清除

make demo clear=true

启动集群模式

cat config/samples/nacos_cluster.yaml

apiVersion: nacos.io/v1alpha1
kind: Nacos
metadata:
  name: nacos
spec:
  type: cluster
  image: nacos/nacos-server:1.4.1
  replicas: 3
# 创建nacos集群
kubectl apply -f config/samples/nacos_cluster.yaml

kubectl get po -o wide
NAME             READY   STATUS    RESTARTS   AGE    IP               NODE         NOMINATED NODE   READINESS GATES
nacos-0          1/1     Running   0          111s   10.168.247.39    slave-100    <none>           <none>
nacos-1          1/1     Running   0          109s   10.168.152.186   master-212   <none>           <none>
nacos-2          1/1     Running   0          108s   10.168.207.209   slave-214    <none>           <none>

kubectl get nacos
NAME    REPLICAS   READY     TYPE      DBTYPE   VERSION   CREATETIME
nacos   3          Running   cluster            1.4.1     2021-03-14T09:33:09Z

kubectl get nacos nacos -o yaml -w
...
status:
conditions:
- instance: 10.168.247.39
nodeName: slave-100
podName: nacos-0
status: "true"
type: leader
- instance: 10.168.152.186
nodeName: master-212
podName: nacos-1
status: "true"
type: Followers
- instance: 10.168.207.209
nodeName: slave-214
podName: nacos-2
status: "true"
type: Followers
event:
- code: -1
firstAppearTime: "2021-03-05T08:35:03Z"
lastTransitionTime: "2021-03-05T08:35:06Z"
message: The number of ready pods is too small[]
status: false
- code: 200
firstAppearTime: "2021-03-05T08:36:09Z"
lastTransitionTime: "2021-03-05T08:36:48Z"
status: true
phase: Running
version: 1.4.1

清除

make demo clear=true

配置

全部参数如下

参数描述参考值
spec.type集群类型目前支持 standalone 和 cluster
spec.image镜像地址,兼容社区镜像nacos/nacos-server:1.4.1
spec.mysqlInitImagemysql 数据初始镜像地址,mysql 模式下将自动导入数据库registry.cn-hangzhou.aliyuncs.com/shenkonghui/mysql-client
spec.replicas实例数量1
spec.database.type数据库类型目前支持 mysql 和 embedded
spec.database.mysqlHostmysql 连接地址默认 mysql
spec.database.mysqlPortmysql 端口默认 3306
spec.database.mysqlUsermysql 用户默认 root
spec.database.mysqlPasswordmysql 密码默认 123456
spec.database.mysqlDbmysq 数据库默认 nacos
spec.volume.enabled是否开启数据卷true,如果数据库类型是 embedded,请开启数据卷,否则重启 pod 数据丢失
spec.volume.requests.storage存储大小1Gi
spec.volume.storageClass存储类default
spec.config其他自定义配置,自动映射到 custom.propretise格式和 configmap 兼容

设置模式

目前支持 standalone 和 cluster 模式

通过配置 spec.type 为 standalone/cluster

数据库配置

embedded 数据库

apiVersion: nacos.io/v1alpha1
kind: Nacos
metadata:
name: nacos
spec:
type: standalone
image: nacos/nacos-server:1.4.1
replicas: 1
database:
type: embedded
  # 启动数据卷,不然重启后数据丢失
volume:
enabled: true
requests:
storage: 1Gi
storageClass: default

mysql 数据库

该模式下需要提供外部 mysql 连接信息,会自动创建创建 nacos 数据库,并执行初始化 sql

注意:集群mysql模式下提供外部 mysql 连接信息,必须手动新建数据库及导出初始化数据
apiVersion: nacos.io/v1alpha1
kind: Nacos
metadata:
  name: nacos
spec:
  type: standalone
  image: nacos/nacos-server:1.4.1
  replicas: 1
  database:
    type: mysql
    mysqlHost: mysql
    mysqlDb: nacos
    mysqlUser: root
    mysqlPort: "3306"
    mysqlPassword: "123456"

自定义配置

  1. 通过环境变量配置 兼容 nacos-docker 项目, https://github.com/nacos-group/nacos-docker

    apiVersion: nacos.io/v1alpha1
    kind: Nacos
    metadata:
    name: nacos
    spec:
    type: standalone
    env:
    - key: JVM_XMS
    value: 2g
    
  2. 通过 properties 文件配置

    https://github.com/nacos-group/nacos-docker/blob/master/build/bin/docker-startup.sh

    export CUSTOM_SEARCH_NAMES="application,custom"
    export CUSTOM_SEARCH_LOCATIONS=${BASE_DIR}/init.d/,file:${BASE_DIR}/conf/
    

    支持自定义配置文件,spec.config 会直接映射成 custom.properties 文件

    apiVersion: nacos.io/v1alpha1
    kind: Nacos
    metadata:
      name: nacos
    spec:
    ...
      config:|
        management.endpoints.web.exposure.include=*
    

开发文档

# 安装crd
make install
# 以源码方式运行operator
make run
# 编译operator镜像
make image_operator IMG=<your image repo>

FAQ

  1. 设置 readiness 和 liveiness 集群出问题

    最后一个实例无法 ready,搜索了下 issus,发现需要以下设置

    nacos.naming.data.warmup=false
    

    设置了以后发现,pod 能够 running,但是集群状态始终无法同步,不同节点出现不同 leader;所以暂时不开启 readiness 和 liveiness

  2. 组集群失败

[root@nacos-0 logs]# tail -n 200 nacos.log
java.lang.IllegalStateException: unable to find local peer: nacos-1.nacos-headless.shenkonghui.svc.cluster.local:8848, all peers: []```
[root@nacos-0 logs]# tail -n 200 alipay-jraft.log
2021-03-16 14:08:48,223 WARN Channel in TRANSIENT_FAILURE state: nacos-2.nacos-headless.shenkonghui.svc.cluster.local:7848.

2021-03-16 14:08:48,223 WARN Channel in SHUTDOWN state: nacos-2.nacos-headless.shenkonghui.svc.cluster.local:7848.
[root@nacos-0 logs]# tail -n 200 nacos-cluster.log
2021-03-16 14:08:05,710 INFO Current addressing mode selection : FileConfigMemberLookup

2021-03-16 14:08:05,717 ERROR nacos-XXXX [serverlist] failed to get serverlist from disk!, error : The IPv4 address("nacos-2.nacos-headless.shenkonghui.svc.cluster.local") is incorrect.

看样子应该是 pod 是按照顺序启动,无法解析后面还未就绪的 pod 的 ip.

  1. 在 service 中加入属性 PublishNotReadyAddresses=true(已实现)。但是如果 pod 还未分配 IP?还是会失败。
  2. 设置 statefulset spec.PodManagementPolicy=Parallel(已实现),让 pod 同时启动而不是 1 个 1 个启动。提高成功率。
  3. 加上 initcontainer, 检测 headless service 全部通过以后才能启动 pod(已实现) 为了兼容社区 docker / 同时不想加 initcontainer 增加复杂度,cmd 中更改启动脚本,在启动 docker-startup.sh 前先执行
var initScrit = `array=(%s)
succ = 0

for element in ${array[@]} 
do
  while true
  do
    ping $element -c 1 > /dev/stdout
    if [[ $? -eq 0 ]]; then
      echo $element "all domain ready"
      break
    else
      echo $element "wait for other domain ready"
    fi
    sleep 1
  done
done
sleep 1

echo "init success"`
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值