首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >kubernete编排技术六:RBAC权限控制

kubernete编排技术六:RBAC权限控制

作者头像
jinjunzhu
发布于 2020-08-21 07:27:35
发布于 2020-08-21 07:27:35
66000
代码可运行
举报
文章被收录于专栏:个人开发个人开发
运行总次数:0
代码可运行

这是kubernete编排技术的第六篇,本文主要讲一下RBAC。之前讲过,kubernete所有API对象,都保存在etcd里。要访问和操作这些对象,一定会通过apiserver,因为apiserver可以做授权工作。

kubernete发展至今,授权模式一共有如下6种,其中RBAC这种授权模式从1.8开始已经成了稳定功能,只要设置通过设置–authorization-mode=RBAC就可以启用。

  • 基于属性的访问控制ABAC
  • 基于角色的访问控制RBAC
  • Webhook
  • Node
  • 总是拒绝AlwaysDeny
  • 总是允许AlwaysAllow

作为业务开发者,我们多多少少也接触过授权,比如spring security,sso等。其实RBAC的授权很类似,它有3个角色相关定义:Role(角色)、Subject(主体或被作用者)和RoleBinding(绑定),还有2个规则:资源、操作类型。

所以在RBAC中,需要api授权的时候,首先需要定义Role,然后需要定义Role和subject绑定关系RoleBinding,定义角色的时候需要指定该角色可以访问的资源和操作类型。

定义Role和ClusterRole

Role首先是一个api对象,在kubernete中有2种,Role和ClusterRole,很明显这2个就是普通角色和集群角色。定义的时候只要把yaml中的kind指定为Role就可以了。下面我们定义了一个名字叫test-role的Role,这个Role可以对namespace是mynamespace的pod进行get、watch和list操作。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: mynamespace
  name: test-role
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "watch", "list"]

下面我们再定义一个名字叫secret-reader的ClusterRole,需要注意集群角色是没有namespace的(因为集群角色不需要namespace进行逻辑隔离),这里定义的资源类型是secrets,secrets也是一种api对象,后面再讲,操作类型跟上面的Role一样。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kind:ClusterRole
apiVersion:rbac.authorization.k8s.io/v1
metadata:
  name:secret-reader
rules:
- apiGroups:[""]
  resources:["secrets"]
  verbs:["get","watch","list"]

注意:

1.如果我们要给当前角色赋予所有权限,可以定义verbs如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]

2.这儿也可以针对具体的对象进行设置,比如下面就是只能对name是my-config的configmaps资源进行get操作。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
rules:
- apiGroups: [""]
  resources: ["configmaps"]
  resourceNames: ["my-config"]
  verbs: ["get"]

3.kubernete提供了四个预先定义好的ClusterRole供用户使用:cluster-admin(集群中所有操作)、admin(单节点所有操作)、edit(读写操作)、view(只读操作)。

需要提一下的是,cluster-admin对应的是整个集群中的最高权限(verbs=*)。下面的命令可以看出每个角色的权限列表:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kubectl describe clusterrole cluster-admin -n kube-system
kubectl describe clusterrole admin -n kube-system
kubectl describe clusterrole edit -n kube-system
kubectl describe clusterrole view -n kube-system

角色的绑定RoleBinding

RoleBinding也是一个api对象,所以定义的时候只要申明kind是RoleBinding就可以了。下面这个RoleBinding名字叫test-rolebinding,定义了一个subjects即被作用对象,是一个叫jinjunzhu的用户。简而言之,就是jinjunzhu这个用户绑定了test-role这个角色,从而绑定了资源的get、watch和list操作。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: test-rolebinding
  namespace: mynamespace
subjects:
- kind: User
  name: jinjunzhu
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: test-role
  apiGroup: rbac.authorization.k8s.io

RoleBinding也可以绑定集群角色角色,这个绑定只能在mynamespace中生效,绑定的正是我们前面定义的名字叫做secret-reader的ClusterRole,这样管理员可以在集群中复制这个公共角色,然后在命名空间中进行复用。yaml文件代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kind:RoleBinding
apiVersion:rbac.authorization.k8s.io/v1
metadata:
  name:read-secrets
  namespace:mynamespace
subjects:
- kind:User
  name:jinjunzhu
  apiGroup:rbac.authorization.k8s.io
roleRef:
  kind:ClusterRole
  name:secret-reader
  apiGroup:rbac.authorization.k8s.io

