Kubernetes是Google大神開源的容器管理組件,常被稱為K8s (PS:K表示第一個字母,s表示最后一個字母,8表示中間一共有8個字母:) ). 被Docker的使用者用于Docker服務(wù)的編排和管理。雖然Docker家出了Swarm用來管理Docker,但是目前來看,使用K8s的仍然居多。
K8s的幾個概念
- Pod
K8s部署調(diào)度的最小單元,運(yùn)行在node節(jié)點(diǎn)上。運(yùn)行在同一個Pod內(nèi)的多個容器共享相同的網(wǎng)絡(luò)命名空間、IP地址和端口。 - RC (Replication Controller)
RC用來保證Pod按照一定的備份數(shù)運(yùn)行。 - Service
Service定義了Pod的邏輯集合和訪問策略... - Node
Node是k8s集群中Pod運(yùn)行的節(jié)點(diǎn)。
K8s集群部署方式
關(guān)于K8s的集群部署方式有很多,比如說tar包/rpm下載安裝,手動配置。這種方法比較麻煩。自從K8s 1.5版本后,新增了kubeadm init方法,能夠快速的安裝k8s集群。雖然目前這個方法還是beta版本,并且被警告不要在生產(chǎn)環(huán)境中使用 (: ,但是經(jīng)過筆者的測試,kubeadm init能夠方便的部署k8s,期待早日轉(zhuǎn)正 :)
以下是筆者在使用kubeadm init部署過程中整理的方法記錄,大部分來源于官方文檔: https://kubernetes.io/docs/setup/independent/create-cluster-kubeadm/
此外加了一些在過程中遇到的問題和解決方法,以供參考。
準(zhǔn)備條件
- 安裝Docker, 參照
https://docs.docker.com/engine/installation/linux/docker-ce/centos/#install-from-a-package - 打開net.bridge.bridge-nf-call-iptables
此處有坑1
如果不設(shè)置,在后面執(zhí)行kubeadm init時,precheck會報錯。
sysctl -w net.bridge.bridge-nf-call-iptables="1"
- 配置k8s yum源,如果能夠連外網(wǎng)使用google的源,否則的話可以找找國內(nèi)的代理源或者自行下載kubeadm和kubelet的安裝包手動安裝。
google的yum源如下:
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg
https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
安裝kubeadm和kubelet
本次安裝選擇的是1.6.6版本。
yum install kubelet-1.6.6*
yum install kubeadm-1.6.6*
在安裝過程中,會自動的將一些依賴安裝,如果某些依賴的源沒有在yum中配置,需要加上可以訪問的源。
使用 kubeadm init
在k8s的安裝文檔中,本步驟最簡單,只有一行命令,但是在實(shí)際操作過程中也是最容易出問題的一步。
登錄master節(jié)點(diǎn),執(zhí)行 kubeadm init,開始初始化master。
此處有坑2
這時候一般會卡到 [apiclient] Created API client, waiting for the control plane to become ready
[kubeadm] WARNING: kubeadm is in beta, please do not use it for production clusters.
[init] Using Kubernetes version: v1.7.0
[init] Using Authorization modes: [Node RBAC]
[preflight] Running pre-flight checks
[preflight] Starting the kubelet service
[certificates] Generated CA certificate and key.
[certificates] Generated API server certificate and key.
[certificates] API Server serving cert is signed for DNS names [kubeadm-master kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local] and IPs [10.96.0.1 10.138.0.4]
[certificates] Generated API server kubelet client certificate and key.
[certificates] Generated service account token signing key and public key.
[certificates] Generated front-proxy CA certificate and key.
[certificates] Generated front-proxy client certificate and key.
[certificates] Valid certificates and keys now exist in "/etc/kubernetes/pki"
[kubeconfig] Wrote KubeConfig file to disk: "/etc/kubernetes/admin.conf"
[kubeconfig] Wrote KubeConfig file to disk: "/etc/kubernetes/kubelet.conf"
[kubeconfig] Wrote KubeConfig file to disk: "/etc/kubernetes/controller-manager.conf"
[kubeconfig] Wrote KubeConfig file to disk: "/etc/kubernetes/scheduler.conf"
[apiclient] Created API client, waiting for the control plane to become ready
這個時候就比較抓瞎,沒有更多有價值的log輸出。這時候可以使用
journalctl -xeu kubelet
打印出log。
如果有如下錯誤log, 說明kubelet的driver設(shè)置的不對。
cgroup driver: "systemd" is different from docker cgroup driver: "cgroupfs"
設(shè)置 /etc/systemd/system/kubelet.service.d/10-kubeadm.conf 里的
--cgroup-driver=cgroupfs
保存后,執(zhí)行systemctl daemon-reload 讓配置生效。
再執(zhí)行kubeadm init,成功完成。
使master節(jié)點(diǎn)可以調(diào)度pod
默認(rèn)情況下,master節(jié)點(diǎn)不能被調(diào)度啟動pod,如果需要將master節(jié)點(diǎn)加入到調(diào)度中,需要執(zhí)行以下命令:
kubectl taint nodes --all node-role.kubernetes.io/master-
配置pod網(wǎng)絡(luò)插件
K8s支持以下多種網(wǎng)絡(luò)插件。在master節(jié)點(diǎn)使用 kubectl apply -f 配置網(wǎng)絡(luò)插件。

以Weave net插件為例,可以通過如下命令配置:
kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"
驗(yàn)證是否添加成功可以執(zhí)行:
kubectl get pods --all-namespaces
如下圖,可以看到,weave相關(guān)已經(jīng)成功創(chuàng)建并拉起。

給集群加入節(jié)點(diǎn)
master初始化完成后,可以向此K8s集群增加node節(jié)點(diǎn)。一條簡單的join命令即可完成。
登錄到node節(jié)點(diǎn),執(zhí)行:
kubeadm join --token <token> <master-ip>:<master-port>
其中token可以在master節(jié)點(diǎn)執(zhí)行 kubeadm token list 查看, 另外默認(rèn)的master-port一般是6443.

此處有坑3
根據(jù)官方文檔,執(zhí)行完此語句后,在master節(jié)點(diǎn)上通過 kubeadm get nodes 就可以查看到已經(jīng)將node節(jié)點(diǎn)加入集群。但是在實(shí)際操作中,發(fā)現(xiàn)在node節(jié)點(diǎn)上執(zhí)行join語句成功,但是在master節(jié)點(diǎn)上看不到新增的node節(jié)點(diǎn)。
在node節(jié)點(diǎn)上查看kubelet, 發(fā)現(xiàn)kubelet沒有啟動。在node節(jié)點(diǎn)上執(zhí)行 journalctl -xeu kubelet 看到和master節(jié)點(diǎn)之前一樣的問題,cgroup driver不一致。經(jīng)過相同的解決方法,成功將node節(jié)點(diǎn)拉起后,過幾秒鐘在master節(jié)點(diǎn)上查看,已經(jīng)能夠顯示新增的節(jié)點(diǎn)了。
部署簡單的K8s集群完成。