1. 程式人生 > >etcd啟用https服務

etcd啟用https服務

ini 私有 fig 直接 amd 簽名 啟用 ID 12.1

[toc]

關於etcd的集群配置可直接參考etcd集群部署

這篇文檔只是在其基礎上增加ssl加密驗證的過程。

要讓集群使用ssl,首先需要為集群生成ssl證書。

我們使用cfssl系列工具來生成相關證書。

cfssl相關工具下載

curl -s -L -o /opt/kubernetes/bin/cfssl https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
curl -s -L -o /opt/kubernetes/bin/cfssljson https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
chmod +x /opt/kubernetes/bin/{cfssl,cfssljson}

生成etcd所需要的ssl證書

生成ca證書

ca-config.json配置如下:

{
    "signing": {
        "default": {
            "expiry": "175200h"
        },
        "profiles": {
            "kubernetes": {
                "expiry": "175200h",
                "usages": [
                    "signing",
                    "key encipherment",
                    "server auth",
            "client auth"
                ]
            },
            "etcd": {
                "expiry": "175200h",
                "usages": [
                    "signing",
                    "key encipherment",
                    "server auth",
                    "client auth"
                ]
            }
        }
    }
}

字段說明:

  • ca-config.json:可以定義多個Profiles,分別指定不同的過期時間、使用場景等參數;後續在簽名證書的時候使用某個Profile。這裏定義了兩個Profile,一個用於kubernetes,一個用於etcd。但因為這篇文檔不涉及到kubernetes的配置,所以kubenretes段是不使用的。
  • signing:表示該證書可用於簽名其他證書;生成的ca.pem證書中CA=TRUE
  • server auth:表示client可以使用該ca對server提供的證書進行驗證
  • client auth:表示server可以用該ca對client提供的證書進行驗證

ca-csr.json配置如下:

{
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "L": "Wuhan",
            "ST": "Hubei",
            "O": "k8s",
            "OU": "System"
        }
    ]
}

生成ca證書:

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

執行後會生成三個文件:

  • ca-key.pem : CA的私有key
  • ca.pem : CA證書
  • ca.csr : CA的證書請求文件

生成etcd服務端證書

etcd服務端證書用於加密etcd集群之間的通信

etcd-csr.json文件內容如下:

{
  "CN": "etcd-server",
  "hosts": [
    "localhost",
    "0.0.0.0",
    "127.0.0.1",
    "10.5.12.16",
    "10.5.12.17",
    "10.5.12.18"
  ],
  "key": {
    "algo": "rsa",
    "size": 4096
  },
  "names": [
    {
      "C": "CN",
      "L": "Wuhan",
      "O": "k8s",
      "OU": "System",
      "ST": "Hubei"
    }
  ]
}

生成etcd服務端證書:

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

生成三個文件:etcd.pem, etcd-key.pem, etcd.csr

生成etcd客戶端證書

etcd客戶端證書用於etcd客戶端連接etcd時提供驗證方式

etcd-client-csr.json

{
  "CN": "etcd-client",
  "hosts": [
    ""
  ],
  "key": {
    "algo": "rsa",
    "size": 4096
  },
  "names": [
    {
      "C": "CN",
      "L": "Wuhan",
      "ST": "Hubei",
      "O": "k8s",
      "OU": "System"
    }
  ]
}

生成客戶端證書:

cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=etcd etcd-client-csr.json | cfssljson -bare etcd-client

生成三個文件:etcd-client.pem, etcd-client-key.pem, etcd-client.csr

最佳實踐: 在實際生產中,為了簡化etcd的管理,我們通常不會為服務端和客戶端各生成一套證書,而是生成一套即可以用於服務端也可以同時用於客戶端的證書。在我們上面生成etcd的ca證書的時候,可以看到etcd-ca-config.json中etcd的證書useags中同時有server auth和client auth。也就是說,基於我們的ca證書生成的etcd證書本身就可以同時用於服務端與客戶端。然而,我們在生成etcd服務端證書的時候,在etcd-server-csr.json中指定了hosts,所以該證書只能被指定的hosts列表中的主機使用,要想所有的客戶端都能使用這個證書。最簡單的方法就是和生成etcd客戶端證書時一樣,直接將hosts留空。反過來,也就是說,我們可以直接將生成的etcd客戶端證書用於服務端。

修改etcd集群配置文件

修改後的/opt/kubernetes/cfg/etcd.conf文件內容如下:

ETCD_NAME=etcd1
ETCD_DATA_DIR="/data/etcd"
ETCD_LISTEN_CLIENT_URLS="http://10.5.12.16:2379,http://127.0.0.1:2379"
ETCD_LISTEN_PEER_URLS="http://10.5.12.16:2380"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://10.5.12.16:2380"
ETCD_INITIAL_CLUSTER="etcd1=http://10.5.12.16:2380,etcd2=http://10.5.12.17:2380,etcd3=http://10.5.12.18:2380"
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_ADVERTISE_CLIENT_URLS="http://10.5.12.16:2379"
CLIENT_CERT_AUTH="true"
ETCD_CA_FILE="/opt/kubernetes/ssl/ca.pem"
ETCD_CERT_FILE="/opt/kubernetes/ssl/etcd.pem"
ETCD_KEY_FILE="/opt/kubernetes/ssl/etcd-key.pem"
PEER_CLIENT_CERT_AUTH="true"
ETCD_PEER_CA_FILE="/opt/kubernetes/ssl/ca.pem"
ETCD_PEER_CERT_FILE="/opt/kubernetes/ssl/etcd.pem"
ETCD_PEER_KEY_FILE="/opt/kubernetes/ssl/etcd-key.pem"

重啟etcd集群

systemctl restart etcd

驗證集群健康情況

驗證集群健康狀態時,需要使用客戶端證書來連接etcd集群:

etcdctl --cert-file=/opt/kubernetes/ssl/etcd-client.pem  --key-file=/opt/kubernetes/ssl/etcd-client-key.pem --ca-file=/opt/kubernetes/ssl/ca.pem --endpoints=https://10.5.12.16:2379,https://10.5.12.17:2379,https://10.5.12.18:2379 member list

etcd啟用https服務