K8S 搭建
搭建本 K8S 集群需要你预先准备好,可以连接到外网的 Fq 工具,并且设置局域网内所有主机都可以自动 fq。
这里我采用的是 ikuai 与 koolshare lede 双软路由解决方案。
本文均采用 ubuntu 18.04LTS 版本系统
docker-ce 版本 18.09.9 k8s 15.3 版本最高依赖 docker-ce 18.09 再高就连接不到 docker 引擎了。
集群网络
192.168.1.20 k8s-master ubuntu-desktop 18.04.03 LTS
192.168.1.21 k8s-node-1 ubuntu-server 18.04.03 LTS
192.168.1.22 k8s-node-2 ubuntu-server 18.04.03 LTS
修改对应服务器 hosts
关闭防火墙,关闭 swap 等
ubuntu 默认关闭防火墙,
1 | sudo swapoff -a |
两个难点之一 , 安装 kubelet kubeadm kubectl
因为访问国外网络慢,所以需要修改 apt-get 的访问源
1 | sudo vim /etc/apt/sources.list #添加deb 行 追加 |
部署主(管理)节点
本来是执行 kubeadm init –kubernetes-version=v1.15.0 –pod-network-cidr=10.10.0.0/16 –apiserver-advertise-address=192.168.1.20
如果你可以 FQ 直接部署上面的命令即可
一步完成, 但是由于国内的网络环境,众所周知的原因,不得不绕弯。
两难点之二
在执行 init 的时候 会向 k8s.gcr.io 获取 kube-apiserver:v1.15.0 等 docker 镜像, 但是 k8s.gcr.io 访问不通。
所以,我们要从拉取 别人的镜像, 然后改名, 再执行 kube init . 注意,一定要版本一致,今天是 1.15, 明天可能是 16 ,
列出需要哪些镜像: command not found
1 | murphyyi@k8s-master:~$ kubeadm config images list --kubernetes-version v1.15.0 |
拉取镜像
1 | docker pull mirrorgooglecontainers/kube-apiserver:v1.15.0 |
改名
1 | docker tag mirrorgooglecontainers/kube-apiserver:v1.15.0 k8s.gcr.io/kube-apiserver:v1.15.0 |
拉取完成后,执行 kubeadm init
成功标志, 出现:
kubeadm join 10.10.10.10:6443 –token kekvgu.nw1n76h84f4camj6 \
–discovery-token-ca-cert-hash sha256:4ee74205227c78ca62f2d641635afa4d50e6634acfaa8291f28582c7e3b0e30e
如果没有出现,就说明没成功,根据错误反复弄。 使用 ** kubeadm reset** 清除 kubeadm init 生成的垃圾, 有些文件可以用 rm -rf 删除。
需要记录这行内容: ** kubeadmin join …… **
添加工作节点用到
执行:
1 | mkdir -p $HOME/.kube |
执行后 kubectl 环境有了,可以执行 kubectl nodes 看看了。 2/3 的工作量完成了。
4. 主节点生效
现在主节点还是没用,需要搭建一个网络给集群用。
1 | kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml |
执行上面的命令搭建 flannel , k8s 有很多网络选择。 有兴趣的自己研究。
网络搭建完成后,执行刚才保存下来的
kubeadm join ………………..
输入
kubectl get nodes
1 | ➜ ~ kubectl get nodes |
添加 node1 工作节点,
在 192.168.1.21 机器上 安装 kubelet kubeadm kubectl 执行 kubeadm join …..
不需要执行 init 和网络
完成后 执行 kubectl get nodes 就能看到 上面这个图了。 恭喜,你的 k8s 集群就已经完成了,以后可以增加节点,减少节点。
创建一个 helloword 应用,看看效果
1 | kubectl create deployment nginx --image=nginx |
用 kubectl 部署, 用 kubectl get nodes, get pods , get cs 查看集群服务状态
1 | ➜ ~ kubectl get pods |
打开浏览器: 192.168.1.20:80 **看你的 hello word , 大功告成。 **
3/3 工作完成 文章完结 。
Docker 不输入 sudo 运行方案
由于 docker daemon 需要绑定到主机的 Unix socket 而不是普通的 TCP 端口,而 Unix socket 的属主为 root 用户,所以其他用户只有在命令前添加 sudo 选项才能执行相关操作。
如果不想每次使用 docker 命令的时候还要额外的敲一下 sudo,可以按照下面的方法配置一下。
- 创建一个 docker 组
1 | sudo groupadd docker |
- 添加当前用户到 docker 组
1 | sudo usermod -aG docker $USER |
- 登出,重新登录 shell
- 验证 docker 命令是否可以运行
1 | docker run hello-world |
遇到问题先查看日志
查看 node kubelet 日志:
1 | journalctl -f -u kubelet |
k8s node 断电/重启
kubernetes 断电重启 导致部分 pod 无法删除
dashboard 上处于黄色
kubectl get 处于 terminate 状态
kubectl delete 报错:
An error occurred while waiting for the object to be deleted: too old resource version:
kubectl get nodes 发现 node 失联:
1 | sudo kubectl get nodes |
但是发现能 ssh 到失联的 node 上去,于是重启 kubelet
1 | sudo systemctl restart kubelet.service |
发现没用。于是关闭交换空间
1 | sudo swapoff -a |
发现错误解决,node 恢复连接,删不掉的 pod 自动没有了
永久关闭 swap 缓存
找到/etc/fstb 下面 注释 swap 行 重启就好