kubernetes高可用設計-CA,etcd

環境準備:node

master01:192.168.150.128linux

master02:192.168.150.130git

master03:192.168.150.131github

node01:192.168.150.132json

lb01:192.168.150.133api

lb02:192.168.150.134瀏覽器

 

集羣環境變量

後面的嗯部署將會使用到的全局變量,定義以下(根據本身的機器、網絡修改):安全

# TLS Bootstrapping 使用的Token,可使用命令 head -c 16 /dev/urandom | od -An -t x | tr -d ' ' 生成
BOOTSTRAP_TOKEN="8981b594122ebed7596f1d3b69c78223"

# 建議使用未用的網段來定義服務網段和Pod 網段
# 服務網段(Service CIDR),部署前路由不可達,部署後集羣內部使用IP:Port可達
SERVICE_CIDR="10.254.0.0/16"
# Pod 網段(Cluster CIDR),部署前路由不可達,部署後路由可達(flanneld 保證)
CLUSTER_CIDR="172.30.0.0/16"

# 服務端口範圍(NodePort Range)
NODE_PORT_RANGE="30000-32766"

# etcd集羣服務地址列表
ETCD_ENDPOINTS="https://192.168.1.137:2379,https://192.168.1.138:2379,https://192.168.1.170:2379"

# flanneld 網絡配置前綴
FLANNEL_ETCD_PREFIX="/kubernetes/network"

# kubernetes 服務IP(預先分配,通常爲SERVICE_CIDR中的第一個IP)
CLUSTER_KUBERNETES_SVC_IP="10.254.0.1"

# 集羣 DNS 服務IP(從SERVICE_CIDR 中預先分配)
CLUSTER_DNS_SVC_IP="10.254.0.2"

# 集羣 DNS 域名
CLUSTER_DNS_DOMAIN="cluster.local."

# MASTER API Server 地址
MASTER_URL="k8s-api.virtual.local"

將上面變量保存爲: env.sh,而後將腳本拷貝到全部機器的/usr/k8s/bin目錄。網絡

注意點: BOOTSTRAP_TOKEN 須要執行head -c 16 /dev/urandom | od -An -t x | tr -d ' ' 生成app

爲方便後面遷移,咱們在集羣內定義一個域名用於訪問apiserver,在每一個節點的/etc/hosts文件中添加記錄:192.168.150.128 k8s-api.virtual.local k8s-api

其中192.168.150.128爲master01 的IP,暫時使用該IP 來作apiserver 的負載地址

若是你使用的是阿里雲的ECS 服務,強烈建議你先將上述節點的安全組配置成容許全部訪問,否則在安裝過程當中會遇到各類訪問不了的問題,待集羣配置成功之後再根據須要添加安全限制。

 

2. 建立CA 證書和密鑰

kubernetes 系統各個組件須要使用TLS證書對通訊進行加密,這裏咱們使用CloudFlare的PKI 工具集cfssl 來生成Certificate Authority(CA) 證書和密鑰文件, CA 是自簽名的證書,用來簽名後續建立的其餘TLS 證書。

 

安裝 CFSSL

$ wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
$ chmod +x cfssl_linux-amd64
$ sudo mv cfssl_linux-amd64 /usr/k8s/bin/cfssl

$ wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
$ chmod +x cfssljson_linux-amd64
$ sudo mv cfssljson_linux-amd64 /usr/k8s/bin/cfssljson

$ wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
$ chmod +x cfssl-certinfo_linux-amd64
$ sudo mv cfssl-certinfo_linux-amd64 /usr/k8s/bin/cfssl-certinfo

$ export PATH=/usr/k8s/bin:$PATH
$ mkdir ssl && cd ssl
$ cfssl print-defaults config > config.json
$ cfssl print-defaults csr > csr.json

爲了方便,將/usr/k8s/bin設置成環境變量,爲了重啓也有效,能夠將上面的export PATH=/usr/k8s/bin:$PATH添加到/etc/rc.local文件中。

建立CA

修改上面建立的config.json文件爲ca-config.json

