最近由于公司可能使用到k8s,所以自己先学习一下。条件有限,先搭建一个单机版k8s,淦就完事了。

一、配置详情

使用的是阿里云的服务器

  1. CPU:1核
  2. 内存:2g
  3. 系统: CentOS 7.3 64位
  4. docker版本: Docker version 19.03.13

二、环境准备

#关闭防火墙
systemctl stop firewalld

#关闭selinux
setenforce 0

#禁止swap分区
swapoff -a 

#桥接的IPV4流量传递到iptables 的链
cat > /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

sysctl --system #生效

#配置k8s yum源
cat >/etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

三、安装kubeadm,kubelet,kubectl

#安装kubeadm(初始化cluster),kubelet(启动pod)和kubectl(k8s命令工具)
yum install -y kubelet-1.19.4
yum install -y kubeadm-1.19.4
yum install -y kubectl-1.19.4

#设置开机启动并启动kubelet
stemctl enable kubelet && systemctl start kubelet

四、部署Kubernetes Master

#初始化Master
kubeadm init --pod-network-cidr=10.244.0.0/16 --kubernetes-version=v1.19.4 --ignore-preflight-errors=NumCPU --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=101.132.172.64

本来上面这行命令就可以拉取k8s所需镜像然后初始化Master的,但是由于我国不可抗的网络因素,除非设置代理,不然往往会报错Initial timeout of 40s passed

解决办法就是先把k8s所需的镜像先全部从docker阿里云镜像下载下来,然后在修改tag为k8s所需要的的镜像。

#查看k8s所需镜像
kubeadm config images list

在这里插入图片描述
创建k8s.sh脚本,下载所需镜像并更改tag
k8s.sh

#!/bin/bash
images=(
    kube-apiserver:v1.19.4
    kube-controller-manager:v1.19.4
    kube-scheduler:v1.19.4
    kube-proxy:v1.19.4
    pause:3.2
    etcd:3.4.13-0
    coredns:1.7.0
)
for imageName in ${images[@]} ; do
    docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/${imageName}
    docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/${imageName} k8s.gcr.io/${imageName}
    docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/${imageName}
done
#执行脚本
./k8s.sh
#查看镜像是否下载好并改好tag
docker images

在这里插入图片描述
然后再执行初始化Master语句的命令。

按理说应该这样应该就行了,可是还是报了错Initial timeout of 40s passed,这不是逗我吗😠,明明镜像都已经下载下来了,怎么可能还超时。

这个问题困惑了我很久,百思不得其解。

后来看到一篇博客k8s 创建集群时出错"[kubelet-check] Initial timeout of 40s passed" ,里面提到通过--v=6可以看到详细的log,解决问题最好的办法就是查看报错的log 😄

然后我将初始化Master的命令加上了--v=6

#初始化Master
kubeadm init --pod-network-cidr=10.244.0.0/16 --kubernetes-version=v1.19.4 --ignore-preflight-errors=NumCPU --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=101.132.172.64 --v=6

然后发现在log里面一直在打印GET https://101.132.172.64:6443/healthz?timeout=10s in 10000 milliseconds,原来是这里超时了,没懂这是要干嘛,但是我在centos上执行netstat -lnp | grep 6443,好家伙,这个端口都没开启,难怪会说超时.看了启动的命令,我就在--apiserver-advertise-address=101.132.172.64这个时指定了ip,于是直接简单粗暴的删除了这条命令。

#初始化Master
kubeadm init --pod-network-cidr=10.244.0.0/16 --kubernetes-version=v1.19.4 --ignore-preflight-errors=NumCPU --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16 --v=6

奇迹发生,启动成功.
在这里插入图片描述

按照成功过后的提示执行下面语句

#使用kubectl
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

不执行这三条语句,在使用kubectl时会报错The connection to the server 127.0.0.1:8080 was refused - did you specify the right host or port?.

#查看组件状态
kubectl get cs

在这里插入图片描述

controller-manager Unhealthy Get “http://127.0.0.1:10252/healthz”: dial tcp 127.0.0.1:10252: connect: connection refused
scheduler Unhealthy Get “http://127.0.0.1:10251/healthz”: dial tcp 127.0.0.1:10251: connect: connection refused

悲伤的发现controller-manager和scheduler状态不对。原因是默认端口是0了,需要注释掉/etc/kubernetes/manifests下的kube-controller-manager.yamlkube-scheduler.yaml- – port=0
解决kubernetes:v1.18.6-1.19.0 get cs127.0.0.1 connection refused错误

#注释完重启服务
systemctl restart kubelet.service
#查看组件状态
kubectl get cs

在这里插入图片描述

#查看节点状态
kubectl get node

在这里插入图片描述
令人头疼的是节点也是NotReady

#查看log
journalctl -f -u kubelet.service

报错

Nov 21 18:37:02 iZuf6gdhs7pd18cytimmvzZ kubelet[8079]: W1121 18:37:02.230409    8079 cni.go:239] Unable to update cni config: no networks found in /etc/cni/net.d
Nov 21 18:37:03 iZuf6gdhs7pd18cytimmvzZ kubelet[8079]: E1121 18:37:03.967844    8079 kubelet.go:2103] Container runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized

在这里插入图片描述
原因是没配置CNI网络插件,这里选用flannel.

curl https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml >>kube-flannel.yml
chmod 777 kube-flannel.yml 
kubectl apply -f kube-flannel.yml 

等个1分钟左右,再次查看节点状态

kubectl get node

在这里插入图片描述
终于变为了ready,k8s单机版完美搭建。
注意:每次重新init master都要执行 kubeadm reset

五、创建pod

kubectl create deployment nginx --image=nginx
#查看pod状态,变为Running才可继续执行
kubectl get pod
#如果一直没有变为Running,查看启动日志
kubectl describe pod {pod名称}
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get pod,svc

在这里插入图片描述
可以看到端口映射到了30253,访问ip:30253即可看到nginx界面。

Logo

开源、云原生的融合云平台

更多推荐