如何在Kubernetes集群中使用kubectl工具来进行管理多个外部K8S集群接入与资源操作?...

2023-11-14

关注「WeiyiGeek」公众号

设为「特别关注」每天带你玩转网络安全运维、应用开发、物联网IOT学习!

cc1cff773c189b95f8328c840867a79e.png


本章目录:

0x03 Kubernetes 中多集群接入管理实践

  • 1.本地集群创建指定用户管理集群

  • 2.外部集群创建指定用户管理集群


原文地址: https://blog.weiyigeek.top/2022/2-27-620.html


0x03 Kubernetes 中多集群接入管理实践

描述: 在pipeline中的CD环节,常常需要将业务产品部署到不同的K8S集群,比如开发环境、测试环境、生产环境,此时可以使用 kubectl config相关命令来进行多个远程集群的配置并采用rbac授权机制来创建指定用户的权限 。

下面我们从两个方面进行验证,一是在本地集群创建指定用户只能访问特定名称空间的资源,二是指定用户接入远程集群中并且只能访问特定名称空间的资源, 我们需要重点关注三大要素即 集群(clusters)、上下文(contexts)、用户(user)

config 命令下重要配置项说明:

  • clusters :配置要访问的kubernetes集群

  • contexts :配置访问kubernetes集群的具体上下文环境

  • current-context : 配置当前使用的上下文环境

  • users :配置访问的用户信息,用户名以及证书信息

1.本地集群创建指定用户管理集群

为当前集群创建一个只管理指定名称空间权限的devopsuser用户
描述: kubernetes 中我们可将权限进行细化、使得使用者可以拥有最小的运行权限,保证集群的安全,特别是CI/CD环境中,下面将演示在kubernetes集群中创建一个只管理名称空间为devtest的devopsuser用户。

步骤 01.创建一个devtest的名称空间, 执行如下命令kubectl create namespace devtest.

步骤 02.执行kubectl config get-clusters命令查看当前集群名称,通常默认为kubernetes.

步骤 03.准备cfssl工具以及生成用户证书的相关json文件。

$ tee ca-config.json << 'EOF'
{
  "signing": {
    "default": {
        "expiry": "87600h"
    },
    "profiles": {
      "kubernetes": {
          "usages": [
            "signing",
            "key encipherment",
            "server auth",
            "client auth"
          ],
          "expiry": "87600h"
        }
      }
  }
}
EOF

$ tee devopsuser-csr.json << 'EOF'
{
  "CN": "devopsuser",
  "hosts": [],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "ChongQing",
      "L": "ChongQing",
      "O": "k8s",
      "OU": "System"
    }
  ]
}
EOF

步骤 04.执行如下命令为devopsuser用户生成相应的证书,并将证书复制到 /etc/kubernetes/pki/user/目录中。

# 生成用户证书
cfssl gencert -ca=/etc/kubernetes/pki/ca.crt -ca-key=/etc/kubernetes/pki/ca.key -config ./ca-config.json -profile=kubernetes ./devopsuser-csr.json | cfssljson -bare devopsuser
  # 2022/03/16 19:40:19 [INFO] generate received request
  # 2022/03/16 19:40:19 [INFO] received CSR
  # 2022/03/16 19:40:19 [INFO] generating key: rsa-2048
  # 2022/03/16 19:40:19 [INFO] encoded CSR
  # 2022/03/16 19:40:19 [INFO] signed certificate with serial number 648194491978037048405922455454162128168023396626

# 查看生成的证书以及申请文件 (后三个新生成)
ls
ca-config.json devopsuser-csr.json  devopsuser.csr   devopsuser-key.pem  devopsuser.pem

# 证书到期时间
openssl x509 -in devopsuser.pem -noout -text  | grep -E 'Not'
  Not Before: Mar 16 11:35:00 2022 GMT
  Not After : Mar 13 11:35:00 2032 GMT

# 新建用户证书存放目录创建并将生成的证书密钥与证书复制到该目录中。
mkdir -vp /etc/kubernetes/pki/user/
cp -a devopsuser*.pem /etc/kubernetes/pki/user/

步骤 05.查看本地或者远程集群的API_SERVER地址,并将其写入到devopsuser.kubeconfig文件之中。

