kubernetes v1.11 二进制部署(二)之Openssl自签TLS证书

2024-08-21 05:08

本文主要是介绍kubernetes v1.11 二进制部署(二)之Openssl自签TLS证书,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原创内容,转载请注明出处

博主地址:https://aronligithub.github.io/

闲言乱语

在前段日子编写了kubernetes部署全过程之后,好友告诉我,你写得太长啦。能不能拆分章节一下。但是由于各种工作上和学习自研上的计划以及任务太多了,这个篇章的修改以及新篇章的编写给延迟了下来,但是为了更加方便各位读者们阅读,我以下对内容做了四个篇章的拆分

kubernetes v1.11 二进制部署篇章目录

  • kubernetes v1.11 二进制部署
    • (一)环境介绍
    • (二)Openssl自签TLS证书
    • (三)master组件部署
    • (四)node组件部署

前言

在经过上一篇章关于kubernetes 基本技术概述铺垫,在部署etcd集群之后,就可以开始部署kubernetes的集群服务了。


使用openssl创建CA证书

13423234-f2290732a96555c8.png

部署kubernetes服务使用的所需证书如下

名称公钥与私钥
根证书公钥与私钥ca.pem与ca.key
API Server公钥与私钥apiserver.pem与apiserver.key
集群管理员公钥与私钥admin.pem与admin.key
节点proxy公钥与私钥proxy.pem与proxy.key

节点kubelet的公钥与私钥:是通过boostrap响应的方式,在启动kubelet自动会产生, 然后在master通过csr请求,就会产生。
那么知道这些基本概念之后,下面就开始创建证书的步骤说明。
再次之前可以先看看生成之后的结果图:

13423234-58ef76235ab60548.png
证书生成的结果图

13423234-fc1877c16e92e84e.png
kubelet证书自动生成结果图

创建根证书

# Generate the root CA. #生成RSA私钥(无加密)openssl genrsa -out ca.key 2048 #生成 RSA 私钥和自签名证书openssl req -x509 -new -nodes -key ca.key -days 10000 -out ca.pem -subj "/CN=kubernetes/O=k8s"# 参数说明:
-new 指生成证书请求
-x509 表示直接输出证书
-key 指定私钥文件
-days 指定证书过期时间为10000天
-out 导出结束后证书文件
-subj 输入证书拥有者信息,这里指定 CN 以及 O 的值# 重要的CN以及0关键参数:
-subj 设置CN以及0的值很重要,kubernetes会从证书这两个值对应获取相关的用户名以及用户租的值,如下:
"CN":Common Name,kube-apiserver 从证书中提取该字段作为请求的用户名 (User Name);浏览器使用该字段验证网站是否合法;
"O":Organization,kube-apiserver 从证书中提取该字段作为请求用户所属的组 (Group);

apiserver证书生成

master中需要证书如下:
根证书公钥(root CA public key, ca.key)、根证书(ca.pem);
apiserver证书:apiserver.pem与其私钥apiserver-key.pem

1.创建openssl.cnf

openssl示例

