如果在安全的内网中,k8s的各个组件与apiserver通讯可以通过8080端口,但是如果需要提供外网访问,更安全的做法是启用HTTPS。在使用客户端证书身份验证时,可以通过Easyrsa、Openssl、Cfssl生成证书,本篇博客基于Openssl。
CA签名的双向数字证书生成过程如下:
使用Openssl工具在master节点上创建CA证书。
openssl genrsa -out ca.key 2048
openssl req -x509 -new -nodes -key ca.key -subj "/CN=kube.chen" -days 5000 -out ca.crt
openssl genrsa -out server.key 2048
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
master_ssl.cnf的配置如下,IP.1的IP地址跟apiserver配置的--service-cluster-ip-rang有关系,一般取第一个IP地址,IP2的IP地址是master节点的IP地址。
ions = 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.chen
IP.1 = 170.170.0.1
IP.2 = 10.0.2.15
通过两个步骤生成以下文件:ca.crt, ca.key, ca.srl, server.crt, server.csr, server.key,并复制到/var/run/kubernetes/目录下。
然后配置apiserver的启动参数,配置如下:
KUBE_API_ARGS="--etcd-servers=http://127.0.0.1:2379 --insecure-bind-address=0.0.0.0 --insecure-port=0 --secure-port=443 --service-cluster-ip-range=170.170.0.0/16 --service-node-port-range=1-65535 --admission-control=NamespaceLifecycle,ServiceAccount,LimitRanger,ResourceQuota --logtostderr=false --log-dir=/home/chen/log/kubenetes --v=2"
KUBE_API_CERT="--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"
同时关闭8080端口,启动443端口:--insecure-port=0 --secure-port=443
启动apiserver,如下:
生成私钥、证书,并用CA证书签名,执行命令如下:
openssl genrsa -out cs_client.key 2048
openssl req -new -key cs_client.key -subj “/CN=kube.chen” -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文件,该文件controller和scheduler共用:
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和kube-scheduler的启动配置:
kube-controller-manager配置如下:
KUBE_CONTROLLER_MANAGER_ARGS="--master=https://10.0.2.15:443 --logtostderr=false --log-dir=/home/chen/log/kubernetes --v=2 --service-account-private-key-file=/var/run/kubernetes/server.key --root-ca-file=/var/run/kubernetes/ca.crt --kubeconfig=/etc/kubernetes/kubeconfig"
kube-scheduler配置如下:
KUBE_SCHEDULER_ARGS="--master=https://10.0.2.15:443 --logtostderr=false --log-dir=/home/chen/log/kubernetes --v=2 --kubeconfig=/etc/kubernetes/kubeconfig"
分别启动kube-controller-manager和kube-scheduler,截图如下:
生产私钥、证书,并用CA签名
openssl genrsa -out kubelet_client.key 2048
openssl req -new -key kubelet_client.key -subj "/CN=kube.chen" -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目录下,其中ca.crt和ca.key是master生成的私钥和证书。
创建/etc/kubernetes/kubeconfig_node文件,文件如下:
apiVersion: v1
kind: Config
users:
- name: kubelet
user:
client-certificate: /var/run/kubernetes/kubelet_client.crt
client-key: /var/run/kubernetes/kubelet_client.key
clusters:
- name: local
cluster:
server: https://10.0.2.15:443
certificate-authority: /var/run/kubernetes/ca.crt
contexts:
- context:
cluster: local
user: kubelet
name: my-context
current-context: my-context
配置kubelet的启动参数,配置如下:
KUBELET_ARGS="--kubeconfig=/etc/kubernetes/kubeconfig_node --api-servers=https://10.0.2.15:443 --fail-swap-on=false --runtime-cgroups=/systemd/system.slice --kubelet-cgroups=/systemd/system.slice --logtostderr=false --log-dir=/home/chen/log/kubenetes --v=2"
配置kube-proxy的启动参数,配置如下:
KUBE_PROXY_ARGS="--master=https://10.0.2.15:443 --logtostderr=false --log-dir=/home/chen/log/kubernetes --v=2 --kubeconfig=/etc/kubernetes/kubeconfig_node"
分别启动kubelet和kube-proxy,截图如下:
然后在通过以下命令:
kubectl --server=https://10.0.2.15:443 --certificate-authority=/var/run/kubernetes/ca.crt --client-certificate=/var/run/kubernetes/cs_client.crt --client-key=/var/run/kubernetes/cs_client.key get nodes
既可以对apiserver进行安全的访问了。
通过CA签名的双向数字证书认证的方式稍微比较复杂,现在实际的案例中通过cfssl生成证书的比较常见,下来有时间写一篇关于基于cfssl的博客。本文参考了点击打开链接