一、前期准备
阿里云购买2台ECS,CentOS7.6,2核4G
- 不建议在本地机器用虚拟机去搞,会有费力不讨好的问题。现在公有云服务都有按量付费的机器,我上面这个每台1小时才2.5毛钱,100块也够折腾一阵儿了。
- 官方文档
安装 kubeadm、kubelet、kubectl :https://kubernetes.io/zh/docs/setup/independent/install-kubeadm/
安装 docker :https://docs.docker.com/install/linux/docker-ce/centos/- 下列操作均在
root
用户下,2台机器在示例中的名次分别为k8s-study001
(用作master节点)、k8s-study002
(用作worker节点)- 参考链接:https://blog.csdn.net/bbwangj/article/details/85017765
二、部署 Kubernetes 的 Master 节点
安装 kubeadm、kubelet、kubectl & docker
1. 安装 kubeadm、kubelet、kubectl
阿里云k8s镜像仓库:https://mirrors.aliyun.com/kubernetes/
# 添加 k8s 源仓库(已替换为阿里云镜像)
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
exclude=kube*
EOF
# 将 SELinux 设置为 permissive 模式(将其禁用)
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
# 安装
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
# 添加开机启动并启动
systemctl enable kubelet && systemctl start kubelet
#查看版本(验证是否安装成功)
kubectl version
图中我们看到
localhost:8080 was refused
是因为k8s集群压根还没起来且一些加密访问的东西还没处理,使用systemctl status kubelet
可以看到此时kubelet处于每隔几秒就会重启,因为它陷入了一个等待 kubeadm 指令的死循环(这里暂时先不管它):
2. 安装 docker
# 安装依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2
# 添加 docker 源仓库
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 安装
yum -y install docker-ce docker-ce-cli containerd.io
# 启动
systemctl start docker
# 添加开机启动
systemctl enable docker
# 查看版本(验证是否安装成功)
docker version
使用 kubeadm 启动 k8s 集群
正常来说我们使用 kubeadm init
来初始化启动一个集群就可以了,但是由于初始化过程中需要请求k8s.gcr.io
下载镜像,可是国内的网络环境,呃...
所以我们这里采用把相关镜像手动下载下来的方法规避这个问题,下载完后再kubeadm init
,由于本地已经有了相关镜像,所以就不会再请求k8s.gcr.io
了。
查看需要哪些镜像:kubeadm config images list
这里我们可以到 https://hub.docker.com/r/mirrorgooglecontainers 上查找并 pull
相关镜像,由于一个一个太麻烦了,所以我们可以批量下载及重命名镜像,如下:
# 批量下载
kubeadm config images list |sed -e 's/^/docker pull /g' -e 's#k8s.gcr.io#docker.io/mirrorgooglecontainers#g' |sh -x
# 批量重命名镜像
docker images |grep mirrorgooglecontainers |awk '{print "docker tag ",$1":"$2,$1":"$2}' |sed -e 's#mirrorgooglecontainers#k8s.gcr.io#2' |sh -x
# 删除 mirrorgooglecontainers 的镜像
docker images |grep mirrorgooglecontainers |awk '{print "docker rmi ", $1":"$2}' |sh -x
相关实操:
批量下载后,我们可以看到coredns
在mirrorgooglecontainers
是没有的
手动从coredns
官方镜像下载 coredns
# 下载镜像
docker pull coredns/coredns:1.3.1
# 重命名镜像
docker tag coredns/coredns:1.3.1 k8s.gcr.io/coredns:1.3.1
# 删除旧的镜像
docker rmi coredns/coredns:1.3.1
执行 kubeadm init
启动集群
我这里出现了图中两个问题
第1个:看官方文档的说明,我们这里忽略不管
第2个:解决方法如下
cat <<EOF > /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF sysctl --system
再执行 kubeadm init
,终终终于OK了
三、部署 Kubernetes 的 Worker 节点
相比之下,部署 Worker 节点反而是最简单的,只需要两步:
第一步:执行 安装 kubeadm、kubelet、kubectl & docker 的所有步骤
第二步:执行部署 Master 节点时生成的 kubeadm join
指令,我这里如下:
四、检查集群状态
我在 k8s-study001
(master节点) 上执行 kubectl get nodes
这里是因为 k8s 集群默认需要加密方式访问,所以这里需要将刚刚部署生成的 k8s 集群的安全配置文件,保存到当前用户的 .kube 目录下,kubectl 默认会使用这个目录下的授权信息访问 k8s 集群,相关命令如下(在
kubeadm init
后其实有提示):
# 普通用户
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# root 用户
export KUBECONFIG=/etc/kubernetes/admin.conf
然后就可以了
我在 k8s-study002
(worker节点) 上执行 kubectl get nodes
原因可想而知和上面是一样的,缺少认证文件,所以我们要先将
k8s-study001
上的认证文件弄到 k8s-study002
上。由于只有一个文件,我这里直接编辑一个新文件然后复制内容过来,大家也可以采用文件传输的方式
vim /etc/kubernetes/admin.conf
然后同样执行下面的命令
# 普通用户
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# root 用户
export KUBECONFIG=/etc/kubernetes/admin.conf
再执行 kubectl get nodes
,嘿嘿,完美
上图中我们可以看到两个节点的 STATUS 都为 NotReady
通过 kubectl describe node k8s-study001
或者 systemctl status kubelet
我们可以看到是因为我们还没部署网络插件
部署网络插件
Weave 官方文档:https://www.weave.works/docs/net/latest/kubernetes/kube-addon/#install
网络插件有很多,这里以 Weave 为例
kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"
# 可能有部分人因为国内网络问题,执行不了上面的命令,可尝试下面的命令
kubectl apply -f https://git.io/weave-kube-1.6
查看后发现还是不行,我们猜测估计又是因为国内网络拉不了镜像的原因了,通过
ImagePullBackOff
关键字搜索引擎搜索很容易知道怎么排查和解决了。我们可以用
kubectl describe
来查看具体原因
kubectl describe pod -n kube-system weave-net-sf44x
可以看出来我这里的原因是之前批量下载的镜像忘记重命名了,哎,尴尬。按照前面的命令重命名即可。
这里相信有强迫症的同学看着那个<none>
很不爽了,我们可以通过kubectl label node
来设置ROLES
参考链接:https://stackoverflow.com/questions/48854905/how-to-add-roles-to-nodes-in-kubernetes