快速安裝與配置kubernetes集羣搭

Kubernetes是什麼?

首先,它是一個全新的基於容器技術的分佈式架構領先方案。這個方案盡然很新,但它是谷歌十幾年以來大規模應用容器技術的經驗積累和昇華的一個重要成果。確切地說,kubernetes是谷歌嚴格保密十幾年的祕密武器Borg的一個開源版本。Borg是谷歌的一個久負盛名的內部使用的大規模集羣管理系統,它基於容器技術,目的是實現資源管理的自動化,以及跨多個數據中心的資源利用率的最大化。node

2015年4月,傳聞許久的Borg論文伴隨kubernetes(K8S)的高調宣傳被谷歌首次公開,你們才得以瞭解它的更多內幕。正是因爲站在Borg這個前輩的肩膀上,吸收了Borg過去十年間的經驗與教訓,因此kubernetes一經開源就一舉成名,並迅速稱霸了容器技術領域。mysql

若是咱們的系統設計遵循了kubernetes的設計思想,那麼傳統系統架構中哪些和業務沒有多大關係的底層代碼或功能模塊,均可以馬上從咱們的視線中消失,咱們沒必要再費心於負載均衡的選型和部署實施問題,沒必要再考慮引入或本身開發一個複雜的服務治理框架,沒必要再頭疼與服務監控和故障處理模塊的開發。總之,使用kubernetes提供的解決方案,咱們節約了很多於30%的開發成本,同時能夠將精力更加集中於業務自己,並且因爲kubernetes提供了強大的自動化機制,因此係統後期的運維難度和運維成本大幅下降。linux

Kubernetes概述

隨着 Docker 技術的發展和普遍流行,雲原生應用和容器調度管理系統也成爲 IT 領域大熱的詞彙。事實上,在 Docker 技術火爆以前,雲原生應用的思想已經由雲計算技術的領導者和分佈式系統架構的推廣者普遍傳播。例如早在 2011 年 Heroku 的工程師提出了雲原生應用的 12 要素,只不過以虛擬機技術做爲雲原生應用的基礎實施。因爲虛擬機鏡像大、鏡像標準不統一以及打包流程和工具不統一,致使了業界沒法普遍接受的雲原生應用標準,限制了雲原生應用的流行。而 Docker 的出現正好解決了這些限制雲原生應用構建、交付和運行的瓶頸,使得構建雲原生應用成爲了使用 Docker 的開發者天然而然的選擇。git

Kubernetes 是爲生產環境而設計的容器調度管理系統,對於負載均衡、服務發現、高可用、滾動升級、自動伸縮等容器雲平臺的功能要求有原生支持。因爲 Kubernetes 在K和s間有8個字母,所以常簡稱 k8s。事實上,隨着對 k8s 系統架構與設計理念的瞭解深刻,會發現 K8s 系統正是到處爲運行雲原生應用而設計考慮;同時,隨着對 k8s 系統使用的加深和推廣,也會有愈來愈多有關雲原生應用的設計模式產生出來,使得基於 k8s 系統設計和開發生產級的複雜雲原生應用變得像啓動一個單機版容器服務那樣簡單易用。github

爲何要用 Kubernetes

使用 Kubernetes 的理由有不少,最基本的一個理由就是:IT 是新技術驅動行業。Docker 這個新興的容器化技術當前已經被不少公司所採用,其從單機走向集羣已成必然,而云計算的蓬勃發展正在加速這一進程。Kubernetes 做爲當前惟一被業界普遍承認和看好的 Docker 分佈式系統解決方案。能夠預見,在將來幾年內,會有大量的新系統選擇它,不論是運行在企業本地服務器上仍是被託管到公有云上。sql

使用 Kubernetes 又會收穫哪些好處呢?docker

首先,使用 Kubernetes 就是在全面擁抱微服務架構。微服務架構的核心就是將一個巨大的單體應用分解爲不少小的互相鏈接的微服務,一個微服務背後可能有多個實例副本在支撐,副本的數量可能會隨着系統的負荷變化而進行調整,內嵌的負載均衡器在 k8s 平臺中有多個實例副本在支撐,副本的數量可能會隨着系統的負荷變化而進行調整,內嵌的負載均衡器 k8s 平臺中發揮了重要的做用。微服務架構使得每一個服務均可以由專門的開發團隊來開發,開發者能夠自由選擇開發技術,這對於大規模團隊來講頗有價值。另外,每一個微服務獨立開發、升級、擴展,使得系統具有很高的穩定性和快速迭代進化能力。vim