下面再看一个ClusterRoleBinding,这儿定义的被作用者subject是一个名字叫做jinjunzhu的Group,绑定关系是名字叫做secret-reader,这个绑定允许jinjunzhu这个组中的所有用户对集群中任何namespace中的secrets进行get、watch和list操作。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kind:ClusterRoleBinding
apiVersion:rbac.authorization.k8s.io/v1
metadata:
  name:read-secrets-global
subjects:
- kind:Group
  name:jinjunzhu
  apiGroup:rbac.authorization.k8s.io
roleRef:
  kind:ClusterRole
  name:secret-reader
  apiGroup:rbac.authorization.k8s.io

注意:这个绑定关系是没有namespace定义的。

主体或被作用者subject

在上面的subjects定义中,使用到了User和Group。

首先我们介绍一下User,它实际上是一个为了授权的逻辑概念。一般情况下,kubernete集群为我们提供的内置用户就能满足我们使用了,我们也可以通过外部认证服务比如keystone或者直接给APIServer指定用户名密码文件来指定。

如下是名字是jinjunzhu的用户:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
subjects:
- kind:User
  name:jinjunzhu
  apiGroup:rbac.authorization.k8s.io

而Group只是一组User,这一组用户也可以由外服授权服务来提供。

下面这个定义是用户名为jinjunzhu的Group:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
subjects:
- kind:Group
  name:jinjunzhu
  apiGroup:rbac.authorization.k8s.io

注意:

ServiceAccount中Users,在kubernete里对应的name是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
system:serviceaccount:<Namespace名字>:<ServiceAccount名字>

ServiceAccount中Group,在kubernete里对应的name是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
system:serviceaccounts:<Namespace名字>

下面这个定义是所有的用户:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
subjects:
- kind:Group
  name:system:authenticated #授权过的
  apiGroup:rbac.authorization.k8s.io
- kind:Group
  name:system:unauthenticated #未授权过的
  apiGroup:rbac.authorization.k8s.io

下面的定义是所有内置用户:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
subjects:
- kind:Group
  name:system:serviceaccounts
  apiGroup:rbac.authorization.k8s.io

下面的定义是所有namespace是jinjunzhu的所有内置用户:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
subjects:
- kind:Group
  name:system:serviceaccounts:jinjunzhu
  apiGroup:rbac.authorization.k8s.io

关于如何使用外部授权服务,这里就不再详细介绍了。

进行试验

上面我们提到过,一般情况下,kubernete为我们提供的内置用户就能满足我们使用了,这个内置用户或者用户组就是ServiceAccount。

首先我定义一个name是jinjunzhu的ServiceAccount,serviceaccount.yaml文件内容如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
apiVersion: v1
kind: ServiceAccount
metadata:
  namespace: mynamespace
  name: jinjunzhu

接着我们定义一个Role,Role.yaml文件内容如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: mynamespace
  name:   -role
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "watch", "list"]

然后我们定义RoleBinding,RoleBinding.yaml文件内容如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: test-rolebinding
  namespace: mynamespace
subjects:
- kind: ServiceAccount
  name: jinjunzhu
  namespace: mynamespace
roleRef:
  kind: Role
  name: test-role
  apiGroup: rbac.authorization.k8s.io

因为上面用到了mynamespace,我们需要创建这个namespace, mynamespaces.yaml文件内容如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
apiVersion: v1
kind: Namespace
metadata:
   name: mynamespace
   labels:
     name: mynamespace

下面我们创建这4个api对象,命令如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kubectl create -f mynamespaces.yaml
kubectl create -f serviceaccount.yaml 
kubectl create -f Role.yaml 
kubectl create -f RoleBinding.yaml 

创建成功后,首先我们看一下ServiceAccount,kubernete为它分配了简写sa,查看时可以使用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@master rbac]# kubectl get sa -n mynamespace -o yaml
apiVersion: v1
items:
- apiVersion: v1
  kind: ServiceAccount
  metadata:
    creationTimestamp: "2020-08-16T07:11:37Z"
    name: default
    namespace: mynamespace
    resourceVersion: "2354"
    selfLink: /api/v1/namespaces/mynamespace/serviceaccounts/default
    uid: 4d234ef6-7a44-4ffc-bcd2-3a1a490eef0a
  secrets:
  - name: default-token-2tjlh
