Kubernetes系列之一:在Ubuntu上快速搭建一个集群Demo
简介
K8s集群部署有三种方式:Kubeadm、minikube和二进制包,本文直接使用kubeadm来部署
描述
本文只使用两台虚拟机,一台是Master节点,一台是Node节点。虚拟机的IP,如下命令查到
ifconfig
准备工作
第一步:一定要改每台虚拟机的主机名,进入系统设置
选择Detail,进入Overview,直接修改DeviceName,Master节点和Node节点都需要改,而且不能重名。
主机名 | IP |
ubuntu-master | 192.168.29.137 |
kube-slave | 192.168.29.136 |
第二步(可选):配置主机名映射,Master节点和Node节点都需要配置,如下图,如果hostname 文件是readonly的话,可以使用
sudo chmod 777 /etc/hostname
然后把主机名和IP加入到hostname中。
cat /etc/hostname
第三步: 在所有节点上安装kubeadm,这里使用阿里云的系统和kubernetes的源。
$ cat /etc/apt/sources.list
# 系统安装源
deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted
deb http://mirrors.aliyun.com/ubuntu/ xenial universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates universe
deb http://mirrors.aliyun.com/ubuntu/ xenial multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
# kubeadm及kubernetes组件安装源
deb https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial main
更新源并安装kubeadm, kubectl, kubelet软件包
apt-get update -y && apt-get install -y kubelet kubeadm kubectl --allow-unauthenticated
安装docker,当前kubeadm不支持docker.ce
apt-get install docker.io -y
使用kubeadmin初始化master节点
这个下载镜像的过程涉及*,因为会从gcr的站点下载容器镜像,这里一定要连接VPN,不然初始化不成功, 这里要指定apiserver-advertise-address
kubeadm init --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=192.168.29.137
执行的时候却报了一个错,如下图
提示说需要disable swap,因为Kubernetes v1.8+ 要求关闭系统 Swap,修改/etc/fstab 文件,它永久性地关闭swap space, 只需在下面两行前面加上(#),然后重启虚拟机。或者直接运行sudo swapoff -a
如果还出错,执行下面命令之后,再执行kubeadm init
kubeadm reset
直到看到下面的图片,就表示执行成功了,如下图:
执行如下命令来配置kubectl
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
这样master的节点就配置好了,并且可以使用kubectl来进行各种操作了,根据上面的提示接着往下做,需要安装一个网络插件
然后再将slave节点加入到集群。
安装一个网络插件canal
从canal官方文档参考,如下网址下载2个文件并且安装,其中一个是配置canal的RBAC权限,一个是部署canal的DaemonSet。但笔者是从这里(Installing a pod network add-on)参考的,根据kubeadm init时用到的--pod-network-cidr=10.244.0.0/16,所以选择了canal.
执行以上两条命令:
kubectl apply -f https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/hosted/canal/rbac.yaml
clusterrole.rbac.authorization.k8s.io "calico" created
clusterrole.rbac.authorization.k8s.io "flannel" created
clusterrolebinding.rbac.authorization.k8s.io "canal-flannel" created
clusterrolebinding.rbac.authorization.k8s.io "canal-calico" created
kubectl apply -f https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/hosted/canal/canal.yaml
configmap "canal-config" created
daemonset.extensions "canal" created
customresourcedefinition.apiextensions.k8s.io "felixconfigurations.crd.projectcalico.org" created
customresourcedefinition.apiextensions.k8s.io "bgpconfigurations.crd.projectcalico.org" created
customresourcedefinition.apiextensions.k8s.io "ippools.crd.projectcalico.org" created
customresourcedefinition.apiextensions.k8s.io "clusterinformations.crd.projectcalico.org" created
customresourcedefinition.apiextensions.k8s.io "globalnetworkpolicies.crd.projectcalico.org" created
customresourcedefinition.apiextensions.k8s.io "networkpolicies.crd.projectcalico.org" created
serviceaccount "canal" created
执行如下命令,可以就可以查看canal的安装状态了
aaa@qq.com:/home/cong# kubectl get pod -n kube-system -o wide
NAME READY STATUS RESTARTS AGE IP NODE
canal-66gd7 3/3 NodeLost 0 16h 192.168.29.136 ubuntu
canal-9j4pj 3/3 Running 0 16h 192.168.29.137 ubuntu-master
canal-smjbw 3/3 Running 0 16h 192.168.29.136 kube-slave
coredns-78fcdf6894-jcswx 1/1 Running 0 16h 10.244.0.6 ubuntu-master
coredns-78fcdf6894-k9qxw 1/1 Running 0 16h 10.244.0.7 ubuntu-master
etcd-ubuntu-master 1/1 Running 0 16h 192.168.29.137 ubuntu-master
kube-apiserver-ubuntu-master 1/1 Running 0 16h 192.168.29.137 ubuntu-master
kube-controller-manager-ubuntu-master 1/1 Running 0 16h 192.168.29.137 ubuntu-master
kube-proxy-95v7c 1/1 Running 0 16h 192.168.29.137 ubuntu-master
kube-proxy-h2gl7 1/1 Running 0 16h 192.168.29.136 kube-slave
kube-proxy-vzhzw 1/1 NodeLost 0 16h 192.168.29.136 ubuntu
kube-scheduler-ubuntu-master 1/1 Running 0 16h 192.168.29.137 ubuntu-master
Slave节点加入集群
打开另一台虚拟机,执行如下命令,就可以这台Node节点的机器加入到集群中。
kubeadm join 192.168.29.137:6443 --token aoanr5.geidnr74gvp5xrlc --discovery-token-ca-cert-hash sha256:beb198cf8a70ff17c96b387b06de16d6973f9b8cacb1a8e1586b52ff5f84db0c
这时他会报个错,如下图:
可以从图中看出,是因为少了一些kernel moudules,我们依次运行:
modprobe ip_vs
modprobe ip_vs_rr
modprobe ip_vs_wrr
modprobe ip_vs_sh
modprobe nf_conntrack_ipv4
如果还遇到swap的问题,可以运行sudo swapoff -a,然后再运行上面的kubeadm join的代码,最后就执行成功了,如下图:
在Master 上运行kube get nodes, 结果如下:
aaa@qq.com:/home/cong# kubectl get nodes
NAME STATUS ROLES AGE VERSION
kube-slave Ready <none> 16h v1.11.1
ubuntu-master Ready master 17h v1.11.1
大功告成,加油!