[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 = ${K8S_SERVICE_IP}
IP.2 = ${MASTER_IPV4}
[^_^]:
使用有API被访问的Master的IP地址替换${MASTER_IPV4},使用自己规划作为kubernetes service IP端的首IP替换${K8S_SERVICE_IP}如:一般以10.100.0.0/16作为service的服务IP端,则此处以10.100.0.1替换${K8S_SERVICE_IP}
如果在高可用配置中部署多个Master节点,需要添加更多的TLS subjectAltNames (SANs)。每个证书合适的SANs配置依赖于从节点与kubectl用户是怎样与Master节点通讯的:直接通过IP地址、通过负载均衡、或者通过解析DNS名称。
DNS.5 = ${MASTER_DNS_NAME}
IP.3 = ${MASTER_IP}
IP.4 = ${MASTER_LOADBALANCER_IP}
从节点将通过${MASTER_DNS_NAME}访问到Loadbalancer。

根据上面的示例,下面则以server81作为master服务器,创建openssl的cnf文件。


创建openssl.cnf文件

[root@server81 openssl]# vim openssl.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
DNS.5 = kubernetes.default.svc.cluster.local
DNS.6 = k8s_master
IP.1 = 10.0.6.1              # ClusterServiceIP 地址
IP.2 = 172.16.5.81           # master IP地址
IP.3 = 10.1.0.1              # docker IP地址
IP.4 = 10.0.6.200            # kubernetes DNS IP地址

2.生成apiserver 证书对

# Generate the API server keypair.
openssl genrsa -out apiserver.key 2048openssl req -new -key apiserver.key -out apiserver.csr -subj "/CN=kubernetes/O=k8s" -config openssl.cnfopenssl x509 -req -in apiserver.csr -CA ca.pem -CAkey ca.key -CAcreateserial -out apiserver.pem -days 3650 -extensions v3_req -extfile openssl.cnf

一般生成的根证书(ca.key, ca.pem)与apiserver证书(apiserver.key,apiserver.pem)放置在Master节点的/etc/kubernetes/kubernetesTLS/路径下(这个路径是可以自定义修改的,不一定要用我这个)


3.证书配置相关说明

apiserver的配置中需要指定如下参数:

## Kubernetes的访问证书配置:
--token-auth-file=/etc/kubernetes/token.csv   
--tls-cert-file=/etc/kubernetes/kubernetesTLS/apiserver.pem 
--tls-private-key-file=/etc/kubernetes/kubernetesTLS/apiserver.key  
--client-ca-file=/etc/kubernetes/kubernetesTLS/ca.pem  
--service-account-key-file=/etc/kubernetes/kubernetesTLS/ca.key  ## Etcd的访问证书配置:
--storage-backend=etcd3  
--etcd-cafile=/etc/etcd/etcdSSL/ca.pem  
--etcd-certfile=/etc/etcd/etcdSSL/etcd.pem  
--etcd-keyfile=/etc/etcd/etcdSSL/etcd-key.pem  

controller-manager的配置中需要指定如下参数:

## Kubernetes的访问证书配置:
--cluster-name=kubernetes  
--cluster-signing-cert-file=/etc/kubernetes/kubernetesTLS/ca.pem  
--cluster-signing-key-file=/etc/kubernetes/kubernetesTLS/ca.key  
--service-account-private-key-file=/etc/kubernetes/kubernetesTLS/ca.key  
--root-ca-file=/etc/kubernetes/kubernetesTLS/ca.pem

admin集群管理员证书生成

## 此证书用于kubectl,设置方式如下:
openssl genrsa -out admin.key 2048
openssl req -new -key admin.key -out admin.csr -subj "/CN=admin/O=system:masters/OU=System"
openssl x509 -req -in admin.csr -CA ca.pem -CAkey ca.key -CAcreateserial -out admin.pem -days 3650

说明:

由于后续 kube-apiserver 在启用RBAC模式之后, 客户端(如 kubelet、kube-proxy、Pod)请求进行授权的时候会需要认证用户名、以及用户组
那么所谓的用户名用户组哪里来定义呢?
我们来看看上面openssl创建证书的语句:

openssl req -new -key admin.key -out admin.csr -subj "/CN=admin/O=system:masters/OU=System"

其中这里的/CN=admin/O=system:masters/OU=System就是在CN定义用户为adminO定义用户组为system:mastersOU 指定该证书的 Group 为 system:masters

那么定义好之后,在kubernetes中是怎么使用的呢?

kube-apiserver 预定义了一些 RBAC 使用的 RoleBindings(角色),如 cluster-admin (角色)Group(组) system:mastersRole(角色) cluster-admin 绑定,该 Role 授予了调用kube-apiserver 的所有 API的权限;
那么当然的,我们创建admin的证书的时候,就要按照该上面的说明定义好证书的组、用户

另外当kubelet使用该证书访问kube-apiserver是什么样的过程呢?

在证书的签名中,OU 指定该证书的 Group 为 system:masterskubelet 使用该证书访问 kube-apiserver 时 ,由于证书被 CA 签名,所以认证通过,同时由于证书用户组为经过预授权的 system:masters,所以被授予访问所有 API 的权限
同理,如果你是使用CFSSL来签名证书也需要这样去配置好用户和用户组。在这里就不单独写CFSSL签kubernetes的相关证书了。
重要的是要好好理解证书签名kubernetesRBAC角色绑定的关系。


节点proxy证书生成

openssl genrsa -out proxy.key 2048
openssl req -new -key proxy.key -out proxy.csr -subj "/CN=system:kube-proxy"
openssl x509 -req -in proxy.csr -CA ca.pem -CAkey ca.key -CAcreateserial -out proxy.pem -days 3650

说明:

从上面解析说明admin的CN签名与kubernetes角色绑定的关系中,这里简单一眼就看出CN是拿来定义proxy的用户的。

CN 指定该证书的请求 User(用户)system:kube-proxy
kubernetesRABC默认角色绑定中,kube-apiserver 预定义的 RoleBinding cluster-adminUser system:kube-proxyRole system:node-proxier 绑定,该 Role 授予了调用 kube-apiserver Proxy 相关 API 的权限;


将生成的ca证书拷贝至准备部署的指定目录

13423234-d903ff4398343755.png

以上就是部署master节点所需要的证书文件了。

在这个过程CA产生的过程,大家肯定会角色笔者为什么要这么啰嗦详详细细去写那么多注释和说明。而且看了那么多内容之后,内心肯定觉得步骤好多呀,好烦躁。
不着急,步骤说明详细可以让读者的你更加好去理解;步骤多而烦躁我已经写好了自动化签订证书的脚本了。
在这里附上源码:

  • 第一步,创建openssl的cnf文件
[root@server81 openssl]# cat create_openssl_cnf.sh 
#!/bin/bash
basedir=$(cd `dirname $0`;pwd)################## Set PARAMS ######################MASTER_IP=`python -c "import socket;print([(s.connect(('8.8.8.8', 53)), s.getsockname()[0], s.close()) for s in [socket.socket(socket.AF_INET, socket.SOCK_DGRAM)]][0][1])"`
DockerServiceIP="10.1.0.1"  ## 10.1.0.0/16
ClusterServiceIP="10.0.6.1" ## 10.0.6.0/24
kubeDnsIP="10.0.6.200"## function
function create_openssl_cnf(){
cat <<EOF > $basedir/openssl.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
DNS.5 = kubernetes.default.svc.cluster.local
DNS.6 = k8s_master
IP.1 = $ClusterServiceIP              # ClusterServiceIP 地址
IP.2 = $MASTER_IP                     # master IP地址
IP.3 = $DockerServiceIP               # docker IP地址
IP.4 = $kubeDnsIP                     # kubernetes DNS IP地址
EOF
}create_openssl_cnf
[root@server81 openssl]# 
13423234-f557505ef4a66714.png

- 第二步,创建master所需的TLS证书

[root@server81 install_k8s_master]# ls
configDir     Step1_create_CA.sh  Step2_create_token.sh       Step4_install_controller.sh  Step6_create_kubeconfig_file.sh
Implement.sh  Step1_file          Step3_install_apiserver.sh  Step5_install_scheduler.sh   Step7_set_master_info.sh
[root@server81 install_k8s_master]# 
[root@server81 install_k8s_master]# vim Step1_create_CA.sh 
[root@server81 install_k8s_master]# cat Step1_create_CA.sh 
#!/bin/bash
basedir=$(cd `dirname $0`;pwd)
configdir=$basedir/Step1_file
openssldir=$configdir/openssl
ssldir=$configdir/kubernetesTLS
kubernetsDir=/etc/kubernetes
kubernetsTLSDir=/etc/kubernetes/kubernetesTLS################## Set PARAMS ######################
MASTER_IP=`python -c "import socket;print([(s.connect(('8.8.8.8', 53)), s.getsockname()[0], s.close()) for s in [socket.socket(socket.AF_INET, socket.SOCK_DGRAM)]][0][1])"`## function and implments
function check_firewalld_selinux(){systemctl status firewalld/usr/sbin/sestatus -vswapoff -a
}check_firewalld_selinuxfunction create_ssl(){cd $configdir && rm -rf $ssldir && mkdir -p $ssldircd $ssldir && \# Generate the root CA. openssl genrsa -out ca.key 2048 openssl req -x509 -new -nodes -key ca.key -days 10000 -out ca.pem -subj "/CN=kubernetes/O=k8s"ls $ssldir
}create_ssl function create_openssl_cnf(){sh $openssldir/create_openssl_cnf.sh cat $openssldir/openssl.cnf > $ssldir/openssl.cnf
}create_openssl_cnffunction create_apiserver_key_pem(){cd $ssldir && \openssl genrsa -out apiserver.key 2048openssl req -new -key apiserver.key -out apiserver.csr -subj "/CN=kubernetes/O=k8s" -config openssl.cnfopenssl x509 -req -in apiserver.csr -CA ca.pem -CAkey ca.key -CAcreateserial -out apiserver.pem -days 3650 -extensions v3_req -extfile openssl.cnfls $ssldir
}create_apiserver_key_pemfunction create_admin_key_pem(){cd $ssldir && \openssl genrsa -out admin.key 2048 openssl req -new -key admin.key -out admin.csr -subj "/CN=admin/O=system:masters/OU=System" openssl x509 -req -in admin.csr -CA ca.pem -CAkey ca.key -CAcreateserial -out admin.pem -days 3650ls $ssldir
}create_admin_key_pemfunction create_proxy_key_pem(){cd $ssldir && \openssl genrsa -out proxy.key 2048openssl req -new -key proxy.key -out proxy.csr -subj "/CN=system:kube-proxy"openssl x509 -req -in proxy.csr -CA ca.pem -CAkey ca.key -CAcreateserial -out proxy.pem -days 3650ls $ssldir
}create_proxy_key_pemfunction setup_ca(){rm -rf $kubernetsDirmkdir -p $kubernetsTLSDircat $ssldir/ca.pem > $kubernetsTLSDir/ca.pemcat $ssldir/ca.key > $kubernetsTLSDir/ca.keycat $ssldir/apiserver.pem > $kubernetsTLSDir/apiserver.pemcat $ssldir/apiserver.key > $kubernetsTLSDir/apiserver.keycat $ssldir/admin.pem > $kubernetsTLSDir/admin.pemcat $ssldir/admin.key > $kubernetsTLSDir/admin.keycat $ssldir/proxy.pem > $kubernetsTLSDir/proxy.pemcat $ssldir/proxy.key > $kubernetsTLSDir/proxy.keyecho "checking TLS file:"ls $kubernetsTLSDir
}setup_ca
[root@server81 install_k8s_master]# 

执行生成证书如下

[root@server81 install_k8s_master]# ./Step1_create_CA.sh 
● firewalld.service - firewalld - dynamic firewall daemonLoaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)Active: inactive (dead)Docs: man:firewalld(1)
SELinux status:                 disabled
Generating RSA private key, 2048 bit long modulus
................................................+++
............................................................................+++
e is 65537 (0x10001)
ca.key  ca.pem
Generating RSA private key, 2048 bit long modulus
.......................................................................................+++
.............+++
e is 65537 (0x10001)
Signature ok
subject=/CN=kubernetes/O=k8s
Getting CA Private Key
apiserver.csr  apiserver.key  apiserver.pem  ca.key  ca.pem  ca.srl  openssl.cnf
Generating RSA private key, 2048 bit long modulus
.......................................+++
...........+++
e is 65537 (0x10001)
Signature ok
subject=/CN=admin/O=system:masters/OU=System
Getting CA Private Key
admin.csr  admin.key  admin.pem  apiserver.csr  apiserver.key  apiserver.pem  ca.key  ca.pem  ca.srl  openssl.cnf
Generating RSA private key, 2048 bit long modulus
...+++
..+++
e is 65537 (0x10001)
Signature ok
subject=/CN=system:kube-proxy
Getting CA Private Key
admin.csr  admin.pem      apiserver.key  ca.key  ca.srl       proxy.csr  proxy.pem
admin.key  apiserver.csr  apiserver.pem  ca.pem  openssl.cnf  proxy.key
checking TLS file:
admin.key  admin.pem  apiserver.key  apiserver.pem  ca.key  ca.pem  proxy.key  proxy.pem
[root@server81 install_k8s_master]#
[root@server81 install_k8s_master]# ls
configDir     Step1_create_CA.sh  Step2_create_token.sh       Step4_install_controller.sh  Step6_create_kubeconfig_file.sh
Implement.sh  Step1_file          Step3_install_apiserver.sh  Step5_install_scheduler.sh   Step7_set_master_info.sh
[root@server81 install_k8s_master]#
[root@server81 install_k8s_master]# ls /etc/kubernetes/
kubernetesTLS
[root@server81 install_k8s_master]# ls /etc/kubernetes/kubernetesTLS/
admin.key  admin.pem  apiserver.key  apiserver.pem  ca.key  ca.pem  proxy.key  proxy.pem
[root@server81 install_k8s_master]# 
[root@server81 install_k8s_master]# ls -ll /etc/kubernetes/kubernetesTLS/
total 32
-rw-r--r-- 1 root root 1675 Aug 19 22:21 admin.key
-rw-r--r-- 1 root root 1050 Aug 19 22:21 admin.pem
-rw-r--r-- 1 root root 1675 Aug 19 22:21 apiserver.key
-rw-r--r-- 1 root root 1302 Aug 19 22:21 apiserver.pem
-rw-r--r-- 1 root root 1679 Aug 19 22:21 ca.key
-rw-r--r-- 1 root root 1135 Aug 19 22:21 ca.pem
-rw-r--r-- 1 root root 1679 Aug 19 22:21 proxy.key
-rw-r--r-- 1 root root 1009 Aug 19 22:21 proxy.pem
[root@server81 install_k8s_master]# 