kubectl cluster-info  | grep "control plan"
  # Kubernetes control plane is running at https://slb-vip.k8s:16443

# 设置集群参数写入到devopsuser.kubeconfig文件中
KUBE_APISERVER="https://slb-vip.k8s:16443"
kubectl config set-cluster kubernetes \
  --certificate-authority=/etc/kubernetes/pki/ca.crt \
  --embed-certs=true \
  --server=${KUBE_APISERVER} \
  --kubeconfig=/root/.kube/devopsuser.kubeconfig
# Cluster "kubernetes" set.

步骤 06.为devopsuser用户创建一个devops-ctx上下文,并指定名称空间为devtest(在此上下文中在有rbac权限的情况下,只能操作该空间下的资源)并将配置写入到devopsuser.kubeconfig中。

kubectl config set-context devopsuser-ctx --cluster=kubernetes --user=devopsuser --namespace=devtest --kubeconfig=/root/.kube/devopsuser.kubeconfig
  # Context "devopsuser-ctx" created.

步骤 07.在kubeconfig中设置devopsuser用户条目客户端参数,并将配置写入到devopsuser.kubeconfig中。

kubectl config set-credentials devopsuser --cluster=kubernetes \
  --client-certificate=/etc/kubernetes/pki/user/devopsuser.pem  \
  --client-key=/etc/kubernetes/pki/user/devopsuser-key.pem \
  --embed-certs=true \
  --kubeconfig=/root/.kube/devopsuser.kubeconfig
  # User "devopsuser" set.

步骤 08.查看生成的devopsuser.kubeconfig文件.

$ cat devopsuser.kubeconfig
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: [api-server CA证书-base64编码]
    server: https://slb-vip.k8s:16443  # API Server 地址
  name: kubernetes
contexts:
- context:               
    cluster: kubernetes  # 集群名称
    namespace: devtest   # 名称空间 
    user: devopsuser     # 此上下文中的用户
  name: devopsuser-ctx   # 上下文名称
current-context: ""
kind: Config
preferences: {}
users:
- name: devopsuser       # 创建的用户,认证方式为CA签名的证书。
  user:
    client-certificate-data: [客户端证书-base64编码]
    client-key-data: [客户端密钥-base64编码]

步骤 09.RoleBinding 角色绑定,为devopsuser用户创建rolerolebinding,利用rbac进行资源访问操作权限的管控。

# 方式1.命令行方式(一步到位),生产环境中间建议为指定用户划分需要资源的权限。
kubectl create rolebinding devopsuser-admin --clusterrole=admin --user=devopsuser --namespace=devtest

# 方式2.资源清单方式
# Role 名称:devtest-role
# RoleBinding 名称:devopsuser-admin
tee devopsuser-rolebinding.yaml <<'EOF'
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: devtest-role
  namespace: devtest
rules:
- apiGroups:
  - ""
  resources:
  - pods
  - pods/attach
  - pods/exec
  - pods/portforward
  - pods/proxy
  verbs:
  - create
  - delete
  - deletecollection
  - get
  - list
  - patch
  - update
  - watch
- apiGroups:
  - ""
  resources:
  - configmaps
  - endpoints
  - persistentvolumeclaims
  - replicationcontrollers
  - replicationcontrollers/scale
  - secrets
  - serviceaccounts
  - services
  - services/proxy
  verbs:
  - create
  - delete
  - deletecollection
  - get
  - list
  - patch
  - update
  - watch
- apiGroups:
  - ""
  resources:
  - bindings
  - events
  - limitranges
  - pods/log
  - pods/status
  - replicationcontrollers/status
  - resourcequotas
  - resourcequotas/status
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - ""
  resources:
  - serviceaccounts
  verbs:
  - impersonate
- apiGroups:
  - apps
  resources:
  - deployments
  - deployments/rollback
  - deployments/scale
  - statefulsets
  verbs:
  - create
  - delete
  - deletecollection
  - get
  - list
  - patch
  - update
  - watch
- apiGroups:
  - autoscaling
  resources:
  - horizontalpodautoscalers
  verbs:
  - create
  - delete
  - deletecollection
  - get
  - list
  - patch
  - update
  - watch
- apiGroups:
  - batch
  resources:
  - cronjobs
  - jobs
  - scheduledjobs
  verbs:
  - create
  - delete
  - deletecollection
  - get
  - list
  - patch
  - update
  - watch
