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

k8s 部署ETCD ,并且使用.net core 连接获取配置

  1. 创建namespace
sudo kubectl create namespace compose
  1. 部署ETCD
apiVersion: apps/v1
kind: StatefulSet
metadata:name: etcdnamespace: composelabels:app: etcd
spec:serviceName: etcdreplicas: 1selector:matchLabels:app: etcdtemplate:metadata:labels:app: etcdspec:containers:- name: etcdimage: quay.io/coreos/etcd:v3.4.15ports:- containerPort: 2379- containerPort: 2380command:- /usr/local/bin/etcd- --data-dir=/var/lib/etcd- --name=$(POD_NAME)- --listen-peer-urls=http://0.0.0.0:2380- --listen-client-urls=http://0.0.0.0:2379- --advertise-client-urls=http://$(POD_IP):2379- --initial-advertise-peer-urls=http://$(POD_IP):2380- --initial-cluster=$(POD_NAME)=http://$(POD_IP):2380- --initial-cluster-token=etcd-cluster- --initial-cluster-state=newenv:- name: POD_NAMEvalueFrom:fieldRef:fieldPath: metadata.name- name: POD_IPvalueFrom:fieldRef:fieldPath: status.podIPvolumeMounts:- name: etcd-datamountPath: /var/lib/etcdvolumeClaimTemplates:- metadata:name: etcd-dataspec:accessModes: ["ReadWriteOnce"]resources:requests:storage: 1Gi
---
apiVersion: v1
kind: Service
metadata:name: etcdnamespace: compose
spec:type: NodePortports:- port: 2379name: a-nametargetPort: 2379nodePort: 30379- port: 2380name: b-nametargetPort: 2380nodePort: 30380selector:app: etcd
  1. 进入pod添加root用户
# 使用 etcdctl 创建 root 用户
etcdctl user add root
# 系统会提示输入密码# 创建一个管理员角色
etcdctl role add root# 为 root 角色赋予读写权限
etcdctl role grant-permission root readwrite /# 将 root 用户赋予 root 角色
etcdctl user grant-role root root# 启用 etcd 的认证功能
etcdctl auth enable
  1. 创建普通用户
etcdctl user add user1
# 创建一个自定义角色
etcdctl role add readwrite# 为该角色赋予读写权限,仅对指定路径(如 `/config/`)
etcdctl role grant-permission readwrite readwrite /config/# 将用户赋予这个角色
etcdctl user grant-role user1 readwrite# 以 user1 用户的身份操作 etcd
etcdctl --user=user1:password get /config/appsetting
  1. yaml 启用认证
command:- etcd- --auth-token=simple
  1. 安装dotnet-etcd
> dotnet-etcd                 7.1.1   7.1.1
  1. 声明帮助类
