一、背景

本文以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)

kubernetes-client-python示例

k8s官网是通过KubeConfig连接api server,注意有所区别。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