Kubernetes 系统提供了三种认证方式:CA 认证、Token 认证 和 Base 认证。安全功能是一把双刃剑,它保护系统不被攻击,但是也带来额外的性能损耗。集群内的各组件访问 API Server 时,由于它们与 API Server 同时处于同一局域网内,所以建议用非安全的方式访问 API Server 效率更高。

接下来对集群的双向认证配置和简单认证配置过程进行详细说明。

双向认证配置

双向认证方式是最为严格和安全的集群安全配置方式,主要配置流程如下:

  1. 生成根证书、API Server 服务端证书、服务端私钥、各个组件所用的客户端证书和客户端私钥。
  2. 修改 Kubernetes 各个服务进程的启动参数,启用双向认证模式。

详细的配置操作流程如下:

生成根证书

用 openssl 工具生成 CA 证书,请注意将其中 subject 等参数改为用户所需的数据,CN 的值通常是域名、主机名或 IP 地址。

  1. $ cd /var/run/kubernetes
  2. $ openssl genrsa -out dd_ca.key 2048
  3. $ openssl req -x509 -new -nodes -key dd_ca.key -subj "/CN=YOUDOMAIN.COM" -days 5000 -out dd_ca.crt

生成 API Server 服务端证书和私钥

  1. $ openssl genrsa -out dd_server.key 2048
  2. $ HN=`hostname`
  3. $ openssl req -new -key dd_server.key -subj "/CN=$HN" -out dd_server.csr
  4. $ openssl x509 -req -in dd_server.csr -CA dd_ca.crt -CAkey dd_ca.key -CAcreateserial-out dd_server.crt -days 5000

生成 Controller Manager 与 Scheduler 进程共用的证书和私钥

  1. $ openssl genrsa -out dd_cs_client.key 2048
  2. $ openssl req -new -key dd_cs_client.key -subj "/CN=$HN" -out dd_cs_client.csr
  3. $ openssl x509 -req -in dd_cs_client.csr CA dd_ca.crt -CAkey dd_ca.key -CAcreateserial -out dd_cs_client.crt -days 5000

生成 Kubelet 所用的客户端证书和私钥

注意,这里假设 Kubelet 所在机器的 IP 地址为 192.168.1.129。

  1. $ openssl genrsa -out dd_kubelet_client.key 2048
  2. $ openssl req -new -key dd_kubelet_client.key -subj "/CN=192.168.1.129" -out dd_kubelet_client.csr
  3. $ openssl x509 -req -in dd_kubelet_client.csr -CA dd_ca.crt -CAkey dd_ca.key -CAcreateserial -out dd_kubelet_client.crt -days 5000

修改 API Server 的启动参数

增加 CA 根证书、Server 自身证书等参数并设置安全端口为 443.

修改/etc/kubernetes/apiserver 配置文件的 KUBE_API_ARGS 参数:

  1. KUBE_API_ARGS="--log-dir=/var/log/kubernetes --secure-port=443 --client_ca_file=/var/run/kubernetes/dd_ca.crt --tls-private-key-file=/var/run/kubernetes/dd_server.key --tls-cert-file=/var/run/kubernetes/dd_server.crt"

重启 kube-apiserver 服务:

  1. # systemctl restart kube-apiserver

验证 API Server 的 HTTPS 服务。

  1. $ curl https://kubernetes-master:443/api/v1/nodes --cert /var/run/kubernetes/dd_cs_client.crt --key /var/run/kubernetes/dd_cs_client.key --cacert /var/run/kubernetes/dd_ca.crt

修改 Controller Manager 的启动参数

修改/etc/kubernetes/controller-manager 配置文件

  1. KUBE_CONTROLLER_MANAGER_ARGS="--log-dir=/var/log/kubernetes --service_account_private_key_file=/var/run/kubernetes/server.key --root-ca-file=/var/run/kubernetes/ca.crt --master=https://kubernetes-master:443 --kubeconfig=/etc/kubernetes/cmkubeconfig"

创建/etc/kubernetes/cmkubeconfig 文件,配置证书等相关参数,具体内容如下:

  1. apiVersion: v1
  2. kind: Config
  3. users
  4. - name: controllermanager
  5. user:
  6. client-certificate: /var/run/kubernetes/dd_cs_client.crt
  7. client-key: /var/run/kubernetes/dd_cs_client.key
  8. clusters:
  9. - name: local
  10. cluster:
  11. certificate-authority: /var/run/kubernetes/dd_ca.crt
  12. contexts:
  13. - context:
  14. cluster: local
  15. user: controllermanager
  16. name: my-context
  17. current-context: my-context

