0
点赞
收藏
分享

微信扫一扫

在线办公大势所趋,细说3种主流云办公方式优劣

自由的美人鱼 2023-05-14 阅读 24
kubernetes

一、背景

Master apiserver启用TLS认证后,Node节点kubelet和kube-proxy要与kube-apiserver进行通信,必须使用CA签发的有效证书才可以,当Node节点很多时,这种客户端证书颁发需要大量工作,同样也会增加集群扩展复杂度。

为了简化流程,Kubernetes引入了TLS bootstraping机制来自动颁发客户端证书,kubelet会以一个低权限用户自动向apiserver申请证书,kubelet的证书由apiserver动态签署。

所以强烈建议在Node上使用这种方式,目前主要用于kubelet,kube-proxy还是由我们统一颁发一个证书。(当机器越来越多的时候,手动的为kubelet颁发证书,还是比较麻烦的,应用这个机制就是为自动的为kubelet颁发证书)

TLS bootstrapping,使用Token时整个引导过程:


二、kubelet配置TLS客户端证书启动引导

2.1、启动引导认证

2.1.1、方法一:基于令牌认证文件

1、如果你希望使用令牌认证文件,你必须在kube-apiserver上使用下面的标志启用之

--token-auth-file=/etc/kubernetes/pki/token.csv

2、创建令牌认证文件并复制到 master节点的/etc/kubernetes/pki目录下

export bootstrap_token="$(head -c 6 /dev/urandom | md5sum |head -c 6).$(head -c 16 /dev/urandom | md5sum | head -c 16)"
echo "$bootstrap_token,kubelet-bootstrap,10001,\"system:bootstrappers\"" > token.csv
cp token.csv /etc/kubernetes/pki

3、生成bootstrap.kubeconfig凭证文件并复制到 master节点 和 worker节点的 /etc/kubernetes目录下

export kube_api_server="192.168.1.65:6443"
kubectl config --kubeconfig=kubelet-bootstrap.kubeconfig set-cluster kubernetes --server=https://${kube_api_server} --certificate-authority=ca.pem --embed-certs=true
kubectl config --kubeconfig=kubelet-bootstrap.kubeconfig set-credentials kubelet-bootstrap --token="$bootstrap_token"
kubectl config --kubeconfig=kubelet-bootstrap.kubeconfig set-context bootstrap --user=kubelet-bootstrap --cluster=kubernetes 
kubectl config --kubeconfig=kubelet-bootstrap.kubeconfig use-context bootstrap
cp kubelet-bootstrap.kubeconfig /etc/kubernetes

总结:


2.2.2、方法二:基于启动引导令牌(Bootstrap Token)

启动引导令牌在Kubernetes集群中存储为Secret对象,被发放给各个kubelet。 你可以在整个集群中使用同一个令牌,也可以为每个节点发放单独的令牌。

1、如果你希望使用启动引导令牌,你必须在kube-apiserver上使用下面的标志启用之

--enable-bootstrap-token-auth=true

2、随机生成Token ID和Token Secret

c3047froot@k8s-master-65:~# export token_id=`head -c 6 /dev/urandom | md5sum |head -c 6`
root@k8s-master-65:~# echo $token_id
e9a59b

root@k8s-master-65:~# export token_secret=`head -c 16 /dev/urandom | md5sum | head -c 16`
root@k8s-master-65:~# echo $token_secret
b5490ff78e038ba1

2、创建bootstrap-token.yaml启动引导令牌文件

启动引导令牌使用 abcdef.0123456789abcdef 的形式。 更加规范地说,它们必须符合正则表达式 [a-z0-9]{6}.[a-z0-9]{16}。令牌的第一部分是 “Token ID”,它是一种公开信息,用于引用令牌并确保不会 泄露认证所使用的秘密信息。 第二部分是“令牌秘密(Token Secret)”,它应该被共享给受信的第三方。

#1、创建bootstrap-token.yaml文件
vim bootstrap-secret.yaml
apiVersion: v1
kind: Secret
metadata:
  name: bootstrap-token-e9a59b
  namespace: kube-system
type: bootstrap.kubernetes.io/token
stringData:
  token-id: e9a59b
  token-secret: b5490ff78e038ba1
  usage-bootstrap-authentication: "true"
  usage-bootstrap-signing: "true"
  auth-extra-groups: system:bootstrappers:worker,system:bootstrappers:ingress

