k8s client 通过KubeConfig和证书方式连接api server
一、背景
本文以kubePi这样一个k8s客户端为示例,使用证书方式,怎么连接k8s集群。
然后告诉你证书是如何生成的,
最后通过一个Python编程示例,在程序里如何使用。

api server地址:比如https://110.206.56.308:6443
Certificate:证书内容
Certificate Key:证书的私钥
先说下他们的格式到底是怎么样,然后再说从哪里去得到这两个东西。
- crt 客户端证书文件格式:

- key客户端私钥文件格式

二、KubeConfig
如果你已使用kubeconfig文件连接了k8s。
如果你使用的是阿里云k8s容器的话,找到连接信息。

使用KubeConfig方式连接K8S,进入其终端。

第一步、找到你的用户名是什么,通过“kubectl config view --raw”
第二步、导出证书内容;
#提取 base64 编码的证书 , 我这里的用户名是admin
kubectl config view --raw -o jsonpath='{.users[?(@.name=="admin")].user.client-certificate-data}' | base64 -d > client.crt
client.crt内容对应上文的Certificate
第三步、导出证书的私钥;
# 提取 base64 编码的密钥
kubectl config view --raw -o jsonpath='{.users[?(@.name=="admin")].user.client-key-data}' | base64 -d > client.key
client.key内容对应上文的Certificate Key
三、手动生成证书
在使用客户端证书认证的场景下,你可以通过 easyrsa、 openssl 或 cfssl 等工具以手工方式生成证书。
详见官方网站地址:https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/certificates/#cfssl
这里可以总结为三步:
- 准备 CA 根证书
- 生成客户端证书
- 在 kubeconfig 中配置证书认证
1、准备 CA 根证书
#创建 CA 配置文件(ca-config.json)
cat > ca-config.json <<'EOF'
{
"signing": {
"default": { "expiry": "87600h" },
"profiles": {
"client": { "usages": ["client auth"], "expiry": "87600h" }
}
}
}
EOF
#创建 CA 证书请求(ca-csr.json)
cat > ca-csr.json <<'EOF'
{
"CN": "kubernetes-ca",
"key": { "algo": "rsa", "size": 2048 },
"names": [
{ "C": "CN", "ST": "Shanghai", "L": "Shanghai", "O": "Kubernetes", "OU": "CA" }
]
}
EOF
# 生成 CA 证书 + 私钥
cfssl gencert -initca ca-csr.json | cfssljson -bare ca
自此,就得到了 ca.pem(根证书)和 ca-key.pem(根私钥)。
2、生成客户端证书
# 创建客户端证书请求(client-csr.json)
cat > client-csr.json <<'EOF'
{
"CN": "alice", # 用户名,apiserver 会提取为 User
"key": { "algo": "rsa", "size": 2048 },
"names": [
{ "C": "CN", "ST": "Shanghai", "L": "Shanghai", "O": "system:masters", "OU": "Kubernetes" }
]
}
EOF
# 使用 CA 签发客户端证书
cfssl gencert \
-ca=ca.pem \
-ca-key=ca-key.pem \
-config=ca-config.json \
-profile=client \
client-csr.json | cfssljson -bare client
到这一步,客户端连接k8s所需要的 client.pem(客户端证书)和 client-key.pem(客户端私钥)。
3、在 kubeconfig 中配置证书认证
kubectl config set-cluster my-cluster \
--server=https://<apiserver-ip>:6443 \
--certificate-authority=ca.pem
kubectl config set-credentials admin \
--client-certificate=client.pem \
--client-key=client-key.pem
kubectl config set-context admin@my-cluster \
--cluster=my-cluster \
--user=admin
kubectl config use-context admin@my-cluster
现在 kubectl 会使用客户端证书 + 私钥与 apiserver 进行双向 TLS 认证。
四、python调用示例
当我们有了client证书和私钥后,也可以方便地使用python等编程语言来操作k8s。
import sys
import requests
import json
import yaml
import urllib3
# close http waring
urllib3.disable_warnings()
url = "https://<apiserver-ip>:6443"
namespace = "consul"
api = "/apis/apps/v1/namespaces/%s/deployments" %namespace
api_url = "%s%s" %(url, api)
client_certs = "/opt/client-cert.pem"
client_key = "/opt/client-key.pem"
def get_info(service):
headers = {"content-type": "application/strategic-merge-patch+json"}
_api_url = "%s/%s" %(api_url, service)
response = requests.get(_api_url, cert=(client_certs, client_key), verify=False, headers=headers)
response_data = json.loads(response.text)
print(response_data)
k8s官网是通过KubeConfig连接api server,注意有所区别。
更多推荐


所有评论(0)