1. 程式人生 > >Centos7.4 Kubernets1.9叢集安裝部署

Centos7.4 Kubernets1.9叢集安裝部署

一、概述

Master元件:

kube-apiserver
Kubernetes API,叢集的統一入口,各元件協調者,以HTTP API提供介面服務,所有物件資源的增刪改查和監聽操作都交給APIServer處理後再提交給Etcd儲存。
kube-controller-manager
處理叢集中常規後臺任務,一個資源對應一個控制器,而ControllerManager就是負責管理這些控制器的。
kube-scheduler
根據排程演算法為新建立的Pod選擇一個Node節點。
Node元件:
kubelet
kubelet是Master在Node節點上的Agent,管理本機執行容器的生命週期,比如建立容器、Pod掛載資料卷、
下載secret、獲取容器和節點狀態等工作。kubelet將每個Pod轉換成一組容器。
kube-proxy
在Node節點上實現Pod網路代理,維護網路規則和四層負載均衡工作。
docker或rocket/rkt
執行容器。

第三方服務:
  etcd 

分散式鍵值儲存系統。用於保持叢集狀態,比如Pod、Service等物件資訊。

架構圖


二、叢集部署-環境規劃

序號 IP 主機名 元件 備註
1 172.16.8.210
 devops-k8s-master  
kube-apiserver kube-controller-manager kube-scheduler etcd
  

2 172.16.8.211
devops-k8s-node1 
kubelet
kube-proxy
docker
flannel
etcd

3 172.16.8.212
devops-k8s-node2
kubelet kube-proxy docker flannel
etcd

軟體版本
序號 軟體 版本 備註
1 作業系統 CentOS Linux release 7.4.1708 (Core) 

2 Kubernetes
1.9

3 Docker 
18.03.0-ce

4 Etcd   
3.0  

三、叢集部署-安裝Docker
安裝Docker依賴包
yum install -y yum-utils device-mapper-persistent-data lvm2

使用Docker ce的官方源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install docker-ce -y

設定開機啟動
systemctl start docker
systemctl enable docker

配置Docker的國內的私有映象

cat << EOF > /etc/docker/daemon.json
{
"registry-mirrors": [ "https://registry.docker-cn.com"]
}
EOF
檢視docker版本系統
[[email protected] ~]# docker info
Containers: 0
 Running: 0
 Paused: 0
 Stopped: 0
Images: 0
Server Version: 18.03.0-ce
Storage Driver: overlay2
 Backing Filesystem: xfs
 Supports d_type: true
 Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
 Volume: local
 Network: bridge host macvlan null overlay
 Log: awslogs fluentd gcplogs gelf journald json-file logentries splunk syslog
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: cfd04396dc68220d1cecbe686a6cc3aa5ce3667c
runc version: 4fc53a81fb7c994640722ac585fa9ca548971871
init version: 949e6fa
Security Options:
 seccomp
  Profile: default
Kernel Version: 3.10.0-693.el7.x86_64
Operating System: CentOS Linux 7 (Core)
OSType: linux
Architecture: x86_64
CPUs: 2
Total Memory: 1.781GiB
Name: devops-k8s-node1
ID: EG5G:RUCR:B6Q6:WWTE:S5SR:O7WA:HKOP:SC33:YZYB:6IMO:LQSO:E4LD
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
 127.0.0.0/8
Live Restore Enabled: false

四、叢集部署-部署Etcd叢集

安裝etcd
yum -y install etcd

