第4篇:Ubuntu16.4环境下使用kubeadm安装kubernetes集群

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,发现所有的节点都已经准备好了。

发布了47 篇原创文章 · 获赞 0 · 访问量 1166

猜你喜欢

转载自blog.csdn.net/weixin_43103748/article/details/104745337