- apiGroups:
  - extensions
  resources:
  - daemonsets
  - deployments
  - deployments/rollback
  - deployments/scale
  - ingresses
  - replicasets
  - replicasets/scale
  - replicationcontrollers/scale
  verbs:
  - create
  - delete
  - deletecollection
  - get
  - list
  - patch
  - update
  - watch
- apiGroups:
  - authorization.k8s.io
  resources:
  - localsubjectaccessreviews
  verbs:
  - create
---
# roleRef 角色来源为 devtest-role
# subjects 赋予角色给 devopsuser 用户
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: devopsuser-admin
  namespace: devtest
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: devtest-role
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: User
  name: devopsuser
EOF

kubectl apply -f devopsuser-rolebinding.yaml
  # role.rbac.authorization.k8s.io/devtest-role unchanged
  # rolebinding.rbac.authorization.k8s.io/devopsuser-admin created

步骤 10.指定devopsuser用的kubeconfig并切换用户上下文。

# 切换用户上下文
kubectl config use-context devopsuser-ctx --kubeconfig=/root/.kube/devopsuser.kubeconfig
# Switched to context "devopsuser-ctx".

# 查看当前上下文
kubectl config current-context --kubeconfig=/root/.kube/devopsuser.kubeconfig
# devopsuser-ctx

# 当前上下文中的用户
kubectl config get-users --kubeconfig=/root/.kube/devopsuser.kubeconfig
  # NAME
  # devopsuser

步骤 11.验证创建devopsuser用户的权限。

# 无权限查看节点以及操作其它名称空间的资源
kubectl --kubeconfig=/root/.kube/devopsuser.kubeconfig get node
  # Error from server (Forbidden): nodes is forbidden: User "devopsuser" cannot list resource "nodes" in API group "" at the cluster scope

# 创建一个pod
kubectl --kubeconfig=/root/.kube/devopsuser.kubeconfig run nginx --image=nginx:latest --namespace devtest --labels="app=nginx" --port=8080
# pod/nginx created

# 查看Pod运行状态
kubectl --kubeconfig=/root/.kube/devopsuser.kubeconfig get pod -n devtest
  # NAME    READY   STATUS    RESTARTS   AGE
  # nginx   1/1     Running   0          37s

# 保留Pod服务 
kubectl --kubeconfig=/root/.kube/devopsuser.kubeconfig expose pod nginx -n devtest --port=8080 --name=nginx-frontend
  # service/nginx-frontend exposed

# 查看服务
kubectl --kubeconfig=/root/.kube/devopsuser.kubeconfig get pod -n devtest -l app=nginx -o wide
  # NAME    READY   STATUS    RESTARTS   AGE     IP              NODE       NOMINATED NODE   READINESS GATES
  # nginx   1/1     Running   0          3h29m   10.66.182.255   weiyigeek-226   <none>           <none>

至此完毕!

2.外部集群创建指定用户管理集群

描述: 在本地集群接入外部集群时我们需要获得其api-server地址(注意如果没有域名解析请做硬解析),以及ca证书, 此处同样以访问devtes名称空间为例。

步骤 01.外部集群信息及其CA证获取。

# 远程集群中执行如下命令查看集群相关
$ kubectl cluster-info
  # Kubernetes control plane is running at https://apiserver.cluster.weiyigeek:6443

$ ping apiserver.cluster.weiyigeek
  # PING apiserver.cluster.weiyigeek (192.168.12.102) 56(84) bytes of data.
  # 64 bytes from weiyigeek-102 (192.168.12.102): icmp_seq=1 ttl=64 time=0.134 ms

# 配置硬解析
sudo tee -a /etc/hosts <<'EOF'
192.168.12.102 apiserver.cluster.weiyigeek 
EOF

# 将外部集群ca证书将其复制到现有机器上
ls /etc/kubernetes/pki/ca.crt && cat /etc/kubernetes/pki/ca.crt
cat > cluster.prod.ca.crt <<'EOF'
-----BEGIN CERTIFICATE-----
[上面显示的 base64 编码]
-----END CERTIFICATE-----
EOF

步骤02.在本地集群中利用kubectl config set-cluster命令设置远程集群。

