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根证书签发的证书配置kubectl是无法访问集群的,需要将这个公网IP添加到允许访问apiserver列表中。

把端口映射出来一直无法访问集群,报以下错误
Unable to connect to the server: x509: certificate is valid for 10.96.0.1, 192.168.3.10, not 

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 ==
如下:
Kubernetes中API Server使用token访问_第1张图片

你可能感兴趣的:(Kubernetes,k8s,docker,kubernetes,容器)