Kubernetes 1.6高可用詳細部署流程
本文為了更好的表達,能讓更多的人瞭解各方面的技術,因此在寫的時候會不時的說一說基礎的知識,也會不時的重複一些重點知識。為此,如果影響到閱讀,實在是沒有辦法。
當然,如果只是想快速的把k8s部署到虛擬機器上,只是測試一下效能,那麼,此文可能不適合你的閱讀。因為可以要花不少時間才可以完成。
由於本文涉及的內容比較多,因此劃分為多篇寫。
本文使用的程式碼有很多是來自github,所以,出了問題可以留言,也可以自己到github上面留言。
為了你查閱方便,本文也會把相應的程式碼歸類放到github上。
*時,本人也重新開安裝的虛擬機器,所以,所有的安裝流程都是一步一步的進行,所以,在閱讀時不需要考慮整體的結構。 而整體的結構,也會在以下某一節中詳細說明。
這個會在最後寫
0.0 架構介紹
在本節中,我們會談論到我們要怎麼實現的目標,也就是我們要把k8s配置成什麼樣子。並且我們需要準備多少臺伺服器(當然,也可以是虛擬機器)。
並且,我們需要使用的軟體。
伺服器
haproxy ——- 2臺
k8smaster ——- 2臺
ETCD ——- 3臺
k8snode ——- 3臺,也可以是n臺。
一共 十 臺伺服器。也可以把ETCD放到k8smaster,在這個文件中,我們會單獨建立ETCD叢集。IP規劃
2.1 master
k8smaster01 —– 192.168.123.180
k8smaster02 —– 192.168.123.1812.2 nodes
k8snode01 —– 192.168.123.190
k8snode02 —– 192.168.123.191
k8snode03 —– 192.168.123.1922.3 haproxy
haproxy01 —– 192.168.123.200
haproxy02 —– 192.168.123.201
k8smasterVIP —– 192.168.123.210 —>這個是虛擬IP地址
NodesVIP —– 192.168.123.211 —>這個是虛擬IP地址
2.3 ETCD
etcd01 —— 192.168.123.220
etcd02 —— 192.168.123.221
etcd02 —— 192.168.123.222
基於以上IP地址:
我們會在k8smaster上面安裝api。然後通過haproxy和keepalive做高可用。然後我們會在k8snode上面寫安裝ingress,用於服務訪問,所有的ingress會通過haproxy和keepalive做高可用。然後,我們也會講到如果增加節點。軟體介紹
Centos 7
Docker
keepalive
haproxy
kubernetes 1.6
暫時我們會列出這些,主要現在也記不住版本。我們會在安裝過程中詳細說明。
基於以上IP地址:
我們會在k8smaster上面安裝api。然後通過haproxy和keepalive做高可用。然後我們會在k8snode上面寫安裝ingress,用於服務訪問,所有的ingress會通過haproxy和keepalive做高可用。然後,我們也會講到如果增加節點。拓撲結構
實話這圖看起來真心有點亂,不過相對於網上的抽象圖,應該更直觀一些。如果對圖存在疑問,不用擔心。在此圖上面都標註了IP地址。在隨後的章節中,我們會詳細的談論這些。
當然,此圖並沒有標註的非常詳細。比如flanneld就沒有寫出來。我們在看時,只需要根據結構有一個大概的映像就好。
1.左右結構
2.上中下結構
1.0 環境配置
安裝作業系統Centos 7。檢視核心版本。
[[email protected] ~]# uname -a
Linux localhost.localdomain 3.10.0-514.16.1.el7.x86_64 #1 SMP Wed Apr 12 15:04:24 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
升級作業系統到最新,以下的命令可以要執行一會,看你的網路速度。
update -y
升級完成後,看下版本:
[[email protected] yum.repos.d]# uname -r
3.10.0-514.16.1.el7.x86_64
在執行的時候,我們來看下ETCD相關的資訊。
2.0 ETCD高可用配置
在配置前,我們可以看下在 0.0 中的拓撲圖,在這個圖的右上方ETCD叢集,IP地址如下:
etcd01 —— 192.168.123.220
etcd02 —— 192.168.123.221
etcd02 —— 192.168.123.222
現在我們首先這配置這三臺伺服器。
不要急著進行操作,首先了解一下ETCD的相關資訊。請看下面一段話:(不是我寫的,從網上抄過來的,不想看直接跳過)
ETCD是一個分散式的,一致的 key-value 儲存,主要用途是共享配置和服務發現。Etcd 已經在很多分散式系統中得到廣泛的使用。所有的分散式系統,都面臨的一個問題是多個節點之間的資料共享問題,這個和團隊協作的道理是一樣的,成員可以分頭幹活,但總是需要共享一些必須的資訊,比如誰是 leader, 都有哪些成員,依賴任務之間的順序協調等。所以分散式系統要麼自己實現一個可靠的共享儲存來同步資訊(比如 Elasticsearch ),要麼依賴一個可靠的共享儲存服務,而 Etcd 就是這樣一個服務。
* 提供儲存以及獲取資料的介面,它通過協議保證 Etcd 叢集中的多個節點資料的強一致性。用於儲存元資訊以及共享配置。
* 提供監聽機制,客戶端可以監聽某個key或者某些key的變更(v2和v3的機制不同,參看後面文章)。用於監聽和推送變更。
* 提供key的過期以及續約機制,客戶端通過定時重新整理來實現續約(v2和v3的實現機制也不一樣)。用於叢集監控以及服務註冊發現。
* 提供原子的CAS(Compare-and-Swap)和 CAD(Compare-and-Delete)支援(v2通過介面引數實現,v3通過批量事務實現)。用於分散式鎖以及leader選舉。
迴歸正題
2.1 修改hosts檔案
我們按照這個對應修改
etcd01 —— 192.168.123.220
etcd02 —— 192.168.123.221
etcd02 —— 192.168.123.222
檢視/etc/hosts
[root@localhost ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain
192.168.123.220 etcd01
192.168.123.221 etcd02
192.168.123.222 etcd03
確保
192.168.123.220
192.168.123.221
192.168.123.222
三臺伺服器的/etc/hosts檔案相同
2.2 修改主機名
在192.168.123.220中執行:
hostnamectl set-hostname etcd01
在192.168.123.221中執行:
hostnamectl set-hostname etcd02
在192.168.123.222中執行:
hostnamectl set-hostname etcd03
以上執行完後,重新登入一下終端,命令列前面的提示符就會改成剛剛修改的主機名。
2.3 TLS 認證檔案建立
在這裡,我們使用到的證書有ca.pem, etcd-key.pem, etcd.pem三個證書。接下來,我們一起建立這三個證書。
2.3.1 安裝CFSSL
* 安裝wget下載工作
yum install -y wget
* 建立 /root/cfssl目錄(這裡是使用root帳號登入,因此就在root目錄中,寫全路徑是為了不讓你不產生路徑上面的混亂。)
mkdir /root/cfssl
* 下載CFSSL執行檔案
wget -O cfssl https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
wget -O cfssljson https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
wget -O cfssl-certinfo https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
檢視下載目錄有以下檔案
[root@etcd01 cfssl]# ls cfssl cfssl-certinfo cfssljson
把cfssl的目錄/root/cfssl加到環境變數中
export PATH=/root/cfssl:$PATH
建立CA配置檔案
增加可執行許可權
chmod +x cfssl*
- 建立證書目錄
mkdir /root/ssl
cd /root/ssl
- 生成預設的證書配置檔案
cfssl print-defaults config > ca-config.json
cfssl print-defaults csr > ca-csr.json
config.json內容如下:
[root@etcd01 ssl]# cat ca-config.json
{
"signing": {
"default": {
"expiry": "168h"
},
"profiles": {
"www": {
"expiry": "8760h",
"usages": [
"signing",
"key encipherment",
"server auth"
]
},
"client": {
"expiry": "8760h",
"usages": [
"signing",
"key encipherment",
"client auth"
]
}
}
}
}
[root@etcd01 ssl]# cat ca-csr.json
{
"CN": "example.net",
"hosts": [
"example.net",
"www.example.net"
],
"key": {
"algo": "ecdsa",
"size": 256
},
"names": [
{
"C": "US",
"L": "CA",
"ST": "San Francisco"
}
]
}
接下來,我們需要修改這兩個配置檔案。
首先,我們來修改ca-config.json
“`
{
“signing”: {
“default”: {
“expiry”: “168h”
},
“profiles”: {
“www”: {
“expiry”: “8760h”,
“usages”: [
“signing”,
“key encipherment”,
“server auth”
]
},
“client”: {
“expiry”: “8760h”,
“usages”: [
“signing”,
“key encipherment”,
“client auth”
]
}
}
}
}
“`
未完續待,正在編寫2017.06.16
1.0 環境準備
本節主要介紹安裝環境,以及安裝環境的簡單配置。
這裡,你需要注意: 這時的環境為測試環境,如果你要將K8s部署到生產環境,那麼,這裡可能沒有寫的這樣簡單,當然,我也喜歡在後面的文章中能把此處補充的更為詳細,更接近於生產環境。
本文使用的作業系統為CentOS。隨後,如果時間允許,也會在ubuntu上進行部署和測試。如果寫完的話,那麼這裡可能會多一個連線。
虛擬機器安裝地址:http://blog.csdn.net/wenwst/article/details/72477444
現在這篇接虛擬機器安裝地址。
1.1 作業系統
- CentOS 7
檢視核心資訊
[[email protected] ~]# uname -a
Linux localhost.localdomain 3.10.0-327.el7.x86_64 #1 SMP Thu Nov 19 22:10:57 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
- 系統更新
yum update -y
完成後,檢視核心版本
uname -a
Linux localhost.localdomain 3.10.0-514.16.1.el7.x86_64 #1 SMP Wed Apr 12 15:04:24 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
- 關閉防火牆
systemctl stop firewalld
systemctl disable firewalld
確認是否關閉
[[email protected] ~]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
- 關閉Selinux
[[email protected] ~]# cat /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=disabled
#SELINUX=enforcing
# SELINUXTYPE= can take one of three two values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
- 檢視網絡卡資訊
[root@localhost ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eno16777736: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:40:ce:2c brd ff:ff:ff:ff:ff:ff
inet 192.168.123.159/24 brd 192.168.123.255 scope global dynamic eno16777736
valid_lft 1413sec preferred_lft 1413sec
inet6 fe80::20c:29ff:fe40:ce2c/64 scope link
valid_lft forever preferred_lft forever
- 配置檔案/etc/hosts
這裡增加幾個hosts檔案,用於提高下載速度。在後面的配置中, 我們還會再配置一次/etc/hosts。
[[email protected] etc]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
61.91.161.217 gcr.io
61.91.161.217 www.gcr.io
162.242.195.84 index.docker.io
162.242.195.84 www.docker.io
162.242.195.84 registry-1.docker.io
以上部分我們對剛安裝的系統進行了最簡單的配置。接下來,我們通過相同的方式準備三臺伺服器。
2.0 配置ETCD高可用叢集##
在上一個步驟中,我們暫時準備了三臺伺服器。現在我們針對這三臺伺服器做ETCD高可用叢集。
2.1 ETCD伺服器IP地址
剛才我們準備的三臺伺服器詳細資訊如下:
192.168.123.159
192.168.123.160
192.168.123.161
接下來我們會在這三臺伺服器中安裝ETCD高可用叢集。
2.1 配置hosts
此部分在剛剛準備的三臺伺服器中都要執行
我們把以下資訊寫入到/etc/hosts中:
192.168.123.159 k8s01
192.168.123.160 k8s02
192.168.123.161 k8s03
完成以後,在三臺伺服器中執行命令,檢查
[[email protected] ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.123.159 k8s01
192.168.123.160 k8s02
192.168.123.161 k8s03
61.91.161.217 gcr.io
61.91.161.217 www.gcr.io
162.242.195.84 index.docker.io
162.242.195.84 www.docker.io
162.242.195.84 registry-1.docker.io
2.2 配置主機名
此部分在剛剛準備的三臺伺服器中都要執行
然後在k8s01中執行
hostnamectl set-hostname k8s01
hostname
然後在k8s01中執行
hostnamectl set-hostname k8s02
hostname
然後在k8s01中執行
hostnamectl set-hostname k8s03
hostname
2.3 ETCD證書生成
ETCD使用的證書有以下幾個:
ca.pem
kubernetes-key.pem
kubernetes.pem
我們通過CFSSL生成這些證書!
這裡的操作只需要在一臺伺服器上面操作,現在我們是在k8s01上面
- 安裝wget
yum install -y wget
當前我們工作的目錄如下:
[root@k8s01 ssl]# pwd
/root
- 下載CFSS
mkdir /root/ssl
cd /root/ssl
wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
目錄中檔案如下
[root@k8s01 ssl]# pwd
/root/ssl
[root@k8s01 ssl]# ls
cfssl-certinfo_linux-amd64 cfssljson_linux-amd64 cfssl_linux-amd64
修改cfssl檔名。
mv cfssl-certinfo_linux-amd64 cfssl-certinfo
mv cfssljson_linux-amd64 cfssljson
mv cfssl_linux-amd64 cfssl
增加可執行許可權
chmod +x cfssl-certinfo cfssljson cfssl
修改完後文件名如下:
[root@k8s01 ssl]# ls
cfssl cfssl-certinfo cfssljson
將當前目錄加到環境變數中
[root@k8s01 ssl]# export PATH=/root/ssl:$PATH
- 建立CA
建立CA配置檔案
建立證書目錄
[[email protected] ssl]# mkdir /opt/ssl
[[email protected] ssl]# cd /opt/ssl/
[[email protected] ssl]# cfssl print-defaults config > config.json
Segmentation fault
在安裝中出現的問題
- Segmentation fault
[root@k8s01 ssl]# cfssl print-defaults config > config.json
Segmentation fault
可能是寫載檔案出現了問題,重新下載相應的檔案。