Kubernetes中API Server使用token访问
因自建集群,默认的apiserver-advertise-address是一个内网IP,自建的CA会为apiserver签发了一个证书,默认可访问的是内网IP、kubernetes、kubernetes.default kubernetes.default.svc、kubernetes.default.svc.cluster.local,不包含设备的外网IP。所以直接使用cfssl根据CA根证书签
·
因自建集群,默认的apiserver-advertise-address是一个内网IP,自建的CA会为apiserver签发了一个证书,默认可访问的是内网IP、kubernetes、kubernetes.default kubernetes.default.svc、kubernetes.default.svc.cluster.local,不包含设备的外网IP。所以直接使用cfssl根据CA根证书签发的证书配置kubectl是无法访问集群的,需要将这个公网IP添加到允许访问apiserver列表中。
把端口映射出来一直无法访问集群,报以下错误
Unable to connect to the server: x509: certificate is valid for 10.96.0.1, 192.168.3.10, not <master节点的公网IP>
API Server认证管理
Kubernetes集群中所有资源的访问和变更都是通过Kubernetes API Server的REST API来实现的,所以集群安全的关键点就在于如何鉴权和授权
Kubernetes集群提供了3种级别的客户端身份认证方式
HTTP Token认证:通过一个Token来识别合法用户。
HTTPS 证书认证:基于CA根证书签名的双向数字证书认证方式
HTTP Base认证:通过用户名+密码的方式认证,这个只有1.19之前的版本适用,之后的版本不在支持
HTTP Token认证
HTTP Token的认证是用一个很长的特殊编码方式的并且难以被模仿的字符串Token来表明客户身份的一种方式。
每个Token对应一个用户名,存储在APIServer能访问的一个文件中。当客户端发起API调用请求时,需要在HTTP Header里放入Token,这样一来, API Server就能识别合法用户和非法用户了。
当 API 服务器的命令行设置了–token-auth-file=SOMEFILE选项时,会从文件中 读取持有者令牌。目前,令牌会长期有效,并且在不重启 API 服务器的情况下 无法更改令牌列表。下面我们一个通过Demo来演示通过静态Token的用户认证,
比如我的集群信息如下:
root@ipo# kubectl cluster-info
Kubernetes control plane is running at https://172.31.9.115:6443
CoreDNS is running at https://172.31.9.115:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/prTo further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
1 通过openssl生成一个令牌
# openssl rand -hex 10
4bf42S36c8ff0a0fb
令牌文件是一个 CSV 文件,包含至少 3 个列:令牌、用户名和用户的 UID。 其余列被视为可选的组名。这里需要注意的是,令牌文件要放到/etc/kubernetes/pki目录下才可以,可能默认读取令牌的位置即是这个位置
echo "4bf42S36c8ff0a0fb,admins8,3" > /etc/kubernetes/pki/amins8.csv
cat /etc/kubernetes/pki/amins8.csv
4bf42S36c8ff0a0fb,admins8,3
通过Sed添加kube-apiserver服务启动参数,- --token-auth-file=/etc/kubernetes/pki/amins8.csv
#尝试替换
sed '17a \ \ \ \ - --token-auth-file=/etc/kubernetes/pki/amins8.csv' /etc/kubernetes/manifests/kube-apiserver.yaml | grep -A 5 command
#正式sed替换
sed -i '17a \ \ \ \ - --token-auth-file=/etc/kubernetes/pki/amins8.csv' /etc/kubernetes/manifests/kube-apiserver.yaml
#查看
cat -n /etc/kubernetes/manifests/kube-apiserver.yaml | grep -A 5 comma
效果如下:
root@ip-172# sed '17a \ \ \ \ - --token-auth-file=/etc/kubernetes/pki/amins8.csv' /ver.yaml | grep -A 5 command
- command:
- kube-apiserver
- --service-node-port-range=80-65535
- --advertise-address=172.31.9.115
- --token-auth-file=/etc/kubernetes/pki/amins8.csv
- --allow-privileged=true
root@ip-172# sed -i '17a \ \ \ \ - --token-auth-file=/etc/kubernetes/pki/amins8.csvserver.yaml
检查修改的启动参数
root@ip-172# cat -n /etc/kubernetes/manifests/kube-apiserver.yaml | grep -A 5 comma
14 - command:
15 - kube-apiserver
16 - --service-node-port-range=80-65535
17 - --advertise-address=172.31.9.115
18 - --token-auth-file=/etc/kubernetes/pki/amins8.csv
19 - --allow-privileged=true
无需重启 kubelet服务
客户端访问
[root@docker02 ~]# kubectl -s="https://你的公网IP:6443" --insecure-skip-tls-verify=true --token="4bf42S36c8ff0a0fb" get pods -n kube-system
NAME READY STATUS RESTARTS AGE
cilium-gpbfd 1/1 Running 0 17h
cilium-operator-5f6c65555d-h297t 1/1 Running 4 (52m ago) 17h
cilium-w8flp 1/1 Running 1 (3h55m ago) 17h
coredns-6d8c4cb4d-n8qgw 1/1 Running 0 17h
coredns-6d8c4cb4d-tgbjb 1/1 Running 0 17h
etcd-ip-172-31-9-115 1/1 Running 1 (3h55m ago) 17h
kube-apiserver-ip-172-31-9-115 1/1 Running 0 51m
kube-controller-manager-ip-172-31-9-115 1/1 Running 3 (52m ago) 17h
kube-proxy-2cc6p 1/1 Running 0 17h
kube-proxy-mmk97 1/1 Running 1 (3h55m ago) 17h
命令太长可以通过别名访问
alias kubectl='kubectl -s="https://你的公网IP:6443" --insecure-skip-tls-verify=true --token="4bf42S36c8ff0a0fb"'
定义别名永久生效:
/etc/profile 全局生效
~/.bashrc 当前用户生效
vim ~/.bashrc
alias kubectl='kubectl -s="https://你的公网IP:6443" --insecure-skip-tls-verify=true --token="4bf42S36c8ff0a0fb"'
保存
source .bashrc
PS:
如果访问得到以下提示
在集群外的客户机访问集群信息,这里提示刚才创建得用户没有访问的权限,说明已经认证成功了,只是没有权限
Error from server (Forbidden): pods is forbidden: User "admins" cannot list resource "pods" in API group "" in the namespace "kube-system"
Token和集群的Token文件不对应,会提示我们没有获得授权,即认证失败
error: You must be logged in to the server (Unauthorized)
== 解决需要拷贝.kube/config文件拷贝到本地替换你的公网IP ==
如下:
更多推荐
所有评论(0)