Centos7.4 Kubernets1.9叢集安裝部署
阿新 • • 發佈:2018-12-03
一、概述
軟體版本
三、叢集部署-安裝Docker
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 |
序號 | 軟體 | 版本 | 備註 |
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