前提条件

已经安装了Helm Helm 3.14.2 安装

我的Helm版本3.14.2

从github上面下载下来nacos-k8s 项目

nacos-k8s GibHub地址

方法一

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

方法二

下载压缩包

解压、进入文件夹

# 解压文件
unzip nacos-k8s-master.zip

# 进入helm目录
cd nacos-k8s-master/helm

# 备份原文件
cp values.yaml values-original.yaml

# 编辑文件
vim values.yaml

编辑文件

# Default values for nacos.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.

global:
#  mode: standalone
  mode: cluster # 集群模式

############################nacos###########################
namespace: nacos # 命名空间
nacos:
  image:
    repository: nacos/nacos-server
    tag: v2.2.3 # nacos 版本 注:2.2.1版本后Nacos的鉴权默认是关闭的,需要自己开启
    pullPolicy: IfNotPresent # 拉取策略
  plugin: # 插件
    enable: true
    image:
      repository: nacos/nacos-peer-finder-plugin  # 用于服务间节点发现
      tag: 1.1
      pullPolicy: IfNotPresent
  replicaCount: 3  # 副本数量
  podManagementPolicy: Parallel # pod 管理策略, 默认是根据编号顺序管理增添,Parallel 表示可以同时进行
  domainName: cluster.local # 指定集群内Pod的DNS域名
  preferhostmode: hostname # Pod调度策略
  serverPort: 8848 # 服务端口号
  health:
    enabled: true # 是否开启健康检查
  storage:
#    type: embedded
    type: mysql # 数据存储 目前只支持 embedded和mysql
    db: # 数据库链接信息
      host: mysql-primary.mysql # 数据库的主机,我这里mysql-primary代表mysql的service名称,mysql代表命名空间,mysql我搭建的是一个主从复制,这里的service要选择有写操作权限的
      name: nacos_config # 数据库名称
      port: "3306" # 数据库端口,集群内部端口即可
      username: root # 账号
      password: "123123" # 密码
      param: characterEncoding=utf8&connectTimeout=10000&socketTimeout=30000&autoReconnect=true&useSSL=false&serverTimezone=UTC # 连接参数

# 以下默认即可
persistence: # 持久化
  enabled: false # 默认关闭
  data:
    accessModes:
      - ReadWriteOnce
    storageClassName: manual
    resources:
      requests:
        storage: 5Gi


service:
  #type: ClusterIP
  type: NodePort
  port: 8848
  nodePort: 30000


...

注意事项

mode: cluster

namespace: nacos

tag:你想接取的版本

replicaCount:副本数量

type:选用Mysql

Mysql的param后面最好加上:&serverTimezone=UTC

安装nacos

# 创建命令空间
kubectl create ns nacos

# 在helm目录下执行
helm install nacos . -n nacos

可能出错(没有就忽略)Error: UPGRADE FAILED: failed to create resource: ConfigMap in version "v1" cannot be handled as a ConfigMap: json: cannot unmarshal number into Go struct field ConfigMap.data of type string

出现这个问题,我感觉是Nacos的一个bug

解决办法是:

# 进入templates文件夹
cd templates

# 编辑configmap资源文件
vim configmap.yaml


# 文件内容 Start

{{- if eq .Values.nacos.storage.type "mysql"}}
apiVersion: v1
kind: ConfigMap
metadata:
  name: nacos-cm
  namespace: {{ .Values.namespace }}
data:
  {{- with .Values.nacos.storage.db }}
  mysql.db.host: "{{.host}}" # 加上双引号
  mysql.db.name: "{{ .name }}" # 加上双引号
  mysql.port: "{{ .port | default 3306}}" # 加上双引号
  mysql.user: "{{ .username }}" # 加上双引号
  mysql.password: "{{ .password }}" # 加上双引号
  mysql.param: "{{ .param | default "characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false" }}" # 加上双引号
  {{- end }}
  {{- end }}

# 文件内容 End

# 在helm目录下执行更新操作
helm upgrade nacos . -n nacos

# 我建议最好删掉重新安装
helm delete nacos -n nacos
helm install nacos . -n nacos

查看容器运行状况

# 查看nacos命名空间下的pod、service、statefulset资源
kubectl get all -n nacos

NAME          READY   STATUS    RESTARTS   AGE
pod/nacos-0   1/1     Running   0          50m
pod/nacos-1   1/1     Running   0          50m
pod/nacos-2   1/1     Running   0          50m

NAME               TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                                                       AGE
service/nacos-cs   NodePort    10.106.217.14   <none>        8848:31804/TCP,9848:31249/TCP,9849:32202/TCP,7848:30000/TCP   50m
service/nacos-hs   ClusterIP   None            <none>        8848/TCP,9848/TCP,9849/TCP,7848/TCP                           50m

NAME                     READY   AGE
statefulset.apps/nacos   3/3     50m

浏览器访问

上图看到service对外映射的端口是:31804

群集的随便一个IP xxx.xxx.xx.xx:31804/nacos

没有登陆页面怎么办

2.2.1版本后Nacos的鉴权默认是关闭的,需要自己开启

开启如下

# 进入templates目录
cd templates

# 编辑statefulset资源
vim statefulset.yaml

# 找到窗口的环境变量env 添加下面的内容,注意和原有的变量保持同级
env:
  - name: NACOS_AUTH_ENABLE # 开启鉴权
    value: "true"
  - name: NACOS_AUTH_IDENTITY_KEY             # 账号
    value: "nacos"
  - name: NACOS_AUTH_IDENTITY_VALUE   # 密码
    value: "nacos"
  - name: NACOS_AUTH_TOKEN                    # token            
    value: "Ym1GamIzTWdhWE1nZG1WeWVTQm5iMjlrSUhOdlpuUjNZWEpsQ2c9PQo="


# 在helm目录下执行更新操作
helm upgrade nacos . -n nacos

# 我建议最好删掉重新安装
helm delete nacos -n nacos
helm install nacos . -n nacos

再次访问页面

注:登陆还是要使用数据库配置的密码

Ingress对外暴露

上面的访问每当集群重启后对应的NodePort端口也会跟着变,所以可以采用ingress暴露对应的服务

注:前提需要安装对应的ingress-controller控制器  K8S 1.28 安装ingress-controller控制器-CSDN博客

注:nacos-k8s上面也有对应的ingress资源,但是我看好像只能设置对应的host,我这里用的是路径匹配,所以自己写了一个yaml

创建nacos-ingress.yaml文件

apiVersion: networking.k8s.io/v1 
kind: Ingress
metadata:
  name: nacos-ingress # ingress名称
  namespace: nacos # 命令空间
  annotations:
   # nginx.ingress.kubernetes.io/rewrite-target: / # 重写请求,类似nginx。我这里给注释了
spec:
  ingressClassName: nginx # ingress 的控制器,选用nginx
  rules: 
  - http:
      paths:
      - path: /nacos # 匹配路径
        pathType: Prefix # 模糊匹配
        backend:
          service:
            name: nacos-cs # 映射service名称
            port:
              number: 8848 # 映射service端口

创建ingress

# 创建ingress
kubectl create -f nacos-ingress.yaml

# 查看ingress
kubectl get ingress -n nacos
kubectl describe ingress nacos-ingress -n nacos

 访问页面

ingress-controller安装节点+匹配路径,

比如我ingress-controller安装在192.168.66.89上面

访问:192.168.66.89/nacos/index.html

Logo

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

更多推荐