Kubernetes 系统提供了三种认证方式:CA 认证、Token 认证 和 Base 认证。安全功能是一把双刃剑,它保护系统不被攻击,但是也带来额外的性能损耗。集群内的各组件访问 API Server 时,由于它们与 API Server 同时处于同一局域网内,所以建议用非安全的方式访问 API Server 效率更高。
接下来对集群的双向认证配置和简单认证配置过程进行详细说明。
双向认证配置
双向认证方式是最为严格和安全的集群安全配置方式,主要配置流程如下:
- 生成根证书、API Server 服务端证书、服务端私钥、各个组件所用的客户端证书和客户端私钥。
- 修改 Kubernetes 各个服务进程的启动参数,启用双向认证模式。
详细的配置操作流程如下:
生成根证书
用 openssl 工具生成 CA 证书,请注意将其中 subject 等参数改为用户所需的数据,CN 的值通常是域名、主机名或 IP 地址。
$ cd /var/run/kubernetes
$ openssl genrsa -out dd_ca.key 2048
$ openssl req -x509 -new -nodes -key dd_ca.key -subj "/CN=YOUDOMAIN.COM" -days 5000 -out dd_ca.crt
生成 API Server 服务端证书和私钥
$ openssl genrsa -out dd_server.key 2048
$ HN=`hostname`
$ openssl req -new -key dd_server.key -subj "/CN=$HN" -out dd_server.csr
$ 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 进程共用的证书和私钥
$ openssl genrsa -out dd_cs_client.key 2048
$ openssl req -new -key dd_cs_client.key -subj "/CN=$HN" -out dd_cs_client.csr
$ 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。
$ openssl genrsa -out dd_kubelet_client.key 2048
$ openssl req -new -key dd_kubelet_client.key -subj "/CN=192.168.1.129" -out dd_kubelet_client.csr
$ 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 参数:
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 服务:
验证 API Server 的 HTTPS 服务。
$ 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 配置文件
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 文件,配置证书等相关参数,具体内容如下:
apiVersion: v1
kind: Config
users
- name: controllermanager
user:
client-certificate: /var/run/kubernetes/dd_cs_client.crt
client-key: /var/run/kubernetes/dd_cs_client.key
clusters:
- name: local
cluster:
certificate-authority: /var/run/kubernetes/dd_ca.crt
contexts:
- context:
cluster: local
user: controllermanager
name: my-context
current-context: my-context
重启 kube-controller-manager 服务:
配置各个节点上的 Kubelet 进程
复制 Kubelet 的证书、私钥 与 CA 根证书到所有 Node 上。
$ scp /var/run/kubernetes/dd_kubelet* root@kubernetes-minion1:/home
$ scp /var/run/kubernetes/dd_ca.* root@kubernetes-minion:/home
在每个 Node 上创建/var/lib/kubelet/kubeconfig 文件,内容如下:
apiVersion: v1
kind: Config
users:
- name: kubelet
user:
client-certificats: /home/dd_kubelet_client.crt
client-key: /home/dd_kubelet_client.key
clusters:
- name: local
cluster:
certificate-authority: /home/dd_ca.crt
contexts:
- context:
cluster: local
user: kubelet
name: my-context
current-context: my-context
修改 Kubelet 的启动参数,以修改/etc/kubernetes/kubelet 配置文件为例:
KUBELET_API_SERVER="--api_servers=https://kubernetes-master:443"
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 服务:
配置 kube-proxy
首先,创建/var/lib/kubeproxy/proxykubeconfig 文件,内容如下:
apiVersion: v1
kind: Config
users:
- name: kubeproxy
user:
client-certificate: /home/dd_kubelet_client.crt
client-key: /home/dd_kubelet_client.key
clusters:
- name: local
cluster:
certificate-authority: /home/dd_ca.crt
contexts:
- context:
cluster: local
user: kubeproxy
name: my-context
current-context: my-context
然后,修改 kube-proxy 的启动参数,引用上述文件并指明 API Server 在安全模式下的访问地址,以修改配置文件/etc/kubenetes/proxy 为例:
KUBE_PROXY_ARGS="--kubeconfig=/var/lib/kubeproxy/proxykubeconfig --master=https://kubenetes-master:443"
重启 kube-proxy 服务:
至此,一个双向认证的 Kubernetes 集群环境就搭建完成了。
简单认证配置
除了双向认证方式,Kubernets 也提供了基于 Token 和 HTTP Base 的简单认证方式。通信方式仍然采用 HTTPS,但不使用数字证书。
采用基于 Token 和 HTTP Base 的简单认证方式时,API Server 对外暴露 HTTPS 端口,客户端提供 Token 或用户名、密码来完成认证过程。这里需要说明的一点是 Kubelet 比较特殊,它同时支持双向认证与简单认证两种模式,其他组件智能配置为双向认证或非安全模式。
API Server 基于 Token 认证的配置过程如下
建立包括用户名、密码和 UID 的文件 token_auth_file:
$ cat /root/token_auth_file
dingmingk,dingmingk,1
admin,admin,2
system,system,3
修改 API Server 的配置,采用上述文件进行安全认证
$ vi /etc/kubernetes/apiserver
KUBE_API_ARGS="--secure-port=443 --token_auth_file=/root/token_auth_file"
重启 API Server 服务
用 curl 验证连接 API Server
$ curl https://kubenetes-master:443/version --header "Authorization: Bearer dingmingk" -k
{
"major": "1",
"minor": "0",
"gitVersion": "v1.0.0",
"gitCommit": "xxxHASHCODE",
"gitTreeState": "clean"
}
API Server 基于 HTTP Base 认证的配置过程如下
创建包括用户名、密码和 UID 的文件 basic_auth_file:
$ cat /root/basic_auth_file
dingmingk,dingmingk,1
admin,admin,2
system,system,3
修改 API Server 的配置,采用上述文件进行安全认证
$ vi /etc/kubernetes/apiserver
KUBE_API_ARGS="--secure-port=443 --basic_auth_file=/root/basic_auth_file"
重启 API Server 服务
用 curl 验证连接 API Server
$ curl https://kubernetes-master:443/version --basic -u dingmingk:dingmingk -k
{
"major": "1",
"minor": "0",
"gitVersion": "v1.0.0",
"gitCommit": "xxxHASHCODE",
"gitTreeState": "clean"
}
使用 Kubelet 时则需要指定用户名和密码来访问 API Server
$ kubectl get nodes --server="https://kubernetes-master:443" --api-version="v1" --username="dingmingk" --password="dingmingk" --insecure-skip-tls-verify=true
相关推荐
通过遵循这个指南,用户可以搭建一个稳定且安全的Kubernetes集群,并根据需要安装和配置各种插件以满足特定的运维和开发需求。 文档还特别提醒用户,由于启用了严格的安全机制,建议从头开始进行部署,以避免认证和...
主要内容包括集群配置管理、节点配置管理和集群内部网络设置等多个方面,涵盖了从基本单元Pod到服务访问、存储卷及资源配额等一系列核心主题。此外,文档深入探讨了安全性、调度管理、状态化应用部署等高级话题,并...
安全操作系统是确保Kubernetes集群和应用程序安全运行的重要组成部分。 文档《Kubernetes Security》由Liz Rice和Michael Hausenblas撰写,旨在帮助读者理解和实施Kubernetes集群和应用程序的安全操作。本书提供了...
5. **安全最佳实践**:随着网络安全威胁的日益增多,企业必须采取一系列措施来加强Kubernetes集群的安全防护能力。 #### 三、Gardener开源软件介绍 针对上述挑战,**Gardener**项目应运而生,它是一款用于大规模...
资源控制是确保Kubernetes集群高效运行的关键。推荐在每个Pod的YAML清单中明确指定CPU和内存的请求和限制。请求定义了Pod所需的最小资源,而限制则设定了Pod的最大资源使用量,防止资源过度消耗。未设置请求和限制...
网络是Kubernetes集群中不可或缺的部分,网络配置主要关注如何使Pod之间以及Pod与外部通信。 1. 网络插件 Kubernetes支持多种网络插件,比如Flannel、Calico、Weave Net等,它们提供不同的网络解决方案。 2. ...
【Kubernetes最佳实践案例】 Kubernetes 是一个强大的容器编排平台,它允许用户高效地管理和部署容器化应用。本文档提供了多个Kubernetes...建议开发者和管理员深入学习和理解这些案例,以优化他们的Kubernetes集群。
Kubernetes RBAC与OpenSSL认证 Kubernetes作为一款流行的开源容器编排平台,它的安全特性对于维护集群的...在实际应用中,了解和配置RBAC以及OpenSSL认证机制对于保护Kubernetes集群的资源安全有着十分重要的意义。
Kubernetes 网络策略允许你控制 Pod 间的网络通信,实现安全的微服务隔离。在代码中,你可能找到如何定义和应用网络策略的示例。 8. **自定义资源定义(Custom Resource Definitions, CRD)** CRD 允许你在 ...
- 介绍了如何在CentOS上部署Kubernetes集群,包括证书、秘钥的创建、TLS的配置、高可用etcd集群的搭建,以及各种集群组件的部署。 12. **使用客户端工具**: - 提到了Kubernetes的客户端工具,如Kabin、...
4. **密钥与证书管理**:Kubernetes集群依赖于TLS证书进行通信,学习如何管理和更新这些证书,以及使用Secrets存储敏感信息,是保障数据安全的重要环节。 5. **资源审核(Auditing)**:Kubernetes审计日志提供了...
- **在CentOS上部署Kubernetes集群**:涉及创建TLS证书和秘钥、配置kubeconfig文件、安装kubectl命令行工具、部署master和node节点等步骤。 - **集群维护工具**:安装flannel网络插件、kubedns、dashboard、heapster...
在部署Kubernetes集群前,首先需要确保服务器满足以下条件: - **硬件配置**:建议每台服务器至少配备2核CPU、2GB内存及30GB硬盘空间。 - **网络连接**:服务器最好能够访问公网,以便于从互联网上拉取必要的镜像...
它允许开发者和运维人员将应用部署在一组容器内,并通过Kubernetes集群进行调度和管理。 **Kubernetes基本概念** Kubernetes的核心组件包括: 1. **etcd**: 高可用的键值存储,用于保存集群的状态。 2. **kube-api...
22 | 安全机制:Kubernetes 如何保障集群安全? 23 | 最后的防线:怎样对 Kubernetes 集群进行灾备和恢复? 「关注公众号【云世】,免费获取全系列课程内容」 加餐:问题答疑和优秀留言展示 知其所以然:底层核心...
在提供的压缩包中,您会找到详细的安装包和笔记整理,这些资料将帮助您逐步完成从安装Kubernetes集群到部署和管理电商微服务的全过程。其中包括环境准备、配置文件编写、命令行操作实例等。请仔细阅读并实践,以便...
本节会详细讲解Kubernetes集群的内部工作原理,包括主节点和工作节点的通信方式,以及整个系统是如何协调资源和任务的。 2. 核心原理 2.1 架构原理设计理念 阐述了Kubernetes的设计理念和架构设计,帮助读者理解...