k8s——kubeadm工具使用
一.kubeadm使用Kubeadm 是一个工具,它提供了 kubeadm init 以及 kubeadm join 这两个命令作为快速创建kubernetes 集群的最佳实践.1.kubeadm init作用:初始化一个 Kubernetes 控制平面节点语法格式:kubeadm init [flags]举例:[root@master ~]# kubeadm init --kubernetes-
一.kubeadm使用
Kubeadm 是一个工具,它提供了 kubeadm init 以及 kubeadm join 这两个命令作为快速创建kubernetes 集群的最佳实践.
1.kubeadm init
作用:
初始化一个 Kubernetes 控制平面节点
语法格式:
kubeadm init [flags]
举例:
[root@master ~]# kubeadm init --kubernetes-version=1.19.2 --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=10.0.1.10
参数解释:
–apiserver-advertise-address string
API 服务器所公布的其正在监听的 IP 地址。如果未设置,则使用默认网络接口。
–apiserver-bind-port int32 默认值:6443
API 服务器绑定的端口。
–apiserver-cert-extra-sans stringSlice
用于 API Server 服务证书的可选附加主题备用名称(SAN)。可以是 IP 地址和 DNS 名称。
–cert-dir string 默认值:"/etc/kubernetes/pki"
保存和存储证书的路径。
–certificate-key string
用于加密 kubeadm-certs Secret 中的控制平面证书的密钥。
–config string
kubeadm 配置文件的路径。
–control-plane-endpoint string
为控制平面指定一个稳定的 IP 地址或 DNS 名称。
–ignore-preflight-errors stringSlice
错误将显示为警告的检查列表;例如:‘IsPrivilegedUser,Swap’。取值为 ‘all’ 时将忽略检查中的所有错误。
–image-repository string 默认值:“k8s.gcr.io”
选择用于拉取控制平面镜像的容器仓库
–kubernetes-version string 默认值:“stable-1”
为控制平面选择一个特定的 Kubernetes 版本。
–node-name string
指定节点的名称。
–pod-network-cidr string
指明 pod 网络可以使用的 IP 地址段。如果设置了这个参数,控制平面将会为每一个节点自动分配 CIDRs。
Init 命令的工作流程:
在做出变更前运行一系列的预检项来验证系统状态。一些检查项目仅仅触发警告,其它的则会被视为错误并且退出 kubeadm,除非问题得到解决或者用户指定了 --ignore-preflight-errors= 参数
生成一个自签名的 CA 证书 (或者使用现有的证书,如果提供的话) 来为集群中的每一个组件建立身份标识。如果用户已经通过 --cert-dir 配置的证书目录(默认为 /etc/kubernetes/pki)提供了他们自己的 CA 证书以及/或者密钥, 那么将会跳过这个步骤
将 kubeconfig 文件写入 /etc/kubernetes/ 目录以便 kubelet、控制器管理器和调度器用来连接到 API 服务器,它们每一个都有自己的身份标识,同时生成一个名为 admin.conf 的独立的 kubeconfig 文件,用于管理操作
为 API 服务器、控制器管理器和调度器生成静态 Pod 的清单文件。假使没有提供一个外部的 etcd 服务的话,也会为 etcd 生成一份额外的静态 Pod 清单文件。
一旦控制平面的 Pod 都运行起来, kubeadm init 的工作流程就继续往下执行
对控制平面节点应用 labels 和 taints 标记以便不会在它上面运行其它的工作负载
生成令牌以便其它节点以后可以使用这个令牌向控制平面节点注册它们自己。用户可以通过 --token 提供一个令牌
为了使得节点能够遵照 Bootstrap Tokens 和 TLS Bootstrap 这两份文档中描述的机制加入到集群中,kubeadm 会执行所有的必要配置: - 创建一份 ConfigMap 提供添加集群节点所需的信息,并为该 ConfigMap 设置相关的 RBAC 访问规则。 - 使得 Bootstrap Tokens 可以访问 CSR 签名 API。 - 对新的 CSR 请求配置为自动签发。
2.kubeadm join
作用:
初始化 Kubernetes 工作节点并将其加入集群
语法:
kubeadm join [api-server-endpoint] [flags]
举例:
[root@node-1 ~]# kubeadm join 192.168.122.201:6443 --token ntqpnh.f5tbwenab50233at --discovery-token-ca-cert-hash sha256:42e125ef64f5aabc67ae0e0f14b58270be35fde8ff4f7b9a47d5d76a74a97c4a
参数解释:
–config string
kubeadm 配置文件的路径。
–control-plane
在此节点上创建一个新的控制平面实例
–cri-socket string
要连接的 CRI 套接字的路径。如果为空,则 kubeadm 将尝试自动检测此值;仅当安装了多个 CRI 或具有非标准 CRI 插槽时,才使用此选项。
–discovery-file string
对于基于文件的发现,给出用于加载集群信息的文件或者 URL。
–discovery-token string
对于基于令牌的发现,该令牌用于验证从 API 服务器获取的集群信息。
–discovery-token-ca-cert-hash stringSlice
对基于令牌的发现,验证根 CA 公钥是否与此哈希匹配 (格式: “:”)。
–ignore-preflight-errors stringSlice
错误将显示为警告的检查列表;例如:‘IsPrivilegedUser,Swap’。取值为 ‘all’ 时将忽略检查中的所有错误。
–node-name string
指定节点的名称
–skip-phases stringSlice
要跳过的阶段列表
–tls-bootstrap-token string
指定在加入节点时用于临时通过 Kubernetes 控制平面进行身份验证的令牌。
–token string
如果未提供这些值,则将它们用于 discovery-token 令牌和 tls-bootstrap 令牌。
kubeadm join 工作流程:
kubeadm 从 API 服务器下载必要的集群信息。 默认情况下,它使用引导令牌和 CA 密钥哈希来验证数据的真实性。 也可以通过文件或 URL 直接发现根 CA
如果调用 kubeadm 时启用了 --feature-gates=DynamicKubeletConfig,它首先从主机上检索 kubelet 初始化配置并将其写入磁盘。
一旦知道集群信息,kubelet 就可以开始 TLS 引导过程。 TLS 引导程序使用共享令牌与 Kubernetes API 服务器进行临时的身份验证,以提交证书签名请求 (CSR); 默认情况下,控制平面自动对该 CSR 请求进行签名。
最后,kubeadm 配置本地 kubelet 使用分配给节点的确定标识连接到 API 服务器。
带 CA 锁定模式的基于令牌的发现:
这是 Kubernetes 1.8 及以上版本中的默认模式。 在这种模式下,kubeadm 下载集群配置(包括根CA)并使用令牌验证它,并且会验证根 CA 的公钥与所提供的哈希是否匹配,以及 API 服务器证书在根 CA 下是否有效。
CA 键哈希格式为 sha256:<hex_encoded_hash>。 默认情况下,在 kubeadm init 最后打印的 kubeadm join 命令或者 kubeadm token create–print-join-command 的输出信息中返回哈希值。 它使用标准格式 (请参考 RFC7469) 并且也能通过第三方工具或者驱动系统进行计算。 例如,使用 OpenSSL CLI:
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
基于 HTTPS 或文件发现:
kubeadm join 命令示例:
kubeadm join --discovery-file path/to/file.conf (本地文件)
kubeadm join --discovery-file https://url/file.conf (远程 HTTPS URL)
优势:允许引导节点安全地发现主节点的信任根,即使网络或其他工作节点受到损害。
关闭节点客户端证书的自动批准:
默认情况下,Kubernetes 启用了 CSR 自动批准器,如果在身份验证时使用 Bootstrap Token,它会批准对 kubelet 的任何客户端证书的请求。 如果不希望集群自动批准kubelet客户端证书,可以通过执行以下命令关闭它:
[root@master ~]# kubectl get clusterrole
[root@master ~]# kubectl delete clusterrole system:node-bootstrapper
关闭后,kubeadm join 操作将会被阻断,直到管理员已经手动批准了在途中的 CSR 才会继续:[master 批准]
[root@master ~]# kubectl get csr
NAME AGE REQUESTOR CONDITION
node-csr-c69HXe7aYcqkS1bKmH4faEnHAWxn6i2bHZ2mD04jZyQ 18s system:bootstrap:878f07 Pending
[root@master ~]# kubectl certificate approve node-csr-c69HXe7aYcqkS1bKmH4faEnHAWxn6i2bHZ2mD04jZyQ
certificatesigningrequest "node-csr-c69HXe7aYcqkS1bKmH4faEnHAWxn6i2bHZ2mD04jZyQ" approved
[root@master ~]# kubectl get csr
NAME AGE REQUESTOR CONDITION
node-csr-c69HXe7aYcqkS1bKmH4faEnHAWxn6i2bHZ2mD04jZyQ 1m system:bootstrap:878f07 Approved,Issued
只有执行了 kubectl certificate approve 后,kubeadm join 才会继续
二:kubeadm故障排除
问题:
[root@k8s-node-1 ~]# kubeadm join 192.168.122.201:6443 --token fmqvwn.6h11y2ayq23r7zmw --discovery-token-ca-cert-hash sha256:42e125ef64f5aabc67ae0e0f14b58270be35fde8ff4f7b9a47d5d76a74a97c4a
W0107 17:53:50.512517 14686 join.go:346] [preflight] WARNING: JoinControlPane.controlPlane settings will be ignored when control-plane flag is not set.
[preflight] Running pre-flight checks
[WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/
error execution phase preflight: couldn't validate the identity of the API Server: abort connecting to API servers after timeout of 5m0s
解决方案:
因为kubeadm在使用过程中token的有效期只有24h,需要重新生成,才能解决上述问题
生成token:
[root@k8s-master ~]# kubeadm token create
ntqpnh.f5tbwenab50233at
查看有效期:
[root@k8s-master ~]# kubeadm token list
TOKEN TTL EXPIRES USAGES DESCRIPTION EXTRA GROUPS
ntqpnh.f5tbwenab50233at 23h 2020-01-08T19:27:01+08:00 authentication,signing <none> system:bootstrappers:kubeadm:default-node-token
生成令牌:
[root@k8s-master ~]# openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
42e125ef64f5aabc67ae0e0f14b58270be35fde8ff4f7b9a47d5d76a74a97c4a
node节点重新加入:
[root@k8s-node-1 ~]# kubeadm join 192.168.122.201:6443 --token ntqpnh.f5tbwenab50233at --discovery-token-ca-cert-hash sha256:42e125ef64f5aabc67ae0e0f14b58270be35fde8ff4f7b9a47d5d76a74a97c4a
更多推荐
所有评论(0)