部署環境
由於是測試搭建kubernetes
集羣環境,所以我只用了兩臺機器進行,一臺用作Master
節點,一臺用作Node
節點。不過原理上是一樣的,即使加機器,搭建步驟也是一樣的。
Kubernetes Master節點:10.0.11.150
Kubernetes Node節點:10.0.11.152
部署軟件
docker:1.12.6
kubernetes:1.5.2
CentOS:7.3
關閉防火牆
在每臺機器上執行下面的命令,關閉防火牆並啓用ntp
// 關閉防火牆
systemctl stop firewalld
// 禁用防火牆
systemctl disable firewalld
//安裝ntp
yum -y install ntp
//啓用ntp
systemctl start ntpd
//加入開機啓動
systemctl enable ntpd
Kubernetes Master節點的安裝與配置
Kubernetes Master
指的是集羣控制節點,每個Kubernetes
集羣裏需要有一個Master
節點來負責整個集羣的管理和控制,基本上Kubernetes
的所有控制命令都發給他,他來負責具體的執行過程,我們後面執行的所有命令基本上都是在Master
節點上運行的。Master
節點通常會佔據一個獨立的服務器(高可用部署建議用3臺服務器),其主要原因是他太重要了,是整個集羣的首腦,如果宕機或者不可用,那麼對集羣內容器應用的管理都將失效。
Master
節點上運行以下一組關鍵進程:
1. Kubernetes API Server
(kube-apiserver
):提供了HTTP Rest
接口的關鍵服務進程,是Kubernetes
裏所有資源的增刪改查等操作的唯一入口,也是集羣控制的入口進程。
2. Kubernetes Controller Manager
(kube-controller-manager
):Kubernetes
裏所有資源對象的自動化控制中心,可以理解爲資源對象的大總管。
3. Kubernetes Scheduler
(kube-scheduler
):負責資源調度(Pod調度
)的進程,相當於公交公司的調度室。
另外,在Master
節點上需要啓動一個etcd
服務,因爲Kubernetes
裏的所有資源對象的數據全部是保存在etcd中的。
安裝etcd、docker、kubernetes
yum -y install etcd docker kubernetes
etcd配置
配置文件位置:/etc/etcd/etcd.conf
etcd配置主要是ETCD_LISTEN_CLIENT_URLS
、ETCD_ADVERTISE_CLIENT_URLS
這兩項。
// 節點名稱
ETCD_NAME=default
// 數據存放位置
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
// 監聽客戶端地址,這裏要注意,設置成0.0.0.0,並且Master節點、Node節點端口要一致
// 這樣Master才能和Node節點互通,否則Node節點的flanneld無法正常啓動
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"
// 通知客戶端地址,本地地址
ETCD_ADVERTISE_CLIENT_URLS="http://127.0.0.1:2379"
其中ETCD_LISTEN_CLIENT_URLS=”http://0.0.0.0:2379”表示etcd在2379端口上監聽所有網絡接口。
Kubernetes配置
config配置文件位置:/etc/kubernetes/config
kubernetes配置主要配置KUBE_MASTER
,其他項使用默認即可。
KUBE_LOGTOSTDERR="--logtostderr=true"
KUBE_LOG_LEVEL="--v=0"
KUBE_ALLOW_PRIV="--allow-privileged=false"
// 本機IP:PORT
KUBE_MASTER="--master=http://10.0.11.150:8080"
KUBE_MASTER="--master=http://10.0.11.150:8080"
是將Kubernetes
的apiserver
進程的服務地址告訴Kubernetes
的controller-manager
, scheduler
和proxy
進程。
apiserver配置文件位置:/etc/kubernetes/apiserver
KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"
KUBE_API_PORT="--port=8080"
KUBELET_PORT="--kubelet-port=10250"
// 本機IP:PORT
KUBE_ETCD_SERVERS="--etcd-servers=http://127.0.0.1:2379"
KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16"
KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota"
KUBE_API_ARGS=""
這些配置讓apiserver
進程在8080
端口上監聽所有網絡接口,並告訴apiserver
進程etcd
服務的地址。
flannel網絡配置
配置etcd
中關於flannel
的key
(這個只在安裝了etcd的機器上操作,這裏只在Master節點安裝etcd)
flannel
使用etcd
進行配置,來保證多個flannel
實例之間的配置一致性,所以需要在etcd
上進行如下配置:
// 直接在linux命令行執行下面這條命令,前提是安裝etcd
etcdctl mk /atomic.io/network/config '{"Network":"10.1.0.0/16"}'
'/atomic.io/network'
這個key
要與後面配置的Master
節點和Node
節點中/etc/sysconfig/flannel
中的配置項FLANNEL_ETCD_PREFIX
相對應,錯誤的話啓動就好報錯。
注:上面flannel設置的ip網段可以任意設定,隨便設定一個網段都可以。容器的ip就是根據這個網段進行自動分配的,ip分配後,容器一般是可以對外聯網的(網橋模式,只要宿主機能上網就可以
flannel配置
問題及安裝原因
首次安裝我並沒有在master節點安裝flannel,導致再安裝了kubernetes-dashboard之後,無法通過http:masterIP:8080/ui訪問dashboard後臺(頁面顯示錯誤在下方)。經過折磨人的檢查過程,排除了配置的問題之後,發現是由於集羣內部網絡不通導致的。。再然後通過試驗發現master節點安裝配置好flannel之後就沒問題了。。所以還是在master節點安裝flannel吧。。
// kubernetes-dashboard 打開後臺報錯
kubernetes Error: 'dial tcp 10.1.93.3:9090: getsockopt: no route to host'
安裝flannel
yum -y install flannel
配置文件
打開flannel配置文件:/etc/sysconfig/flanneld
# etcd集羣master地址,即上面配置的etcd地址,若etcd和flannel安裝在同一臺集羣,則使用127.0.0.1也行
FLANNEL_ETCD_ENDPOINTS="http://127.0.0.1:2379"
# flannel網絡配置的key,上面設置的flannel網絡配置中的key前綴
FLANNEL_ETCD_PREFIX="/atomic.io/network"
啓動flannel
# 啓動flannel
systemctl start flanneld
# 重啓flannel
systemctl restart flanneld
# 查看flannel狀態
systemctl status flanneld
啓動Master服務
啓動Kubernetes Master
節點上的etcd
, docker
, kube-apiserver
, kube-controller-manager
和kube-scheduler
進程並查看其狀態
// 一個小shell腳本,循環啓動這些服務,要按照這裏的順序啓動服務
for SERVICES in etcd docker kube-apiserver kube-controller-manager kube-scheduler; do
systemctl restart $SERVICES
systemctl enable $SERVICES
systemctl status $SERVICES
done
現在我們可以使用kubectl get nodes
命令來查看,當然,目前還沒有Node節點加入到該Kubernetes集羣,所以命令的執行結果是空的:
Kubernetes Node節點的安裝與配置
除了Master
,Kubernetes
集羣中的其他集羣被稱爲Node
節點,在較早版本中也被稱爲Minion
。與Master
一樣,Node
節點可以使一臺物理機,也可以是一臺虛擬機。Node
節點纔是Kubernetes
集羣中的工作負載節點
,每個Node
都會被Master
分配一些工作負載(Docker容器
),當某個Node
宕機時,其上的工作負載會被Master
自動轉移到其他節點上去。
每個Node
節點都運行着以下一組關鍵進程:
1. kubelet
:負責Pod
對應的容器的創建、啓停等任務,同時與Master節點密切協作,實現集羣管理的基本功能。
2. kube-proxy
:實現Kubernetes Service
的通信與負載均衡機制的重要組件。
3. Docker Engine(docker)
:Docker引擎,負責本機的容器創建和管理工作。
Node節點可以在運行期間動態增加到Kubernetes集羣中,前提是這個節點上已經正確安裝、配置和啓動了上述關鍵進程,在默認情況下kubelet
會向Master
註冊自己,這也是Kubernetes推薦的Node管理方式。一旦Node被納入集羣管理範圍,kubelet
進程就好定時向Master節點彙報自身的情報,例如操作系統、Docker版本、機器的CPU和內存情況,以及當前有哪些Pod在運行等,這樣Master可以獲知每個Node的資源使用情況。並實現高效均衡的資源調度策略。而某個Node超過指定時間不上報信息時,會被Master判定爲‘失聯’
,Node的狀態被標記爲不可用(Not Ready
)。隨後Master會觸發‘工作負載大轉移’的自動流程。
安裝 flannel, docker和Kubernetes
yum -y install flannel docker kubernetes
flannel 配置
配置文件位置:/etc/sysconfig/flanneld
// Master節點etcd配置IP:PORT
FLANNEL_ETCD_ENDPOINTS="http://10.0.11.150:2379"
// Master節點配置的flannel中的key
FLANNEL_ETCD_PREFIX="/atomic.io/network"
#FLANNEL_OPTIONS=""
配置信息告訴flannel進程etcd服務的位置以及在etcd上網絡配置信息的節點位置
Kubernetes配置
配置文件位置:/etc/kubernetes/config
KUBE_LOGTOSTDERR="--logtostderr=true"
KUBE_LOG_LEVEL="--v=0"
KUBE_ALLOW_PRIV="--allow-privileged=false"
//Master節點的kube url
KUBE_MASTER="--master=http://10.0.11.150:8080"
KUBE_MASTER=”–master=http://10.0.11.150:8080“是將Kubernetes的apiserver進程的服務地址告訴Kubernetes的controller-manager, scheduler和proxy進程。
kubelet配置
配置文件位置:/etc/kubernetes/kubelet
KUBELET_ADDRESS="--address=0.0.0.0"
KUBELET_PORT="--port=10250"
// 本機IP,每個節點都不一樣
KUBELET_HOSTNAME="--hostname-override=10.0.11.152"
// Master節點配置的server
KUBELET_API_SERVER="--api-servers=http://10.0.11.150:8080"
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"
KUBELET_ARGS=""
注意:KUBELET_POD_INFRA_CONTAINER
: kubelet配置文件中的KUBELET_POD_INFRA_CONTAINER
該配置項指的是在Pod創建啓動時,會從該地址下載pod-infrastructure
鏡像並隨pod啓動,但是默認的鏡像下載地址國內會出現下載失敗情況,導致pod啓動失敗,因此建議將該pod下載下來,並保存到本地的Docker私有庫中。然後修改該配置項的值。我這裏將該配置項修改爲:
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=10.0.11.150:5000/rhel7/pod-infrastructure:v1.0.0"
啓動Node服務
啓動kube-proxy
kubelet
flanneld
和docker
進程並查看其狀態
// 注意啓動順序,flanneld需要在docker前啓動
for SERVICES in kube-proxy kubelet flanneld docker; do
systemctl restart $SERVICES
systemctl enable $SERVICES
systemctl status $SERVICES
done
將每個服務啓動並設置成開啓啓動,然後查看服務狀態
最後,在Master節點使用kubectl get nodes
命令來查看,可以看到節點信息: