1. 程式人生 > >kubernetes部署之創建TLS證書(2)

kubernetes部署之創建TLS證書(2)

efault control sage 啟用 簽名證書 sched amd .json 進行

研究過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-amd64
chmod +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可以用該CAserver提供的證書進行驗證;

  client auth:表示server可以用該CAclient提供的證書進行驗證;

創建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

提示:

  CNCommon Namekube-apiserver從證書中提取該字段作為請求的用戶名;

  OOrganizationkube-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

至此,所有相關證書制作完成!

kubernetes部署之創建TLS證書(2)