怎么样?有了这个脚本是不是感觉世界都美好了。只要理解清楚详细配置步骤,然后执行一下脚本,你就可以拥有更加多的咖啡时间了。


kubernetes v1.11 二进制部署篇章目录

  • kubernetes v1.11 二进制部署
    • (一)环境介绍
    • (二)Openssl自签TLS证书
    • (三)master组件部署
    • (四)node组件部署

13423234-7907ae6344e86e8a.png

13423234-6804d40e7a12773b.jpg

关注微信公众号,回复【资料】、Python、PHP、JAVA、web,则可获得Python、PHP、JAVA、前端等视频资料。

这篇关于kubernetes v1.11 二进制部署(二)之Openssl自签TLS证书的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1092210

相关文章

闲置电脑也能活出第二春?鲁大师AiNAS让你动动手指就能轻松部署

对于大多数人而言,在这个“数据爆炸”的时代或多或少都遇到过存储告急的情况,这使得“存储焦虑”不再是个别现象,而将会是随着软件的不断臃肿而越来越普遍的情况。从不少手机厂商都开始将存储上限提升至1TB可以见得,我们似乎正处在互联网信息飞速增长的阶段,对于存储的需求也将会不断扩大。对于苹果用户而言,这一问题愈发严峻,毕竟512GB和1TB版本的iPhone可不是人人都消费得起的,因此成熟的外置存储方案开

