成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

在 .NET8 中獲取 k8s 集群的 Namespace id

云計算 云原生
在 kubesphere 中,通常會以項目來進行組織,kubesphere 中的項目就是 k8s 中的 namespace,可以通過獲取 namespace id 的方式來獲取唯一標識。.NET8 容器內部需要安裝 kubectl 命令。

將程序和機器進行綁定是一種 License 校驗的方法,需要能獲取到機器的唯一標識,比如獲取機器的 Mac 地址就是獲取唯一標識的一種方式,命令如下:

ifconfig |egrep 'ether' |awk '{{print $2}}'

但如果程序部署在 k8s 中,每次容器構建,使用上面命令獲取的 Mac 地址就會發生變化,我使用 kubesphere 做測試發現的確如此。

那么在 k8s 環境中想要獲取唯一標識應該怎么辦呢?

思路

  • 在 kubesphere 中,通常會以項目來進行組織,kubesphere 中的項目就是 k8s 中的 namespace,可以通過獲取 namespace id 的方式來獲取唯一標識。
  • .NET8 容器內部需要安裝 kubectl 命令。

步驟

構建 .NET8 底包鏡像,供后面程序使用,Dockerfile 內容如下:

FROM mcr.microsoft.com/dotnet/aspnet:8.0
RUN apt-get install -y curl

# 安裝 kubectl

RUN curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" && \

chmod +x kubectl && \

mv kubectl /usr/local/bin/kubectl

# 確保 kubectl 已正確安裝
RUN kubectl version --client

在 Dockerfile 所在目錄執行下面命令進行鏡像構建:

docker build -t net8-kube .

編寫示例程序獲取 namespace id,獲取 namespace id 的命令如下:

kubectl get namespace test -o jsonpath='{.metadata.uid}'

創建一個 .NET8 的 WebAPI 項目,執行上面命令,并將結果輸出,代碼如下:

using System.Diagnostics;  
  
var builder = WebApplication.CreateBuilder(args);  
  
builder.Services.AddEndpointsApiExplorer();  
builder.Services.AddSwaggerGen();  
  
var app = builder.Build();  
  
if (app.Environment.IsDevelopment())  
{  
    app.UseSwagger();  
    app.UseSwaggerUI();  
}  
  
app.UseHttpsRedirection();  
  
app.MapGet("/GetNamespaceId", (string name) =>  
    {  
        string result = "id is empty";  
        try  
        {  
            string cmd = "kubectl get namespace "+name+" -o jsonpath='{.metadata.uid}'";  
            result= "id is :"+ExecuteCommand(cmd);  
        }        catch (Exception ex)  
        {            Console.WriteLine(ex.Message);  
        }        return result;  
    })    .WithOpenApi();  
  
app.Run();  
  
  
string ExecuteCommand(string command)  
{  
    var processInfo = new ProcessStartInfo("bash", "-c \"" + command + "\"")  
    {        RedirectStandardOutput = true,  
        RedirectStandardError = true,  
        UseShellExecute = false,  
        CreateNoWindow = true  
    };  
  
    var process = new Process { StartInfo = processInfo };  
    process.Start();  
  
    string output = process.StandardOutput.ReadToEnd();  
    process.WaitForExit();  
    return output.Trim();  
}

將程序發布,并在 publish 目錄中創建 Dockerfile 文件:

FROM net8-kube:latest 
COPY . /app  
WORKDIR /app  

ENTRYPOINT ["dotnet", "namespaceid.dll"]

在 publish 目錄中執行 docker build -t namespace-id-test .  命令進行測試程序的鏡像構建。

在 kubesphere 中創建一個 test 項目,在該項目中創建無狀態負載部署示例程序,調用程序中的示例接口,發現 namespace id 并沒有獲取到,日志中有報錯信息:

Error from server (Forbidden): namespaces is forbidden: User "system:serviceaccount:test:default" cannot list resource "namespaces" in API group "" at the cluster scope

