1. 程式人生 > >kubernetes 叢集的安裝部署

kubernetes 叢集的安裝部署

kubernetes 叢集的安裝部署

本文來自我的github pages部落格http://galengao.github.io/ 即www.gaohuirong.cn

摘要:

  • 首先kubernetes得官方文件我自己看著很亂,資訊很少,所以結合了很多部落格搭建的
  • 其次因為既然用到docker,當然離不開kubernetes管理,還有swarm,前者管理複雜,但功能齊全
  • 這裡僅僅是安裝部署,還未使用,具體使用出現問題後續更新

前提條件

系統時centos7上 關閉防火牆 systemctl stop firewalld.service 關閉selinux vi /etc/selinux/comfig

主要元件說明

Kubernetes 叢集中主要存在兩種型別的節點,分別是 master 節點,以及 minion 節點。
Minion 節點是實際執行 Docker 容器的節點,負責和節點上執行的 Docker 進行互動,並且提供了代理功能。
Master 節點負責對外提供一系列管理叢集的 API 介面,並且通過和 Minion 節點互動來實現對叢集的操作管理。

apiserver:使用者和 kubernetes 叢集互動的入口,封裝了核心物件的增刪改查操作,提供了 RESTFul 風格的 API 介面,通過 etcd 來實現持久化並維護物件的一致性。

scheduler

:負責叢集資源的排程和管理,例如當有 pod 異常退出需要重新分配機器時,scheduler 通過一定的排程演算法從而找到最合適的節點。

controller-manager:主要是用於保證 replicationController 定義的複製數量和實際執行的 pod 數量一致,另外還保證了從 service 到 pod 的對映關係總是最新的。

kubelet:執行在 minion 節點,負責和節點上的 Docker 互動,例如啟停容器,監控執行狀態等。

proxy:執行在 minion 節點,負責為 pod 提供代理功能,會定期從 etcd 獲取 service 資訊,並根據 service 資訊通過修改 iptables 來實現流量轉發(最初的版本是直接通過程式提供轉發功能,效率較低。),將流量轉發到要訪問的 pod 所在的節點上去。

etcd:key-value鍵值儲存資料庫,用來儲存kubernetes的資訊的。

flannel:Flannel 是 CoreOS 團隊針對 Kubernetes 設計的一個覆蓋網路(Overlay Network)工具,需要另外下載部署。我們知道當我們啟動 Docker 後會有一個用於和容器進行互動的 IP 地址,如果不去管理的話可能這個 IP 地址在各個機器上是一樣的,並且僅限於在本機上進行通訊,無法訪問到其他機器上的 Docker 容器。Flannel 的目的就是為叢集中的所有節點重新規劃 IP 地址的使用規則,從而使得不同節點上的容器能夠獲得同屬一個內網且不重複的 IP 地址,並讓屬於不同節點上的容器能夠直接通過內網 IP 通訊。

部署規劃

這裡我用3臺伺服器搭建一個簡單的叢集:
192.168.10.147 # master節點(etcd,kubernetes-master)
192.168.10.148 # node節點(etcd,kubernetes-node,docker,flannel)
192.168.10.149 # node節點(etcd,kubernetes-node,docker,flannel)

由於kubernetes的程序較多,每個節點上的程序如圖:

安裝

  • 1、分別先在兩個node上安裝docker

安裝方式參照我的另一篇文章

http://blog.csdn.net/u014642915/article/details/60963653 或者 http://blog.csdn.net/u014642915/article/details/72771449

 
  • 2、在master安裝
yum install kubernetes-master etcd -y
 
  • 3、分別在兩個node上安裝
yum install kubernetes-node etcd flannel -y
 
  • 4、etcd叢集配置

在master節點上編輯etcd配置檔案

複製程式碼
vi /etc/etcd/etcd.conf

