部署前的准备工作

准备节点

操作系统

使用 Linux 发行版,本教程主要以 Ubuntu 18.04 为例

Master 节点

部署 K8S 控制面组件,推荐三台以上数量的机器

ETCD 节点

部署 ETCD,可以跟 Master 节点用相同的机器,也可以用单独的机器,推荐三台以上数量的机器

Worker 节点

实际运行工作负载的节点,Master 节点也可以作为 Worker 节点,可以通过 kubelet 参数 --kube-reserved 多预留一些资源给系统组件。

通常会给 Master 节点打标签,让关键的 Pod 跑在 Master 节点上,比如集群 DNS 服务。

准备客户端工具

我们需要用 cfsslkubectl 来为各个组件生成证书和 kubeconfig,所以先将这两个工具在某个机器下载安装好。

" class="reference-link">安装 cfssl

  1. curl -L https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -o cfssl
  2. curl -L https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 -o cfssljson
  3. curl -L https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 -o cfssl-certinfo
  4. chmod +x cfssl cfssljson cfssl-certinfo
  5. sudo mv cfssl cfssljson cfssl-certinfo /usr/local/bin/

安装 kubectl

  1. wget -q --show-progress --https-only --timestamping \
  2. https://storage.googleapis.com/kubernetes-release/release/v1.16.1/bin/linux/amd64/kubectl
  3. chmod +x kubectl
  4. mv kubectl /usr/local/bin/

" class="reference-link">生成 CA 证书

由于各个组件都需要配置证书,并且依赖 CA 证书来签发证书,所以我们首先要生成好 CA 证书以及后续的签发配置文件:

  1. cat > ca-csr.json <<EOF
  2. {
  3. "CN": "Kubernetes",
  4. "key": {
  5. "algo": "rsa",
  6. "size": 2048
  7. },
  8. "names": [
  9. {
  10. "C": "CN",
  11. "ST": "SiChuan",
  12. "L": "ChengDu",
  13. "O": "Kubernetes",
  14. "OU": "CA"
  15. }
  16. ]
  17. }
  18. EOF
  19. cfssl gencert -initca ca-csr.json | cfssljson -bare ca
  20. cat > ca-config.json <<EOF
  21. {
  22. "signing": {
  23. "default": {
  24. "expiry": "8760h"
  25. },
  26. "profiles": {
  27. "kubernetes": {
  28. "usages": ["signing", "key encipherment", "server auth", "client auth"],
  29. "expiry": "8760h"
  30. }
  31. }
  32. }
  33. }
  34. EOF

生成的文件中有下面三个后面会用到:

  • ca-key.pem: CA 证书密钥
  • ca.pem: CA 证书
  • ca-config.json: 证书签发配置

csr 文件字段解释:

  • CN: Common Name,apiserver 从证书中提取该字段作为请求的用户名 (User Name)
  • Organization,apiserver 从证书中提取该字段作为请求用户所属的组 (Group)

由于这里是 CA 证书,是签发其它证书的根证书,这个证书密钥不会分发出去作为 client 证书,所有组件使用的 client 证书都是由 CA 证书签发而来,所以 CA 证书的 CN 和 O 的名称并不重要,后续其它签发出来的证书的 CN 和 O 的名称才是有用的