1、环境准备
准备3台虚拟机,信息如下:
192.168.0.105 作为master节点
192.168.0.106 作为node1节点
192.168.0.107 作为node2节点
三台虚拟机均安装好docker环境,安装docker的操作在此不做详细介绍。
2、安装master节点
2.1 关闭防火墙
主要是防止master和node之间、master和客户端之间通信阻止。
// 关闭防火墙
sudo ufw disable
2.2 关闭swap并重新加载配置
因为k8s调度需要计算机器容量,因此关闭交换内存,减少计算误差,另外,启动kubelet时如果未关闭,也会报错。
sudo swapoff -a
sudo sysctl -p
sudo sysctl --system
修改fstab,防止机器重启又自动打开swap,导致无法重新加入集群
vim /etc/fstab
注释掉swap盘挂载的一行,保存退出。
2.3 设置机器名
用于在集群中显示,以便分辨机器
sudo hostnamectl set-hostname 主机名
2.4 安装kubeadm、kubectl、kubelet
apt-get update
# add aliyun resource
curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg| apt-key add -
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
apt-get update
更新资源库之后就可以直接安装了,但是默认安装的是最新版本,如果需要安装指定版本的(例如只有1.17.1的整套镜像,就需要选择安装对应1.17.1的客户端) 。
# default install latest version
apt-get install -y kubelet kubeadm kubectl
NOTICE:
# list available version
apt-cache madison kubectl
apt-cache madison kubeadm
apt-cache madison kubelet
# spec version to install
apt-get install -y kubelet=<version> kubeadm kubectl=<version>
2.5 安装docker
具体安装操作流程请自己百度吧,在此只写一些建议:
**墙裂建议:**修改docker的默认存储位置(具体方式参考上链接),以防以后空间不足报,因为k8s是依赖docker创建容器的,以后pods创建数量过大会直接导致硬盘不足,整个集群面临瘫痪的风险,而且遇到问题之后再修改docker存储,会导致已有的镜像、容器丢失,如果是主节点,可能就要重新部署集群了。
如果需要让非root用户可使用docker命令,则参考一下两步;如果本身就是root用户,则不需要。
2.6 拉取k8s的基础镜像
将一下内容保存为download.sh,上传到master/node机器上,执行 sudo chmod ugo+x ./download.sh赋予权限。
直接执行./download.sh即可。
注意:镜像版本需要和kubectl客户端一致,如果不知道,执行kubectl version查看client部分即可。由于当前的kubectl的版本是1.17.1,所以镜像选的是1.17.1版本。
#!/bin/bash
images=(kube-proxy:v1.17.1 kube-scheduler:v1.17.1 kube-controller-manager:v1.17.1 kube-apiserver:v1.17.1 etcd:3.4.3-0 coredns:1.6.5 pause:3.1 )
for imageName in ${images[@]} ; do
docker pull registry.aliyuncs.com/google_containers/$imageName
docker tag registry.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageName
docker rmi registry.aliyuncs.com/google_containers/$imageName
done
2.7 初始化master节点
初始化的过程中会用到上一步下载好的镜像。
指定网卡监听apiserver
kubeadm init --kubernetes-version=v1.17.1 --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=192.168.0.105 --apiserver-bind-port=6443
#192.168.0.105是master节点的ip地址,--apiserver-advertise-address指明用master的哪个interface与Cluster的其他节点通信。如果有多个interface,建议明确指定,如果不指定,kubeadm会自动选择默认网关的interface。
#--pod-network-cidr指定Pod网络的范围。Kubernetes支持多种网络方案,而且不同网络方案对 --pod-network-cidr有自己的要求,这里设置为10.244.0.0/16是因为我们将使用flannel网络方案,必须设置成这个CIDR。
初始化的大概流程:
(1)kubeadm执行初始化前的检查。
(2)生成token和证书
(3)生成KubeConfig文件,kubelet需要用这个文件与Master通信
(4)安装Master组件,如果本地没有那些镜像,会从Google的Registry下载组件的Docker镜像。
(5)安装附加组件kube-proxy和kube-dns
(6) Kubernetes Master初始化成功
(7)提示如何配置kubectl
(8) 提示如何安装Pod网络
(9)提示如何注册其他节点到Cluster
返回成功后,执行以下操作来配置kubectl,如果跳过可能导致下一步创建flannel pod证书不受信。
依据kubeadm init输出的第7步提示,推荐Linux普通用户执行kubectl(root会有一些问题)
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
此时 获取node状态,会是NotReady,describe node会发现,是因为网络配置未完成。
kubectl get nodes
2.8 master初始化完成之后,创建网络层pod
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
2.9 master上的kubelet加到系统服务 ,在kubeadm init之后,此服务状态才会是Active
systemctl enable kubelet
3、node节点安装
3.1 关闭防火墙
主要是防止master和node之间、master和客户端之间通信阻止。
// 关闭防火墙
sudo ufw disable
3.2 关闭swap并重新加载配置
因为k8s调度需要计算机器容量,因此关闭交换内存,减少计算误差,另外,启动kubelet时如果未关闭,也会报错。
sudo swapoff -a
sudo sysctl -p
sudo sysctl --system
修改fstab,防止机器重启又自动打开swap,导致无法重新加入集群
vim /etc/fstab
注释掉swap盘挂载的一行,保存退出。
3.3 设置机器名
用于在集群中显示,以便分辨机器
sudo hostnamectl set-hostname 主机名
3.4 安装kubeadm、kubectl、kubelet
apt-get update
# add aliyun resource
curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg| apt-key add -
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
apt-get update
更新资源库之后就可以直接安装了,但是默认安装的是最新版本,如果需要安装指定版本的(例如只有1.17.1的整套镜像,就需要选择安装对应1.17.1的客户端) 。
# default install latest version
apt-get install -y kubelet kubeadm kubectl
NOTICE:
# list available version
apt-cache madison kubectl
apt-cache madison kubeadm
apt-cache madison kubelet
# spec version to install
apt-get install -y kubelet=<version> kubeadm kubectl=<version>
在安装kubelet、kubeadm、kubectl之前,最好先确认master上其他node的version,之前我们选择的是v1.17.1
#查询已有哪些版本可以安装
apt-cache madison kubectl
指定版本安装命令:
apt-get install kubelet=1.17.1-00
apt-get install kubeadm=1.17.1-00
apt-get install kubectl=1.17.1-00
3.5 安装docker
具体安装操作流程请自己百度吧,在此只写一些建议:
**墙裂建议:**修改docker的默认存储位置(具体方式参考上链接),以防以后空间不足报,因为k8s是依赖docker创建容器的,以后pods创建数量过大会直接导致硬盘不足,整个集群面临瘫痪的风险,而且遇到问题之后再修改docker存储,会导致已有的镜像、容器丢失,如果是主节点,可能就要重新部署集群了。
如果需要让非root用户可使用docker命令,则参考一下两步;如果本身就是root用户,则不需要。
3.6 拉取k8s的基础镜像
将一下内容保存为download.sh,上传到master/node机器上,执行 sudo chmod ugo+x ./download.sh赋予权限。
直接执行./download.sh即可。
注意:镜像版本需要和kubectl客户端一致,如果不知道,执行kubectl version查看client部分即可。由于当前的kubectl的版本是1.17.1,所以镜像选的是1.17.1版本。
#!/bin/bash
images=(kube-proxy:v1.17.1 kube-scheduler:v1.17.1 kube-controller-manager:v1.17.1 kube-apiserver:v1.17.1 etcd:3.4.3-0 coredns:1.6.5 pause:3.1 )
for imageName in ${images[@]} ; do
docker pull registry.aliyuncs.com/google_containers/$imageName
docker tag registry.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageName
docker rmi registry.aliyuncs.com/google_containers/$imageName
done
3.7 node部分创建并加入集群
执行格式是由创建master成功后返回的。
sudo su - root
kubeadm join 192.168.0.105:6443 --token wc52ln.zxwjd0qvb5nivh1y --discovery-token-ca-cert-hash sha256:c87435f9d3f44ffd1ff013a4c8bd865f146370f518d98095c7690a744bb62d30
这里的–token来自Master节点kubeadm init输出的第9步提示,如果当时没有记录下来,可以通过kubeadm token list查看,如下图:
如果已经失效(默认24小时就消失了),则在master上创建一个新的:
kubeadm token create
然后再执行 token list即可。
查询哈希值,在master上执行:
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
可以返回哈希值,两部分拼到一起即可。
在master节点查看nodes:kubectl get nodes 如下图:
xxx@VirtualBox-01:/etc/resolvconf/resolv.conf.d$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
virtualbox-01 Ready master 23h v1.17.1
virtualbox-02 Ready <none> 25m v1.17.1
virtualbox-03 Ready <none> 8m18s v1.17.1
设置节点角色为node:
kubectl label nodes virtualbox-02 node-role.kubernetes.io/node=
kubectl label nodes virtualbox-03 node-role.kubernetes.io/node=
再次查看如下图:
mengqp@mengqp-VirtualBox-01:/etc/resolvconf/resolv.conf.d$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
mengqp-virtualbox-01 Ready master 23h v1.17.1
mengqp-virtualbox-02 Ready node 25m v1.17.1
mengqp-virtualbox-03 Ready node 8m57s v1.17.1
3.8 将kubelet加到系统服务
systemctl enable kubelet
4、常见问题
4.1 节点状态为NotReady
通过kubectl get nodes查看节点的状态,均显示NotReady
目前所有的节点都是NotReady,这是因为每个节点都需要启动若干组件,这些组件都是在pod中运行,需要
首先从Coogle下载镜像。我们可以通过如下命令查看Pod的状态:
kubectl get pod --all-namespaces
Pending、ContainerCreating、ImagePullBackOff都表明Pod没有就绪,Running才是就绪状态。我们可以通过kubectl describe pod Pod Name 查看pod的具体情况,比如:
kubectl describe pod kube-flannel-ds-v0p3x --namespace=kube-system
结果如下所示:
从上图截取命令输出的最后部分,可以看到在下载image时失败,如果网络质量不好,这种情况是很常见的。
我们可以耐心等待,因为Kubernetes会重试,我们也可以自己手动执行docker pull 去下载这个镜像。
等待一段时间,image成功下载后,所有Pod都会处于Running状态,这时再看各个node,发现所有的节点都已经准备好了。