环境准备

准备好几台主机或者虚拟机,然后安装好kubeadm和Docker。

添加kubeadm的源

$ curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
$ cat <<EOF > /etc/apt/sources.list.d/kubernetes.list
deb http://apt.kubernetes.io/ kubernetes-xenial main
EOF
$ apt-get update
$ apt-get install -y docker.io kubeadm

国内可以替换成中科大的源

http://mirrors.ustc.edu.cn/kubernetes/apt

在上述安装 kubeadm 的过程中,kubeadm 和 kubelet、kubectl、kubernetes-cni 这几个二进制文件都会被自动安装好。

部署k8s的Master节点

这里可以配置kubeadm的部署参数,通过指定kubeadm.yaml配置文件

apiVersion: kubeadm.k8s.io/v1alpha1
kind: MasterConfiguration
controllerManagerExtraArgs:
  horizontal-pod-autoscaler-use-rest-clients: "true" #可以水平扩展
  horizontal-pod-autoscaler-sync-period: "10s"
  node-monitor-grace-period: "10s"
apiServerExtraArgs:
  runtime-config: "api/all=true"
kubernetesVersion: "stable-1.11" #k8s版本为1.11

接下来执行一句命令即可完成Master节点的部署

$ kubeadm init --config kubeadm.yaml

部署完成之后,会生成一条指定,这条指令就是Node节点加入集群的命令,这在后面部署worker节点会用到。

kubeadm join 10.168.0.2:6443 --token 00bwbx.uvnaa2ewjflwu1ry --discovery-token-ca-cert-hash sha256:00eb62a2a6020f94132e3fe1ab721349bbcd3e9b94da9654cfe15f2985ebd711

kubeadm还会提示第一次使用kubernetes集群需要的配置命令:

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

将刚刚部署生成的 Kubernetes 集群的安全配置文件,保存到当前用户的.kube 目录下,kubectl 默认会使用这个目录下的授权信息访问 Kubernetes 集群。

然后使用kubectl get命令即可查看节点的状态,当前只有一个master节点

$ kubectl get nodes
 
NAME      STATUS     ROLES     AGE       VERSION
master    NotReady   master    1d        v1.11.1

此节点状态为NotReady,可以使用kubectl describe来查看节点的详细信息、状态和事件。

$ kubectl describe node master
 
...
Conditions:
...
 
Ready   False ... KubeletNotReady  runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized

检查这个节点上各个系统Pod的状态

$ kubectl get pods -n kube-system
 
NAME               READY   STATUS   RESTARTS  AGE
coredns-78fcdf6894-j9s52     0/1    Pending  0     1h
coredns-78fcdf6894-jm4wf     0/1    Pending  0     1h
etcd-master           1/1    Running  0     2s
kube-apiserver-master      1/1    Running  0     1s
kube-controller-manager-master  0/1    Pending  0     1s
kube-proxy-xbd47         1/1    NodeLost  0     1h
kube-scheduler-master      1/1    Running  0     1s

要注意,kube-system是k8s预留的系统Pod的工作空间。

Master节点的网络尚未就绪,部署一下网络插件

$ kubectl apply -f https://git.io/weave-kube-1.6

然后Mater节点就部署完成了。

部署k8s的Worker节点

k8s的Master与Worker几乎是一样的,运行的都是一个kubelet组件,不同的是Master节点会自动运行kube-apiserver,kube-controller-manager,kube-scheduler三个组件。

Worker节点的部署要更加简单,直接运行部署Master节点时生成的命令即可

$ kubeadm join 10.168.0.2:6443 --token 00bwbx.uvnaa2ewjflwu1ry --discovery-token-ca-cert-hash sha256:00eb62a2a6020f94132e3fe1ab721349bbcd3e9b94da9654cfe15f2985ebd711

Taint/Toleration

默认情况下,Master节点是不允许运行用户Pod的,这是由于Taint机制,一旦一个节点被加上了以Taint,那么所有的Pod就不能在这个节点上运行。 查看一下Master节点详细信息,就可以发现Master节点打上了Taint

$ kubectl describe node master
 
Name:               master
Roles:              master
Taints:             node-role.kubernetes.io/master:NoSchedule

因此是不能够运行其它Pod的。

但是其它Pod可以通过声明Toleration来容忍指定的Taint,这样它就可以运行在有Taint的节点上了,例如在Pod的yaml文件中,加上tolerations字段:

apiVersion: v1
kind: Pod
...
spec:
  tolerations:
  - key: "foo"
    operator: "Equal"
    value: "bar"
    effect: "NoSchedule"

上面的配置表示这个Pod可以容忍所有键值对为”foo=bar“的Taint。

可以手动添加或者删除Taint

# 为node1节点打上Taint
$ kubectl taint nodes node1 foo=bar:NoSchedule
# 末尾的键后面的横线表示删除这个键的Taint
$ kubectl taint nodes --all node-role.kubernetes.io/master-

部署存储插件

容器本身是无状态的,但是容器运行产生的一些数据和状态是需要进行存储的。

存储插件会在容器内挂载一个基于网络的或者其它机制的远程数据卷,使得容器内创建的文件,实际上是保存在远端存储服务器上。

这里部署Rook,几条简单的指令就可以将rook部署起来。

$ kubectl apply -f https://raw.githubusercontent.com/rook/rook/master/cluster/examples/kubernetes/ceph/common.yaml
 
$ kubectl apply -f https://raw.githubusercontent.com/rook/rook/master/cluster/examples/kubernetes/ceph/operator.yaml
 
$ kubectl apply -f https://raw.githubusercontent.com/rook/rook/master/cluster/examples/kubernetes/ceph/cluster.yaml

部署完成,Rook项目会将自己的Pod防止再由它自己管理的两个Namespace, rook-ceph-system中:

$ kubectl get pods -n rook-ceph-system
NAME                                  READY     STATUS    RESTARTS   AGE
rook-ceph-agent-7cv62                 1/1       Running   0          15s
rook-ceph-operator-78d498c68c-7fj72   1/1       Running   0          44s
rook-discover-2ctcv                   1/1       Running   0          15s
 
$ kubectl get pods -n rook-ceph
NAME                   READY     STATUS    RESTARTS   AGE
rook-ceph-mon0-kxnzh   1/1       Running   0          13s
rook-ceph-mon1-7dn2t   1/1       Running   0          2s

接下来,k8s项目上创建的所有Pod就能够通过Persistent Volume和Persistent Volume Claim在容器内挂载由Ceph提供的数据卷了。


tags: k8s集群部署