KUBE_APISERVER="https://apiserver.cluster.weiyigeek:6443"
kubectl config set-cluster k8s-cluster \
  --certificate-authority=./cluster.prod.ca.crt \
  --embed-certs=true \
  --server=${KUBE_APISERVER} \
  --kubeconfig=/root/.kube/devops.kubeconfig

步骤03.在本地集群中利用 kubectl confi set-context 命令设置上下文。

kubectl config set-context devops-ctx \
  --cluster=k8s-cluster \
  --user=devops \
  --namespace=devtest \
  --kubeconfig=/root/.kube/devops.kubeconfig
# Context "devopsuser-ctx" created.

步骤04.在本地集群中,同样利用cfssl工具生成devops用户证书

# 证书相关配置文件
$ tee ca-config.json << 'EOF'
{
  "signing": {
    "default": {
        "expiry": "87600h"
    },
    "profiles": {
      "kubernetes": {
          "usages": [
            "signing",
            "key encipherment",
            "server auth",
            "client auth"
          ],
          "expiry": "87600h"
        }
      }
  }
}
EOF

$ tee devops-csr.json << 'EOF'
{
  "CN": "devops",
  "hosts": [],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "ChongQing",
      "L": "ChongQing",
      "O": "k8s",
      "OU": "System"
    }
  ]
}
EOF

# 证书生成
tee cluster.prod.ca.key <<'EOF'
-----BEGIN RSA PRIVATE KEY-----
[远程集群 ca 私钥 base64 编码 ]
-----END RSA PRIVATE KEY-----
EOF

# 证书生成
cfssl gencert -ca=./cluster.prod.ca.crt -ca-key=./cluster.prod.ca.key -config ./ca-config.json -profile=kubernetes ./devops-csr.json | cfssljson -bare devops

# 将生成的证书以及密钥复制到/etc/kubernetes/pki/user目录中
sudo cp devops*.pem /etc/kubernetes/pki/user

步骤 05.在本地集群中利用 kubectl confi set-credentials 命令设置devops用户, 注意集群、上下文以及用户认证拼接都是写入到/root/.kube/devops.kubeconfig

kubectl config set-credentials devops \
  --cluster=k8s-cluster \
  --client-certificate=/etc/kubernetes/pki/user/devops.pem  \
  --client-key=/etc/kubernetes/pki/user/devops-key.pem \
  --embed-certs=true \
  --kubeconfig=/root/.kube/devops.kubeconfig

# 切换上下文为devops-ctx
kubectl config use-context devops-ctx --kubeconfig=/root/.kube/devops.kubeconfig
  # Switched to context "devops-ctx".

# 查看当前上下文
kubectl config current-context --kubeconfig=/root/.kube/devops.kubeconfig
  # devops-ctx

步骤 06.在远端集群中执行如下命令给devops用户绑定指定名称空间中(devtest)拥有的角色及其赋予的权限。

kubectl create rolebinding devops --clusterrole=admin --user=devops --namespace=devtest 
kubectl get rolebindings.rbac.authorization.k8s.io -n devtest                         
  # NAME     ROLE                AGE
  # devops   ClusterRole/admin   2s

温馨提示: 上面为了演示采用了kubernetes默认的admin角色,在实践环境中建议自己按照所需权限创建role然后再绑定给指定用户。

步骤 07.在本地集群中使用--kubeconfig指定前面生成集群连接配置,访问远端集群中devtest名称空间下的资源, 如果访问其它名称空间的资源是没有权限的。

kubectl --kubeconfig=/root/.kube/devops.kubeconfig get pod -n devtest
  # NAME             READY   STATUS    RESTARTS         AGE
  # oa-dev-0         1/1     Running   24 (2d17h ago)   16d
  # redis-single-0   1/1     Running   0                47d

# 非 devtest 名称空间下的 资源是无权限的。
kubectl --kubeconfig=/root/.kube/devops.kubeconfig get pod -n devops
# Error from server (Forbidden): pods is forbidden: User "devops" cannot list resource "pods" in API group "" in the na

本文至此完毕,更多技术文章,尽情期待下一章节!


原文地址: https://blog.weiyigeek.top/2022/2-27-620.html


16b8ac4019069941d1b8eee8614c6ea4.png 往期相关文章66813761e0b0f2f5493eee31db403ecf.png

