kubernetes部署之创建TLS证书(2)

研究过kubernetes的同事们都知道,kubernetes如果需要启用TLS认证,那么制作证书是必不可少的一步。然而,很多人在制作证书上遇到了很多的麻烦。今天主要记录一次我在部署kubernetes的过程中,是如何制作证书的。在整个过程中,将详细列出各组件的启动参数,给出配置文件,以及详解它们的含义和可能遇到的问题。

一、部署前准备

1.1 主机环境

环境参考ETCD集群部署,这里会增加一个VIP(192.168.15.200),用户实现kubernetes master高可用;

1.2 安装cfssl工具

cd /usr/src/
wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
chmod +x cfssl_linux-amd64
mv cfssl_linux-amd64 /usr/local/bin/cfssl
wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
chmod +x cfssljson_linux-amd64
mv cfssljson_linux-amd64 /usr/local/bin/cfssljson
wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64chmod +x cfssl-certinfo_linux-amd64
mv cfssl-certinfo_linux-amd64 /usr/local/bin/cfssl-certinfo

二、生成证书

2.1 创建CA证书

mkdir /root/ssl
cd /root/ssl
cat >> ca-config.json << EOF
{
  "signing": {
    "default": {
      "expiry": "87600h"
    },
    "profiles": {
      "kubernetes": {
        "usages": [
            "signing",
            "key encipherment",
            "server auth",
            "client auth"
        ],
        "expiry": "87600h"
      }
    }
  }
}EOF

提示:

  ca-config.json:可以定义多个 profiles,分别指定不同的过期时间、使用场景等参数,后续在签名证书时使用某个profile;

  signing:表示该证书可用于签名其它证书,生成的ca.pem证书中CA=TRUE

  server auth:表示client可以用该CA对server提供的证书进行验证;

  client auth:表示server可以用该CA对client提供的证书进行验证;

创建CA证书签名请求配置:

cat >> ca-csr.json << EOF
{
  "CN": "kubernetes",
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "BeiJing",
      "L": "BeiJing",
      "O": "k8s",
      "OU": "system"
    }
  ]
}
EOF

提示:

  CN即Common Name,kube-apiserver从证书中提取该字段作为请求的用户名;

  O即Organization,kube-apiserver从证书中提取该字段作为请求用户所属的组;

用cfssl生成CA证书以及颁发证书:

 cfssl gencert -initca ca-csr.json | cfssljson -bare ca

2.2 创建apiserver证书

cat >> apiserver-csr.json << EOF
{
    "CN": "kubernetes",
    "hosts": [
      "127.0.0.1",
      "192.168.15.131",
      "192.168.15.132",
      "192.168.15.133",
      "192.168.15.200",
      "10.96.0.1",
      "kubernetes",
      "kubernetes.default",
      "kubernetes.default.svc",
      "kubernetes.default.svc.cluster",
      "kubernetes.default.svc.cluster.local"
    ],
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "ST": "BeiJing",
            "L": "BeiJing",
            "O": "k8s",
            "OU": "system"
        }
    ]
}
EOF

提示:注意上面配置hosts字段中制定授权使用该证书的IP和域名列表,因为现在要生成的证书需要被Kubernetes Master集群各个节点使用,所以这里指定了各个节点的IP和hostname。同时还要指定集群内部kube-apiserver的多个域名和IP地址10.96.0.1(后边kube-apiserver-service-cluster-ip-range=10.96.0.0/12参数的指定网段的第一个IP)。最后一点,如果你用到了VIP这里也是需要添加该IP地址的。

生成kube-apiserver的证书和私钥:

cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=frognew apiserver-csr.json | cfssljson -bare apiserver

2.3 创建kubernetes-admin证书以及私钥

cat >> admin-csr.json << EOF
{
  "CN": "kubernetes-admin",
  "hosts": [
        "192.168.15.131",
        "192.168.15.132",
        "192.168.15.133",
        "192.168.15.200"
  ],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "BeiJing",
      "L": "BeiJing",
      "O": "system:masters",
      "OU": "system"
    }
  ]
}
EOF

提示:kube-apiserver将提取CN作为客户端的用户名,这里是kubernetes-admin,将提取O作为用户所属的组,这里是system:master。 kube-apiserver预定义了一些 RBAC使用的ClusterRoleBindings,例如 cluster-admin将组system:masters与 ClusterRole cluster-admin绑定,而cluster-admin拥有访问kube-apiserver的所有权限,因此kubernetes-admin这个用户将作为集群的超级管理员。(具体参考kubernetes 认证相关文档)

生成kubernetes-admin的证书和私钥:

cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=frognew admin-csr.json | cfssljson -bare admin

2.4 创建kubernetes-controller-manager证书和私钥

cat >> controller-manager-csr.json << EOF
{
  "CN": "system:kube-controller-manager",
  "hosts": [
      "192.168.15.131",
      "192.168.15.132",
      "192.168.15.133",
      "192.168.15.200"
  ],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "BeiJing",
      "L": "BeiJing",
      "O": "system:kube-controller-manager",
      "OU": "system"
    }
  ]
}
EOF

提示:kube-apiserver将提取CN作为客户端的用户名,这里是system:kube-controller-manager。 kube-apiserver预定义的 RBAC使用的ClusterRoleBindings system:kube-controller-manager将用户system:kube-controller-manager与ClusterRole system:kube-controller-manager绑定。

生成kubernetes-controller-manager证书及私钥:

cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=frognew controller-manager-csr.json | cfssljson -bare controller-manager

