最近由于公司可能使用到k8s,所以自己先学习一下。条件有限,先搭建一个单机版k8s,淦就完事了。
一、配置详情
使用的是阿里云的服务器
- CPU:1核
- 内存:2g
- 系统: CentOS 7.3 64位
- 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.yaml
和kube-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界面。