修改配置檔案
etcd節點1
grep -n '^'[a-Z] /etc/etcd/etcd.conf
1:ETCD_DATA_DIR="/var/lib/etcd/etcd01"
2:ETCD_LISTEN_PEER_URLS="http://0.0.0.0:2380"
3:ETCD_LISTEN_CLIENT_URLS="http://172.16.8.210:2379,http://127.0.0.1:2379"
4:ETCD_NAME="etcd01"
5:ETCD_INITIAL_ADVERTISE_PEER_URLS="http://172.16.8.210:2380"
6:ETCD_ADVERTISE_CLIENT_URLS="http://172.16.8.210:2379"
7:ETCD_INITIAL_CLUSTER="etcd01=http://172.16.8.210:2380,etcd02=http://172.16.8.211:2380,etcd03=http://172.16.8.212:2380"
8:ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
9:ETCD_INITIAL_CLUSTER_STATE="new

etcd節點2
grep -n '^'[a-Z] /etc/etcd/etcd.conf
1:ETCD_DATA_DIR="/var/lib/etcd/etcd02"
2:ETCD_LISTEN_PEER_URLS="http://0.0.0.0:2380"
3:ETCD_LISTEN_CLIENT_URLS="http://172.16.8.211:2379"
4:ETCD_NAME="etcd02"
5:ETCD_INITIAL_ADVERTISE_PEER_URLS="http://172.16.8.211:2380"
6:ETCD_ADVERTISE_CLIENT_URLS="http://172.16.8.211:2379"
7:ETCD_INITIAL_CLUSTER="etcd01=http://172.16.8.210:2380,etcd02=http://172.16.8.211:2380,etcd03=http://172.16.8.212:2380"
8:ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
9:ETCD_INITIAL_CLUSTER_STATE="new

etcd節點3
grep -n '^'[a-Z] /etc/etcd/etcd.conf
1:ETCD_DATA_DIR="/var/lib/etcd/etcd03"
2:ETCD_LISTEN_PEER_URLS="http://0.0.0.0:2380"
3:ETCD_LISTEN_CLIENT_URLS="http://172.16.8.212:2379"
4:ETCD_NAME="etcd03"
5:ETCD_INITIAL_ADVERTISE_PEER_URLS="http://172.16.8.212:2380"
6:ETCD_ADVERTISE_CLIENT_URLS="http://172.16.8.212:2379"
7:ETCD_INITIAL_CLUSTER="etcd01=http://172.16.8.210:2380,etcd02=http://172.16.8.211:2380,etcd03=http://172.16.8.212:2380"
8:ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
9:ETCD_INITIAL_CLUSTER_STATE="new

注意:先啟動etcd節點2,在啟動etcd節點1,有可能會報錯。
systemctl restart etcd.service 
systemctl enable etcd.service

檢視監聽埠
netstat -tnlp |grep etcd
tcp        0      0 172.16.8.210:2379       0.0.0.0:*               LISTEN      2989/etcd           
tcp        0      0 127.0.0.1:2379          0.0.0.0:*               LISTEN      2989/etcd           
tcp6       0      0 :::2380                 :::*                    LISTEN      2989/etcd 

五、叢集部署-部署Flannel網路

Flannel是CoreOS團隊針對Kubernetes設計的一個網路規劃服務,簡單來說,它的功能是讓叢集中的不同節點主機建立的Docker容器都具有全叢集唯一的虛擬IP地址。

但在預設的Docker配置中,每個節點上的Docker服務會分別負責所在節點容器的IP分配。這樣導致的一個問題是,不同節點上容器可能獲得相同的內外IP地址。並使
這些容器之間能夠之間通過IP地址相互找到,也就是相互ping通。
   
Flannel的設計目的就是為叢集中的所有節點重新規劃IP地址的使用規則,從而使得不同節點上的容器能夠獲得"同屬一個內網"且"不重複的"IP地址,並讓屬於不同節
點上的容器能夠直接通過內網IP通訊。
   
Flannel實質上是一種"覆蓋網路(overlay network)",即表示執行在一個網上的網(應用層網路),並不依靠ip地址來傳遞訊息,而是採用一種對映機制,把ip地址和
identifiers做對映來資源定位。也就是將TCP資料包裝在另一種網路包裡面進行路由轉發和通訊,目前已經支援UDP、VxLAN、AWS VPC和GCE路由等資料轉發方式。
   