1.还不会部署高可用的kubernetes集群?看我手把手教你使用二进制部署v1.23.6的K8S集群实践(上)

2.还不会部署高可用的kubernetes集群?看我手把手教你使用二进制部署v1.23.6的K8S集群实践(下)

Jenkins Pipeline 流水线如何根据代仓库的 webhook 自动触发拉取提交的分支代码并构建?

如何在 Kubernetes 中进行 ingress-nginx 配置优化以及HTTP请求速率限制

如何配置Kubernetes仪表板dashboard支持http方式并使用ingress-nginx代理访问实践

在k8s集群中Kubernetes仪表板dashboard使用RABC机制限制指定用户针对指定名称空间中的资源进行管理实践

Let'sEncrypt快速颁发及自动续签泛域名证书实践指南

cb49121c394258e005f1ec02ba2e1149.png


欢迎各位志同道合的朋友一起学习交流,如文章有误请在下方留下您宝贵的经验知识,个人邮箱地址【master#weiyigeek.top】或者个人公众号【WeiyiGeek】联系我。

更多文章来源于【WeiyiGeek Blog 个人博客 - 为了能到远方,脚下的每一步都不能少 】

个人主页: 【 https://weiyigeek.top】

博客地址: 【 https://blog.weiyigeek.top 】

86755727a49a1d556cfeef4922462cb1.png

专栏书写不易,如果您觉得这个专栏还不错的,请给这篇专栏 【点个赞、投个币、收个藏、关个注,转个发,留个言】(人间六大情),这将对我的肯定,谢谢!。

  • echo  "【点个赞】,动动你那粗壮的拇指或者芊芊玉手,亲!"

  • printf("%s", "【投个币】,万水千山总是情,投个硬币行不行,亲!")

  • fmt.Printf("【收个藏】,阅后即焚不吃灰,亲!")  

  • console.info("【转个发】,让更多的志同道合的朋友一起学习交流,亲!")

  • System.out.println("【关个注】,后续浏览查看不迷路哟,亲!")

  • cout << "【留个言】,文章写得好不好、有没有错误,一定要留言哟,亲! " << endl;

139fba75f5cf5daaed068612b6819463.gif

更多网络安全、系统运维、应用开发、全栈文章,尽在【个人博客 - https://blog.weiyigeek.top】站点,谢谢支持!

    帅哥、美女、大佬们点个【赞+在看】吧!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在Kubernetes集群中使用kubectl工具来进行管理多个外部K8S集群接入与资源操作?... 的相关文章

