1. 程式人生 > >Kubernetes 1.6高可用詳細部署流程

Kubernetes 1.6高可用詳細部署流程

本文為了更好的表達,能讓更多的人瞭解各方面的技術,因此在寫的時候會不時的說一說基礎的知識,也會不時的重複一些重點知識。為此,如果影響到閱讀,實在是沒有辦法。

當然,如果只是想快速的把k8s部署到虛擬機器上,只是測試一下效能,那麼,此文可能不適合你的閱讀。因為可以要花不少時間才可以完成。

由於本文涉及的內容比較多,因此劃分為多篇寫。

本文使用的程式碼有很多是來自github,所以,出了問題可以留言,也可以自己到github上面留言。

為了你查閱方便,本文也會把相應的程式碼歸類放到github上。

*時,本人也重新開安裝的虛擬機器,所以,所有的安裝流程都是一步一步的進行,所以,在閱讀時不需要考慮整體的結構。 而整體的結構,也會在以下某一節中詳細說明。

這個會在最後寫

0.0 架構介紹

在本節中,我們會談論到我們要怎麼實現的目標,也就是我們要把k8s配置成什麼樣子。並且我們需要準備多少臺伺服器(當然,也可以是虛擬機器)。
並且,我們需要使用的軟體。

  1. 伺服器
    haproxy ——- 2臺
    k8smaster ——- 2臺
    ETCD ——- 3臺
    k8snode ——- 3臺,也可以是n臺。
    一共 臺伺服器。也可以把ETCD放到k8smaster,在這個文件中,我們會單獨建立ETCD叢集。

  2. IP規劃
    2.1 master
    k8smaster01 —– 192.168.123.180
    k8smaster02 —– 192.168.123.181

    2.2 nodes
    k8snode01 —– 192.168.123.190
    k8snode02 —– 192.168.123.191
    k8snode03 —– 192.168.123.192

    2.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做高可用。然後,我們也會講到如果增加節點。

  3. 軟體介紹
    Centos 7
    Docker
    keepalive
    haproxy
    kubernetes 1.6
    暫時我們會列出這些,主要現在也記不住版本。我們會在安裝過程中詳細說明。
    基於以上IP地址:
    我們會在k8smaster上面安裝api。然後通過haproxy和keepalive做高可用。然後我們會在k8snode上面寫安裝ingress,用於服務訪問,所有的ingress會通過haproxy和keepalive做高可用。然後,我們也會講到如果增加節點。

  4. 拓撲結構

這裡寫圖片描述

實話這圖看起來真心有點亂,不過相對於網上的抽象圖,應該更直觀一些。如果對圖存在疑問,不用擔心。在此圖上面都標註了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

可能是寫載檔案出現了問題,重新下載相應的檔案。