搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
花生_TL007
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
iOS 如何获取scrollView状态是否正在滚动_ios开发 获取uiscrollview正在滑动
2
WCH RISC CH32V303RCT6 单片机的SDI Printf 虚拟串口功能 类似SEGGER RTT打印功能 简单分析
3
Matlab雷达信号处理 1.雷达威力图仿真 模糊函数仿真 2.恒虚警检测(CFAR)_matlab雷达威力图仿真
4
开源数据质量解决方案——Apache Griffin入门宝典
5
2023 梦幻西游之天天西游手游Linux手工服务端
6
docker 导出镜像、导出容器操作
7
LobeChat:支持国内中文版媲美ChatGPT-4.0_lobe chat
8
Java中的优先级队列 PriorityQueue 与 堆_java priorityqueue 大顶堆
9
Vue研习录(02)——模板语法详解及示例分析_vue模板例子
10
小牛如何从功能测试转型到高级自动化测试变大鹏鸟
当前位置:
article
> 正文
k8s技术预研5--Kubernetes集群的安全设置
作者:花生_TL007 | 2024-05-16 12:46:11
赞
踩
k8s技术预研5--Kubernetes集群的安全设置
一、基于HTTP BASE的简单认证方式
各组件与apiserver之间的通信方式仍然采用HTTPS,但不使用CA数字证书。不建议在生产环境中这样使用。
1、配置支持HTTP BASE认证
在Master Node上创建/etc/kubernetes/basic_auth文件,文件中每行的格式为password,user,uid,"group1,group2,group3"。
[root@bogon kubernetes]# more baisc_auth
123456,admin,1
121212,system,2
在设置kube-apiserver的配置文件/etc/kubernetes/apiserver中加入:
--secure-port=6443
--basic_auth_file=/etc/kubernetes/basic_auth
重启kube-apiserver服务:systemctl restart kube-apiserver
2、使用kubectl进行验证测试
[root@bogon kubernetes]# kubectl --server=
https://10.0.2.5:6443
--username=admin --password=123456 --insecure-skip-tls-verify=true cluster-info
Kubernetes master is running at
https://10.0.2.5:6443
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
[root@bogon kubernetes]#kubectl --server=
https://10.0.2.5:6443
--username=admin --password=123456 --insecure-skip-tls-verify=true get nodes
NAME STATUS ROLES AGE VERSION
10.0.2.6 Ready <none> 1d v1.8.8
3、模拟HTTP客户端请求时,使用请求头Authorization Basic BASE64ENCODED(USER:PASSWORD)
[root@bogon kubernetes]# echo -n "admin:123456" | base64
YWRtaW46MTIzNDU2
[root@bogon kubernetes]# curl -k --header "Authorization:Basic YWRtaW46MTIzNDU2"
https://10.0.2.5:6443/api
{
"kind": "APIVersions",
"versions": [
"v1"
],
"serverAddressByClientCIDRs": [
{
"clientCIDR": "0.0.0.0/0",
"serverAddress": "10.0.2.5:6443"
}
]
}
二、基于TOKEN认证的配置
1、在Master节点上创建包括token、用户名、密码和UID的token_auth文件。
文件格式为
token,user,uid,"group1,group2,group3"
792c62a1b5f2b07b,admin,1
设置kube-apiserver的启动参数,增加--token-auth-file=/etc/kubernetes/token_auth
重启kube-apiserver服务:
systemctl restart kube-apiserver
2、模拟HTTP请求Api时要在Authorization头中加入Bearer Token
[root@bogon kubernetes]# curl -k --header "Authorization: Bearer 792c62a1b5f2b07b"
https://10.0.2.5:6443/api
{
"kind": "APIVersions",
"versions": [
"v1"
],
"serverAddressByClientCIDRs": [
{
"clientCIDR": "0.0.0.0/0",
"serverAddress": "10.0.2.5:6443"
}
]
}
[root@bogon kubernetes]# curl -k --header "Authorization: Bearer 792c62a1b5f2b07b"
https://10.0.2.5:6443/version
{
"major": "1",
"minor": "8",
"gitVersion": "v1.8.8",
"gitCommit": "2f73858c9e6ede659d6828fe5a1862a48034a0fd",
"gitTreeState": "clean",
"buildDate": "2018-02-09T21:23:25Z",
"goVersion": "go1.8.3",
"compiler": "gc",
"platform": "linux/amd64"
3、使用kubectl进行验证
root@bogon kubernetes]# kubectl --server=
https://10.0.2.5:6443
--token=792c62a1b5f2b07b --insecure-skip-tls-verify=true cluster-info
Kubernetes master is running at
https://10.0.2.5:6443
三、基于CA签名的双向数字证书认证方式
证书实际是由证书签证机关(CA)签发的对用户的公钥的认证,证书的内容包括:电子签证机关的信息、公钥用户信息、公钥、权威机构的签字和有效期等等。因为我们是在程序接口调用中使用数字证书,所以可以制作和使用自签的证书。
基于CA签名的双向数字证书的生成过程:
为kube-apiserver生成一个数字证书,并用CA证书进行签名;
配置kube-apiserver进程的启动参数,增加CA证书、服务器证书及私钥;
为每个要访问k8s API Server的客户端进程(kube-controller-manager,kube-scheduler,kubelet,kube-proxy)制作自己的一个证书,也都使用CA证书进行签名,在这些进程的启动参数中增加CA证书、自己的证书等参数配置。
1、制作kube-apiserver使用的CA证书相关的文件和参数
(1)生成CA的RSA密钥
[root@bogon ~]# openssl genrsa -out ca.key 2048
Generating RSA private key, 2048 bit long modulus
.........+++
............+++
e is 65537 (0x10001)
注:这个文件实际上已经包含了公钥和私钥两部分,也就是说这个文件即可用来加密也可以用来解密。后面的2048是生成密钥的长度。可以继续使用openssl命令-pubout参数把这个文件中的公钥单独提取出来。
(2)
制作自签名的CA证书
[root@bogon ~]# openssl req -x509 -new -nodes -key ca.key -subj "/CN=bogon" -days 5000 -out ca.crt
[root@bogon ~]# ls -l ca.crt
-rw-r--r--. 1 root root 1082 Feb 27 09:10 ca.crt
命令及选项说明:
openssl req 用于生成证书请求
-new这个选项用于生成一个新的证书请求
-x509 生成自签名证书,而不是证书请求
-nodes(no des)可以明确指定不需要密码保护
-subj 替换或指定证书申请者的个人信息,格式是:/type0=value0/type1=value1/type2=...(其中C是Country,ST是state,L是local,O是Organization,OU是Organization Unit,CN是common name)
查看刚刚生成的这个证书中的信息:
[root@bogon etc]# openssl x509 -noout -text -in /root/ca.crt
(3)
生成kube-apiserver使用的服务器密钥
[root@bogon ~]# openssl genrsa -out server.key 2048
Generating RSA private key, 2048 bit long modulus
...........................................................................................................................................+++
.................................................+++
e is 65537 (0x10001)
(4)
为kube-apiserver服务创建证书请求
先制作一个包含证书请求信息的配置文件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
IP.1 = 10.10.10.1 #k8s 集群service ip
IP.2 = 10.0.2.5 #k8s master ip
注:这里是使用的免交互的配置文件方式,以上为创建证书请求时使用的配置文件。
注2:对于多域名,只需要一个证书就可以保护非常多的域名。SubjectAltName是X509 Version 3 (RFC 2459)的扩展,允许ssl证书指定多个可以匹配的名称。SubjectAltName 可以包含email 地址,ip地址,正则匹配DNS主机名,等等。
执行创建证书请求的命令:
openssl req -new -key server.key -subj "/CN=bogon" -config master_ssl.cnf -out server.csr
(5)
使用自建CA签署 apiserver的服务器证书
[root@bogon ~]# 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
Signature ok
subject=/CN=bogon
Getting CA Private Key
注:-CAcreateserial选项,如果不存在CA证书序列号文件,则生成一个。执行上面命令后会新生成一个ca.srl的CA证书序列号文件。
按生成的先后顺序,此时共有以下7个文件了:
[root@bogon ~]# ls -lt
-rw-r--r--. 1 root root 1172 Feb 27 23:35 server.crt #apiserver服务的经由自建CA签名了的证书
-rw-r--r--. 1 root root 17 Feb 27 23:35 ca.srl #CA证书序列号文件
-rw-r--r--. 1 root root 1106 Feb 27 23:26 server.csr #apiserver服务的证书请求文件
-rw-r--r--. 1 root root 396 Feb 27 23:20 master_ssl.cnf #申请证书使用的证书请求配置文件
-rw-r--r--. 1 root root 1675 Feb 27 09:21 server.key #给apiserver使用的密钥
-rw-r--r--. 1 root root 1082 Feb 27 09:10 ca.crt #CA证书
-rw-r--r--. 1 root root 1675 Feb 27 08:29 ca.key #CA证书密钥
(6)
配置kube-apiserver的启动参数
--tls-cert-file=/etc/kubernetes/ssl/server.crt
--tls-private-key-file=/etc/kubernetes/ssl/server.key
--client-ca-file=/etc/kubernetes/ssl/ca.crt
关掉非安全端口,打开安全端口:
--insecure-port=0
--secure-port=6443
调整后的kube-apiserver配置文件:
[root@bogon kubernetes]# cat apiserver
KUBE_API_ARGS="--storage-backend=etcd3 --etcd-servers=
http://127.0.0.1:2379
--insecure-bind-address=0.0.0.0 --insecure-port=0 --service-cluster-ip-range=10.10.10.0/24 --service-node-port-range=1-65535 --admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,DefaultStorageClass,ResourceQuota --secure-port=6443 --tls-cert-file=/etc/kubernetes/ssl/apiserver.pem --tls-private-key-file=/etc/kubernetes/ssl/apiserver-key.pem --client-ca-file=/etc/kubernetes/ssl/ca.pem --logtostderr=true --log-dir=/var/log/kubernetes --v=2"
创建一个存放证书文件的目录,将上面得到的证书相关的6个文件复制过来:
[root@bogon ssl]# cd /etc/kubernetes/ssl && ls
ca.crt ca.key ca.srl server.crt server.csr server.key
最后,重启kube-apiserver服务。
2、创建访问apiServer的各个组件使用的客户端证书,修改启动参数
(1)制作客户端证书并将得到的3个证书相关文件复制到/etc/kubernetes/ssl下面
controllerManager、scheduler、kubectl、kubelet、kube-proxy服务都使用这里生成的管理员证书。
[root@bogon ssl]# openssl genrsa -out cs_client.key 2048
Generating RSA private key, 2048 bit long modulus
...........................................................................................+++
...................................................................................................................................+++
e is 65537 (0x10001)
[root@bogon ssl]# openssl req -new -key cs_client.key -subj "/CN=kube-admin" -out cs_client.csr
[root@bogon ssl]# openssl x509 -req -in cs_client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -days 5000 -out cs_client.crt
Signature ok
subject=/CN=kube-admin
Getting CA Private Key
(2)修改kubectl命令行工具默认使用的apiServer地址、集群CA和客户端证书
[root@bogon ssl]# kubectl config set-cluster default-cluster --server=https://10.0.2.5:6443 --certificate-authority=/etc/kubernetes/ssl/ca.crt
Cluster "default-cluster" set.
[root@bogon ssl]# kubectl config set-credentials default-admin --certificate-authority=/etc/kubernetes/ssl/ca.crt --client-key=/etc/kubernetes/ssl/cs_client.key --client-certificate=/etc/kubernetes/ssl/cs_client.crt
User "default-admin" set.
[root@bogon ssl]# kubectl config set-context default-system --cluster=default-cluster --user=default-admin
Context "default-system" created.
[root@bogon ssl]# kubectl config use-context default-system
Switched to context "default-system".
把kubectl当前使用的context配置输出来:
[root@bogon ssl]# kubectl config view
apiVersion: v1
clusters:
- cluster:
certificate-authority: /etc/kubernetes/ssl/ca.crt
server: https://10.0.2.5:6443
name: default-cluster
contexts:
- context:
cluster: default-cluster
user: default-admin
name: default-system
current-context: default-system
kind: Config
preferences: {}
users:
- name: default-admin
user:
client-certificate: /etc/kubernetes/ssl/cs_client.crt
client-key: /etc/kubernetes/ssl/cs_client.key
将上面输出的信息保存到公共文件/etc/kubernetes/kubeconfig ,供controllerManager、scheduler、kubelet、kube-proxy服务在启动参数里引用。
(3)设置kube-controller-manager服务的启动参数
[root@bogon kubernetes]# cat
/etc/kubernetes/
controller-manager
KUBE_CONTROLLER_MANAGER_ARGS="--master=https://10.0.2.5:6443 --service-account-private-key-file=/etc/kubernetes/ssl/server.key --root-ca-file=/etc/kubernetes/ssl/ca.crt --kubeconfig=/etc/kubernetes/kubeconfig --logtostderr=true --log-dir=/var/log/kubernetes --v=2"
重启kube-controller-manager服务。
(4)设置kube-scheduler服务的启动参数
复用客户端证书并配置启动参数为:
[root@bogon kubernetes]# more scheduler
KUBE_SCHEDULER_ARGS="--master=https://10.0.2.5:6443 --kubeconfig=/etc/kubernetes/kubeconfig --logtostderr=true --log-dir=/var/log/kubernetes --v=2"
重启kube-scheduler服务。
(5)设置Node节点上kubelet的客户端证书和启动参数
将CA证书ca.crt和客户端证书cs_client.crt、私钥cs_client.key复制到Node节点/etc/kubernetes/ssl目录下一份。
将上面编写的用于客户端程序的context配置文件kubeconfig复制到Node节点/etc/kubernetes目录下一份。
配置kubelet服务的启动参数如下所示:
[root@worknode1 kubernetes]# more /etc/kubernetes/kubelet
KUBELET_ARGS="--kubeconfig=/etc/kubernetes/kubeconfig --address=10.0.2.6 --port=10250 --hostname-override=10.0.2.6 --allow-privileged=false --cluster-dns=10.10.10.2 --cluster-domain=cluster.local --fail-swap-on=false --logtostderr=true --log-dir=/var/log/kubernetes --v=4"
重启kubelet服务。
注:很多资料上要求配置一个--api-server的参数,而实际情况是在新版本k8s中这个参数已经过期了,加上这个参数反而会造成服务无法启动。
(6)设置Node节点上kube-proxy的客户端证书和启动参数
客户端证书及密钥继续复用kubelet的那一套。kube-proxy启动参数修改如下:
[root@worknode1 kubernetes]# more /etc/kubernetes/proxy
KUBE_PROXY_ARGS="--master=https://10.0.2.5:6443 --kubeconfig=/etc/kubernetes/kubeconfig --hostname-override=10.0.2.6 --logtostderr=true --log-dir=/var/log/kubernetes --v=4"
重启kube-proxy服务。
小结:本文中只制作了两套自签的数字证书,分别用于kube-apiserver服务端和除此之外的其它所有扮演客户端角色的服务进程。也有很多部署方案中,选择为每一个客户端单独制作一个专用的密钥与证书。
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/花生_TL007/article/detail/578796
推荐阅读
article
Kubernetes
已经成为
云
原生
时代
的安卓,这就够了吗?_
kubevela
karmada
...
本文将介绍如何在
Kubernetes
上构建新的应用管理平台,提供一层抽象以封装底层逻辑,只呈现用户关心的接口,使用户...
赞
踩
article
容器
化时代的领航者:
Docker
和
Kubernetes
云
原生
时代的黄金搭档_
docker
容器
、...
简而言之,
容器
是计算机上的沙盒进程,与主机上的所有其他进程隔离。这种隔离利用内核命名空间和cgroups, 在 Linu...
赞
踩
article
Kubernetes
:(
一
)基本概念_
一
个
kubernetes
集群
只能支持
一
个
云原生应用...
kubernetes
的本质是
一
组服务器
集群
,它可以在
集群
的每个节点上运行特定的程序,来对节点中的容器进行管理。目的是实现...
赞
踩
article
[
Kubernetes
]
sealos
部署
K8s
集群
...
sealos
部署
K8s
集群
[
Kubernetes
]
sealos
部署
K8s
集群
...
赞
踩
article
Kubernetes
Taints
和
Tolerations
(污点和
容忍
)_
tolerations
k...
一、说明:1、
Taints
和
Tolerations
NodeAffinity是节点亲和性,是在Pod上定义的一种属性, 使...
赞
踩
article
Kubernetes
:
Taints
(污点)和
Tolerations
(容忍)分析操作_
effect
:...
一、环境搭建使用一开始nginx:v1.7.9 创建deployment[root@hdss7-21 ~]# kubec...
赞
踩
article
Kubernetes
(k8s)的
认证
(
Authentication
)
策略
解析...
Kubernetes
(k8s)的
认证
(
Authentication
)
策略
是确保只有经过验证的实体(用户、服务账户等)能够...
赞
踩
article
Kubernetes
Jobs
-
运行
处理
任务
指南...
2019独角兽企业重金招聘Python工程师标准>>> ..._kubernetes job 在...
赞
踩
article
Kubernetes
--
(k8s)
Job
、Cron
Job
_
job
.
batch
...
Job
https://www.kubernetes.org.cn/
job
https://www.kubernetes.o...
赞
踩
article
Kubernetes
Job
配置...
我们知道使用kubernetes的rc或者rs创建的pod,kubernetes会实时监控其健康状态,如果发现pod...
赞
踩
article
Kubernetes
jobs
:
使用
模版进行
并行处理
...
2019独角兽企业重金招聘Python工程师标准>>> ..._yaml job 并行任务yam...
赞
踩
article
Kubernetes
jobs
:使用
队列
进行
并行化处理...
2019独角兽企业重金招聘Python工程师标准>>> ..._kubernetes
jobs
并...
赞
踩
article
“
kubernetes
容器
+
GPU
并行编程”
研讨会
_
nccl
kubernetes
...
“
kubernetes
容器
+
GPU
并行编程”
研讨会
前言目的主讲内容时间地点参会对象证明文件新的改变功能快捷键合理的创建标...
赞
踩
article
Kubernetes----
Job
控制器
_
dashboard
怎么限制
job
...
一、
Job
控制器
简介1.1
Job
控制器
简介
Job
,主要用于负责批量处理短暂的一次性任务,
Job
特点如下:当
Job
创建的...
赞
踩
article
【
kubernetes
/
k8s
源码分析】
coredns
源码分析之三
kubernetes
插件
...
插件
描述:https://
coredns
.io/plugins/1.
kubernetes
插件
kubernetes
[...
赞
踩
article
kubernetes
1.24.2实战与源码(1)_
telegraf
sidecar
telegra...
kubectl的职责主要的工作是处理用户提交的东西(包括,命令行参数,yaml文件等)然后其会把用户提交的这些东西组织成...
赞
踩
article
Kubernetes
v1.20.0-添加pvc后无法动态创建pv解决方法_-
--
feature
-...
首先PVC一直是Pending状态步骤:kubectl delete -f 你自定义所创建的pvc,yaml文件等编辑/...
赞
踩
article
Kubernetes
初始化报错[ERROR CRI]
:
container
runtime
is
...
再次执行 Kubeadm init 就可以了。_error cri]
:
container
runtime
is
not...
赞
踩
article
【Kubernetes】Kubeadm init失败:
container
runtime
is
no...
在使用
container
d作为容器运行时部署Kubeadm时报错:[ERROR CRI]:
container
runt...
赞
踩
article
k8s问题排查:the
existing
bootstrap
client
cert
ificate ...
k8s问题排查:the
existing
bootstrap
client
cert
ificate in /etc/ku...
赞
踩
相关标签
云计算
阿里云
云原生
docker
kubernetes
容器
数据库
cuda
k8s
gpu