原理是每個主機配置一個ip段和子網個數。例如,可以配置一個覆蓋網路使用 10.100.0.0/16段,每個主機/24個子網。因此主機a可以接受10.100.5.0/24,主機B可以
接受10.100.18.0/24的包。flannel使用etcd來維護分配的子網到實際的ip地址之間的對映。對於資料路徑,flannel 使用udp來封裝ip資料報,轉發到遠端主機。選擇
UDP作為轉發協議是因為他能穿透防火牆。例如,AWS Classic無法轉發IPoIP or GRE 網路包,是因為它的安全組僅僅支援TCP/UDP/ICMP。
   
flannel 使用etcd儲存配置資料和子網分配資訊。flannel 啟動之後,後臺程序首先檢索配置和正在使用的子網列表,然後選擇一個可用的子網,然後嘗試去註冊它。
etcd也儲存這個每個主機對應的ip。flannel 使用etcd的watch機制監視/coreos.com/network/subnets下面所有元素的變化資訊,並且根據它來維護一個路由表。為了
提高效能,flannel優化了Universal TAP/TUN裝置,對TUN和UDP之間的ip分片做了代理。

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網絡卡。

在master節點執行

[[email protected] bin]# etcdctl -endpoint="http://172.16.8.210:2379,http://172.16.8.211:2379,http://172.16.8.212:2379" set /coreos.com/network/config  '{ "Network": "172.17.0.0/16", "Backend": {"Type": "vxlan"}}'
{ "Network": "172.17.0.0/16", "Backend": {"Type": "vxlan"}}
[[email protected] bin]# etcdctl -endpoint="http://172.16.8.210:2379,http://172.16.8.211:2379,http://172.16.8.212:2379" get /coreos.com/network/config 
{ "Network": "172.17.0.0/16", "Backend": {"Type": "vxlan"}}

建立目錄
mkdir /opt/kubernetes/{bin,cfg} -p
mkdir /app/tools/ -p

下載flannel安裝
wget https://github.com/coreos/flannel/releases/download/v0.9.1/flannel-v0.9.1-linux-amd64.tar.gz
tar -xvf flannel-v0.9.1-linux-amd64.tar.gz 
mv flanneld mk-docker-opts.sh /opt/kubernetes/bin/

vim /opt/kubernetes/cfg/flanneld
FLANNEL_OPTIONS="--etcd-endpoints=http://172.16.8.210:2379,http://172.16.8.211:2379,http://172.16.8.212:2379" 

編輯啟動etcd檔案
vim  /usr/lib/systemd/system/flanneld.service 
[Unit]
Description=Flanneld overlay address etcd agent
After=network.target
After=network-online.target
Wants=network-online.target
Before=docker.service

[Service]
Type=notify
EnvironmentFile=/opt/kubernetes/cfg/flanneld
ExecStart=/opt/kubernetes/bin/flanneld  $FLANNEL_OPTIONS
ExecStartPost=/opt/kubernetes/bin/mk-docker-opts.sh -k DOCKER_NETWORK_OPTIONS -d /run/flannel/subnet.env
Restart=on-failure

[Install]
WantedBy=multi-user.target
RequiredBy=docker.service

啟動etcd
systemctl enable flanneld.service
systemctl start flanneld.service

檢視路由
節點1
route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         gateway         0.0.0.0         UG    100    0        0 ens32
172.16.8.0      0.0.0.0         255.255.255.0   U     100    0        0 ens32
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0
172.17.15.0     172.17.15.0     255.255.255.0   UG    0      0        0 flannel.1
節點2
route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         gateway         0.0.0.0         UG    100    0        0 ens32
172.16.8.0      0.0.0.0         255.255.255.0   U     100    0        0 ens32
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0
172.17.96.0     172.17.96.0     255.255.255.0   UG    0      0        0 flannel.1