環境準備: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 服務,強烈建議你先將上述節點的安全組配置成容許全部訪問,否則在安裝過程當中會遇到各類訪問不了的問題,待集羣配置成功之後再根據須要添加安全限制。
kubernetes
系統各個組件須要使用TLS
證書對通訊進行加密,這裏咱們使用CloudFlare
的PKI 工具集cfssl 來生成Certificate Authority(CA) 證書和密鑰文件, CA 是自簽名的證書,用來簽名後續建立的其餘TLS 證書。
$ 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
文件中。
修改上面建立的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" } ] }
CN
: Common Name
,kube-apiserver 從證書中提取該字段做爲請求的用戶名(User Name);瀏覽器使用該字段驗證網站是否合法;O
: Organization
,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
kubernetes 系統使用etcd
存儲全部的數據,咱們這裏部署3個節點的etcd 集羣,這3個節點直接複用kubernetes master的3個節點,分別命名爲etcd01
、etcd02
、etcd03
:
使用到的變量以下:
$ 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
到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版本了吧
爲了保證通訊安全,客戶端(如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/
$ 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
,須要在啓動服務前建立這個目錄;--initial-cluster-state
值爲new
時,--name
的參數值必須位於--initial-cluster
列表中;$ 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,則表示集羣服務正常。