Kubernetes - Kubelet TLS Bootstrapping
一、简单说明
写这个的初衷是自己搜索TLS Bootstrapping的时候没有搜到自己想要的东西,因为TLS Bootstrapping经过很多版本之后也发生了一些变化,所以网上很多也是老的内容了。其实很早的时候就知道了TLS Bootstrapping了,而且也看了官方文档,并且也能根据文档搭建,但是可能还是对他没有彻底了解,所以过了一段时间就忘了,不知道如何使用了。由于之前改功能一直处于开发变动之中,所以也不好写什么,在kubernetes v1.18.0之后,该功能也基本成熟了,所以将该功能整理记录下来。希望这次可以将Kubelet TLS Bootstrapping彻底搞清楚,从出现它的需求、它需要实现的目标、它的配置、它的源码各方面搞懂才好,我现在还没有开始研究源码,所以这里就没有源码的解析。如果以后有机会去看源码,也希望能将体会分享在这里。
二、需求
我们都知道,kubernetes对安全性的要求是比较高的,而且也一直践行全站安全的规范,基本上各种访问调用都需要TLS证书进行认证及授权。但是TLS对于具体实现的时候成本就相对增加了很多。尤其集群中众多的kubelet都需要与kube-apiserver通信,如果由管理员是管理证书及权限,很有可能会因为证书过期等问题出现混乱。所以,对于更加简单的部署kubelet的需求就不难理解了。
Kubelet TLS Bootstrapping需求由 CoreOS社区的开发者在2015年12月提出来,并且描述详细。主要需要实现两个功能,第一,实现kubelet与kube-apiserver之间的自动认证通信;第二,限制相关访问kube-apiserver的权限。
https://github.com/kubernetes/kubernetes/issues/18112
https://docs.google.com/document/d/1XPPuq9NBGNXLgZ94LvAANq8lP89nXiQFRHTzjzuE2kI/edit?usp=sharing
https://github.com/kubernetes/kubernetes/pull/20439
三、Kubelet认证过程简述
### kubelet启动时候向kube-apiserver进行认证过程:
1. kubelet启动时查找配置的kubeconfig文件
2. 从kubeconfig文件中得到apiserver的URL和认证信息(一般是TLS key和CA签发的证书)
3. 使用认证信息向apiserver进行认证
### 集群管理需要为kubelet做的事:
1. 为kubernetes集群创建CA和CA-KEY
2. 将CA和CA-KEY给kube-apiserver使用
3. 为每个node的kubelet创建证书和key(强烈建议每个node使用唯一证书,并设置唯一CN)
4. 使用CA-KEY签发kubelet的证书
5. 将kubelet的证书给kubelet使用
TLS Bootstrapping旨在简化从第三步开始的步骤,因为这是每个kubelet都需要的。
### TLS Bootstrap初始化过程:
1. kubelet进程启动
2. kubelet查找kubeconfig,没找到(因为没配置)
3. kubelet查找到bootstrap-kubeconfig文件
4. kubelet通过bootstrap-kubeconfig文件,查找到apiserver的URL和有限制权限的"token",该"token"可以通过apiserver的认证,且只能向apiserver发送CSR请求
5. kubelet使用"token"向apiserver认证
6. kubelet现在有权限创建一个CSR并发给apiserver
7. kubelet创建一个key和cert,并使用cert创建一个带signerName=kubernetes.io/kube-apiserver-client-kubelet的CSR,并发送给apiserver
8. apiserver签发该CSR:
如果配置了自动签发,kube-controller-manager将会自动签发该CSR
可以使用集群外的程序或人使用kubectl或Kubernetes API进行签发
9. 为kubelet签发证书(一般证书有效期为1年)
10. 将签发好的证书分发给kubelet
11. kubelet得到签发的证书
12. kubelet使用key和签发的证书生成kubeconfig
13. kubelet现在可以正常与apiserver交互了
14. 可选:如果配置了,kubelet将会在证书快过期的时候,自动发起新的CSR请求更新自己的证书
15. apiserver或手动或自动签发kubelet发送的更新证书的CSR请求
四、Token
### 格式
Token格式:[a-z0-9]{6}\.[a-z0-9]{16}
点号之前的是token ID,之后的是token Secret
如:abcdef.0123456789abcdef
### 权限
token认证的所使用的用户名是system:bootstrap:<token id>,属于system:bootstrappers组,可以在secret中的auth-extra-groups字段添加额外组
### 生成bootstrap-kubeconfig
kubectl config --embed-certs=true --kubeconfig=/var/lib/kubelet/bootstrap-kubeconfig set-cluster bootstrap --server='https://192.168.81.10:6443' --certificate-authority=/var/lib/kubernetes/ca.pem
kubectl config --kubeconfig=/var/lib/kubelet/bootstrap-kubeconfig set-credentials kubelet-bootstrap --token=10001.be31df5b85f4f55404b96bffe768562a
kubectl config --kubeconfig=/var/lib/kubelet/bootstrap-kubeconfig set-context bootstrap --user=kubelet-bootstrap --cluster=bootstrap
kubectl config --kubeconfig=/var/lib/kubelet/bootstrap-kubeconfig use-context bootstrap
# 将bootstrap-kubeconfig文件分发到kubelet上
五、Kubelet TLS Bootstrapping配置
### 需要配置的组件
1. kube-apiserver(--enable-bootstrap-token-auth)
2. kube-controller-manager
3. kubelet
4. in-cluster resources: ClusterRoleBinding and potentially ClusterRole
`注意:需要使用到你的CA`
### kubelet向kube-apiserver认证方式
kubernetes 认证器(authenticators):
https://kubernetes.io/docs/reference/access-authn-authz/authentication/
* X509 Client Certs
* Static Token File(推荐用于bootsrap)
* Bootstrap Tokens(推荐用于bootsrap)
* Service Account Tokens
* OpenID Connect Tokens
* Using kubectl
* Webhook Token Authentication
* Anonymous requests
* User impersonation
* client-go credential plugins
1. 生成token
token由token-id和token-secret组成,id相当于用户名,secret相当于密码。
token-id由自己取一个,密码可以通过以下命令生成。
生成token密码:
head -c 16 /dev/urandom | od -An -t x | tr -d ' '
2. kube-apiserver配置
配置kube-apiserver参数
--client-ca-file=FILENAME
该CA用于验证客户端证书的有效性。
* 用于认证bootstrapping kubelet的组system:bootstrappers
* 批准CSR
kube-apiserver启用token认证
--enable-bootstrap-token-auth
#### 方法一:Bootstrap Tokens Kubernetes `v1.18 [stable]`
这是一种更加简单方便的认证方式。
1. 创建包含token ID,token密码,作用范围的secret
apiVersion: v1
kind: Secret
metadata:
# Name MUST be of form "bootstrap-token-<token id>"
name: bootstrap-token-07401b
namespace: kube-system
# Type MUST be 'bootstrap.kubernetes.io/token'
type: bootstrap.kubernetes.io/token
stringData:
# Human readable description. Optional.
description: "The default bootstrap token generated by 'kubeadm init'."
# Token ID and secret. Required.
token-id: "07401b"
token-secret: f395accd246ae52d
# Expiration. Optional.
#expiration: 2017-03-10T03:22:11Z
# Allowed usages.
usage-bootstrap-authentication: "true"
usage-bootstrap-signing: "true"
# Extra groups to authenticate the token as. Must start with "system:bootstrappers:"
auth-extra-groups: system:bootstrappers:worker,system:bootstrappers:ingress
**Secret说明:**
* # https://github.com/kubernetes/community/blob/master/contributors/design-proposals/cluster-lifecycle/bootstrap-discovery.md
* type: bootstrap.kubernetes.io/token
* name: bootstrap-token-<token id>
* token-id: 自己定义的
* token-secret: 自己生成的
* expiration: 过期时间
* usage-bootstrap-signing: 为true时,表示允许这个token的请求签发bootstrap配置
* usage-bootstrap-authentication: 这个token是否允许用于apiserver的认证
* description(optional): 描述信息
* auth-groups(or auth-extra-groups?): 逗号分隔的认证组列表,必须以system:bootstrappers:开头
* ConfigMap Signing
#### 方法二:Token authentication file
https://kubernetes.io/docs/reference/access-authn-authz/authentication/#static-token-file
生成token文件
如:`02b50b05283e98dd0fd71db496ef01e8,kubelet-bootstrap,10001,"system:bootstrappers"` token,user,uid,"group1,group2,group3"
kube-apiserver添加参数
--token-auth-file=FILENAME
3. 配置bootstrapper有生成CSR的权限
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: system:node-bootstrapper
rules:
- apiGroups:
- certificates.k8s.io
resources:
- certificatesigningrequests
verbs:
- create
- get
- list
- watch
---
# enable bootstrapping nodes to create CSR
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: create-csrs-for-bootstrapping
subjects:
- kind: Group
name: system:bootstrappers
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: ClusterRole
name: system:node-bootstrapper
apiGroup: rbac.authorization.k8s.io
4. kube-controller-manager配置
签发kubelet证书所用的ca和ca-key,这个ca应用和kube-apiserver中的--client-ca-file一致
--cluster-signing-cert-file="/var/lib/kubernetes/ca.pem" --cluster-signing-key-file="/var/lib/kubernetes/ca-key.pem"
在kubernetes v1.19中提供了更加细致的CA配置,仅供参考
Csrsigning controller flags: --cluster-signing-cert-file string Filename containing a PEM-encoded X509 CA certificate used to issue
cluster-scoped certificates. If specified, no more specific --cluster-signing-* flag may be specified.
--cluster-signing-duration duration The length of duration signed certificates will be given. (default 8
760h0m0s)
--cluster-signing-key-file string Filename containing a PEM-encoded RSA or ECDSA private key used to s
ign cluster-scoped certificates. If specified, no more specific --cluster-signing-* flag may be specified.
--cluster-signing-kube-apiserver-client-cert-file string Filename containing a PEM-encoded X509 CA certificate used to issue
certificates for the kubernetes.io/kube-apiserver-client signer. If specified, --cluster-signing-{cert,key}-file must not be set.
--cluster-signing-kube-apiserver-client-key-file string Filename containing a PEM-encoded RSA or ECDSA private key used to s
ign certificates for the kubernetes.io/kube-apiserver-client signer. If specified, --cluster-signing-{cert,key}-file must not be set
.
--cluster-signing-kubelet-client-cert-file string Filename containing a PEM-encoded X509 CA certificate used to issue
certificates for the kubernetes.io/kube-apiserver-client-kubelet signer. If specified, --cluster-signing-{cert,key}-file must not be
set.
--cluster-signing-kubelet-client-key-file string Filename containing a PEM-encoded RSA or ECDSA private key used to s
ign certificates for the kubernetes.io/kube-apiserver-client-kubelet signer. If specified, --cluster-signing-{cert,key}-file must no
t be set.
--cluster-signing-kubelet-serving-cert-file string Filename containing a PEM-encoded X509 CA certificate used to issue
certificates for the kubernetes.io/kubelet-serving signer. If specified, --cluster-signing-{cert,key}-file must not be set.
--cluster-signing-kubelet-serving-key-file string Filename containing a PEM-encoded RSA or ECDSA private key used to s
ign certificates for the kubernetes.io/kubelet-serving signer. If specified, --cluster-signing-{cert,key}-file must not be set.
--cluster-signing-legacy-unknown-cert-file string Filename containing a PEM-encoded X509 CA certificate used to issue
certificates for the kubernetes.io/legacy-unknown signer. If specified, --cluster-signing-{cert,key}-file must not be set.
--cluster-signing-legacy-unknown-key-file string Filename containing a PEM-encoded RSA or ECDSA private key used to s
ign certificates for the kubernetes.io/legacy-unknown signer. If specified, --cluster-signing-{cert,key}-file must not be set.
看个实践的例子
$ kubectl version
Client Version: version.Info{Major:"1", Minor:"19", GitVersion:"v1.19.0", GitCommit:"e19964183377d0ec2052d1f1fa930c4d7575bd50", GitTreeState:"clean", BuildDate:"2020-09-04T02:07:01Z", GoVersion:"go1.15", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"19", GitVersion:"v1.19.0", GitCommit:"e19964183377d0ec2052d1f1fa930c4d7575bd50", GitTreeState:"clean", BuildDate:"2020-09-04T02:07:01Z", GoVersion:"go1.15", Compiler:"gc", Platform:"linux/amd64"}
$ kubectl get csr
NAME AGE SIGNERNAME REQUESTOR CONDITION
csr-9d7qd 0s kubernetes.io/kubelet-serving system:node:k8s00.99bill.com Pending #没有手工签发前的server证书csr
csr-qzbmz 8s kubernetes.io/kube-apiserver-client-kubelet system:bootstrap:07401b Approved,Issued # client证书csr
$ kubectl certificate approve csr-9d7qd
certificatesigningrequest.certificates.k8s.io/csr-9d7qd approved
$ kubectl get csr
NAME AGE SIGNERNAME REQUESTOR CONDITION
csr-9d7qd 43s kubernetes.io/kubelet-serving system:node:k8s00.99bill.com Approved,Issued
csr-qzbmz 51s kubernetes.io/kube-apiserver-client-kubelet system:bootstrap:07401b Approved,Issued
证书有效期参数
--cluster-signing-duration
自动续签证书请求参数(默认开启)
--feature-gates=RotateKubeletServerCertificate=true
(可选)自动删除过期token,在controller-manager添加参数,tokencleaner控制器负责这个工作。
--controllers=*,tokencleaner(默认开启)
签发证书配置:
为了批准csr,您需要告诉controller-manager批准它们是可以接受的。这是通过将RBAC权限授予正确的组来实现的。
有2种权限需要授予
* nodeclient: 如果一个节点正在为一个节点创建一个新证书,那么它还没有证书。它使用上面列出的令牌之一进行身份验证,因此是组system:bootstrappers的一部分
* selfnodeclient: 如果一个节点正在更新它的证书,那么它已经有一个证书,它作为组system:nodes进行验证。
5. 配置证书自动签发权限(仅针对)
证书签发有CSR approving controllers实现,自动签发只针对client证书。
创建clusterrole
# A ClusterRole which instructs the CSR approver to approve a user requesting
# node client credentials.
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: system:certificates.k8s.io:certificatesigningrequests:nodeclient
rules:
- apiGroups: ["certificates.k8s.io"]
resources: ["certificatesigningrequests/nodeclient"]
verbs: ["create"]
---
# A ClusterRole which instructs the CSR approver to approve a node renewing its
# own client credentials.
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: system:certificates.k8s.io:certificatesigningrequests:selfnodeclient
rules:
- apiGroups: ["certificates.k8s.io"]
resources: ["certificatesigningrequests/selfnodeclient"]
verbs: ["create"]
创建clusterrolebinding
#自动批准 kubelet 的首次 CSR 请求(用于与 apiserver 通讯的证书)
kubectl create clusterrolebinding auto-approve-csrs-for-group --clusterrole=system:certificates.k8s.io:certificatesigningrequests:nodeclient --group=system:bootstrappers
#自动批准 kubelet 后续 renew 用于与 apiserver 通讯证书的 CSR 请求
kubectl create clusterrolebinding auto-approve-renewals-for-nodes --clusterrole=system:certificates.k8s.io:certificatesigningrequests:selfnodeclient --group=system:nodes
#自动批准 kubelet 发起的用于 10250 端口鉴权证书的 CSR 请求(包括后续 renew)(下面用到的clusterrole是不会默认创建的,需要手工创建一下)
kubectl create clusterrolebinding node-server-auto-renew-crt --clusterrole=approve-node-server-renewal-csr --group=system:nodes
6. kubelet配置
kubelet加参数启动
--feature-gates=RotateKubeletClientCertificate=true,RotateKubeletServerCertificate=true(1.12后默认开启)
--rotate-certificates
--rotate-server-certificates
--bootstrap-kubeconfig="/var/lib/kubelet/bootstrap-kubeconfig"
--kubeconfig="/var/lib/kubelet/kubeconfig"
kubelet配置bootstrap需要以下东西:
* 存储签发好的证书的路径(可以使用默认/var/lib/kubelet/pki)
* 存放kubeconfig文件的路径(kubeconfig还不存在)
* bootstrap kubeconfig文件
* (可选)rotate证书
当kubelet启动时,如果kubeconfig文件不存在,将使用bootstrap-kubeconfig文件
获取到的证书将放在`--cert-dir`路径下
7. Kubelet client和server证书
client证书:kubelet向kube-apiserver通信时,由于kubelet与kube-apiserver使用双向认证,即不仅client端要验证server端的身份,server也会验证client端的身份,client证书即是kube-apiserver需要对client端的身份进行验证的证书。
server证书:kubelet本身也会提供https服务,用的就是该证书。
可以使用参数指定client证书和key:
* --tls-private-key-file
* --tls-cert-file
如果没有指定,则创建自签的证书和key,然后向kube-apiserver请求签发
注意:默认情况下,TLS bootstrap签发的证书仅用于client auth,出于安全考虑,不会用于server auth。如果想要自动签发server证书,打开RotateKubeletServerCertificate特性,并且自己实现一个自动签发server证书的controller。但是,你也可以启动服务器证书,至少支持kubelet发送证书轮询请求,但是kube-controller-manager不能自动签发。
六、kubelet自动续签证书请求
默认情况下kube-apiserver签发的证书有效期1年,当然可以调整kube-controller-manager参数`--cluster-signing-duration`(早期版本是`--experimental-cluster-signing-duration`)修改有效期,但是生产环境不建议将时间修改得太长。
kubelet开启client证书轮询:`--rotate-certificates`
kubelet开启server证书轮询:`--rotate-server-certificates`
开启了参数之后,kubelet在证书将要到期的时候会向kube-apiserver发送续签证书请求。
该功能需要kubelet开启特性RotateKubeletClientCertificate(beta默认开始) 和 RotateKubeletServerCertificate(beta默认开启)
https://kubernetes.io/docs/tasks/tls/certificate-rotation/
`注意:由于安全原因,在Kubernetes核心中实现的CSR审批控制器不审批节点serving证书。要使用RotateKubeletServerCertificate,需要运行自定义的审批控制器,或手动审批提供服务的证书请求。`
七、其它需要与kube-apiserver认证的组件
向kube-proxy以及一些监控组件可能也需要与kube-apiserver进行验证,主要有以下方法:
①传统老路:在kubelet进行TLS bootstrapping之前,可以手动生成可以通过验证相关的证书及key
②DaemonSet:由于kubelet安装成功之后就可以调度pod,你可以kube-proxy或特定服务封装成Daemonset,放到kube-system命名空间中。由于在kubernetes集群内部,你就可以使用有相关权限的serviceaccount启动你的pod
八、通过或拒绝证书请求
①手工通过请求:
kubectl get csr
kubectl describe csr <name>
kubectl certificate approve <name>
kubectl certificate deny <name>
②使用kube-controller-manager自动签发
注意:server端证书不能自动签发,需要自己手动签发
九、参考
kubelet TLS Bootstrapping
https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet-tls-bootstrapping/
TLS Bootstrap参考资料
https://mritd.me/2018/01/07/kubernetes-tls-bootstrapping-note/
生成CA及证书工具
https://kubernetes.io/docs/concepts/cluster-administration/certificates/
kubernetes集群证书
配置bootsrap token验证方式
https://kubernetes.io/docs/reference/access-authn-authz/bootstrap-tokens/
kubernetes集群相关证书种类及参数
https://kubernetes.io/docs/setup/best-practices/certificates/
配置证书轮询
https://kubernetes.io/docs/tasks/tls/certificate-rotation/
利用CSR功能签发集群认可的证书自己使用
https://kubernetes.io/docs/tasks/tls/managing-tls-in-a-cluster/
更新kubernetes集群CA
https://kubernetes.io/docs/tasks/tls/manual-rotation-of-ca-certificates/
v1.19.0中CSR相关介绍, Kubernetes v1.19 [stable]
https://kubernetes.io/docs/reference/access-authn-authz/certificate-signing-requests/
Kubernetes - Kubelet TLS Bootstrapping的更多相关文章
- [转]Kubernetes TLS bootstrapping 那点事
这个写得确实专业, 转一下收藏. https://mritd.me/2018/01/07/kubernetes-tls-bootstrapping-note/ 阅读本文章前,请先阅读一下本文参考的相关 ...
- Kubernetes 1.12公布:Kubelet TLS Bootstrap与Azure虚拟机规模集(VMSS)迎来通用版本号
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/M2l0ZgSsVc7r69eFdTj/article/details/82880341 https: ...
- Kubernetes Kubelet安全认证连接Apiserver
Kubelet使用安全认证连接Apiserver,可以用Token或证书连接.配置步骤如下. 1,生成Token命令 head -c /dev/urandom | od -An -t x | tr - ...
- kubelet tls
当成功签发证书后,目标节点的 kubelet 会将证书写入到 --cert-dir= 选项指定的目录中:此时如果不做其他设置应当生成上述除ca.pem以外的4个文件 kubelet-client.cr ...
- CoreOS Linux引入了Kubernetes kubelet
CoreOS Linux引入了Kubernetes kubelet 作者:Kelsey Hightower 2015年8月14日 这周我们在 CoreOS Linux 的 alpha 开发版集成了 k ...
- kubernetes kubelet组件中cgroup的层层"戒备"
cgroup是linux内核中用于实现资源使用限制和统计的模块,docker的风靡一时少不了cgroup等特性的支持.kubernetes作为容器编排引擎,除了借助docker进行容器进程的资源管理外 ...
- 二进制安装部署kubernetes集群---超详细教程
本文收录在容器技术学习系列文章总目录 前言:本篇博客是博主踩过无数坑,反复查阅资料,一步步搭建完成后整理的个人心得,分享给大家~~~ 本文所需的安装包,都上传在我的网盘中,需要的可以打赏博主一杯咖啡钱 ...
- K8S学习笔记之二进制部署Kubernetes v1.13.4 高可用集群
0x00 概述 本次采用二进制文件方式部署,本文过程写成了更详细更多可选方案的ansible部署方案 https://github.com/zhangguanzhang/Kubernetes-ansi ...
- Kubernetes体系结构
Nodes Node Status Addresses Phase Condition Capacity Info Management Node Controller Self-Registra ...
随机推荐
- 在eclipse完成对Java_web项目里面资源文件的读取
Java_web项目的资源文件一般有两种: 一种是存放数据之间有联系的文件,使用xml文件 另一种是存放数据之间没有联系的文件,使用properties文件 这里我们对properties文件读写做示 ...
- FZU - 1901 Period II (kmp)
传送门:FZU - 1901 题意:给你个字符串,让你求有多少个p可以使S[i]==S[i+P] (0<=i<len-p-1). 题解:这个题是真的坑,一开始怎么都觉得自己不可能错,然后看 ...
- AtCoder Beginner Contest 165
比赛链接:https://atcoder.jp/contests/abc165/tasks A - We Love Golf 题意 区间 $[a, b]$ 中是否存在 $k$ 的倍数. 代码 #inc ...
- 高斯消元初步(Gauss算法)
Gauss算法,称为高斯消元算法,用来解决n元一次方程,在解决线性方程问题起着重要作用. 简述 运用高斯消元的方法,我们可以在O(n3)的时间求出n元线性方程,但是由于时间复杂度的原因,请注意题目数据 ...
- 第 45 届国际大学生程序设计竞赛(ICPC)亚洲网上区域赛模拟赛. A.Easy Equation (前缀和/差分)
题意:RT,给你四个数\(a,b,c,d\),求\(x+y+z=k\)的方案数. 题解:我们可以先枚举\(x\)的值,然后\(x+y\)能取到的范围一定是\([x,x+b]\),也就是说这个区间内每个 ...
- PowerShell随笔7 -- Try Catch
PowerShell默认的顺序执行命令,即使中间某一句命令出错,也会继续向下执行. 但是,我们的业务有时并非如此,我们希望出现异常情况后进行捕获异常,进行记录日志等操作. 和其他编程语言一样,我们可以 ...
- 【转】REST风格框架实战:从MVC到前后端分离(附完整Demo)
版权声明:欢迎转载,注明作者和出处就好!如果不喜欢或文章存在明显的谬误,请留言说明原因再踩哦,谢谢,我也可以知道原因,不断进步! https://blog.csdn.net/justloveyou_/ ...
- HTTP笔记2--简单的HTTP 协议
HTTP概念 HTTP用于客户端和服务器之间的通信 客户端:请求访问文本或图像等资源的一端 服务器端而提供资源响应的一端 通过请求和响应的交换达成通信 HTTP 协议规定,请求从客户端发出,最后服务器 ...
- [APUE] 进程控制
APUE 一书的第八章学习笔记. 进程标识 大家都知道使用 PID 来标识的. 系统中的一些特殊进程: PID = 0: 调度进程,也称为交换进程 (Swapper) PID = 1: init 进程 ...
- 【Azure Redis 缓存】使用Python代码获取Azure Redis的监控指标值 (含Powershell脚本方式)
问题描述 通过Metrics监控页面,我们能得知当前资源(如Redis)的运行情况与各种指标.如果我们需要把指标下载到本地或者生成JSON数据导入到第三方的监控平台呢?Azure是否可以通过Pytho ...