kubernetes构建微服务-CA签名双向数字证书

前言

如果在安全的内网中,k8s的各个组件与apiserver通讯可以通过8080端口,但是如果需要提供外网访问,更安全的做法是启用HTTPS。在使用客户端证书身份验证时,可以通过Easyrsa、Openssl、Cfssl生成证书,本篇博客基于Openssl。

CA签名的双向数字证书生成过程如下:

  • 在master节点上生成CA证书
  • 在apiserver生成一个数字证书,并用CA证书签名
  • 配置apiserver证书启动参数,包括CA证书、CA证书签名后的证书及私钥
  • 为kube-controller-manager、kube-scheduler、kubelet、kube-proxy及kubelet生成自己的数字证书,并用CA证书签名,然后配置启动证书的参数

Master节点生成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

Apiserver生成一个数字证书,并用CA证书签名

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证书启动参数

然后配置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"
  • --client-ca-file代表CA根证书文件
  • --tls-private-key-file代表服务端私钥
  • --tls-cert-file代表服务端证书

同时关闭8080端口,启动443端口:--insecure-port=0 --secure-port=443

启动apiserver,如下:


配置kube-controller-manager和kube-scheduler证书及启动参数

生成私钥、证书,并用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,截图如下:



配置kubelet和kube-proxy证书及启动参数

生产私钥、证书,并用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的博客。本文参考了点击打开链接

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值