前提條件

1. 你需要2臺或以上安裝有Fedora的機器

說明

本文是針對Fedora系統的Kubernetes入門教程。通過手動配置,你將會理解所有底層的包、服務、埠等。

本文只會讓一個節點(之前稱從節點)工作。多節點需要在Kubernetes之外配置一個可用的網路環境,儘管這個額外的配置條件是顯而易見的,(本節也不會去配置)。

Kubernetes包提供了一些服務:kube-apiserver,kube-scheduler,kube-controllermanager,kubelet,kube-proxy。這些服務通過systemd進行管理,配置資訊都集中存放在一個地方:/etc/kubernetes。我們將會把這些服務執行到不同的主機上。第一臺主機,fedmaster,將是Kubernetes的master主機。這臺機器上將執行kube-apiserver,kube-controllermanager和kube-scheduler這幾個服務,此外,master主機上還將執行etcd(如果etcd執行在另一臺主機上,那就不需要了,本文假設etcd和Kubernetesmaster執行在同一臺主機上)。其餘的主機,fed-node,將是從節點,上面執行kubelet, proxy和docker。

系統資訊:

主機:

fed-master = 192.168.121.9
fed-node = 192.168.121.65

準備主機:

  • 在所有主機上(fed-master和fed-node)都安裝Kubernetes,。這對docker也適用。在fed-master上安裝etcd。本文在kubernetes-0.18及之後版本上通過測試。
  • yum命令之後的 –enablerepo=update-testing 引數可以保證安裝最新的Kubernetes預覽版。如果不加這個引數,你安裝的版本將是Fedora提供的較舊的穩定版。
  • 如果你想獲取最新的版本,你可以從Fedora Koji上下載最新的RPM包,然後yum install安裝。而不是用下面的命令。
yum -y install --enablerepo=updates-testing kubernetes
  • 安裝etcd和iptables
yum -y install etcd iptables
  • 在所有主機的/etc/hosts檔案中加入master和node節點,如果DNS中已經有了主機名,就不需要加了。需要保證fed-master和fed-node之間可以正常通訊,可使用ping測試網路是否連通。

echo “192.168.121.9 fed-master
192.168.121.65 fed-node” >> /etc/hosts

編輯/etc/kubernetes/config檔案,加入以下內容。所有主機都是(包括master和node)。

# Comma separated list of nodes in the etcd cluster
KUBE_MASTER=”–master=http://fed-master:8080″
# 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”

  • 禁用master和node上的防火牆,因為如果有其他防火牆規則管理工具的話,docker會無法正常執行。請注意以預設方式安裝的fedora伺服器上,iptables服務並不存在。

systemctl disable iptables-services firewalld
systemctl stop iptables-services firewalld

配置master主機上Kubernetes服務

  • 按照下面的示例編輯/etc/kubernetes/apiserver檔案。注意–service-cluster-ip-range引數後跟的IP地址必須是在任何地方都未使用的地址段,這些地址無需路由也無需分配到任何東西上。

# The address on the local server to listen to.
KUBE_API_ADDRESS=”–address=0.0.0.0″
# Comma separated list of nodes in the etcd cluster
KUBE_ETCD_SERVERS=”–etcd_servers=http://127.0.0.1:4001″
# Address range to use for services
KUBE_SERVICE_ADDRESSES=”–service-cluster-ip-range=10.254.0.0/16″
# Add your own!
KUBE_API_ARGS=””

  • 編輯/etc/etcd/etcd.conf檔案,使得etcd監聽除了127.0.0.1之外的所有IP,如果沒有做這步,將會產生“connection refused”這樣的錯誤。

ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:4001

  • 啟動master上恰當的服務

for SERVICES in etcd kube-apiserver kube-controller-manager kube-scheduler;do
systemctl restart $SERVICES
systemctl enable $SERVICES
systemctl status $SERVICES
done

  • 新增node結點:
  • 在Kubernetes的master上建立下面node.json檔案:

{
“apiVersion”: “v1”,
“kind”: “Node”,
“metadata”: {
“name”: “fed-node”,
“labels”:{ “name”: “fed-node-label”}
},
“spec”: {
“externalID”: “fed-node”
}
}

現在在你的Kubernetes叢集內部建立一個node物件,執行命令

$ kubectl create -f ./node.json
$ kubectl get nodes
NAME LABELS STATUS
fed-node name=fed-node-label Unknown

請注意上面的命令,它只在內部建立了一個fed-node的引用(原文representation),並不會真的提供fed-node節點。同時,假定fed-node節點(在name中指定的)能夠被解析並可從Kubernetes的master節點訪問。下面本文將論述如何提供Kubernetes node節點(fed-node)。

配置node節點上的Kubernetes服務

我們需要在節點上配置kubelet

  • 按照下面的示例編輯/etc/kubernetes/kubelet檔案:
###
# Kubernetes kubelet (node) config
# The address for the info server to serve on (set to 0.0.0.0 or "" for all interfaces)
KUBELET_ADDRESS="--address=0.0.0.0"
# You may leave this blank to use the actual hostname
KUBELET_HOSTNAME="--hostname_override=fed-node"
# location of the api-server
KUBELET_API_SERVER="--api_servers=http://fed-master:8080"
# Add your own!
#KUBELET_ARGS=""
  • 啟動節點上(fed-node)上恰當的服務
for SERVICES in kube-proxy kubelet docker; do
systemctl restart $SERVICES
systemctl enable $SERVICES
systemctl status $SERVICES
done
  • 檢測以確認現在叢集中fed-master能夠看到fed-node,而且狀態變為Ready了
kubectl get nodes
NAME LABELS STATUS
fed-node name=fed-node-label Ready
  • 節點的刪除 如果要想從Kubernetes叢集中刪除fed-node節點,需要在fed-master上執行下面命令(請別這樣做,只是提示刪除的方法)
kubectl delete -f ./node.json

你應該完成了吧!

叢集現在應該在運行了,啟動一個用於測試的Pod吧。

K8S中文社群微信公眾號