using dotnet_etcd;
using Etcdserverpb;
using Google.Protobuf;
using Grpc.Core;namespace coreETCD
{public class ETCDHelper{private readonly EtcdClient etcdClient;private AuthenticateResponse authenticateResponse;public ETCDHelper(){etcdClient = new EtcdClient("http://192.168.214.133:30379", configureChannelOptions: (options =>{options.Credentials = ChannelCredentials.Insecure;}));authenticateResponse = etcdClient.Authenticate(new Etcdserverpb.AuthenticateRequest(){Name = "ellis",Password = "ellis",});// 观察字段CRUD时间etcdClient.WatchAsync("name", print, new Grpc.Core.Metadata() {new Grpc.Core.Metadata.Entry("token",authenticateResponse.Token)});}public async Task<PutResponse> PutConfig(string key, string value){return await etcdClient.PutAsync(key, value, new Grpc.Core.Metadata() {new Grpc.Core.Metadata.Entry("token",authenticateResponse.Token)});}public async Task<string> GetConfig(string key){return await etcdClient.GetValAsync(key, new Grpc.Core.Metadata() {new Grpc.Core.Metadata.Entry("token",authenticateResponse.Token)});}public async Task<Dictionary<string,string>> GetRange(string key){RangeResponse result =  await etcdClient.GetRangeAsync(key, new Grpc.Core.Metadata() {new Grpc.Core.Metadata.Entry("token",authenticateResponse.Token)});Dictionary<string, string> dict = new Dictionary<string, string>();// 遍历并输出键值对foreach (var kv in result.Kvs){dict.Add(kv.Key.ToStringUtf8(), kv.Value.ToStringUtf8());}return dict;}public async Task<DeleteRangeResponse> DeleteKey(string key){return await etcdClient.DeleteAsync(key, new Grpc.Core.Metadata() {new Grpc.Core.Metadata.Entry("token",authenticateResponse.Token)});}// ----------------------------------// Print function that prints key and value from the minimal watch// response data private static void print(WatchEvent[] response){foreach (WatchEvent e1 in response){Console.WriteLine($"{e1.Key}:{e1.Value}:{e1.Type}");}}}
}
  1. DI
builder.Services.AddSingleton<ETCDHelper>();
  1. controller
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options;namespace coreETCD.Controllers
{[Route("api/[controller]/[action]")][ApiController]public class ETCDController : ControllerBase{private readonly ETCDHelper _etcdHelper;public ETCDController(ETCDHelper etcdHelper){_etcdHelper = etcdHelper;}[HttpGet]public async Task<IActionResult> GetValue([FromQuery] string key){var value = _etcdHelper.GetConfig(key).Result;return Ok(value);}[HttpGet]public async Task<IActionResult> GetRangeValue([FromQuery] string key){var value = _etcdHelper.GetRange(key).Result;return Ok(value);}[HttpGet]public async Task<IActionResult> PutValue([FromQuery] string key,[FromQuery] string value){var result = _etcdHelper.PutConfig(key,value).Result;return Ok(result);}[HttpDelete]public async Task<IActionResult> DeleteKey([FromQuery] string key){var result = _etcdHelper.DeleteKey(key).Result;return Ok(result);}}
}
  1. 罗列etcd已经存储的配置
etcdctl --user=username:password get "" --prefix --keys-only

参考

相关文章:

  • linux-CMake
  • MySQL进阶:深入理解数据约束与优化查询
  • Linux增加一个回收站功能(实用功能)
  • 算法复杂度之时间复杂度
  • PMA TB40-1 限温器Temperature limiter TB 40-1 手测
  • SpringBoot整合JPA实现CRUD详解
  • 【珠海一号卫星】
  • 鼎阳加油-IOC关键技术问题的解决记
  • 柯桥韩语学校|韩语每日一词打卡:회갑연[회가변]【名词】花甲宴
  • 怎么通过AI大模型开发一个网站?
  • 计算机网络回顾
  • 【WRF运行第三期】服务器上运行WRF模型(官网案例-Hurricane Matthew)
  • 科技云报到:以数据“价值三角”为擎,探索数据治理实践路径
  • 基于Springboot投稿和稿件处理系统设计与实现
  • list模拟实现(部分)
  • [译] 怎样写一个基础的编译器
  • 《Javascript高级程序设计 (第三版)》第五章 引用类型
  • Brief introduction of how to 'Call, Apply and Bind'
  • ES6 学习笔记(一)let,const和解构赋值
  • FastReport在线报表设计器工作原理
  • Idea+maven+scala构建包并在spark on yarn 运行
  • iOS动画编程-View动画[ 1 ] 基础View动画
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • node 版本过低
  • SpiderData 2019年2月25日 DApp数据排行榜
  • VUE es6技巧写法(持续更新中~~~)
  • 分布式熔断降级平台aegis
  • 基于OpenResty的Lua Web框架lor0.0.2预览版发布
  • 讲清楚之javascript作用域
  • 使用common-codec进行md5加密
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • 小程序开发中的那些坑
  • 学习HTTP相关知识笔记
  • 一个SAP顾问在美国的这些年
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • 《码出高效》学习笔记与书中错误记录
  • C# - 为值类型重定义相等性
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • ​人工智能书单(数学基础篇)
  • # 计算机视觉入门
  • #{}和${}的区别?
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • #图像处理
  • (4)STL算法之比较
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • (Java企业 / 公司项目)点赞业务系统设计-批量查询点赞状态(二)
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (二)丶RabbitMQ的六大核心
  • (机器学习-深度学习快速入门)第一章第一节:Python环境和数据分析
  • (九)c52学习之旅-定时器
  • (力扣记录)1448. 统计二叉树中好节点的数目
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (七)Appdesigner-初步入门及常用组件的使用方法说明
  • (十五)Flask覆写wsgi_app函数实现自定义中间件
  • (转)甲方乙方——赵民谈找工作