2.5 创建kubernetes-scheduler证书及私钥

cat >> scheduler-csr.json << EOF
{
  "CN": "system:kube-scheduler",
  "hosts": [
      "192.168.15.131",
      "192.168.15.132",
      "192.168.15.133",
      "192.168.15.200"
  ],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "BeiJing",
      "L": "BeiJing",
      "O": "system:kube-scheduler",
      "OU": "system"
    }
  ]
}
EOF

提示:kube-scheduler将提取CN作为客户端的用户名,这里是system:kube-scheduler。 kube-apiserver预定义的RBAC使用的ClusterRoleBindings system:kube-scheduler将用户system:kube-scheduler与ClusterRole system:kube-scheduler绑定。

生成kubernetes-scheduler证书及私钥:

cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=frognew scheduler-csr.json | cfssljson -bare scheduler

至此,所有相关证书制作完成!

时间: 2024-10-11 18:17:13

kubernetes部署之创建TLS证书(2)的相关文章

创建TLS证书和秘钥

创建TLS证书和秘钥 前言 执行下列步骤前建议你先阅读以下内容: 管理集群中的TLS:教您如何创建TLS证书 kubelet的认证授权:向您描述如何通过认证授权来访问 kubelet 的 HTTPS 端点. TLS bootstrap:介绍如何为 kubelet 设置 TLS 客户端证书引导(bootstrap). **注意:**这一步是在安装配置kubernetes的所有步骤中最容易出错也最难于排查问题的一步,而这却刚好是第一步,万事开头难,不要因为这点困难就望而却步. 如果您足够有信心在完全

kubernetes 集群部署 自签 TLS 证书

kubernetes 集群之间的通信需要加密,可以使用自签 TLS 证书.具体证书如下: 组件 使用的证书 etcd ca.pem,  server.pem,  server-key.pem kube-apiserver ca.pem,  server.pem,  server-key.pem kubelet ca.pem,  ca-key.pem kube-proxy ca.pem,  kube-proxy.pem,  kube-proxy-key.pem kubectl ca.pem,  a

Kubernetes部署(四):ETCD集群部署

手动部署ETCD集群 0.准备etcd软件包 [[email protected] k8s]# wget https://github.com/coreos/etcd/releases/download/v3.2.18/etcd-v3.2.18-linux-amd64.tar.gz [[email protected] k8s]# tar zxf etcd-v3.2.18-linux-amd64.tar.gz [[email protected] k8s]# cd etcd-v3.2.18-li

Kubernetes部署(六):Master节点部署

1.部署Kubernetes API服务部署 0.准备软件包 [[email protected] ~]# cd /usr/local/src/kubernetes [[email protected] kubernetes]# cp server/bin/kube-apiserver /data/kubernetes/bin/ [[email protected] kubernetes]# cp server/bin/kube-controller-manager /data/kubernet

nginx配置多个TLS证书,以及TLS SNI简介

背景 原来申请的正式域名备案通过,TLS证书也申请了.之前使用的临时域名和证书作为测试环境使用.于是要在单个ECS主机上配置nginx多个证书和多个域名. 实践 nginx部署多个TLS证书很简单,在不同的virtual host分别配置证书就搞定了.比如我有a.com和b.com两个域名,在nginx.conf分别配置2个server就可以了 123456789101112131415161718192021 server { listen 443 ssl http2; server_toke

Kubernetes部署(十二):helm部署harbor企业级镜像仓库

相关内容: Kubernetes部署(一):架构及功能说明Kubernetes部署(二):系统环境初始化Kubernetes部署(三):CA证书制作Kubernetes部署(四):ETCD集群部署Kubernetes部署(五):Haproxy.Keppalived部署Kubernetes部署(六):Master节点部署Kubernetes部署(七):Node节点部署Kubernetes部署(八):Flannel网络部署Kubernetes部署(九):CoreDNS.Dashboard.Ingre

[系统集成] 基于Kubernetes 部署 jenkins 并动态分配资源

基于kubernetes 部署 jenkins master 比较简单,难点是为 jenkins 动态分配资源.基于kubernetes 为 jenkins 动态分配资源需要实现下述功能: 资源分配:jenkins 根据任务属性自动创建临时 docker 容器,并作为 slave 节点加入 jenkins 集群,实现资源的分配: 资源释放:任务执行结束后,jenkins 自动删除相关节点,并销毁相关 docker 容器,实现资源的释放: 整个资源分配和资源释放过程对用户来说是透明的,用户只需要创

在线培训 | Kubernetes部署与使用入门

容器技术凭借其轻量化和快速部署的特性,被越来越多企业开发者赞誉,近两年来发展态势可谓炙手可热. 去年一年,Kubernetes的流行度持续快速上升,我们有理由相信在不远的未来,Kubernetes将成为通用的基础设施标准. 开源的全栈化企业级容器管理平台Rancher,凭借优异的基础设施服务管理能力和强大的容器协调能力,让用户在生产环境中的容器部署.运行与管理工作变得更加简单.加上Rancher创造性的纳管来自不同基础架构的Kubernetes集群的能力,为企业在生产环境落地Docker与Kub

Kubernetes 部署集群内部DNS服务

Kubernetes 部署集群内部DNS服务 部署官网:https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/dns/coredns 为服务提供名称域名的访问. - DNS服务监视Kubernetes API,为每一个Service创建DNS记录用于域名解析.- ClusterIP A记录格式:<service-name>.<namespace-name>.svc.cluster.local示例:my