基于CA签名的双向数字证书认证方式

在一个安全的内网环境中,Kubernetes各个组件与Master之间可以通过apiserver的非安全端口http://apiserver:8080 访问。

如果apiserver需要对外提供服务,或者集群中的某些容器需要访问apiserver以获取集群中的某些信息,更安全的方法是启用HTTPS安全机制。Kuernetes提供基于CA签名的双向数字认证方式和简单的基于HTTP BASIC或TOKEN的认证方式。

基于CA签名的双向数字证书的生成过程是:

  • 为kube-apiserver生成一个数字证书,并用CA证书进行签名

  • 为kube-apiserver进程配置证书相关的启动参数,包括CA证书、自己经过CA签名后的证书及私钥

  • 为每个访问Kubernetes API Server的客户端进程生成自己的数字证书,并使用CA证书签名,在相关程序的启动参数中增加CA证书、自己的证书等相关参数

设置kube-apiserver

首先,使用OpenSSL工具在Master服务器创建CA证书和私钥相关的文件

openssl genrsa -out ca.key 2048
openssl req -x509 -new -nodes -key ca.key -subj "/CN=yourcompany.com" -days 5000 -out ca.crt
openssl genrsa -out server.key 2048

配置master_ssl.cnf

[req]
req_extensions=v3_req
distinguished_name=req_distinguished_name
[req_distinguished_name]
[v3_req]
basicConstraints=CA:FALSE
keyUsage=nonRepudiation,digitalSignature,keyEncipherment
subjectAltName=@alt_names
[alt_names]
DNS.1=kubernetes
DNS.2=kubernetes.default
DNS.3=kubernetes.default.svc
DNS.4=kubernetes.default.svc.cluster.local
DNS.5=k8s-master
IP.1=169.169.0.1
IP.2=192.168.18.3

基于master_ssl.conf 创建server.csr和server.crt

openssl req -new -key server.key -subj "/CN=k8s-master" -config master_ssl.cnf -out server.csr
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -days 5000 -extensions v3_req -extfile master_ssl.cnf -out server.crt

将这些文件复制到目录/var/run/kubernetes/ ,设置kube-apiserver启动参数

--client_ca_file=/var/run/kubernetes/ca.crt
--tls-private-key-file=/var/run/kubernetes/server.key
--tls-cert-file=/var/run/kubernetes/server.crt

关闭非安全端口,设置安全端口

--insecure-port=0
--secure-port=443

重启kube-apiserver服务。

设置kube-controller-manager

openssl genrsa -out cs_client.key 2048
openssl req -new -key cs_client.key -subj "/CN=k8s-node-1" -out cs_client.csr
openssl x509 -req -in cs_client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out cs_client.crt -days 5000

将生成的文件复制到/var/run/kubernetes

/etc/kubernetes/kubeconfig 配置客户端证书等相关参数

apiVersion: v1
kind: Config
users:
- name: controllermanager
  user:
    client-certificate: /var/run/kubernetes/cs_client.crt
    client-key: /var/run/kubernetes/cs_client.key
clusters:
- name: local
  cluster:
    certificate-authority: /var/run/kubernetes/ca.crt
contexts:
- context:
    cluster: local
    user: controllermanager
  name: my-context
current-context: my-context

设置kube-controller-manager服务的启动参数

--master=https://192.168.18.3.443
--service_account_private_key_file=/var/run/kubernetes/server.key
--root-ca-file=/var/run/kubernetes/ca.crt
--kubeconfig=/etc/kubernetes/kubeconfig

重启kube-controller-manager服务。

kube-scheduler

kube-scheduler复用kube-controller-manager创建的客户端证书,配置启动参数

--master=https://192.168.18.3:443
--kubeconfig=/etc/kubernetes/kubeconfig

重启kube-scheduler服务。

设置kubelet

复制kube-apiserver的ca.crt和ca.key文件到node

openssl genrsa -out kubelet_client.key 2048
openssl req -new -key kubelet_client.key -subj "/CN=192.168.18.4" -out kubelet_client.csr
openssl x509 -req -in kubelet_client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out kubelet_client.crt -days 5000

将文件复制到/var/run/kubernetes。

创建/etc/kubernetes/kubeconfig 文件,配置客户端证书等相关参数

apiVersion: v1
kind: Config
users:
- name: kubelet
  user:
    client-certificate: /etc/kubernetes/ssl_keys/kubelet_client.crt
    client-key: /etc/kubernetes/ssl_keys/kubelete_client.key
clusters:
- name: local
  cluster:
    certificate-authority: /etc/kubernetes/ssl_keys/ca.crt
  contexts:
  - context:
      cluster: local
      user: kubelet
    name: my-context
  current-context: my-context

kubelet启动参数

--api_servers=https://192.168.18.3:443
--kubeconfig=/etc/kubelet/kubeconfig

重启kubelet服务。

设置kube-proxy

kube-proxy复用kubelet创建的客户端证书,配置启动参数

--master=https://192.168.18.3:443
--kubeconfig=/etc/kubernetes/kubeconfig

重启kube-proxy服务。

设置kubectl

在使用kubectl对kubernetes集群操作时,默认使用非安全端口8080对apiserver进行访问,也可以设置为安全访问apiserver的模式。

kubectl --server=https://k8s-master:443 
--certificate-authority=/etc/kubernetes/ssl_keys/ca.crt 
--client-certificate=/etc/kubernetes/ssl_keys/cs_client.crt 
--client-key=/etc/kubernetes/ssl_keys/cs_client.key 
get nodes

基于HTTP BASIC或TOKEN的简单认证方式

客户端需要提供用户名、密码或Token完成认证过程。

kubectl同时支持CA双向认证与简单认证两种模式。其他组件只能配置为CA双向安全认证或非安全模式。

基于基本认证

首先创建/etc/kubernetes/basic_auth_file

admin,admin,1
system,system,2

设置kube-apiserver启动参数

--secure-port=443
--basic_auth_file=/etc/kubernetes/basic_auth_file

重启kube-apiserver服务。

kubectl使用用户名和密码访问apiserver

kubectl --server=https://192.168.18.3:443 --username=admin --password=admin --insecure-skip-tls-verify=true 
get nodes

基于Token认证

创建/etc/kubernetes/token_auth_file

admin,admin,1
system,system,2

设置kube-apiserver启动参数

--secure-port=443
--token_auth_file=/etc/kubernetes/token_auth_file

重启apiserver服务。

使用curl验证和访问apiserver

curl -k --header "Authorization:Bearer admin" https://192.168.18.3:443/version

results matching ""

    No results matching ""