- apiVersion: v1
  kind: ServiceAccount
  metadata:
    creationTimestamp: "2020-08-16T07:14:34Z"
    name: jinjunzhu
    namespace: mynamespace
    resourceVersion: "2761"
    selfLink: /api/v1/namespaces/mynamespace/serviceaccounts/jinjunzhu
    uid: 31e92f92-e2dd-40dc-8a73-822b3be4c637
  secrets:
  - name: jinjunzhu-token-qxttq
kind: List
metadata:
  resourceVersion: ""
  selfLink: ""

从上面的输出可以看到,kubernete为jinjunzhu这个ServiceAccount分配了一个secrets,这个名字叫jinjunzhu-token-qxttq的secrets,它就是用来跟apiserver进行交互的token信息,只不过是以secrets对象的格式信息保存在etcd当中。

然后,我们从下面的输出可以看出,Role和RoleBinding已经创建成功了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@master rbac]# kubectl get Role -n mynamespace
NAME        AGE
test-role   6m19s
[root@master rbac]# kubectl get RoleBinding -n mynamespace
NAME               AGE
test-rolebinding   6m8s

这时我们定义一个pod,这个pod名字叫sa-pod,镜像是我之前使用的一个springboot镜像,我们定义这个pod使用我们刚刚创建的名字叫jinjunzhu的ServiceAccount,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
apiVersion: v1
kind: Pod
metadata:
  namespace: mynamespace
  name: sa-pod
spec:
  containers:
  - name: spingboot-mybatis
    imagePullPolicy: IfNotPresent
    image: zjj2006forever/springboot-mybatis:1.3
  ports:
    - containerPort: 8300
  serviceAccountName: jinjunzhu

这个文件我们命名为sa-pod.yaml,然后创建这个pod,命令如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kubectl create -f sa-pod.yaml

创建成功后,我们用describe看一下这个pod的详情:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@master rbac]# kubectl describe pod sa-pod -n mynamespace
Name:         sa-pod
Namespace:    mynamespace
Priority:     0
Node:         worker1/192.168.59.141
Start Time:   Sun, 16 Aug 2020 03:40:56 -0400
Labels:       <none>
Annotations:  <none>
Status:       Running
IP:           10.244.1.2
IPs:
  IP:  10.244.1.2
Containers:
  spingboot-mybatis:
    Container ID:   docker://8cb76ef92f94f128adedddd3dfc1d401cc238b2eef74af507c39b3d3e210814e
    Image:          zjj2006forever/springboot-mybatis:1.3
    Image ID:       docker-pullable://zjj2006forever/springboot-mybatis@sha256:502c368a0a0ea9dc38c8175f2b97aa7527336dea314b3712151fccefe957eaf8
    Port:           8300/TCP
    Host Port:      0/TCP
    State:          Running
      Started:      Sun, 16 Aug 2020 03:40:57 -0400
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from jinjunzhu-token-qxttq (ro)
Conditions:
  Type              Status
  Initialized       True 
  Ready             True 
  ContainersReady   True 
  PodScheduled      True 
Volumes:
  jinjunzhu-token-qxttq:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  jinjunzhu-token-qxttq
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                 node.kubernetes.io/unreachable:NoExecute for 300s
Events:
  Type    Reason     Age   From               Message
  ----    ------     ----  ----               -------
  Normal  Scheduled  102s  default-scheduler  Successfully assigned mynamespace/sa-pod to worker1
  Normal  Pulled     101s  kubelet, worker1   Container image "zjj2006forever/springboot-mybatis:1.3" already present on machine
  Normal  Created    101s  kubelet, worker1   Created container spingboot-mybatis
  Normal  Started    101s  kubelet, worker1   Started container spingboot-mybatis

上面输出的Mounts部分信息我们可以看到,前面我们创建jinjunzhu这个ServiceAccount时生成的token已经挂载到了一个目录下面,这是我们进入这个容器内部,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@worker1 kubernetes]# kubectl exec -it sa-pod -n mynamespace -- /bin/sh
/ # cd /var/run/secrets/kubernetes.io/serviceaccount
/run/secrets/kubernetes.io/serviceaccount # ls
ca.crt     namespace  token

可以看到容器里面已经有了一个ca.crt文件,容器里的应用就是用这个文件来访问apiserver的。根据前面Role定义,这个ServiceAccount的操作权限只有get、watch和list。

最后要说的是,如果我们声明pod的时候,没有定义serviceAccountName,kubernete会怎么控制pod的操作权限呢?

