kubeadm 安装 k8s 集群(国内网络)

一、前期准备

阿里云购买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 < /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 指令的死循环(这里暂时先不管它):

kubeadm 安装 k8s 集群(国内网络)_第1张图片

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 集群(国内网络)_第2张图片

使用 kubeadm 启动 k8s 集群

正常来说我们使用 kubeadm init来初始化启动一个集群就可以了,但是由于初始化过程中需要请求k8s.gcr.io下载镜像,可是国内的网络环境,呃...
所以我们这里采用把相关镜像手动下载下来的方法规避这个问题,下载完后再kubeadm init,由于本地已经有了相关镜像,所以就不会再请求k8s.gcr.io了。

查看需要哪些镜像:kubeadm config images list

kubeadm 安装 k8s 集群(国内网络)_第3张图片

这里我们可以到 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

相关实操:
批量下载后,我们可以看到corednsmirrorgooglecontainers是没有的

kubeadm 安装 k8s 集群(国内网络)_第4张图片

手动从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 安装 k8s 集群(国内网络)_第5张图片

kubeadm 安装 k8s 集群(国内网络)_第6张图片

kubeadm 安装 k8s 集群(国内网络)_第7张图片

执行 kubeadm init 启动集群

kubeadm 安装 k8s 集群(国内网络)_第8张图片

我这里出现了图中两个问题

第1个:看官方文档的说明,我们这里忽略不管

第2个:解决方法如下

cat <  /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了

kubeadm 安装 k8s 集群(国内网络)_第9张图片

kubeadm 安装 k8s 集群(国内网络)_第10张图片

三、部署 Kubernetes 的 Worker 节点

相比之下,部署 Worker 节点反而是最简单的,只需要两步:
第一步:执行 安装 kubeadm、kubelet、kubectl & docker 的所有步骤
第二步:执行部署 Master 节点时生成的 kubeadm join 指令,我这里如下:

kubeadm 安装 k8s 集群(国内网络)_第11张图片

四、检查集群状态

我在 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 我们可以看到是因为我们还没部署网络插件

kubeadm 安装 k8s 集群(国内网络)_第12张图片

kubeadm 安装 k8s 集群(国内网络)_第13张图片

部署网络插件

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

kubeadm 安装 k8s 集群(国内网络)_第14张图片

查看后发现还是不行,我们猜测估计又是因为国内网络拉不了镜像的原因了,通过ImagePullBackOff关键字搜索引擎搜索很容易知道怎么排查和解决了。
我们可以用 kubectl describe来查看具体原因

kubectl describe pod -n kube-system weave-net-sf44x
kubeadm 安装 k8s 集群(国内网络)_第15张图片

可以看出来我这里的原因是之前批量下载的镜像忘记重命名了,哎,尴尬。按照前面的命令重命名即可。


这里相信有强迫症的同学看着那个很不爽了,我们可以通过kubectl label node来设置ROLES

kubeadm 安装 k8s 集群(国内网络)_第16张图片

参考链接:https://stackoverflow.com/questions/48854905/how-to-add-roles-to-nodes-in-kubernetes

你可能感兴趣的:(kubeadm 安装 k8s 集群(国内网络))