# [member]
ETCD_NAME=etcd1
ETCD_DATA_DIR="/var/lib/etcd/etcd1.etcd"
#ETCD_WAL_DIR=""
#ETCD_SNAPSHOT_COUNT="10000"
#ETCD_HEARTBEAT_INTERVAL="100"
#ETCD_ELECTION_TIMEOUT="1000"
ETCD_LISTEN_PEER_URLS="http://192.168.10.147:2380"
ETCD_LISTEN_CLIENT_URLS="http://192.168.10.147:2379,http://127.0.0.1:2379"
CD_MAX_SNAPSHOTS="5"
#ETCD_MAX_WALS="5"
#ETCD_CORS=""
#
#[cluster]
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.10.147:2380"
# if you use different ETCD_NAME (e.g. test), set ETCD_INITIAL_CLUSTER value for this name, i.e. "test=http://..."
ETCD_INITIAL_CLUSTER="etcd1=http://192.168.10.147:2380,etcd2=http://192.168.10.148:2380,etcd3=http://192.168.10.149:2380"
#ETCD_INITIAL_CLUSTER_STATE="new"
#ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.10.147:2379"
#ETCD_DISCOVERY=""
#ETCD_DISCOVERY_SRV=""
#ETCD_DISCOVERY_FALLBACK="proxy"
#ETCD_DISCOVERY_PROXY=""
#
#[proxy]
#ETCD_PROXY="off"
#ETCD_PROXY_FAILURE_WAIT="5000"
#ETCD_PROXY_REFRESH_INTERVAL="30000"
#ETCD_PROXY_DIAL_TIMEOUT="1000"
#ETCD_PROXY_WRITE_TIMEOUT="5000"
#ETCD_PROXY_READ_TIMEOUT="0"
#
#[security]
#ETCD_CERT_FILE=""
#ETCD_KEY_FILE=""
#ETCD_CLIENT_CERT_AUTH="false"
#ETCD_TRUSTED_CA_FILE=""
#ETCD_PEER_CERT_FILE=""
#ETCD_PEER_KEY_FILE=""
#ETCD_PEER_CLIENT_CERT_AUTH="false"
#ETCD_PEER_TRUSTED_CA_FILE=""
#
#[logging]
#ETCD_DEBUG="false"
# examples for -log-package-levels etcdserver=WARNING,security=DEBUG
#ETCD_LOG_PACKAGE_LEVELS=""
複製程式碼
 

在node1上編輯配置檔案

複製程式碼
vi /etc/etcd/etcd.conf

# [member]
ETCD_NAME=etcd2
ETCD_DATA_DIR="/var/lib/etcd/etcd2"
#ETCD_WAL_DIR=""
#ETCD_SNAPSHOT_COUNT="10000"
#ETCD_HEARTBEAT_INTERVAL="100"
#ETCD_ELECTION_TIMEOUT="1000"
ETCD_LISTEN_PEER_URLS="http://192.168.10.148:2380"
ETCD_LISTEN_CLIENT_URLS="http://192.168.10.148:2379,http://127.0.0.1:2379"
#ETCD_MAX_SNAPSHOTS="5"
#ETCD_MAX_WALS="5"
#ETCD_CORS=""
#
#[cluster]
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.10.148:2380"
# if you use different ETCD_NAME (e.g. test), set ETCD_INITIAL_CLUSTER value for this name, i.e. "test=http://..."
ETCD_INITIAL_CLUSTER="etcd1=http://192.168.10.147:2380,etcd2=http://192.168.10.148:2380,etcd3=http://192.168.10.149:2380"
#ETCD_INITIAL_CLUSTER_STATE="new"
#ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.10.148:2379"
#ETCD_DISCOVERY=""
#ETCD_DISCOVERY_SRV=""
#ETCD_DISCOVERY_FALLBACK="proxy"
#ETCD_DISCOVERY_PROXY=""
#
#[proxy]
#ETCD_PROXY="off"
#ETCD_PROXY_FAILURE_WAIT="5000"
#ETCD_PROXY_REFRESH_INTERVAL="30000"
#ETCD_PROXY_DIAL_TIMEOUT="1000"
#ETCD_PROXY_WRITE_TIMEOUT="5000"
#ETCD_PROXY_READ_TIMEOUT="0"
#
#[security]
#ETCD_CERT_FILE=""
#ETCD_KEY_FILE=""
#ETCD_CLIENT_CERT_AUTH="false"
#ETCD_TRUSTED_CA_FILE=""
#ETCD_PEER_CERT_FILE=""
#ETCD_PEER_KEY_FILE=""
#ETCD_PEER_CLIENT_CERT_AUTH="false"
#ETCD_PEER_TRUSTED_CA_FILE=""
#
#[logging]
#ETCD_DEBUG="false"
# examples for -log-package-levels etcdserver=WARNING,security=DEBUG
#ETCD_LOG_PACKAGE_LEVELS=""
複製程式碼
 

在node2上編輯配置檔案

複製程式碼
vi /etc/etcd/etcd.conf

