当前位置: 首页 > news >正文

K8S搭建NACOS集群踩坑问题

一、NACOS容器启动成功无法访问

  1. 现象描述:通过K8S的statefulset启动,通过NodePort暴露不能在外网访问,只能在MASTER主节点访问。

  1. yaml配置:

apiVersion: apps/v1
kind: StatefulSet
metadata:name: 'nacos-${parameters.nameSpace}-dm'namespace: '${parameters.nameSpace}'
spec:replicas: 1selector:matchLabels:app: 'nacos-${parameters.nameSpace}'serviceName: 'nacos-${parameters.nameSpace}'template:metadata:annotations:pod.alpha.kubernetes.io/initialized: 'true'labels:app: 'nacos-${parameters.nameSpace}'spec:containers:- env:- name: NACOS_REPLICASvalue: '1'- name: MYSQL_SERVICE_HOSTvalueFrom:configMapKeyRef:key: mysql.hostname: 'nacos-${parameters.nameSpace}-cm'- name: MYSQL_SERVICE_DB_NAMEvalueFrom:configMapKeyRef:key: mysql.db.namename: 'nacos-${parameters.nameSpace}-cm'- name: MYSQL_SERVICE_PORTvalueFrom:configMapKeyRef:key: mysql.portname: 'nacos-${parameters.nameSpace}-cm'- name: MYSQL_SERVICE_USERvalueFrom:configMapKeyRef:key: mysql.username: 'nacos-${parameters.nameSpace}-cm'- name: MYSQL_SERVICE_PASSWORDvalueFrom:configMapKeyRef:key: mysql.passwordname: 'nacos-${parameters.nameSpace}-cm'- name: MODEvalue: cluster- name: NACOS_SERVER_PORTvalue: '8848'- name: NACOS_APPLICATION_PORTvalue: '8848'- name: NACOS_SERVERSvalue: >-nacos-${parameters.nameSpace}-dm-0.nacos-${parameters.nameSpace}.${parameters.nameSpace}.svc.cluster.local:8848- name: PREFER_HOST_MODEvalue: hostname- name: nacos.naming.data.warmupvalue: 'false'image: 'nacos/nacos-server:2.0.3'imagePullPolicy: Alwaysname: k8snacosports:- containerPort: 8848name: client- containerPort: 9848name: client-rpc- containerPort: 9849name: raft-rpcresources:requests:cpu: 500mmemory: 2GiimagePullSecrets:- name: '${parameters.imagePullSecrets}'nodeName: host-52hostNetwork: trueapiVersion: v1
kind: Service
metadata:labels:app: 'nacos-${parameters.nameSpace}'name: 'nacos-${parameters.nameSpace}'namespace: '${parameters.nameSpace}'
spec:ports:- name: servernodePort: 28855port: 8848targetPort: 8848selector:app: 'nacos-${parameters.nameSpace}'type: NodePort
  1. 原因分析: 因为我们要将POD固定运行在NODE52这台节点上,所以加上了

nodeName: host-52,但是同时也加上了hostNetwork: true,导致POD已经启动,但是只能在主节点通过28855端口访问,其它局域网机构加上28855端口无法访问。

在k8s中,若pod使用主机网络,也就是hostNetwork=true。则该pod会使用主机的dns以及所有网络配置,默认情况下是无法使用k8s自带的dns解析服务

但是可以修改DNS策略或者修改主机上的域名解析(/etc/resolv.conf),使主机可以用k8s自身的dns服务。一般通过DNS策略(ClusterFirstWithHostNet)来使用k8s DNS内部域名解析,k8s DNS策略如下:

Default: 继承Pod所在宿主机的DNS设置,hostNetwork的默认策略。

ClusterFirst(默认DNS策略):优先使用kubernetes环境的dns服务,将无法解析的域名转发到从宿主机继承的dns服务器。

ClusterFirstWithHostNet:和ClusterFirst类似,对于以hostNetwork模式运行的Pod应明确知道使用该策略。也是可以同时解析内部和外部的域名。

None: 忽略kubernetes环境的dns配置,通过spec.dnsConfig自定义DNS配置。

  1. 修改方案

4.1 一般使用主机网络就增加如下几行即可:

