一、前期准备
阿里云购买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
![](https://img.haomeiwen.com/i3515296/8d33938d865b7877.png)
图中我们看到
localhost:8080 was refused
是因为k8s集群压根还没起来且一些加密访问的东西还没处理,使用systemctl status kubelet
可以看到此时kubelet处于每隔几秒就会重启,因为它陷入了一个等待 kubeadm 指令的死循环(这里暂时先不管它):
![](https://img.haomeiwen.com/i3515296/f7c391ba3852a658.png)
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
![](https://img.haomeiwen.com/i3515296/05e6e3a2bd3d9b68.png)
使用 kubeadm 启动 k8s 集群
正常来说我们使用 kubeadm init
来初始化启动一个集群就可以了,但是由于初始化过程中需要请求k8s.gcr.io
下载镜像,可是国内的网络环境,呃...
所以我们这里采用把相关镜像手动下载下来的方法规避这个问题,下载完后再kubeadm init
,由于本地已经有了相关镜像,所以就不会再请求k8s.gcr.io
了。
查看需要哪些镜像:kubeadm config images list
![](https://img.haomeiwen.com/i3515296/4cccc46b2b3cb2d2.png)
这里我们可以到 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
是没有的
![](https://img.haomeiwen.com/i3515296/7ac9ca3079c18cee.png)
手动从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
![](https://img.haomeiwen.com/i3515296/b43156777416b67f.png)
![](https://img.haomeiwen.com/i3515296/e276f0287ee34514.png)
![](https://img.haomeiwen.com/i3515296/0b4e0314660d4561.png)
执行 kubeadm init
启动集群
![](https://img.haomeiwen.com/i3515296/d5aba3f9c30aff6f.png)
我这里出现了图中两个问题
第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了
![](https://img.haomeiwen.com/i3515296/c209262fc1b7dfce.png)
![](https://img.haomeiwen.com/i3515296/3d53d1ea5f593677.png)
三、部署 Kubernetes 的 Worker 节点
相比之下,部署 Worker 节点反而是最简单的,只需要两步:
第一步:执行 安装 kubeadm、kubelet、kubectl & docker 的所有步骤
第二步:执行部署 Master 节点时生成的 kubeadm join
指令,我这里如下:
![](https://img.haomeiwen.com/i3515296/af3146395cb9f77f.png)
四、检查集群状态
我在 k8s-study001
(master节点) 上执行 kubectl get nodes
![](https://img.haomeiwen.com/i3515296/1260f3720a6e69d0.png)
这里是因为 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
然后就可以了
![](https://img.haomeiwen.com/i3515296/5dcc9fc3d31048ee.png)
我在 k8s-study002
(worker节点) 上执行 kubectl get nodes
![](https://img.haomeiwen.com/i3515296/4237913641a0e9db.png)
原因可想而知和上面是一样的,缺少认证文件,所以我们要先将
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
,嘿嘿,完美
![](https://img.haomeiwen.com/i3515296/3c8cf6f58c1baac8.png)
上图中我们可以看到两个节点的 STATUS 都为 NotReady
通过 kubectl describe node k8s-study001
或者 systemctl status kubelet
我们可以看到是因为我们还没部署网络插件
![](https://img.haomeiwen.com/i3515296/de1c154216474a29.png)
![](https://img.haomeiwen.com/i3515296/4f024719df11fe71.png)
部署网络插件
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
![](https://img.haomeiwen.com/i3515296/485287ffa48dc4db.png)
查看后发现还是不行,我们猜测估计又是因为国内网络拉不了镜像的原因了,通过
ImagePullBackOff
关键字搜索引擎搜索很容易知道怎么排查和解决了。我们可以用
kubectl describe
来查看具体原因
kubectl describe pod -n kube-system weave-net-sf44x
![](https://img.haomeiwen.com/i3515296/98d5e0518b3f915d.png)
可以看出来我这里的原因是之前批量下载的镜像忘记重命名了,哎,尴尬。按照前面的命令重命名即可。
![](https://img.haomeiwen.com/i3515296/2c9b49460da6759f.png)
这里相信有强迫症的同学看着那个<none>
很不爽了,我们可以通过kubectl label node
来设置ROLES
![](https://img.haomeiwen.com/i3515296/a289c67eec75140b.png)
参考链接:https://stackoverflow.com/questions/48854905/how-to-add-roles-to-nodes-in-kubernetes
网友评论