随机推荐

  • zsh + oh-my-zsh 主题预览

    The Themes robbyrussell the default that Robby uses The rest of the themes in alphabetical order af magic afowler agnost
  • 区块链技术之哈希指针

    hello 大家好 我们第三期的区块链技术分享来啦 那么话不多说 我们开始吧 提起区块链 大家可能都会提到 不可篡改 但是为什么区块链不可篡改呢 先给出答案 这与区块链的数据结构哈希指针和默克尔树有关 那么我们今天先分享哈希指针相关的内容
  • cron linux_如何在Linux中使用cron

    cron linux 本文最初发布于2017年11月 现已更新以包含其他信息 成为系统管理员的挑战 其中有很多优点 之一是当您想睡觉时正在运行任务 例如 某些任务 包括定期重复执行的任务 需要在没有人使用计算机资源的情况下通宵运行或在周末运
  • 211和985区别:

    985工程 是在 211工程 的基础上 根据我国国防 民用 东 中 西部协调发展的原则而筛选出来的
  • 获取网页的html文本(用selenium+chrome headless进行js异步加载内容),返回BeautifulSoup的soup对象

    import requests from bs4 import BeautifulSoup from selenium import webdriver def gethtml url js False if js False return
  • 1.代码片断收集-数据拷贝效率问题

    上面是我创建的群聊 欢迎新朋友的加入 1 基本信息 mycode 收录一些简单的代码片段 Gitee com 克隆链接 mycode 收录一些简单的代码片段 目的 记录和收集一些常用的代码片段 同时也欢迎网友提交push申请 共同完善 开发
  • 05C++11多线程编程之使用正确的共享代码案例引入互斥量mutex的概念、用法

    05C 11多线程编程之使用正确的共享代码案例引入互斥量mutex的概念 用法 1 共享代码案例概念分析 1 网络游戏服务器 两个自己创建的线程 一个线程收集玩家命令 一个数字代表玩家发来的命令 并把命令写到一个队列中 另外一个线程从队列中
  • 基于pytorch的无需分割字符的车牌识别

    传统车牌识别 传统的车牌识别需要先检测出车牌 检测出车牌后通过 像素映射 或者 联通区查找 的方法分割出单个的文字 然后单独识别每个文字 传统的车牌识别不仅繁琐 而且切割文字的效果也很难令人满意 因此 能不能绕开字符分割的问题 直接识别车牌
  • 系分 - 系统安全分析与设计

    个人总结 仅供参考 欢迎加好友一起讨论 文章目录 系分 系统安全分析与设计 考点摘要 对称加密 非对称加密 信息摘要 数字签名 数字证书 数字信封 PKI公钥体系 网络安全 安全协议 网络安全 网络威胁与攻击 防火墙 功能 防火墙 分类 防
  • Matlab遗传算法工具箱及应用

    目录 第一章 遗传算法概述 1 1遗传算法概念 1 2遗传算法与爬山法的比较 1 3遗传算法的基本原理与方法 第二章 遗传算法应用举例 2 1简单一元函数优化实例 参考资料 Matlab遗传算法工具箱及应用 主编 雷英杰 张善文 西安电子科
  • SpringBoot——加载测试专用的配置类

    加载测试专用的配置类 之前我们介绍了如何在测试类中加载专用的测试属性 这次我们来看如何在测试类中加载专用的测试类 创建配置类 首先创建一个配置类 并且创建一个第三方的Bean模拟这是一个要在测试用例中引用的第三方Bean 创建测试用例 创建
  • LTE小区搜索过程及SCH/BCH设计

    终端开机过程 在小区搜索之前 需要完成PLMN的选定 再去搜索小区相关信息 PLMN 公共陆地移动网络 是一个标识 由MCC和MNC组成 比如中国电信46011 460是MCC 11是MNC 两个标识都是2 3位 那终端是如何搜索PLMN的
  • WIN7环境下cmd javac不是内部或外部命令

    一般步骤如下 网上摘抄部分 JAVA HOME指明JAVA安装路径 值设为 C Program Files Java jre7 刚才安装时所选择的路径 每个人可能不一样 此路径下包括lib bin jre等文件夹 Path值设为 JAVA
  • GNU __attribute__ 机制

    http blog 163 com sunm lin blog static 9192142200741533038695
  • 在服务器跑vue不能访问?是你的host设置问题

    看了csdn的一堆文章 大都是部署的 也就是 经过了 npm run build 之后 打包好的压缩工程部署 比如 https blog csdn net weixin 43690623 article details 122718677
  • Ubuntu开机后卡死只有左上角有一个下划线不停闪烁

    千万不要乱设置东西 先按一下Ctrl Alt F2打开tty模式检查问题出在哪了 之后会让你输入用户名和密码 就平时开机正常登录那样 然后相当于进入了一个平时用的终端 只是这个终端占据了整个屏幕 平时用的指令都可以用 接着你去检查到底出了什
  • myisamchk命令使用总结

    author sakte time 2012 02 28 myisamchk命令使用总结 myisamchk实用程序可以用来获得有关你的数据库表的统计信息或检查 修复 优化他们 1 常用于myisamchk的检查选项 information
  • 自定义ViewGroup实现控件自动换行

    首先看效果如下 首先我们需要自定义ViewGroup 重写onMeasure和onLayout将布局摆放好然后在通过适配器添加子view 代码如下 public class MyViewGroup extends ViewGroup Lis
  • jetson nano安装mqtt库

    把包放入Work下 sudo apt get update sudo apt get install build essential gcc make cmake cmake gui cmake curses gui sudo apt ge
  • 如何在Kubernetes集群中使用kubectl工具来进行管理多个外部K8S集群接入与资源操作?...

    关注 WeiyiGeek 公众号 设为 特别关注 每天带你玩转网络安全运维 应用开发 物联网IOT学习 本章目录 0x03 Kubernetes 中多集群接入管理实践 1 本地集群创建指定用户管理集群 2 外部集群创建指定用户管理集群 原文
Powered by Hwhale