hostNetwork:true dnsPolicy:"ClusterFirstWithHostNet"

4.2 第二种方案 去除 hostNetwork:true

二、无法拉取私有仓库镜像

  1. 现象描述

kubectl describe pod nacos-itest-dm-0 -n itest

Events:Type     Reason          Age                    From               Message----     ------          ----                   ----               -------Normal   Scheduled       6m25s                  default-scheduler  Successfully assigned gov-itest/nacos-gov-itest-dm-0 to host-112Normal   SandboxChanged  6m23s                  kubelet            Pod sandbox changed, it will be killed and re-created.Warning  Failed          5m41s (x3 over 6m24s)  kubelet            Failed to pull image "public-repository/prdsl/nacos-server:2.0.2": rpc error: code = Unknown desc = Get  unauthorized: Invalid credential. 请确认输入了正确的用户名和密码。Warning  Failed          5m41s (x3 over 6m24s)  kubelet            Error: ErrImagePullNormal   BackOff         5m7s (x7 over 6m22s)   kubelet            Back-off pulling image "public-repository/prdsl/nacos-server:2.0.2"Normal   Pulling         4m53s (x4 over 6m24s)  kubelet            Pulling image "public-repository/prdsl/nacos-server:2.0.2"Warning  Failed          75s (x23 over 6m22s)   kubelet            Error: ImagePullBackOff

  1. 原因分析 没有配置私有镜像仓库的拉取密钥

imagePullSecrets:

- name: '${parameters.imagePullSecrets}'

加上这个即可。

查看密钥

kubectl get secret

magePullSecret资源将Secret提供的密码传递给kubelet从而在拉取镜像前完成必要的认证过程,简单说就是你的镜像仓库是私有的,每次拉取是需要认证的。

配置说明

创建docker-registry类型的Secret对象,并在定义pod资源时明确通过"imagePullSecrets"字段来申明使用哪个私钥去认证;

创建docker-registry类型的Secret对象,然后把它添加到某个ServiceAccount对象中,使用了这个ServiceAccount对象创建出来的pod就自然而然通过认证获取到镜像;

http://www.lryc.cn/news/25874.html

相关文章:

  • 怎么避免计算机SCI论文的重复率过高? - 易智编译EaseEditing
  • uni-app路由拦截
  • 如何使用固态继电器实现更高可靠性的隔离和更小的解决方案尺寸
  • 【YOLOv8/YOLOv7/YOLOv5系列算法改进NO.56】引入Contextual Transformer模块(sci期刊创新点之一)
  • 深圳大学计软《面向对象的程序设计》实验3 指针2
  • 【基于机器学习的推荐系统项目实战-2】项目介绍与技术选型
  • 对称锥规划:锥与对称锥
  • 4.基于Label studio的训练数据标注指南:情感分析任务观点词抽取、属性抽取
  • 算法拾遗二十五之暴力递归到动态规划五
  • Linux进程的创建结束类系统调用总结
  • Git分支的合并策略有哪些?Merge和Rebase有什么区别?关于Merge和Rebase的使用建议
  • 2022-2-23作业
  • 1.基于Label studio的训练数据标注指南:信息抽取(实体关系抽取)、文本分类等
  • “高退货率”标签引热议,亚马逊跨境电商是好是坏?
  • Pinia2
  • 服务器配置 | 在Windows本地打开服务器端Tensorboard结果
  • 13 nuxt3学习(新建页面 内置组件 assets 路由)
  • Linus命令记录(持续编辑版)
  • 玩转ThreadLocal
  • 亚马逊二审来袭,跨境电商传统验证算法真的靠谱吗?
  • 微信小程序|基于小程序+云开发制作一个租房小程序
  • 2.4 群辉驱动:多网口,系统网络只能识别两个网口 解决教程
  • Android正确使用资源res文件
  • 5分钟搭建第一个k8s集群
  • 【MySQL】查询操作(基础篇)
  • 工程管理系统+spring cloud 系统管理+java 系统设置+二次开发
  • MyBatisPlus Study Notes
  • 【Vu3 测试篇】自动化测试
  • Android system实战 — Android R(11) 第三方apk权限
  • 面试总结1