还是上面的sa-pod.yaml,我们删除serviceAccountName,重新创建pod,然后用describe看一下详情,下面是我截取了部分输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@master rbac]# kubectl describe pod sa-pod -n mynamespace
Name:         sa-pod
Namespace:    mynamespace
Priority:     0
Node:         worker1/192.168.59.141
Start Time:   Sun, 16 Aug 2020 04:12:02 -0400
Labels:       <none>
Annotations:  <none>
Status:       Running
IP:           10.244.1.3
IPs:
  IP:  10.244.1.3
Containers:
  spingboot-mybatis:
    Container ID:   docker://8c73ccba58581c6d78714463d65fb75cb5733a7a6aa4b57d635a8fc4e2068f0f
    Image:          zjj2006forever/springboot-mybatis:1.3
    Image ID:       docker-pullable://zjj2006forever/springboot-mybatis@sha256:502c368a0a0ea9dc38c8175f2b97aa7527336dea314b3712151fccefe957eaf8
    Port:           8300/TCP
    Host Port:      0/TCP
    State:          Running
      Started:      Sun, 16 Aug 2020 04:12:03 -0400
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-2tjlh (ro)
Conditions:
  Type              Status
  Initialized       True 
  Ready             True 
  ContainersReady   True 
  PodScheduled      True 
Volumes:
  default-token-2tjlh:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-2tjlh
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                 node.kubernetes.io/unreachable:NoExecute for 300s
Events:
  Type    Reason     Age   From               Message
  ----    ------     ----  ----               -------
  Normal  Scheduled  37s   default-scheduler  Successfully assigned mynamespace/sa-pod to worker1
  Normal  Pulled     37s   kubelet, worker1   Container image "zjj2006forever/springboot-mybatis:1.3" already present on machine
  Normal  Created    37s   kubelet, worker1   Created container spingboot-mybatis
  Normal  Started    36s   kubelet, worker1   Started container spingboot-mybatis

可以看到,kubernete会为这个pod创建一个名字叫default的ServiceAccount,然后为它绑定一个特殊的Secret,我们看一下详情:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@master rbac]# kubectl get secret
NAME                  TYPE                                  DATA   AGE
default-token-zjndz   kubernetes.io/service-account-token   3      81m
[root@master rbac]# kubectl describe secret default-token-zjndz
Name:         default-token-zjndz
Namespace:    default
Labels:       <none>
Annotations:  kubernetes.io/service-account.name: default #这个可以看到这个Secret会跟名字是default的ServiceAccount进行绑定
              kubernetes.io/service-account.uid: f7cd1a1e-9be7-42ba-a0fc-0aa7a8150a9e

Type:  kubernetes.io/service-account-token

Data
====
ca.crt:     1025 bytes
namespace:  7 bytes
token:      eyJhbGciOiJSUzI1NiIsImtpZCI6IlNvT3BWUkY0WWlrQWd2Qm1iT2cwZGJDdF94UU9JT3JrREszbWpLZ0RDZHcifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6ImRlZmF1bHQtdG9rZW4tempuZHoiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGVmYXVsdCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6ImY3Y2QxYTFlLTliZTctNDJiYS1hMGZjLTBhYTdhODE1MGE5ZSIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpkZWZhdWx0OmRlZmF1bHQifQ.YUt48ZYexbxpioOoODGQ6UnrK6urKMFU5NwaGT1PCJe-inqM4ZKWuCxAb6Rd8JubRtf7JhKQOkjNIQcEe0jrjrSu25q0Zc485b_Nm20GRvB6smWC59lG6wJ2U4aanx4IAewTFCZsmct-1G8CU5YxY7gyvklbf2FWzplvCkeLOXx2kH-KHETbZuRDcNUXq-qo2G_X5_feyGRnDrL9tKuk7aBKsSYoQcwE2GWzSClPn9w8T7F2U139cWtI2T_Rk7K_85bk_-4o5AIdTcSLFckB8J4gbm2lDTS5sVxG-njFb7rOZq50xMsMfamPc350MZibgSiszqYzNNb_GgLqIwL16A

注意:default的ServiceAccount拥有的访问apiserver的权限比较多,所以我们一般应该声明一个ServiceAccount进行绑定,用来对操作权限进行控制。

总结

