Kubernetes客户证书(RKE管理)

时间:2018-04-19 10:33:27

标签: ssl kubernetes rancher

我目前正在使用AWS EC2虚拟机(使用CentOS 7和Docker 17.03.2-ce)通过Rancher RKE部署K8S群集。 不幸的是,在推断K8S仪表板之后,我无法通过API SERVER(https://API-server-ip:6443/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/)从外部访问它。 服务启动并运行没有问题:

template<class... Ts> struct types {};

template<class Types, class T> struct is_in : public std::false_type {};
template<class... Ts, class T>
struct is_in<types<T, Ts...>, T> : public std::true_type {};
template<class... Ts, class T0, class T>
struct is_in<types<T0, Ts...>, T> : public is_in<types<Ts...>, T> {};

template<class Derived, bool B, class T> struct func_provider {};
template<class Derived, class T, class... Ts>
struct func_collector
    : public func_provider<Derived, is_in<Ts, T>::value, Ts>...
{};


// implement functions for int
template<class Derived>
struct func_provider<Derived, true, types<int>> {
    void funcA1() {
        auto self = static_cast<Derived*>(this);
        // do something with self
    }
};

// implement functions for double
template<class Derived>
struct func_provider<Derived, true, types<double>> { void funcA2() {} };

// implement functions for both int and double
template<class Derived>
struct func_provider<Derived, true, types<int, double>> { void funcA1_2() {} };

template<class T>
struct foo : public func_collector<foo<T>, T,
    // pull desired functions
    types<int>, types<double>, types<int, double>>
{
    void common() {}
};

int main() {
    foo<int> f;
    foo<double> g;
    f.common();
    f.funcA1();
    f.funcA1_2();
    // f.funcA2(); // Error
    g.funcA2();
    g.funcA1_2();
    // g.funcA1(); // Error
}

我看到PEM证书已经在API SERVER机器的/ etc / kubernetes / ssl中创建了:

NAMESPACE       NAME                   TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)         AGE
default         kubernetes             ClusterIP   10.43.0.1       <none>        443/TCP         1h
ingress-nginx   default-http-backend   ClusterIP   10.43.76.101    <none>        80/TCP          1h
kube-system     kube-dns               ClusterIP   10.43.0.10      <none>        53/UDP,53/TCP   1h
kube-system     kubernetes-dashboard   ClusterIP   10.43.198.196   <none>        443/TCP         1h

我尝试使用-rw-r--r--. 1 root root 1679 Apr 19 09:19 kube-apiserver-key.pem -rw-r--r--. 1 root root 1302 Apr 19 09:19 kube-apiserver.pem -rw-r--r--. 1 root root 1679 Apr 19 09:19 kube-ca-key.pem -rw-r--r--. 1 root root 1017 Apr 19 09:19 kube-ca.pem -rw-r--r--. 1 root root 493 Apr 19 09:19 kubecfg-kube-controller-manager.yaml -rw-r--r--. 1 root root 437 Apr 19 09:19 kubecfg-kube-node.yaml -rw-r--r--. 1 root root 441 Apr 19 09:19 kubecfg-kube-proxy.yaml -rw-r--r--. 1 root root 457 Apr 19 09:19 kubecfg-kube-scheduler.yaml -rw-r--r--. 1 root root 1675 Apr 19 09:19 kube-controller-manager-key.pem -rw-r--r--. 1 root root 1062 Apr 19 09:19 kube-controller-manager.pem -rw-r--r--. 1 root root 1679 Apr 19 09:19 kube-etcd-<...>-compute-amazonaws-com-key.pem -rw-r--r--. 1 root root 1298 Apr 19 09:19 kube-etcd-<...>-us-east-2-compute-amazonaws-com.pem -rw-r--r--. 1 root root 1679 Apr 19 09:19 kube-node-key.pem -rw-r--r--. 1 root root 1070 Apr 19 09:19 kube-node.pem -rw-r--r--. 1 root root 1675 Apr 19 09:19 kube-proxy-key.pem -rw-r--r--. 1 root root 1046 Apr 19 09:19 kube-proxy.pem -rw-r--r--. 1 root root 1675 Apr 19 09:19 kube-scheduler-key.pem -rw-r--r--. 1 root root 1050 Apr 19 09:19 kube-scheduler.pem 作为密钥来生成客户端证书kube-apiserver-key.pem并最终使用它来访问。遗憾的是,生成的证书格式无效(我尝试在MacOS X和SSL在线验证器上安装。

任何帮助?

1 个答案:

答案 0 :(得分:1)

经过多次挖掘,我设法找到了解决方案。

在生成RKE kubeconfig生成的文件中,客户端证书数据和客户端密钥数据都作为kube-admin的base64编码密钥出现。

为了在我的客户端浏览器中使用它们,我首先解码它们以获取相应的证书和密钥

echo '<KUBE_ADMIN_CLIENT_CERTIFICATE_DATA>' | base64 --decode > kube-admin-cert.pem

echo '<KUBE_ADMIN_CLIENT_KEY_DATA>' | base64 --decode > kube-admin-cert-key.pem

生成证书后,可以提取相应的.p12证书文件

openssl pkcs12 -export -clcerts -inkey kube-admin-cert-key.pem -in kube-admin-cert.pem -out kube-admin-cert.p12

最终,一旦在本地客户端浏览器中安装了p12证书,就可以成功验证代理api服务器。