重启 kube-controller-manager 服务:

  1. # systemctl restart kube-controller-manager

配置各个节点上的 Kubelet 进程

复制 Kubelet 的证书、私钥 与 CA 根证书到所有 Node 上。

  1. $ scp /var/run/kubernetes/dd_kubelet* root@kubernetes-minion1:/home
  2. $ scp /var/run/kubernetes/dd_ca.* root@kubernetes-minion:/home

在每个 Node 上创建/var/lib/kubelet/kubeconfig 文件,内容如下:

  1. apiVersion: v1
  2. kind: Config
  3. users:
  4. - name: kubelet
  5. user:
  6. client-certificats: /home/dd_kubelet_client.crt
  7. client-key: /home/dd_kubelet_client.key
  8. clusters:
  9. - name: local
  10. cluster:
  11. certificate-authority: /home/dd_ca.crt
  12. contexts:
  13. - context:
  14. cluster: local
  15. user: kubelet
  16. name: my-context
  17. current-context: my-context

修改 Kubelet 的启动参数,以修改/etc/kubernetes/kubelet 配置文件为例:

  1. KUBELET_API_SERVER="--api_servers=https://kubernetes-master:443"
  2. KUBELET_ARGS="--pod_infro_container_image=192.168.1.128:1180/google_containers/pause:latest --cluster_dns=10.2.0.100 --cluster_domain=cluster.local --kubeconfig=/var/lib/kubelet/kubeconfig"

重启 kubelet 服务:

  1. # systemctl restart kubelet

配置 kube-proxy

首先,创建/var/lib/kubeproxy/proxykubeconfig 文件,内容如下:

  1. apiVersion: v1
  2. kind: Config
  3. users:
  4. - name: kubeproxy
  5. user:
  6. client-certificate: /home/dd_kubelet_client.crt
  7. client-key: /home/dd_kubelet_client.key
  8. clusters:
  9. - name: local
  10. cluster:
  11. certificate-authority: /home/dd_ca.crt
  12. contexts:
  13. - context:
  14. cluster: local
  15. user: kubeproxy
  16. name: my-context
  17. current-context: my-context

然后,修改 kube-proxy 的启动参数,引用上述文件并指明 API Server 在安全模式下的访问地址,以修改配置文件/etc/kubenetes/proxy 为例:

  1. KUBE_PROXY_ARGS="--kubeconfig=/var/lib/kubeproxy/proxykubeconfig --master=https://kubenetes-master:443"

重启 kube-proxy 服务:

  1. # systemctl restart kube-proxy

至此,一个双向认证的 Kubernetes 集群环境就搭建完成了。

简单认证配置

除了双向认证方式,Kubernets 也提供了基于 Token 和 HTTP Base 的简单认证方式。通信方式仍然采用 HTTPS,但不使用数字证书。

采用基于 Token 和 HTTP Base 的简单认证方式时,API Server 对外暴露 HTTPS 端口,客户端提供 Token 或用户名、密码来完成认证过程。这里需要说明的一点是 Kubelet 比较特殊,它同时支持双向认证与简单认证两种模式,其他组件智能配置为双向认证或非安全模式。

API Server 基于 Token 认证的配置过程如下

建立包括用户名、密码和 UID 的文件 token_auth_file:

  1. $ cat /root/token_auth_file
  2. dingmingk,dingmingk,1
  3. admin,admin,2
  4. system,system,3

修改 API Server 的配置,采用上述文件进行安全认证

  1. $ vi /etc/kubernetes/apiserver
  2. KUBE_API_ARGS="--secure-port=443 --token_auth_file=/root/token_auth_file"

重启 API Server 服务

  1. # systemctl restart kube-apiserver

用 curl 验证连接 API Server

  1. $ curl https://kubenetes-master:443/version --header "Authorization: Bearer dingmingk" -k
  2. {
  3. "major": "1",
  4. "minor": "0",
  5. "gitVersion": "v1.0.0",
  6. "gitCommit": "xxxHASHCODE",
  7. "gitTreeState": "clean"
  8. }

API Server 基于 HTTP Base 认证的配置过程如下