其次,Kubernetes 系統架構具有了超強的橫向擴容能力。對於互聯網公司來講,用戶規模就等價於資產,誰擁有更多的用戶,誰就能在競爭中勝出,所以超強的橫向擴容能力是互聯網業務系統的關鍵指標之一。不用修改代碼,一個 Kubernetes 集羣便可從只包含幾個Node 的小集羣平滑擴展到擁有成百上千 Noder 大規模集羣,利用 Kubernetes 提供的工具,甚至能夠在線完成集羣的擴容。只要微服務設計的得好,結合硬件或者公有云資源的線性增長,系統就可以承受大量用戶併發訪問所帶來的壓力。centos

Kubernetes 基本概念和術語

Kubernetes中的大部分概念如Node、Pod、Replication Controller、Server、Deploymeng、Job、DaemonSet 等均可以看做一種資源對象,幾乎全部的資源對象均可以經過 Kubernetes提供的 kubectl 工具執行增、刪、改、查等操做,並將其保存在 etcd 中持久化存儲。從這個角度來看,Kubernets 實際上是一個高度自動化的資源控制系統,它經過跟蹤對比 etcd 存儲裏保存的資源指望狀態與當前環境中的實際資源狀態的差別來實現自動控制和自動糾錯的高級功能。設計模式

Master

Kubernetes 裏的 Master 指的是集羣控制節點,每一個 Kubernetes 集羣裏須要有一個Master 節點來負責整個集羣的管理的控制,基本上 Kubernetes 全部的控制命令進是發給Master,Master 負責具體的執行過程,後面全部執行的命令基本都是在 Master 節點上運行的。Master 節點一般會佔據一個獨立的 X86 服務器,一個主要的緣由是它過重要了,它是整個集羣的大腦,若是它宕機或者不可用,那麼全部的控制命令都將失效。
  
Master 節點上運行着如下一組關鍵進程:

Kube-apiserver:提供了 HTTP Rest 接口的關鍵服務進程,是 Kubernetes 裏全部資源的增、刪、改、查等操做的惟一入口,也是集羣控制入口進程。
Kube-controller-manager:是 Kubernetes 裏全部資源對象的自動化控制中心,能夠理解爲資源對象的管家。
Kube-scheduler:負責資源調度的進程,至關於公交公司的調度室。

快速安裝與配置kubernetes集羣搭快速安裝與配置kubernetes集羣搭

其實 Master 節點上每每還啓動了一個 etcd server 進程,由於 Kubernetes 裏的全部資源對象的數據所有是保存在 etcd 中的。

Node

除了 Master、Kubernetes 集羣中的其餘機器被稱爲 Node 節點,在較早的版本中也被稱爲 Minion。與 Master 同樣,Node 節點能夠是一臺物理主機,也能夠是一臺虛擬機。Node節點纔是 Kubernetes 集羣中的工做負載節點,每一個 Node 都會被 Master 分配一些負載。當某個 Node 宕機時,其上的工做負載會被 Master 自動轉移到其餘節點上去。

每一個 Node 節點都運行着如下一組關鍵進程:

Kubelet:負責 Pod 對應的容器的建立、啓停等任務,同時與 Master 節點密切協做,實現集羣管理的基本功能。
Kube-proxy:實現 Kubernetes Service 的通訊與負載均衡機制的重要組件。

快速安裝與配置kubernetes集羣搭快速安裝與配置kubernetes集羣搭

Pod:是kubernetes最重要也是最基本的概念。每一個Pod都會包含一個 「根容器」,還會包含一個或者多個緊密相連的業務容器。

快速安裝與配置kubernetes集羣搭快速安裝與配置kubernetes集羣搭

Kubernetes爲每一個Pod都分配了惟一的IP地址,稱之爲PodIP,一個Pod裏的多個容器共享PodIP地址。要求底層網絡支持集羣內任意兩個Pod之間的直接通訊,一般採用虛擬二層網絡技術來實現(Flannel)。

k8s集羣部署方案

以下是個人集羣部署策略,1個master + 2個node(minion1.2以前的叫法)。個人存儲集羣etcd是單點集羣,不推薦此作法。網絡使用的是flannel虛擬二次網絡。

快速安裝與配置kubernetes集羣搭快速安裝與配置kubernetes集羣搭

Kubernetes具備完備的集羣管理能力:

包括多層次的安全防禦和准入機制
    多租戶應用支撐能力
    透明的服務註冊和服務發現機制
    內建智能負載均衡器
    強大的故障發現和自我修復能力
    服務滾動升級和在線擴容能力
    可擴展的資源自動調度機制
    以及多粒度的資源管理能力

同時,kubernetes提供了完善的管理工具,這些工具涵蓋了包括開發、部署測試、運維監控在內的各個環節。

在kubernetes中,service(服務)是分佈式集羣架構的核心,一個service對象擁有以下關鍵特徵:

擁有一個惟一指定的名字(好比mysql-service)。
    擁有一個虛擬IP(Cluster IP、service IP或VIP)和端口號。
    可以提供某種遠程服務能力。
    被映射到了提供這種服務能力的一組容器應用上。