$ cat ca-config.json
{
    "signing": {
        "default": {
            "expiry": "87600h"
        },
        "profiles": {
            "kubernetes": {
                "expiry": "87600h",
                "usages": [
                    "signing",
                    "key encipherment",
                    "server auth",
                    "client auth"
                ]
            }
        }
    }
}
  • config.json:能夠定義多個profiles,分別指定不一樣的過時時間、使用場景等參數;後續在簽名證書時使用某個profile;
  • signing: 表示該證書可用於簽名其它證書;生成的ca.pem 證書中CA=TRUE
  • server auth: 表示client 能夠用該CA 對server 提供的證書進行校驗;
  • client auth: 表示server 能夠用該CA 對client 提供的證書進行驗證。

修改CA 證書籤名請求爲ca-csr.json

$ cat ca-csr.json
{
    "CN": "kubernetes",
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "L": "BeiJing",
            "ST": "BeiJing",
            "O": "k8s",
            "OU": "System"
        }
    ]
}
  • CNCommon Name,kube-apiserver 從證書中提取該字段做爲請求的用戶名(User Name);瀏覽器使用該字段驗證網站是否合法;
  • OOrganization,kube-apiserver 從證書中提取該字段做爲請求用戶所屬的組(Group);

生成CA 證書和私鑰:

$ cfssl gencert -initca ca-csr.json | cfssljson -bare ca
$ ls ca*
$ ca-config.json  ca.csr  ca-csr.json  ca-key.pem  ca.pem

分發證書

將生成的CA 證書、密鑰文件、配置文件拷貝到全部機器的/etc/kubernetes/ssl目錄下面:

$ sudo mkdir -p /etc/kubernetes/ssl
$ sudo cp ca* /etc/kubernetes/ssl

3. 部署高可用etcd 集羣

kubernetes 系統使用etcd存儲全部的數據,咱們這裏部署3個節點的etcd 集羣,這3個節點直接複用kubernetes master的3個節點,分別命名爲etcd01etcd02etcd03:

  • etcd01:192.168.150.128
  • etcd02:192.168.150.130
  • etcd03:192.168.150.131

定義環境變量

使用到的變量以下:

$ export NODE_NAME=etcd01 # 當前部署的機器名稱(隨便定義,只要能區分不一樣機器便可)
$ export NODE_IP=192.168.150.128 # 當前部署的機器IP
$ export NODE_IPS="192.168.150.128 192.168.150.130 192.168.150.131" # etcd 集羣全部機器 IP
$ # etcd 集羣間通訊的IP和端口
$ export ETCD_NODES=etcd01=https://192.168.150.128:2380,etcd02=https://192.168.150.130:2380,etcd03=https://192.168.150.131:2380
$ # 導入用到的其它全局變量:ETCD_ENDPOINTS、FLANNEL_ETCD_PREFIX、CLUSTER_CIDR
$ source /usr/k8s/bin/env.sh

 

下載etcd 二進制文件

https://github.com/coreos/etcd/releases頁面下載最新版本的二進制文件:

$ wget https://github.com/coreos/etcd/releases/download/v3.2.9/etcd-v3.2.9-linux-amd64.tar.gz
$ tar -xvf etcd-v3.2.9-linux-amd64.tar.gz
$ sudo mv etcd-v3.2.9-linux-amd64/etcd* /usr/k8s/bin/

     #目前etcd好像是3.3.9版本了吧

建立TLS 密鑰和證書

爲了保證通訊安全,客戶端(如etcdctl)與etcd 集羣、etcd 集羣之間的通訊須要使用TLS 加密。

建立etcd 證書籤名請求:

$ cat > etcd-csr.json <<EOF
{
  "CN": "etcd",
  "hosts": [
    "127.0.0.1",
    "${NODE_IP}"
  ],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "BeiJing",
      "L": "BeiJing",
      "O": "k8s",
      "OU": "System"
    }
  ]
}
EOF
  • hosts 字段指定受權使用該證書的etcd節點IP

生成etcd證書和私鑰:

$ cfssl gencert -ca=/etc/kubernetes/ssl/ca.pem \
  -ca-key=/etc/kubernetes/ssl/ca-key.pem \
  -config=/etc/kubernetes/ssl/ca-config.json \
  -profile=kubernetes etcd-csr.json | cfssljson -bare etcd
$ ls etcd*
etcd.csr  etcd-csr.json  etcd-key.pem  etcd.pem
$ sudo mkdir -p /etc/etcd/ssl
$ sudo mv etcd*.pem /etc/etcd/ssl/

 