创建包括用户名、密码和 UID 的文件 basic_auth_file:

  1. $ cat /root/basic_auth_file
  2. dingmingk,dingmingk,1
  3. admin,admin,2
  4. system,system,3

修改 API Server 的配置,采用上述文件进行安全认证

  1. $ vi /etc/kubernetes/apiserver
  2. KUBE_API_ARGS="--secure-port=443 --basic_auth_file=/root/basic_auth_file"

重启 API Server 服务

  1. # systemctl restart kube-apiserver

用 curl 验证连接 API Server

  1. $ curl https://kubernetes-master:443/version --basic -u dingmingk:dingmingk -k
  2. {
  3. "major": "1",
  4. "minor": "0",
  5. "gitVersion": "v1.0.0",
  6. "gitCommit": "xxxHASHCODE",
  7. "gitTreeState": "clean"
  8. }

使用 Kubelet 时则需要指定用户名和密码来访问 API Server

  1. $ kubectl get nodes --server="https://kubernetes-master:443" --api-version="v1" --username="dingmingk" --password="dingmingk" --insecure-skip-tls-verify=true
 

kubectl config set-cluster

在kubeconfig配置文件中设置一个集群项。

摘要

在kubeconfig配置文件中设置一个集群项。 如果指定了一个已存在的名字,将合并新字段并覆盖旧字段。

  1. kubectl config set-cluster NAME [--server=server] [--certificate-authority=path/to/certficate/authority] [--insecure-skip-tls-verify=true]

示例

  1. # 仅设置e2e集群项中的server字段,不影响其他字段
  2. kubectl config set-cluster e2e --server=https://1.2.3.4
  3. # 向e2e集群项中添加认证鉴权数据
  4. kubectl config set-cluster e2e --certificate-authority=~/.kube/e2e/kubernetes.ca.crt
  5. # 取消dev集群项中的证书检查
  6. kubectl config set-cluster e2e --insecure-skip-tls-verify=true

选项

  1. --api-version="": 设置kuebconfig配置文件中集群选项中的api-version
  2. --certificate-authority="": 设置kuebconfig配置文件中集群选项中的certificate-authority路径。
  3. --embed-certs[=false]: 在是否则kubeconfig配置文件中嵌入客户端证书/key
  4. --insecure-skip-tls-verify[=false]: 设置kuebconfig配置文件中集群选项中的insecure-skip-tls-verify开关。
  5. --server="": 设置kuebconfig配置文件中集群选项中的server

继承自父命令的选项

  1. --alsologtostderr[=false]: 同时输出日志到标准错误控制台和文件。
  2. --certificate-authority="": 用以进行认证授权的.cert文件路径。
  3. --client-certificate="": TLS使用的客户端证书路径。
  4. --client-key="": TLS使用的客户端密钥路径。
  5. --cluster="": 指定使用的kubeconfig配置文件中的集群名。
  6. --context="": 指定使用的kubeconfig配置文件中的环境名。
  7. --insecure-skip-tls-verify[=false]: 如果为true,将不会检查服务器凭证的有效性,这会导致你的HTTPS链接变得不安全。
  8. --kubeconfig="": 命令行请求使用的配置文件路径。
  9. --log-backtrace-at=:0: 当日志长度超过定义的行数时,忽略堆栈信息。
  10. --log-dir="": 如果不为空,将日志文件写入此目录。
  11. --log-flush-frequency=5s: 刷新日志的最大时间间隔。
  12. --logtostderr[=true]: 输出日志到标准错误控制台,不输出到文件。
  13. --match-server-version[=false]: 要求服务端和客户端版本匹配。
  14. --namespace="": 如果不为空,命令将使用此namespace
  15. --password="": API Server进行简单认证使用的密码。
  16. -s, --server="": Kubernetes API Server的地址和端口号。
  17. --stderrthreshold=2: 高于此级别的日志将被输出到错误控制台。
  18. --token="": 认证到API Server使用的令牌。
  19. --user="": 指定使用的kubeconfig配置文件中的用户名。
  20. --username="": API Server进行简单认证使用的用户名。
  21. --v=0: 指定输出日志的级别。
  22. --vmodule=: 指定输出日志的模块,格式如下:pattern=N,使用逗号分隔。