# [member]
ETCD_NAME=etcd3
ETCD_DATA_DIR="/var/lib/etcd/etcd3"
#ETCD_WAL_DIR=""
#ETCD_SNAPSHOT_COUNT="10000"
#ETCD_HEARTBEAT_INTERVAL="100"
#ETCD_ELECTION_TIMEOUT="1000"
ETCD_LISTEN_PEER_URLS="http://192.168.10.149:2380"
ETCD_LISTEN_CLIENT_URLS="http://192.168.10.149:2379,http://127.0.0.1:2379"
#ETCD_MAX_SNAPSHOTS="5"
#ETCD_MAX_WALS="5"
#ETCD_CORS=""
#
#[cluster]
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.10.149:2380"
# if you use different ETCD_NAME (e.g. test), set ETCD_INITIAL_CLUSTER value for this name, i.e. "test=http://..."
ETCD_INITIAL_CLUSTER="etcd1=http://192.168.10.147:2380,etcd2=http://192.168.10.148:2380,etcd3=http://192.168.10.149:2380"
#ETCD_INITIAL_CLUSTER_STATE="new"
#ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.10.149:2379"
#ETCD_DISCOVERY=""
#ETCD_DISCOVERY_SRV=""
#ETCD_DISCOVERY_FALLBACK="proxy"
#ETCD_DISCOVERY_PROXY=""
#
#[proxy]
#ETCD_PROXY="off"
#ETCD_PROXY_FAILURE_WAIT="5000"
#ETCD_PROXY_REFRESH_INTERVAL="30000"
#ETCD_PROXY_DIAL_TIMEOUT="1000"
#ETCD_PROXY_WRITE_TIMEOUT="5000"
#ETCD_PROXY_READ_TIMEOUT="0"
#
#[security]
#ETCD_CERT_FILE=""
#ETCD_KEY_FILE=""
#ETCD_CLIENT_CERT_AUTH="false"
#ETCD_TRUSTED_CA_FILE=""
#ETCD_PEER_CERT_FILE=""
#ETCD_PEER_KEY_FILE=""
#ETCD_PEER_CLIENT_CERT_AUTH="false"
#ETCD_PEER_TRUSTED_CA_FILE=""
#
#[logging]
#ETCD_DEBUG="false"
# examples for -log-package-levels etcdserver=WARNING,security=DEBUG
#ETCD_LOG_PACKAGE_LEVELS=""
複製程式碼
 

針對幾個URLS做下簡單的解釋:
[member]
ETCD_NAME :ETCD的節點名
ETCD_DATA_DIR:ETCD的資料儲存目錄
ETCD_SNAPSHOT_COUNTER:多少次的事務提交將觸發一次快照
ETCD_HEARTBEAT_INTERVAL:ETCD節點之間心跳傳輸的間隔,單位毫秒
ETCD_ELECTION_TIMEOUT:該節點參與選舉的最大超時時間,單位毫秒
ETCD_LISTEN_PEER_URLS:該節點與其他節點通訊時所監聽的地址列表,多個地址使用逗號隔開,其格式可以劃分為scheme://IP:PORT,這裡的scheme可以是http、https
ETCD_LISTEN_CLIENT_URLS:該節點與客戶端通訊時監聽的地址列表
[cluster]
ETCD_INITIAL_ADVERTISE_PEER_URLS:該成員節點在整個叢集中的通訊地址列表,這個地址用來傳輸叢集資料的地址。因此這個地址必須是可以連線叢集中所有的成員的。
ETCD_INITIAL_CLUSTER:配置叢集內部所有成員地址,其格式為:ETCD_NAME=ETCD_INITIAL_ADVERTISE_PEER_URLS,如果有多個使用逗號隔開
ETCD_ADVERTISE_CLIENT_URLS:廣播給叢集中其他成員自己的客戶端地址列表

至此etcd叢集就部署完了,然後每個節點上啟動

systemctl start kube-apiserver
驗證:
[[email protected] ~]# etcdctl cluster-health
member 35300bfb5308e02c is healthy: got healthy result from http://192.168.10.147:2379
member 776c306b60e6f972 is healthy: got healthy result from http://192.168.10.149:2379
member a40f86f061be3fbe is healthy: got healthy result from http://192.168.10.148:2379
 
  • 5、kubernetes master安裝

修改apiserver配置檔案

複製程式碼
[[email protected] ~]# vi /etc/kubernetes/apiserver
###
# kubernetes system config
#
# The following values are used to configure the kube-apiserver
#

# The address on the local server to listen to.
# KUBE_API_ADDRESS="--insecure-bind-address=127.0.0.1"
KUBE_API_ADDRESS="--address=0.0.0.0"

# The port on the local server to listen on.
KUBE_API_PORT="--port=8080"

# Port minions listen on
KUBELET_PORT="--kubelet-port=10250"

# Comma separated list of nodes in the etcd cluster
KUBE_ETCD_SERVERS="--etcd-servers=http://192.168.10.147:2379,http://192.168.10.148:2379,http://192.168.10.149:2379"

# Address range to use for services
KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16"

