- Kubernetes權威指南:從Docker到Kubernetes實踐全接觸(第4版)
- 龔正等編著
- 2134字
- 2019-09-23 11:04:29
2.3 以二進制文件方式安裝Kubernetes集群
本節以二進制文件方式安裝Kubernetes集群,并對每個組件的配置進行詳細說明。
從Kubernetes發布官網https://github.com/kubernetes/kubernetes/releases找到對應的版本號,單擊CHANGELOG,找到已編譯好的二進制文件的下載頁面,如圖2.1和圖2.2所示。本書基于Kubernetes 1.14版本進行說明。

圖2.1 GitHub上Kubernetes的下載頁面一

圖2.2 GitHub上Kubernetes的下載頁面二
在壓縮包kubernetes.tar.gz內包含了Kubernetes的服務程序文件、文檔和示例;在壓縮包kubernetes-src.tar.gz內則包含了全部源代碼。也可以直接下載Server Binaries中的kubernetes-server-linux-amd64.tar.gz文件,其中包含了Kubernetes需要運行的全部服務程序文件。主要的服務程序文件列表如表2.2所示。
表2.2 主要的服務程序文件列表

Kubernetes的主要服務程序都可以通過直接運行二進制文件加上啟動參數完成運行。在Kubernetes的Master上需要部署etcd 、 kube-apiserver 、 kube-controller-manager 、kube-scheduler服務進程,在工作Node上需要部署docker、kubelet和kube-proxy服務進程。
將Kubernetes的二進制可執行文件復制到/usr/bin目錄下,然后在/usr/lib/system/system目錄下為各服務創建systemd服務配置文件(完整的systemd系統知識請參考Linux的相關手冊),這樣就完成了軟件的安裝。要使Kubernetes正常工作,需要詳細配置各個服務的啟動參數。
下面主要介紹各服務最主要的啟動參數,每個服務完整啟動的參數說明詳見2.8節。
2.3.1 Master上的etcd、kube-apiserver、kube-controller-manager、kube-scheduler服務
1.etcd服務
etcd服務作為Kubernetes集群的主數據庫,在安裝Kubernetes各服務之前需要首先安裝和啟動。
從GitHub官網(https://github.com/coreos/etcd/releases)下載etcd二進制文件,將etcd和etcdctl文件復制到/usr/bin目錄。
設置systemd服務配置文件/usr/lib/systemd/system/etcd.service:
[Unit] Description=Etcd Server After=network.target [Service] Type=simple WorkingDirectory=/var/lib/etcd/ EnvironmentFile=-/etc/etcd/etcd.conf ExecStart=/usr/bin/etcd [Install] WantedBy=multi-user.target
其中,WorkingDirectory(/var/lib/etcd/)表示etcd數據保存的目錄,需要在啟動etcd服務之前創建。
配置文件/etc/etcd/etcd.conf通常不需要特別的參數設置(詳細的參數配置內容參見官方文檔),etcd默認使用http://127.0.0.1:2379地址供客戶端連接。
配置完成后,通過systemctl start命令啟動etcd服務。同時,使用systemctl enable命令將服務加入開機啟動列表中:
# systemctl daemon-reload # systemctl enable etcd.service # systemctl start etcd.service
通過執行etcdctl cluster-health,可以驗證etcd是否正確啟動:
# etcdctl endpoint health 127.0.0.1:2379 is healthy: successfully committed proposal: took = 1.33112ms
2.kube-apiserver服務
將kube-apiserver、kube-controller-manager和kube-scheduler文件復制到/usr/bin目錄。
設置systemd服務配置文件/usr/lib/systemd/system/kube-apiserver.service,內容如下:
[Unit] Description=Kubernetes API Server Documentation=https://github.com/GoogleCloudPlatform/kubernetes After=etcd.service Wants=etcd.service [Service] EnvironmentFile=/etc/kubernetes/apiserver ExecStart=/usr/bin/kube-apiserver $KUBE_API_ARGS Restart=on-failure Type=notify LimitNOFILE=65536 [Install] WantedBy=multi-user.target
配置文件/etc/kubernetes/apiserver的內容包括了kube-apiserver的全部啟動參數,主要的配置參數在變量KUBE_API_ARGS中指定。
# cat /etc/kubernetes/apiserver KUBE_API_ARGS="--etcd-servers=http://127.0.0.1:2379 --insecure-bind-address=0.0.0.0--insecure-port=8080 --service-cluster-ip-range=169.169.0.0/16--service-node-port-range=1-65535 --enable-admission-plugins=NamespaceLifecycle,LimitRanger,ServiceAccount,Default StorageClass,DefaultTolerationSeconds,MutatingAdmissionWebhook,ValidatingAdmissi onWebhook,ResourceQuota --logtostderr=false --log-dir=/var/log/kubernetes --v=0"
對啟動參數說明如下。
◎ --etcd-servers:指定etcd服務的URL。
◎ --storage-backend:指定etcd的版本,從Kubernetes 1.6開始,默認為etcd 3。注意,在Kubernetes 1.6之前的版本中沒有這個參數,kube-apiserver默認使用etcd 2,對于正在運行的1.5或舊版本的Kubernetes集群,etcd提供了數據升級方案,詳見etcd文檔(https://coreos.com/etcd/docs/latest/upgrades/upgrade_3_0.html)。
◎ --insecure-bind-address:API Server綁定主機的非安全IP地址,設置0.0.0.0表示綁定所有IP地址。
◎ --insecure-port:API Server綁定主機的非安全端口號,默認為8080。
◎ --service-cluster-ip-range:Kubernetes集群中Service的虛擬IP地址范圍,以CIDR格式表示,例如169.169.0.0/16,該IP范圍不能與物理機的IP地址有重合。
◎ --service-node-port-range:Kubernetes集群中Service可使用的物理機端口號范圍,默認值為30000~32767。
◎ --enable-admission-plugins:Kubernetes集群的準入控制設置,各控制模塊以插件的形式依次生效。
◎ --logtostderr:設置為false表示將日志寫入文件,不寫入stderr。
◎ --log-dir:日志目錄。
◎ --v:日志級別。
3.kube-controller-manager服務
kube-controller-manager服務依賴于kube-apiserver服務,設置systemd服務配置文件/usr/lib/systemd/system/kube-controller-manager.service,內容如下:
[Unit] Description=Kubernetes Controller Manager Documentation=https://github.com/GoogleCloudPlatform/kubernetes After=kube-apiserver.service Requires=kube-apiserver.service [Service] EnvironmentFile=/etc/kubernetes/controller-manager ExecStart=/usr/bin/kube-controller-manager $KUBE_CONTROLLER_MANAGER_ARGS Restart=on-failure LimitNOFILE=65536 [Install] WantedBy=multi-user.target
配置文件/etc/kubernetes/controller-manager的內容包含了kube-controller-manager的全部啟動參數,主要的配置參數在變量KUBE_CONTROLLER_MANAGER_ARGS中指定:
# cat /etc/kubernetes/controller-manager KUBE_CONTROLLER_MANAGER_ARGS="--kubeconfig=/etc/kubernetes/kubeconfig --logtostderr=false --log-dir=/var/log/kubernetes --v=0"
對啟動參數說明如下。
◎ --kubeconfig:設置與API Server連接的相關配置,例如:
apiVersion: v1
kind: Config
users:
- name: client
user:
clusters:
- name: default
cluster:
server: http://192.168.18.3:8080
contexts:
- context:
cluster: default
user: client
name: default
current-context: default
◎ --logtostderr:設置為false表示將日志寫入文件,不寫入stderr。
◎ --log-dir:日志目錄。
◎ --v:日志級別。
4.kube-scheduler服務
kube-scheduler服務也依賴于kube-apiserver服務,設置systemd服務配置文件/usr/lib/systemd/system/kube-scheduler.service,內容如下:
[Unit] Description=Kubernetes Controller Manager Documentation=https://github.com/GoogleCloudPlatform/kubernetes After=kube-apiserver.service Requires=kube-apiserver.service [Service] EnvironmentFile=/etc/kubernetes/scheduler ExecStart=/usr/bin/kube-scheduler $KUBE_SCHEDULER_ARGS Restart=on-failure LimitNOFILE=65536 [Install] WantedBy=multi-user.target
配置文件/etc/kubernetes/scheduler的內容包括了kube-scheduler的全部啟動參數,主要的配置參數在變量KUBE_SCHEDULER_ARGS中指定:
# cat /etc/kubernetes/scheduler KUBE_SCHEDULER_ARGS="--kubeconfig=/etc/kubernetes/kubeconfig --logtostderr=false --log-dir=/var/log/kubernetes --v=0"
對啟動參數說明如下。
◎ --kubeconfig:設置與API Server連接的相關配置,可以與kube-controller-manager使用的kubeconfig文件相同。
◎ --logtostderr:設置為false表示將日志寫入文件,不寫入stderr。
◎ --log-dir:日志目錄。
◎ --v:日志級別。
配置完成后,執行systemctl start命令按順序啟動這3個服務,同時,使用systemctl enable命令將服務加入開機啟動列表中:
# systemctl daemon-reload # systemctl enable kube-apiserver.service # systemctl start kube-apiserver.service # systemctl enable kube-controller-manager # systemctl start kube-controller-manager # systemctl enable kube-scheduler # systemctl start kube-scheduler
通過systemctl status <service_name>驗證服務的啟動狀態,running表示啟動成功。
至此,Master上所需的服務就全部啟動完成了。
2.3.2 Node上的kubelet、kube-proxy服務
在工作Node上需要預先安裝好Docker Daemon并且正常啟動。Docker的安裝和啟動詳見Docker官網http://www.docker.com的說明文檔。
1.kubelet服務
kubelet服務依賴于Docker服務,設置systemd服務配置文件/usr/lib/systemd/system/kubelet.service,內容如下:
[Unit] Description=Kubernetes Kubelet Server Documentation=https://github.com/GoogleCloudPlatform/kubernetes After=docker.service Requires=docker.service [Service] WorkingDirectory=/var/lib/kubelet EnvironmentFile=/etc/kubernetes/kubelet ExecStart=/usr/bin/kubelet $KUBELET_ARGS Restart=on-failure [Install] WantedBy=multi-user.target
其中,WorkingDirectory表示kubelet保存數據的目錄,需要在啟動kubelet服務之前創建。
配置文件/etc/kubernetes/kubelet的內容包括了kubelet的全部啟動參數,主要的配置參數在變量KUBELET_ARGS中指定:
# cat /etc/kubernetes/kubelet KUBELET_ARGS="--kubeconfig=/etc/kubernetes/kubeconfig --hostname-override=192.168.18.3--logtostderr=false --log-dir=/var/log/kubernetes --v=0"
對啟動參數說明如下。
◎ --kubeconfig:設置與API Server連接的相關配置,可以與kube-controller-manager使用的kubeconfig文件相同。
◎ --hostname-override:設置本Node的名稱。
◎ --logtostderr:設置為false表示將日志寫入文件,不寫入stderr。
◎ --log-dir:日志目錄。
◎ --v:日志級別。
2.kube-proxy服務
kube-proxy服務依賴于network服務,設置systemd服務配置文件/usr/lib/systemd/system/kube-proxy.service,內容如下:
[Unit] Description=Kubernetes Kube-Proxy Server Documentation=https://github.com/GoogleCloudPlatform/kubernetes After=network.target Requires=network.service [Service] EnvironmentFile=/etc/kubernetes/proxy ExecStart=/usr/bin/kube-proxy $KUBE_PROXY_ARGS Restart=on-failure LimitNOFILE=65536 [Install] WantedBy=multi-user.target
配置文件/etc/kubernetes/proxy的內容包括了kube-proxy的全部啟動參數,主要的配置參數在變量KUBE_PROXY_ARGS中指定:
# cat /etc/kubernetes/proxy KUBE_PROXY_ARGS="--kubeconfig=/etc/kubernetes/kubeconfig --logtostderr=false --log-dir=/var/log/kubernetes --v=2"
對啟動參數說明如下。
◎ --kubeconfig:設置與API Server連接的相關配置,可以與kube-controller-manager使用的kubeconfig文件相同。
◎ --logtostderr:設置為false表示將日志寫入文件,不寫入stderr。
◎ --log-dir:日志目錄。
◎ --v:日志級別。
配置完成后,通過systemctl啟動kubelet和kube-proxy服務:
# systemctl daemon-reload # systemctl enable kubelet.service # systemctl start kubelet.service # systemctl enable kube-proxy # systemctl start kube-proxy
kubelet默認采用向Master自動注冊本Node的機制,在Master上查看各Node的狀態,狀態為Ready表示Node已經成功注冊并且狀態為可用:
# kubectl get nodes NAME STATUS AGE 192.168.18.3 Ready 1m
等所有Node的狀態都為Ready之后,一個Kubernetes集群就啟動完成了。接下來可以創建Pod、Deployment、Service等資源對象來部署容器應用了。