1. 程式人生 > >CentOS7.5 Kubernetes V1.13(最新版)二進位制部署叢集

CentOS7.5 Kubernetes V1.13(最新版)二進位制部署叢集

一、概述

Kubernetes 1.13 正式GA,這是2018年釋出的第四次也是最後一次大版本,1.13也是迄今為止發行最快的版本,僅用10周時間。此版本繼續關注Kubernetes的穩定性和可擴充套件性,其中在儲存和群集生命週期領域的三個主要功能實現普遍可用(GA)。Kubeadm簡化叢集管理、容器儲存介面(CSI)和CoreDNS作為預設DNS。

1、安裝環境準備:

部署節點說明

IP地址 主機名 CPU 記憶體 磁碟
172.16.8.100 qas-k8s-master01 4C 4G 50G
172.16.8.101 qas-k8s-node01 4C 4G 50G
172.16.8.102 qas-k8s-node02 4C 4G 50G

部署網路說明

2、架構圖

Kubernetes 架構圖

CentOS7.5 Kubernetes V1.13(最新版)二進位制部署叢集

Flannel網路架構圖

CentOS7.5 Kubernetes V1.13(最新版)二進位制部署叢集
1)資料從源容器中發出後,經由所在主機的docker0虛擬網絡卡轉發到flannel0虛擬網絡卡,這是個P2P的虛擬網絡卡,flanneld服務監聽在網絡卡的另外一端。
2)Flannel通過Etcd服務維護了一張節點間的路由表,在稍後的配置部分我們會介紹其中的內容。
3)源主機的flanneld服務將原本的資料內容UDP封裝後根據自己的路由表投遞給目的節點的flanneld服務,資料到達以後被解包,然後直接進入目的節點的flannel0虛擬網絡卡,
然後被轉發到目的主機的docker0虛擬網絡卡,最後就像本機容器通訊一下的有docker0路由到達目標容器。

這樣整個資料包的傳遞就完成了,這裡需要解釋三個問題:
1)UDP封裝是怎麼回事?
在UDP的資料內容部分其實是另一個ICMP(也就是ping命令)的資料包。原始資料是在起始節點的Flannel服務上進行UDP封裝的,投遞到目的節點後就被另一端的Flannel服務
還原成了原始的資料包,兩邊的Docker服務都感覺不到這個過程的存在。

2)為什麼每個節點上的Docker會使用不同的IP地址段?
這個事情看起來很詭異,但真相十分簡單。其實只是單純的因為Flannel通過Etcd分配了每個節點可用的IP地址段後,偷偷的修改了Docker的啟動引數。
在運行了Flannel服務的節點上可以檢視到Docker服務程序執行引數(ps aux|grep docker|grep "bip"),例如“--bip=182.48.25.1/24”這個引數,它限制了所在節
點容器獲得的IP範圍。這個IP範圍是由Flannel自動分配的,由Flannel通過儲存在Etcd服務中的記錄確保它們不會重複。

3)為什麼在傳送節點上的資料會從docker0路由到flannel0虛擬網絡卡,在目的節點會從flannel0路由到docker0虛擬網絡卡?
例如現在有一個數據包要從IP為172.17.18.2的容器發到IP為172.17.46.2的容器。根據資料傳送節點的路由表,它只與172.17.0.0/16匹配這條記錄匹配,因此資料從docker0
出來以後就被投遞到了flannel0。同理在目標節點,由於投遞的地址是一個容器,因此目的地址一定會落在docker0對於的172.17.46.0/24這個記錄上,自然的被投遞到了docker0網絡卡。

3、 Kubernetes工作流程

CentOS7.5 Kubernetes V1.13(最新版)二進位制部署叢集
叢集功能各模組功能描述:

Master節點:
Master節點上面主要由四個模組組成,APIServer,schedule,controller-manager,etcd

APIServer: APIServer負責對外提供RESTful的kubernetes API的服務,它是系統管理指令的統一介面,任何對資源的增刪該查都要交給APIServer處理後再交給etcd,如圖,kubectl(kubernetes提供的客戶端工具,該工具內部是對kubernetes API的呼叫)是直接和APIServer互動的。

schedule: schedule負責排程Pod到合適的Node上,如果把scheduler看成一個黑匣子,那麼它的輸入是pod和由多個Node組成的列表,輸出是Pod和一個Node的繫結。 kubernetes目前提供了排程演算法,同樣也保留了介面。使用者根據自己的需求定義自己的排程演算法。

controller manager: 如果APIServer做的是前臺的工作的話,那麼controller manager就是負責後臺的。每一個資源都對應一個控制器。而control manager就是負責管理這些控制器的,比如我們通過APIServer建立了一個Pod,當這個Pod建立成功後,APIServer的任務就算完成了。

etcd:etcd是一個高可用的鍵值儲存系統,kubernetes使用它來儲存各個資源的狀態,從而實現了Restful的API。

Node節點:
每個Node節點主要由三個模板組成:kublet, kube-proxy

kube-proxy: 該模組實現了kubernetes中的服務發現和反向代理功能。kube-proxy支援TCP和UDP連線轉發,預設基Round Robin演算法將客戶端流量轉發到與service對應的一組後端pod。服務發現方面,kube-proxy使用etcd的watch機制監控叢集中service和endpoint物件資料的動態變化,並且維護一個service到endpoint的對映關係,從而保證了後端pod的IP變化不會對訪問者造成影響,另外,kube-proxy還支援session affinity。

kublet:kublet是Master在每個Node節點上面的agent,是Node節點上面最重要的模組,它負責維護和管理該Node上的所有容器,但是如果容器不是通過kubernetes建立的,它並不會管理。本質上,它負責使Pod的執行狀態與期望的狀態一致。

二、Kubernetes 安裝及配置

1、設定關閉防火牆及SELINUX

systemctl stop firewalld && systemctl disable firewalld
setenforce 0
vi /etc/selinux/config
SELINUX=disabled

2、關閉Swap

swapoff -a && sysctl -w vm.swappiness=0
vi /etc/fstab
#UUID=7bff6243-324c-4587-b550-55dc34018ebf swap                    swap    defaults        0 0

3、設定Docker所需引數

cat << EOF | tee /etc/sysctl.d/k8s.conf
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl -p /etc/sysctl.d/k8s.conf

4、安裝 Docker

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum list docker-ce --showduplicates | sort -r
yum install docker-ce -y
systemctl start docker && systemctl enable docker

5、建立 ETCD 證書

cat << EOF | tee ca-config.json
{
  "signing": {
    "default": {
      "expiry": "87600h"
    },
    "profiles": {
      "kubernetes": {
        "usages": [
            "signing",
            "key encipherment",
            "server auth",
            "client auth"
        ],
        "expiry": "87600h"
      }
    }
  }
}
EOF

6、建立 ETCD CA 配置檔案

cat << EOF | tee ca-csr.json
{
    "CN": "etcd CA",
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "L": "Shenzhen",
            "ST": "Shenzhen"
        }
    ]
}
EOF

7、建立 ETCD Server 證書

cat << EOF | tee server-csr.json
{
    "CN": "etcd",
    "hosts": [
    "172.16.8.100",
    "172.16.8.101",
    "172.16.8.102"
    ],
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "L": "Shenzhen",
            "ST": "Shenzhen"
        }
    ]
}
EOF

8、生成 ETCD CA 證書和私鑰

cfssl gencert -initca ca-csr.json | cfssljson -bare ca -
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=www server-csr.json | cfssljson -bare server