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