Kubernetes集群安全配置案例的更多相关文章

  1. kubernetes 集群安全配置

    版本:v1.10.0-alpha.3 openssl genrsa -out ca.key 2048 openssl req -x509 -new -nodes -key ca.key -subj & ...

  2. Kubernetes集群安全概述

    API的访问安全性 API Server的端口和地址 在默认情况下,API Server通过本地端口和安全端口两个不同的HTTP端口,对外提供API服务,其中本地端口是基于HTTP协议的,用于在本机( ...

  3. Docker学习-Kubernetes - 集群部署

    Docker学习 Docker学习-VMware Workstation 本地多台虚拟机互通,主机网络互通搭建 Docker学习-Docker搭建Consul集群 Docker学习-简单的私有Dock ...

  4. 高可用Kubernetes集群-2. ca证书与秘钥

    四.CA证书与秘钥 kubernetes集群安全访问有两种方式:"基于CA签名的双向数字证书认证"与"基于BASE或TOKEN的简单认证",生产环境推荐使用&q ...

  5. kubernetes集群的认证、授权、准入控制

    一.kubernetes集群安全架构 用户使用kubectl.客户机或通过REST请求访问API.可以授权用户和Kubernetes服务帐户进行API访问.当一个请求到达API时,它会经历几个阶段,如 ...

  6. 一键运行CIS安全扫描,集群安全无忧!

    CIS安全扫描是Rancher 2.4推出的其中一个重磅功能,旨在帮助用户快速.有效地加强集群的安全性.本文将详细介绍CIS安全扫描这一功能,包含详细的操作demo. 本文来自Rancher Labs ...

  7. Kubernetes集群初探

    上文我们在一台虚机上演示了Kubernetes基于redis和docker的guestbook留言簿案例,本文我们将通过配置Kubernetes集群的方式继续深入研究.集群组件安装如下配置. IP N ...

  8. Kubernetes集群的监控报警策略最佳实践

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/M2l0ZgSsVc7r69eFdTj/article/details/79652064 本文为Kub ...

  9. 阿里云上万个 Kubernetes 集群大规模管理实践

    点击下载<不一样的 双11 技术:阿里巴巴经济体云原生实践> 本文节选自<不一样的 双11 技术:阿里巴巴经济体云原生实践>一书,点击上方图片即可下载! 作者 | 汤志敏,阿里 ...

随机推荐

  1. .net下4款不错的微信SDK

    .net下4款不错的微信SDK: 一款值得推荐的.Net微信开发SDK http://www.17ky.net/soft/474.html.Net微信公开帐号接口 WeiXinSDK http://w ...

  2. hdu4348

    题解: 因为卡空间,所以直接到spoj上面去做了 区间修改的线段树 但是加lazy会把之前的操作修改 正确的解法是lazy不下传,只是在当前计算 但是听说可以记录时间的下传,我弱弱不会 代码: #in ...

  3. jquery ajax 无法跨域调用的解决办法

    今天要用到jquery ajax 跨域调用,但是ajax是禁止跨域调用的,所以只能先在php文件使用函数取得跨域的值,然后用ajax调用本地php文件.

  4. JS将日期转化为unix时间戳

    var str = '2008-10-09 21:35:28';//PHP中对应的UNIX时间戳为1223559328 var new_str = str.replace(/:/g,'-'); new ...

  5. 配置total commander 显示所有或特定文件夹 (带点的文件夹)

    在配置|忽略列表 下可以添加或删除需要隐藏的文件夹通配符.

  6. AngularJS-----$compile

    原文:http://docs.ngnice.com/api/ng/service/$compile 写在前面的话: 之前我一直理解错误,我一直以为这句--function([scope], clone ...

  7. SQL语句执行过程详解

    一.SQL语句执行原理: 第一步:客户端把语句发给服务器端执行 当我们在客户端执行select语句时, 客户端会把这条SQL语句发送给服务器端,让服务器端的进程来处理这语句.也就是说,Oracle客户 ...

  8. 利用 gulp 来合并seajs 的项目

    gulp-seajs-transport 和 gulp-seajs-concat这两个gulp插件 gulp-seajs-transpor 这个插件这样是给每个js模块 标示 模块名称 gulp-se ...

  9. 在eclipse中创建web项目(非myeclipse)

    如何创建dynamic web project项目 本文的演示是从本地文件创建dynamic web project,从svn检出的同时创建dynamic web project于此类似.我们推荐使用 ...

  10. Python 字典的遍历

    dic = {"赵四":"刘晓光", "刘能":"王晓利", "王木生":"范伟" ...