這個錯誤表明,當前在容器內執行 kubectl 命令的用戶(system:serviceaccount:test:default)沒有足夠的權限在集群范圍內列出命名空間(namespaces)。這個問題通常與 k8s 中的角色綁定(RoleBinding)或集群角色綁定(ClusterRoleBinding)配置有關。

可以使用下面命令來查看對應賬戶是否有權限:

kubectl auth can-i list namespaces --as=system:serviceaccount:test:default

結果返回 yes 說明該 ServiceAccount 有權限,返回 no 說明沒有權限。

一種簡單的解決方法就是將賬戶綁定到管理員角色上,命令如下:

kubectl create clusterrolebinding test-admin-binding \ --clusterrole=cluster-admin \ --serviceaccount=test:default

但 cluster-admin 權限過大,在生產環境中不太安全,下面用另一種方法來解決,在服務器中創建一個名位 namespace_reader.yaml 的文件,內容如下:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: namespace-reader
rules:
- apiGroups: [""]
  resources: ["namespaces"]
  verbs: ["get", "list", "watch"]

使用下面命令執行后就創建了一個名為 namespace-reader 的角色。

kubectl apply -f namespace_reader.yaml

角色創建成功后,就可以將 ServiceAccount 綁定到這個只讀角色了,命令如下:

kubectl create clusterrolebinding test-namespace-reader-binding \
--clusterrole=namespace-reader \
--serviceaccount=test:default

ServiceAccount 權限綁定后,再調用接口進行測試,會發現已經可以正常獲取 namespace id 了。

責任編輯:姜華 來源: 不止dotNET
相關推薦

2023-11-17 13:42:06

.NET8C#工具

2023-09-03 23:58:23

k8s集群容量

2023-03-05 21:50:46

K8s集群容量

2022-04-22 13:32:01

K8s容器引擎架構

2023-07-11 00:17:58

.Net8AOTC

2023-11-06 07:16:22

WasmK8s模塊

2021-11-04 07:49:58

K8SStatefulSetMySQL

2021-04-22 09:46:35

K8SCluster Aut集群

2023-01-12 11:31:00

K8sToken

2022-01-22 21:38:19

K8SRedisRedis clus

2022-12-28 10:52:34

Etcd備份

2024-05-27 00:00:10

KubernetesK8s云原生

2023-09-07 08:58:36

K8s多集群

2023-09-06 08:12:04

k8s云原生

2023-11-07 08:23:05

2023-09-11 08:40:34

AOTVMP代碼

2023-10-07 10:16:18

.Net8GC內存

2020-07-17 08:40:47

K8SServicePOD

2019-09-09 09:53:52

K8s集群架構
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美精品一区二区三区在线 | 国家一级黄色片 | 日本久久久一区二区三区 | 久久久一区二区 | 国产一区二区成人 | 亚洲成人精 | 一区二区三区视频 | 男人的天堂在线视频 | 国产精品免费小视频 | 久久www免费视频 | 午夜视频一区二区三区 | 亚洲综合日韩精品欧美综合区 | 亚洲欧美一区在线 | 中文字幕在线观看日韩 | 免费人成激情视频在线观看冫 | 免费视频二区 | 成人在线免费观看 | 欧美精品在线观看 | 亚洲男人天堂2024 | 久久久女女女女999久久 | 国产在线麻豆精品入口 | 成人av一区 | 久久精品成人 | 久久亚洲国产精品 | 国产高清精品在线 | 男女污网站 | 一区二区三区四区在线视频 | 国产精品一区二区av | 黄色一级大片在线免费看产 | 国产精品自拍啪啪 | 国产高清精品一区二区三区 | 国产一区二区视频在线观看 | 久草在线在线精品观看 | 国产精品污www一区二区三区 | 亚洲精品视频一区二区三区 | 自拍偷拍亚洲视频 | 亚洲激精日韩激精欧美精品 | 国产精品777一区二区 | 精品欧美乱码久久久久久1区2区 | 亚洲精品久久久久avwww潮水 | 亚洲免费一区二区 |