Kubernetes.io開發了一個交互式教程,經過WEB瀏覽器就能使用預先部署好的一個Kubernetes集羣,快速體驗kubernetes的功能和應用場景。

連接:https://kubernetes.io/docs/tutorials/kubernetes-basics/

K8s官方下載地址:https://github.com/kubernetes

快速安裝與配置kubernetes集羣搭快速安裝與配置kubernetes集羣搭

環境準備工做
主機名 	   操做系統 	             IP地址
master 	Centos 7.4-x86_64 	192.168.2.102
node1 	Centos 7.4-x86_64 	192.168.2.108
node2 	Centos 7.4-x86_64 	192.168.2.228
關閉CentOS7自帶的防火牆服務
systemctl disable firewalld
systemctl stop firewalld
修改主機名
[root@localhost ~]# hostnamectl  master //192.168.2.102
[root@localhost ~]# hostnamectl  node1 //192.168.2.108
[root@localhost ~]# hostnamectl  node2 //192.168.2.228

更改Hostname爲 master、node一、node2,配置IP地址,配置3臺測試機的/etc/hosts文件(在三臺服務器上同步)

[root@master ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.2.102 master
192.168.2.108 node1
192.168.2.228 node2
[root@master ~]#
時間校對(三臺機器都作時間校對)
[root@master ~]# ntpdate ntp1.aliyun.com
13 Sep 14:48:02 ntpdate[1596]: adjust time server 120.25.115.20 offset -0.015854 sec
 
[root@master ~]# hwclock
2018年09月13日 星期四 14時49分51秒  -0.646898 秒
安裝Kubernetes,配置dockers鏡像
[root@master ~]# wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

快速安裝與配置kubernetes集羣搭快速安裝與配置kubernetes集羣搭

配置kubernetes倉庫
[root@master yum.repos.d]# vim kubernetes.repo
[kubernetes]
name=kubernetes Repo
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
enabled=1

快速安裝與配置kubernetes集羣搭快速安裝與配置kubernetes集羣搭

[root@master ~]# wget https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
[root@master ~]# rpm --import rpm-package-key.gpg
[root@master yum.repos.d]# yum repolist

快速安裝與配置kubernetes集羣搭快速安裝與配置kubernetes集羣搭

[root@master yum.repos.d]# scp CentOS-Base.repo docker-ce.repo kubernetes.repo node1:/etc/yum.repos.d/

快速安裝與配置kubernetes集羣搭快速安裝與配置kubernetes集羣搭

安裝docker和kubelet
[root@master ~]# yum -y install docker-ce kubelet kubeadm kubectl

快速安裝與配置kubernetes集羣搭快速安裝與配置kubernetes集羣搭

環境變量
[root@master ~]# vim /usr/lib/systemd/system/docker.service
手動添加一行
Environment="HTTPS_PROXY=http://www.ik8s.io:10080"
Environment="NO_PROXY=127.0.0.0/8,172.0.0.0/16"

快速安裝與配置kubernetes集羣搭快速安裝與配置kubernetes集羣搭

[root@master ~]# systemctl daemon-reload
 
啓動docker
[root@master ~]# systemctl start docker
 
設置開機啓動
[root@master ~]# systemctl enable docker
[root@master ~]# docker info
 
保證輸出的都是1
[root@master ~]# cat /proc/sys/net/bridge/bridge-nf-call-ip6tables
1
[root@master ~]# cat /proc/sys/net/bridge/bridge-nf-call-iptables
1
 
[root@master ~]# rpm -ql kubelet
/etc/kubernetes/manifests  #清單目錄
/etc/sysconfig/kubelet   #配置文件
/etc/systemd/system/kubelet.service  
/usr/bin/kubelet   #主程序
 
設置開機啓動
[root@master ~]# systemctl enable kubelet

快速安裝與配置kubernetes集羣搭快速安裝與配置kubernetes集羣搭

初始化
[root@master ~]# kubeadm init --kubernetes-version=v1.11.1 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12

快速安裝與配置kubernetes集羣搭快速安裝與配置kubernetes集羣搭

報錯信息,解決辦法:

[root@master ~]# vim /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS="--fail-swap-on=false"
 
[root@master ~]# kubeadm init --kubernetes-version=v1.11.1 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --ignore-preflight-errors=Swap

快速安裝與配置kubernetes集羣搭快速安裝與配置kubernetes集羣搭

注意這一條命令須要保存好(添加集羣使用)

kubeadm join 192.168.2.102:6443 --token ns4kps.j8cuqwf78emp5a5b --discovery-token-ca-cert-hash sha256:b71b7e52c318959bab3f05f02f6fe51d6396d8c54ea6849ec7556927d1c6c88a

[root@master ~]# docker image ls

快速安裝與配置kubernetes集羣搭快速安裝與配置kubernetes集羣搭

[root@master ~]# ss –ntl

快速安裝與配置kubernetes集羣搭快速安裝與配置kubernetes集羣搭

[root@master ~]# mkdir -p $HOME/.kube
[root@master ~]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

檢測組件運行是否正常
[root@master ~]# kubectl get cs

快速安裝與配置kubernetes集羣搭快速安裝與配置kubernetes集羣搭

查看並驗證節點信息是否成功
[root@master ~]# kubectl get nodes
NAME      STATUS     ROLES     AGE       VERSION
master    NotReady   master    44m       v1.11.3
安裝flannel
[root@master ~]# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
[root@master ~]# curl -sSL "https://github.com/coreos/flannel/blob/master/Documentation/kube-flannel.yml?raw=true" | kubectl create -f -

快速安裝與配置kubernetes集羣搭快速安裝與配置kubernetes集羣搭

[root@master ~]# docker image ls

快速安裝與配置kubernetes集羣搭快速安裝與配置kubernetes集羣搭

查看並驗證節點信息是否成功
[root@master ~]# kubectl get  nodes
NAME      STATUS    ROLES     AGE       VERSION
master    Ready     master    2h        v1.11.3
查看pod運行狀況
[root@master ~]# kubectl get pods -n kube-system

快速安裝與配置kubernetes集羣搭快速安裝與配置kubernetes集羣搭

配置文件傳到node一、node2
[root@master ~]# scp /usr/lib/systemd/system/docker.service node1:/usr/lib/systemd/system/docker.service

[root@master ~]# scp /etc/sysconfig/kubelet node1:/etc/sysconfig/

[root@master ~]# scp /usr/lib/systemd/system/docker.service node2:/usr/lib/systemd/system/docker.service

[root@master ~]# scp /etc/sysconfig/kubelet node2:/etc/sysconfig/
node1服務器配置
[root@node1 ~]# wget https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg

快速安裝與配置kubernetes集羣搭快速安裝與配置kubernetes集羣搭

[root@node1 ~]# rpm --import rpm-package-key.gpg
安裝docker、kubelet
[root@node1 ~]# yum -y install docker-ce kubelet kubeadm

快速安裝與配置kubernetes集羣搭快速安裝與配置kubernetes集羣搭

啓動docker
[root@node1 ~]# systemctl start docker
[root@node1 ~]# systemctl enable docker kubelet

[root@node1 ~]# docker info
添加主集羣裏
[root@node1 ~]# kubeadm join 192.168.2.102:6443 --token ns4kps.j8cuqwf78emp5a5b --discovery-token-ca-cert-hash sha256:b71b7e52c318959bab3f05f02f6fe51d6396d8c54ea6849ec7556927d1c6c88a --ignore-preflight-errors=Swap

快速安裝與配置kubernetes集羣搭快速安裝與配置kubernetes集羣搭

查看下載鏡像
[root@node1 ~]# docker image ls

快速安裝與配置kubernetes集羣搭快速安裝與配置kubernetes集羣搭

在master服務器上能夠查節點信息
[root@master ~]# kubectl get nodes
NAME      STATUS    ROLES     AGE       VERSION
master    Ready     master    3h        v1.11.3
node1     Ready         7m        v1.11.3
 
[root@master ~]# kubectl get pods -n kube-system -o wide

快速安裝與配置kubernetes集羣搭快速安裝與配置kubernetes集羣搭

node2服務器配置
[root@node2 ~]# wget https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg

快速安裝與配置kubernetes集羣搭快速安裝與配置kubernetes集羣搭

[root@node2 ~]# rpm --import rpm-package-key.gpg
安裝docker、kubelet
[root@node2 ~]#  yum -y install docker-ce kubelet kubeadm

快速安裝與配置kubernetes集羣搭快速安裝與配置kubernetes集羣搭

啓動docker
[root@node2 ~]# systemctl start docker
[root@node2 ~]# systemctl enable docker kubelet
[root@node2 ~]# docker info

快速安裝與配置kubernetes集羣搭快速安裝與配置kubernetes集羣搭

添加主集羣裏
[root@node2 ~]# kubeadm join 192.168.2.102:6443 --token ns4kps.j8cuqwf78emp5a5b --discovery-token-ca-cert-hash sha256:b71b7e52c318959bab3f05f02f6fe51d6396d8c54ea6849ec7556927d1c6c88a --ignore-preflight-errors=Swap

快速安裝與配置kubernetes集羣搭快速安裝與配置kubernetes集羣搭

在master服務器上能夠查節點信息
[root@master ~]# kubectl get nodes

快速安裝與配置kubernetes集羣搭快速安裝與配置kubernetes集羣搭

[root@master ~]# kubectl get pods -n kube-system -o wide

快速安裝與配置kubernetes集羣搭快速安裝與配置kubernetes集羣搭

相關文章
相關標籤/搜索