建立etcd 的systemd unit 文件

$ sudo mkdir -p /var/lib/etcd  # 必需要先建立工做目錄
$ cat > etcd.service <<EOF
[Unit]
Description=Etcd Server
After=network.target
After=network-online.target
Wants=network-online.target
Documentation=https://github.com/coreos

[Service]
Type=notify
WorkingDirectory=/var/lib/etcd/
ExecStart=/usr/k8s/bin/etcd \\
  --name=${NODE_NAME} \\
  --cert-file=/etc/etcd/ssl/etcd.pem \\
  --key-file=/etc/etcd/ssl/etcd-key.pem \\
  --peer-cert-file=/etc/etcd/ssl/etcd.pem \\
  --peer-key-file=/etc/etcd/ssl/etcd-key.pem \\
  --trusted-ca-file=/etc/kubernetes/ssl/ca.pem \\
  --peer-trusted-ca-file=/etc/kubernetes/ssl/ca.pem \\
  --initial-advertise-peer-urls=https://${NODE_IP}:2380 \\
  --listen-peer-urls=https://${NODE_IP}:2380 \\
  --listen-client-urls=https://${NODE_IP}:2379,http://127.0.0.1:2379 \\
  --advertise-client-urls=https://${NODE_IP}:2379 \\
  --initial-cluster-token=etcd-cluster-0 \\
  --initial-cluster=${ETCD_NODES} \\
  --initial-cluster-state=new \\
  --data-dir=/var/lib/etcd
Restart=on-failure
RestartSec=5
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target
EOF

 

  • 指定etcd的工做目錄和數據目錄爲/var/lib/etcd,須要在啓動服務前建立這個目錄;
  • 爲了保證通訊安全,須要指定etcd 的公私鑰(cert-file和key-file)、Peers通訊的公私鑰和CA 證書(peer-cert-file、peer-key-file、peer-trusted-ca-file)、客戶端的CA 證書(trusted-ca-file);
  • --initial-cluster-state值爲new時,--name的參數值必須位於--initial-cluster列表中;

啓動etcd 服務

$ sudo mv etcd.service /etc/systemd/system/
$ sudo systemctl daemon-reload
$ sudo systemctl enable etcd
$ sudo systemctl start etcd
$ sudo systemctl status etcd

 #/etc/systemd/system下面發生改變時須要執行systemctl daemon-reload 命令 從新加載配置

 #最早啓動的etcd 進程會卡住一段時間,等待其餘節點啓動加入集羣,在全部的etcd 節點重複上面的步驟,直到全部的機器etcd 服務都已經啓動。

 #須要注意的是 我配置的都沒有問題可是啓動etcd的時候3個節點都顯示鏈接超時反覆排查檢查證書文件都是沒有問題的,最後想到的是 我這3個master機器是新建的虛擬機

   selinux沒有關閉,防火牆沒有放行端口2080,237九、要是我的實驗能夠關閉防火牆。

#還有配置完一臺的時候啓動etcd確定是啓動不起來etcd服務的,由於是集羣須要全部master節點都配置完etcd還能啓動服務成功。

把master01上面/usr/k8s/bin/  、/etc/kubernetes/ssl  這兩個下面的全部文件都要拷貝到master02,master03機器上面對應的目錄

給你們看一個節點就好了  3個節點都同樣的,看一個就好了 嘿嘿!

接下來驗證服務了,就算這3個節點的etcd都顯示active也不能保證集羣之間能正常通訊因此須要驗證一下。

驗證服務

部署完etcd 集羣后,在任一etcd 節點上執行下面命令:

for ip in ${NODE_IPS}; do
  ETCDCTL_API=3 /usr/k8s/bin/etcdctl \
  --endpoints=https://${ip}:2379  \
  --cacert=/etc/kubernetes/ssl/ca.pem \
  --cert=/etc/etcd/ssl/etcd.pem \
  --key=/etc/etcd/ssl/etcd-key.pem \
  endpoint health; done

寫了一個for循環測試一下

能夠看到上面的信息3個節點上的etcd 均爲healthy,則表示集羣服務正常。

相關文章
相關標籤/搜索