kubernete基于角色的访问控制,其实是通过Role和RoleBinding来实现的,角色中定义了操作权限,然后跟User进行绑定,这个User一般可以用ServiceAccount对象。跟集群相关的访问控制还有ClusterRole和ClusterRoleBinding,这2个对象是集群范围的,不受namespace的限制。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-08-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 jinjunzhu 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Go语言的编译优化技巧
编译优化是指在编译过程中,通过各种技术手段,提高生成代码的执行效率和资源利用效率。Go语言的编译器在编译过程中,会自动进行一些基本的优化,但通过合理的代码设计和编译参数设置,我们可以进一步提升程序的性能。
二一年冬末
2024/07/02
3940
深度解密Go语言之sync.pool
最近在工作中碰到了 GC 的问题:项目中大量重复地创建许多对象,造成 GC 的工作量巨大,CPU 频繁掉底。准备使用 sync.Pool 来缓存对象,减轻 GC 的消耗。为了用起来更顺畅,我特地研究了一番,形成此文。本文从使用到源码解析,循序渐进,一一道来。
梦醒人间
2020/04/27
1.3K0
Go 高性能编程技法
作者:dablelv,腾讯 IEGggG 后台开发工程师 代码的稳健、可读和高效是我们每一个 coder 的共同追求。本文将结合 Go 语言特性,为书写效率更高的代码,从常用数据结构、内存管理和并发,三个方面给出相关建议。话不多说,让我们一起学习 Go 高性能编程的技法吧。 常用数据结构 1.反射虽好,切莫贪杯 标准库 reflect 为 Go 语言提供了运行时动态获取对象的类型和值以及动态创建对象的能力。反射可以帮助抽象和简化代码,提高开发效率。 Go 语言标准库以及很多开源软件中都使用了 Go 语言的反
腾讯技术工程官方号
2022/03/18
2.1K0
PHP转Go速学手册
整理了一份简要的手册,帮助大家高效的上手Go语言,主要是通过对比PHP和Go的不同点来强化理解,内容主要分为以下四部分:
用户1093396
2021/07/28
2.5K0
Go 语言性能优化技巧
在软件开发中,性能往往是我们需要特别关注的方面之一。对于使用 Go 语言的开发者而言,如何编写高性能的代码是一个重要的考虑点。
南山竹
2024/07/09
1240
Go 语言性能优化技巧
《Go小技巧&易错点100例》第三十三篇
Go语言中广泛使用的validator库支持通过结构体标签定义校验规则。当内置规则无法满足需求时,我们可以轻松扩展自定义校验逻辑。
闫同学
2025/05/09
1220
《Go小技巧&易错点100例》第三十三篇
每个程序员都应该掌握的Golang性能优化秘技
Golang 作为一门“现代化”的语言,原生就包含了强大的性能分析工具 pprof 和 trace。pprof 工具常用于分析资源的使用情况,可以采集程序运行时的多种不同类型的数据(例如 CPU 占用、内存消耗和协程数量等),并对数据进行分析聚合生成的报告。trace 工具则关注程序运行时的事件(例如协程状态切换,GC 的开始和结束、系统调用等等),常用于分析延迟、阻塞和调度等问题。掌握了这两个工具就足以满足大部分 Golang 程序的性能分析需求。
腾讯云开发者
2024/05/22
2.2K0
每个程序员都应该掌握的Golang性能优化秘技
fasthttp是如何做到比net/http快十倍的
小许之前分享过标准库net/http的实现原理,不过有个fasthttp的库号称比net/http快十倍呢!
小许code
2024/03/09
1.6K0
fasthttp是如何做到比net/http快十倍的
go语言最全优化技巧总结,值得收藏!
导语 | 本文总结了在维护go基础库过程中,用到或者见到的一些性能优化技巧,现将一些理解梳理撰写成文,和大家探讨。 一、常规手段 (一)sync.Pool 临时对象池应该是对可读性影响最小且优化效果显著的手段。基本上,业内以高性能著称的开源库,都会使用到。 最典型的就是fasthttp(网址:https://github.com/valyala/fasthttp/)了,它几乎把所有的对象都用sync.Pool维护。 但这样的复用不一定全是合理的。比如在fasthttp中,传递上下文相关信息的Requ
腾讯云开发者
2021/08/24
8760
go面试题目收集
使用append向Slice追加元素时, 如果Slice空间不足, 将会触发Slice扩容, 扩容实际上重新一配一块更大的内存, 将原Slice数据拷贝进新Slice, 然后返回新Slice, 扩容后再将数据追加进去。 扩容容量的选择遵循以下规则:
twelvecoder
2021/12/24
7480
go面试题目收集
计算密集型服务 性能优化实战始末
worker 服务消费上游数据(工作日高峰期产出速度达近 200 MB/s,节假日高峰期可达 300MB/s 以上),进行中间处理后,写入多个下游。在实践中结合业务场景,基于快慢隔离的思想,以三个不同的 consumer group 消费同一 Topic,隔离三种数据处理链路。
薯条的编程修养
2022/08/10
9350
计算密集型服务 性能优化实战始末
Go面经
Wall clock(time) VS Monotonic clock(time)
公众号guangcity
2022/12/02
4751
Gitlab CI/CD 实践四:Golang 项目 CI/CD 流水线配置
gdb是linux系统自带的调试器,功能十分强大,它不仅支持C/C++调试,也支持GO程序调试。 支持打断点,查看变量值,查看调用堆栈。使用前需要在编译时禁用编译器优化、内联优化,这样看到的代码才和源代码一致。
Yuyy
2024/07/14
4620
go pprof实战
1 为什么要进行性能优化 1.1 哪些情况需要进行性能优化 其实关于性能优化的主题,网上已经讨论很多次,这里谈一下我的理解,那么其实核心就是2个点: 服务一直高负载,业务增长需要经常扩容 架构不能满足业务发展,需要重构,与此同时需要进行服务的压测&性能优化 1.2 性能优化的一般步骤 准备阶段:发现系统性能问题,明确优化方向 分析阶段:通过各种工具和手段,初步定位瓶颈点 调优阶段:根据定位到的瓶颈点,进行性能调优 测试阶段:实际验证调优效果,如果不能满足期望要求,那么可能需要重复2-3步骤(如果还不行可能
QQ音乐技术团队
2021/05/14
1.9K0
Go 应用优化指北
这是一个速度决定一切的时代,我们的生活在不断地数字化,线下的流程依然在持续向线上转移,转移过程中,作为工程师,我们会碰到各种各样的性能问题。
KevinYan
2021/08/06
3560
Go 应用优化指北
Go语言核心技术深度剖析与高并发实战
#mermaid-svg-k8ekEdaHWMx03TZF {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-k8ekEdaHWMx03TZF .error-icon{fill:#552222;}#mermaid-svg-k8ekEdaHWMx03TZF .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-k8ekEdaHWMx03TZF .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-k8ekEdaHWMx03TZF .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-k8ekEdaHWMx03TZF .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-k8ekEdaHWMx03TZF .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-k8ekEdaHWMx03TZF .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-k8ekEdaHWMx03TZF .marker{fill:#333333;stroke:#333333;}#mermaid-svg-k8ekEdaHWMx03TZF .marker.cross{stroke:#333333;}#mermaid-svg-k8ekEdaHWMx03TZF svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-k8ekEdaHWMx03TZF .pieCircle{stroke:black;stroke-width:2px;opacity:0.7;}#mermaid-svg-k8ekEdaHWMx03TZF .pieTitleText{text-anchor:middle;font-size:25px;fill:black;font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-k8ekEdaHWMx03TZF .slice{font-family:"trebuchet ms",verdana,arial,sans-serif;fill:#333;font-size:17px;}#mermaid-svg-k8ekEdaHWMx03TZF .legend text{fill:black;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:17px;}#mermaid-svg-k8ekEdaHWMx03TZF :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}
大熊计算机
2025/07/15
1370
Go语言核心技术深度剖析与高并发实战
day3 | 高质量编程与性能调优实战 | 第三届字节跳动青训营笔记
实际应用场景千变万化,各种语言的特性和语法各不相同。但是高质量编程遵循的原则是相通的
千羽
2022/05/31
6980
day3 | 高质量编程与性能调优实战 | 第三届字节跳动青训营笔记
Go语言高性能编程手册(王权富贵)
代码的稳健、可读和高效是我们每一个 coder 的共同追求。本文将结合 Go 语言特性,为书写效率更高的代码,从常用数据结构、内存管理和并发,三个方面给出相关建议。话不多说,让我们一起学习 Go 高性能编程的技法吧。
曾高飞
2025/06/16
1120
白话 Golang 协程池
并发指在一段时间内有多个任务(程序,线程,协程等)被同时执行。注意,不是同一时刻。
恋喵大鲤鱼
2021/05/18
2K0
白话 Golang 协程池
基础总结 (Go篇)
注: 此系列内容来自网络,未能查到原作者。感觉不错,在此分享。不排除有错误,可留言指正。
fliter
2023/06/18
5260
基础总结 (Go篇)
相关推荐
Go语言的编译优化技巧
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档