K8S脉络整理(004)-K8S-Cluster部署
官方安装文档可以参考 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
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 命令的自动补全功能。
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
查看节点的状态。
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
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 具体情况,比如:
kubectl describe pod calico-node-4gm72 --namespace=kube-system
所有的节点都已经 Ready后
,Kubernetes Cluster 创建成功,一切准备就绪。