# 2、执行yaml文件
kubectl apply -f bootstrap-token.yaml

3、生成bootstrap.kubeconfig凭证文件并复制到 master节点 和 worker节点的 /etc/kubernetes目录下

export kube_api_server="192.168.1.65:6443"
kubectl config --kubeconfig=kubelet-bootstrap.kubeconfig set-cluster kubernetes --server=https://${kube_api_server} --certificate-authority=ca.pem --embed-certs=true
kubectl config --kubeconfig=kubelet-bootstrap.kubeconfig set-credentials system:bootstrap:e9a59b --token=e9a59b.b5490ff78e038ba1
kubectl config --kubeconfig=kubelet-bootstrap.kubeconfig set-context bootstrap --user=system:bootstrap:e9a59b --cluster=kubernetes 
kubectl config --kubeconfig=kubelet-bootstrap.kubeconfig use-context bootstrap
cp kubelet-bootstrap.kubeconfig /etc/kubernetes

2.3、授权 kubelet 创建 CSR

现在启动引导节点被身份认证 为system:bootstrapping组的成员, 它需要被授权创建证书签名请求(CSR)并在证书被签名之后将其取回。 幸运的是,Kubernetes提供了一个ClusterRole,其中精确地封装了这些许可, system:node-bootstrapper。

为了实现这一点,你只需要创建ClusterRoleBinding,将system:bootstrappers组绑定到集群角色system:node-bootstrapper。

这时候kubelet还无法加入集群,因为kubelet还没有客户端证书,无法正常的连接kube-apiserver。默认Kubernetes是不允许kubelet申请证书的,需要手动授权才行。

#1、创建create-csrs-for-bootstrapping.yaml文件
vim create-csrs-for-bootstrapping.yaml
# 允许启动引导节点创建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

#2、执行yaml文件
kubectl apply -f create-csrs-for-bootstrapping.yaml    

2.4、自动批准kubelet证书

说明:申请下来的证书是 kubelet用于访问kube-apiserver。

# 1、创建auto-approve-csrs-for-group.yaml文件
vim auto-approve-csrs-for-group.yaml
# 批复 "system:bootstrappers" 组的所有 CSR
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: auto-approve-csrs-for-group
subjects:
- kind: Group
  name: system:bootstrappers
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: system:certificates.k8s.io:certificatesigningrequests:nodeclient
  apiGroup: rbac.authorization.k8s.io

#2、执行yaml文件
kubectl apply -f auto-approve-csrs-for-group.yaml

2.5、自动续签kubelet证书

说明:证书即将过期时,可以续签之前申请下来的证书,也是kubelet用于访问kube-apiserver。

#1、创建auto-approve-renewals-for-nodes.yaml文件
vim auto-approve-renewals-for-nodes.yaml
# 批复"system:nodes"组的CSR续约请求
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: auto-approve-renewals-for-nodes
subjects:
- kind: Group
  name: system:nodes
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: system:certificates.k8s.io:certificatesigningrequests:selfnodeclient
  apiGroup: rbac.authorization.k8s.io

#2、执行yaml文件
kubectl apply -f auto-approve-renewals-for-nodes.yaml    

2.6、创建服务启动文件

创建/etc/systemd/system/kubelet.service服务启动文件

vim /etc/systemd/system/kubelet.service 
[Unit]
Description=Kubernetes Kubelet
Documentation=https://github.com/kubernetes/kubernetes
After=containerd.service
Requires=containerd.service

[Service]
ExecStart=/usr/local/bin/kubelet \
    --bootstrap-kubeconfig=/etc/kubernetes/kubelet-bootstrap.kubeconfig \
    --kubeconfig=/var/lib/kubelet/kubelet.kubeconfig \
    --config=/var/lib/kubelet/kubelet-config.yaml \
    --container-runtime=remote \
    --runtime-request-timeout=15m \
    --container-runtime-endpoint=unix:///run/containerd/containerd.sock \
    --cgroup-driver=systemd \
    --pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.7

[Install]
WantedBy=multi-user.target

字段解释:

--bootstrap-kubeconfig:首次启动向apiserver申请证书
--kubeconfig:空路径,会自动生成,后面用于连接apiserver
--config:配置参数文件
--pod-infra-container-image:管理Pod网络容器的镜像

总结:整理不易,如果对你有帮助,可否点赞关注一下?

更多详细内容请参考:企业级K8s集群运维实战

举报

相关推荐

0 条评论