# default admission control policies
KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota"

# Add your own!
KUBE_API_ARGS=""
複製程式碼
 

配置controller-manager 暫時不做修改

複製程式碼
[[email protected] etcd]# vi /etc/kubernetes/controller-manager 
###
# The following values are used to configure the kubernetes controller-manager

# defaults from config and apiserver should be adequate

# Add your own!
KUBE_CONTROLLER_MANAGER_ARGS=""
複製程式碼
 

啟動Master上的三個服務

複製程式碼
systemctl start kube-apiserver
systemctl start kube-controller-manager
systemctl start kube-scheduler
systemctl enable kube-apiserver
systemctl enable kube-controller-manager
systemctl enable kube-scheduler
複製程式碼
 
  • 6、kubernetes node安裝部署

修改節點config配置檔案

複製程式碼
[[email protected] ~]# vi /etc/kubernetes/config 
###
# kubernetes system config
#
# The following values are used to configure various aspects of all
# kubernetes services, including
#
#   kube-apiserver.service
#   kube-controller-manager.service
#   kube-scheduler.service
#   kubelet.service
#   kube-proxy.service
# logging to stderr means we get it in the systemd journal
KUBE_LOGTOSTDERR="--logtostderr=true"

# journal message level, 0 is debug
KUBE_LOG_LEVEL="--v=0"

# Should this cluster be allowed to run privileged docker containers
KUBE_ALLOW_PRIV="--allow-privileged=false"

# How the controller-manager, scheduler, and proxy find the apiserver
KUBE_MASTER="--master=http://192.168.10.147:8080"
~
複製程式碼
 

修改kubelet配置

複製程式碼
[[email protected] ~]# vi /etc/kubernetes/kubelet 
###
# kubernetes kubelet (minion) config

# The address for the info server to serve on (set to 0.0.0.0 or "" for all interfaces)
KUBELET_ADDRESS="--address=127.0.0.1"

# The port for the info server to serve on
# KUBELET_PORT="--port=10250"

# You may leave this blank to use the actual hostname
KUBELET_HOSTNAME="--hostname-override=192.168.10.148"

# location of the api-server
KUBELET_API_SERVER="--api-servers=http://192.168.10.147:8080"

# pod infrastructure container
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"

# Add your own!
KUBELET_ARGS=""
複製程式碼
 

分別啟動kubernetes node服務

systemctl start kubelet
systemctl start kube-proxy
systemctl enable kubelet
systemctl enable kube-proxy
 

網路配置

這裡網路部分是以外掛的形式配置在kubernetes叢集中,這裡選用flannel。

  • 1、安裝flannel

上述步驟已經在node上安裝
yum install flannel -y

  • 2、配置flannel
複製程式碼
[[email protected] ~]# vi /etc/sysconfig/flanneld 

FLANNEL_ETCD_KEY="/atomic.io
# Flanneld configuration options

# etcd url location.  Point this to the server where etcd runs
FLANNEL_ETCD="http://192.168.10.147:2379"

# etcd config key.  This is the configuration key that flannel queries
# For address range assignment
FLANNEL_ETCD_KEY="/coreos.com/network"

# Any additional options that you want to pass
#FLANNEL_OPTIONS=""
複製程式碼
 
  • 3、為flannel建立分配的網路
# 只在master上etcd執行
etcdctl mk /coreos.com/network/config '{"Network": "10.1.0.0/16"}'
# 若要重新建,先刪除
etcdctl rm /coreos.com/network/ --recursive
 

重置docker0網橋的配置
刪除docker啟動時預設建立的docker0網橋,flannel啟動時會獲取到一個網路地址,並且配置docker0的IP地址,作為該網路的閘道器地址,如果此時docker0上配置有IP地址,那麼flannel將會啟動失敗。
ip link del docker0

檢查

在master上執行下面,檢查kubernetes的狀態

[[email protected] ~]# kubectl get nodes
NAME             STATUS    AGE
192.168.10.148   Ready     3h
192.168.10.149   Ready     3h
 

在master上執行下面,檢查etcd的狀態

[[email protected] ~]# etcdctl  member list
35300bfb5308e02c: name=etcd1 peerURLs=http://192.168.10.147:2380 clientURLs=http://192.168.10.147:2379
776c306b60e6f972: name=etcd3 peerURLs=http://192.168.10.149:2380 clientURLs=http://192.168.10.149:2379
a40f86f061be3fbe: name=etcd2 peerURLs=http://192.168.10.148:2380 clientURLs=http://192.168.10.148:2379

 

centos7檢視日誌命令: journalctl -xe 或者 systemctl status flanneld.service flanneld對應改成你的專案