阿里开源语音识别SenseVoiceWindows环境部署

SenseVoice介绍 SenseVoice 专注于高精度多语言语音识别、情感辨识和音频事件检测多语言识别: 采用超过 40 万小时数据训练,支持超过 50 种语言,识别效果上优于 Whisper 模型。富文本识别:具备优秀的情感识别,能够在测试数据上达到和超过目前最佳情感识别模型的效果。支持声音事件检测能力,支持音乐、掌声、笑声、哭声、咳嗽、喷嚏等多种常见人机交互事件进行检测。高效推

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略 1. 特权模式限制2. 宿主机资源隔离3. 用户和组管理4. 权限提升控制5. SELinux配置 💖The Begin💖点点关注,收藏不迷路💖 Kubernetes的PodSecurityPolicy(PSP)是一个关键的安全特性,它在Pod创建之前实施安全策略,确保P

软考系统规划与管理师考试证书含金量高吗?

2024年软考系统规划与管理师考试报名时间节点: 报名时间:2024年上半年软考将于3月中旬陆续开始报名 考试时间:上半年5月25日到28日,下半年11月9日到12日 分数线:所有科目成绩均须达到45分以上(包括45分)方可通过考试 成绩查询:可在“中国计算机技术职业资格网”上查询软考成绩 出成绩时间:预计在11月左右 证书领取时间:一般在考试成绩公布后3~4个月,各地领取时间有所不同

