官方安装文档可以参考 https://kubernetes.io/docs/setup/independent/install-kubeadm/.
使用Kubespray在ubuntu上自动部署K8s1.9.0集群:http://www.cnblogs.com/DaweiJ/p/8462848.html
CloudMan的blog:http://www.cnblogs.com/CloudMan6/p/8269620.html
使用kubespary自动部署概要步骤:
若可FQFQ,可直接下载gcr.io/google_containers/相关镜像25个。
不FQ部署步骤详见:http://www.cnblogs.com/DaweiJ/p/8462848.html
概要如下
1、安装最新ansible
2、下载kubespary
3、安装docker及其他依赖包
4、下载镜像
5、修改ansible相关配置,inventory文件
6、安装
ansible-playbook -i inventory/inventory.cfg cluster.yml
7、troubles shooting
8、集群扩展
一般部署概要步骤:
一、Master安装
1、安装 Docker
所有节点都需要安装 Docker。
apt-get update && apt-get install docker.io
2、安装 kubelet、kubeadm 和 kubectl
在所有节点上安装 kubelet、kubeadm 和 kubectl。
kubelet 运行在 Cluster 所有节点上,负责启动 Pod 和容器。
kubeadm 用于初始化 Cluster。
kubectl 是 Kubernetes 命令行工具。通过 kubectl 可以部署和管理应用,查看各种资源,创建、删除和更新各种组件。
apt-get update && apt-get install -y apt-transport-httpscurl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -cat <<EOF >/etc/apt/sources.list.d/kubernetes.listdeb http://apt.kubernetes.io/ kubernetes-xenial mainEOFapt-get updateapt-get install -y kubelet kubeadm kubectl
用 kubeadm 创建 Cluster
完整的官方文档可以参考 https://kubernetes.io/docs/setup/independent/create-cluster-kubeadm/
初始化 Master
在 Master 上执行如下命令:
kubeadm init --apiserver-advertise-address 192.168.56.105 --pod-network-cidr=10.244.0.0/16
--apiserver-advertise-address
指明用 Master 的哪个 interface 与 Cluster 的其他节点通信。如果 Master 有多个 interface,建议明确指定,如果不指定,kubeadm 会自动选择有默认网关的 interface。
--pod-network-cidr
指定 Pod 网络的范围。Kubernetes 支持多种网络方案,而且不同网络方案对 --pod-network-cidr
有自己的要求,这里设置为 10.244.0.0/16
是因为我们将使用 flannel 网络方案,必须设置成这个 CIDR。在后面的实践中我们会切换到其他网络方案,比如 Canal。
初始化过程简要如下:
① kubeadm 执行初始化前的检查。
② 生成 token 和证书。
③ 生成 KubeConfig 文件,kubelet 需要这个文件与 Master 通信。
④ 安装 Master 组件,会从 goolge 的 Registry 下载组件的 Docker 镜像,这一步可能会花一些时间,主要取决于网络质量。
⑤ 安装附加组件 kube-proxy 和 kube-dns。
⑥ Kubernetes Master 初始化成功。
⑦ 提示如何配置 kubectl,后面会实践。
⑧ 提示如何安装 Pod 网络,后面会实践。
⑨ 提示如何注册其他节点到 Cluster,后面会实践。
配置 kubectl
kubectl 是管理 Kubernetes Cluster 的命令行工具,前面我们已经在所有的节点安装了 kubectl。Master 初始化完成后需要做一些配置工作,然后 kubectl 就能使用了。
依照 kubeadm init
输出的第 ⑦ 步提示,推荐用 Linux 普通用户执行 kubectl(root 会有一些问题)。
我们为 daweij 用户配置 kubectl: ubuntu用户默认不创建HOME,参考:http://www.cnblogs.com/DaweiJ/p/8522092.html
useradd -r -m -s /bin/bash daweij
passwd daweij
chmod 770 /etc/sudoers
vim /etc/sudoers
然后添加:
daweij ALL=(ALL:ALL) ALL
chmod 440 /etc/sudoers
1
2
3
4
|
su
- daweij
mkdir
-p $HOME/.kube
sudo
cp
-i
/etc/kubernetes/admin
.conf $HOME/.kube
/config
sudo
chown
$(
id
-u):$(
id
-g) $HOME/.kube
/config
|
为了使用更便捷,启用 kubectl 命令的自动补全功能。
1
|
echo
"source <(kubectl completion bash)"
>> ~/.bashrc
|
这样 ubuntu 用户就可以使用 kubectl 了。
安装 Pod 网络
要让 Kubernetes Cluster 能够工作,必须安装 Pod 网络,否则 Pod 之间无法通信。
Kubernetes 支持多种网络方案,这里我们先使用 flannel,后面还会讨论 Canal。
执行如下命令部署 flannel:
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
二、Node安装
添加 k8s-node1 和 k8s-node2
在 k8s-node1 和 k8s-node2 上分别执行如下命令,将其注册到 Cluster 中:
kubeadm join --token d38a01.13653e584ccc1980 192.168.56.105:6443
这里的 --token
来自前面 kubeadm init
输出的第 ⑨ 步提示,如果当时没有记录下来可以通过 kubeadm token list
查看。
根据提示,我们可以通过 kubectl get nodes
查看节点的状态。
1
2
3
4
5
6
7
|
kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready master 33d v1.9.0+coreos.0
node1 Ready node 33d v1.9.0+coreos.0
node2 Ready node 33d v1.9.0+coreos.0
node3 Ready node 33d v1.9.0+coreos.0
node4 Ready master,node 33d v1.9.0+coreos.0
|
目前所有节点都是 NotReady
,这是因为每个节点都需要启动若干组件,这些组件都是在 Pod 中运行,需要首先从 google 下载镜像,我们可以通过如下命令查看 Pod 的状态:
kubectl get pod --all-namespaces
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
root@master:~
/kubespray
# kubectl get pod --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
default kubernetes-bootcamp-5d7f968ccb-c57nw 1
/1
Running 0 2h
default kubernetes-bootcamp-5d7f968ccb-lv24f 1
/1
Running 0 2h
kube-system calico-node-4gm72 1
/1
Running 52 33d
kube-system calico-node-8fkfk 1
/1
Running 0 33d
kube-system calico-node-fqdwj 1
/1
Running 53 33d
kube-system calico-node-lpdtx 1
/1
Running 47 33d
kube-system calico-node-nq8l2 1
/1
Running 42 33d
kube-system kube-apiserver-master 1
/1
Running 0 33d
kube-system kube-apiserver-node4 1
/1
Running 224 18d
kube-system kube-controller-manager-master 1
/1
Running 0 33d
kube-system kube-controller-manager-node4 1
/1
Running 5 18d
kube-system kube-dns-79d99cdcd5-6vvrw 3
/3
Running 0 18d
kube-system kube-dns-79d99cdcd5-rkpf2 3
/3
Running 0 18d
kube-system kube-proxy-master 1
/1
Running 0 33d
kube-system kube-proxy-node1 1
/1
Running 0 32d
kube-system kube-proxy-node2 1
/1
Running 0 18d
kube-system kube-proxy-node3 1
/1
Running 0 32d
kube-system kube-proxy-node4 1
/1
Running 0 18d
kube-system kube-scheduler-master 1
/1
Running 0 33d
kube-system kube-scheduler-node4 1
/1
Running 3 18d
kube-system kubedns-autoscaler-5564b5585f-7z62x 1
/1
Running 0 18d
kube-system kubernetes-dashboard-6bbb86ffc4-zmmc2 1
/1
Running 0 18d
kube-system nginx-proxy-node1 1
/1
Running 0 32d
kube-system nginx-proxy-node2 1
/1
Running 0 18d
kube-system nginx-proxy-node3 1
/1
Running 0 32d
|
Pending
、ContainerCreating
、ImagePullBackOff
都表明 Pod 没有就绪,Running
才是就绪状态。我们可以通过 kubectl describe pod <Pod Name>
查看 Pod 具体情况,比如:
1
|
kubectl describe pod calico-node-4gm72 --namespace=kube-system
|
所有的节点都已经 Ready后
,Kubernetes Cluster 创建成功,一切准备就绪。