K8S(Kubernetes)开源的容器编排平台安装步骤详解

K8S(Kubernetes)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。以下是K8S容器编排平台的安装步骤、使用方式及特点的概述: 安装步骤: 安装Docker:K8S需要基于Docker来运行容器化应用程序。首先要在所有节点上安装Docker引擎。 安装Kubernetes Master:在集群中选择一台主机作为Master节点,安装K8S的控制平面组件,如AP

什么是Kubernetes PodSecurityPolicy?

@TOC 💖The Begin💖点点关注,收藏不迷路💖 1、什么是PodSecurityPolicy? PodSecurityPolicy(PSP)是Kubernetes中的一个安全特性,用于在Pod创建前进行安全策略检查,限制Pod的资源使用、运行权限等,提升集群安全性。 2、为什么需要它? 默认情况下,Kubernetes允许用户自由创建Pod,可能带来安全风险。

容器编排平台Kubernetes简介

目录 什么是K8s 为什么需要K8s 什么是容器(Contianer) K8s能做什么? K8s的架构原理  控制平面(Control plane)         kube-apiserver         etcd         kube-scheduler         kube-controller-manager         cloud-controlle

在 Windows 上部署 gitblit

在 Windows 上部署 gitblit 在 Windows 上部署 gitblit 缘起gitblit 是什么安装JDK部署 gitblit 下载 gitblit 并解压配置登录注册为 windows 服务 修改 installService.cmd 文件运行 installService.cmd运行 gitblitw.exe查看 services.msc 缘起

【Kubernetes】K8s 的安全框架和用户认证

K8s 的安全框架和用户认证 1.Kubernetes 的安全框架1.1 认证:Authentication1.2 鉴权:Authorization1.3 准入控制:Admission Control 2.Kubernetes 的用户认证2.1 Kubernetes 的用户认证方式2.2 配置 Kubernetes 集群使用密码认证 Kubernetes 作为一个分布式的虚拟

Solr部署如何启动

Solr部署如何启动 Posted on 一月 10, 2013 in:  Solr入门 | 评论关闭 我刚接触solr,我要怎么启动,这是群里的朋友问得比较多的问题, solr最新版本下载地址: http://www.apache.org/dyn/closer.cgi/lucene/solr/ 1、准备环境 建立一个solr目录,把solr压缩包example目录下的内容复制