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 行 追加
  2. deb https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial main
  3. #执行
  4. apt-get update
  5. #执行
  6. apt-get install -y kubelet kubeadm kubectl
  7. #需要 sudo 自己加
  8. #可能在 apt-get update 时会碰到 no pubkey ...
  9. #执行下面命令解决
  10. curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -
  11. kubelet kubeadm kubectl
  12. #安装好了,工作完成了 1/3. kubelet 是k8相关服务,kubectl 是k8s 管理客户端,kubeadm 是部署工具



部署主(管理)节点

  1. 本来是执行 kubeadm init --kubernetes-version=v1.15.0 --pod-network-cidr=10.10.0.0/16 --apiserver-advertise-address=192.168.1.20<br /> 如果你可以FQ直接部署上面的命令即可<br />一步完成, 但是由于国内的网络环境,众所周知的原因,不得不绕弯。<br />**两难点之二**

在执行 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
  2. k8s.gcr.io/kube-apiserver:v1.15.0
  3. k8s.gcr.io/kube-controller-manager:v1.15.0
  4. k8s.gcr.io/kube-scheduler:v1.15.0
  5. k8s.gcr.io/kube-proxy:v1.15.0
  6. k8s.gcr.io/pause:3.1
  7. k8s.gcr.io/etcd:3.3.10
  8. k8s.gcr.io/coredns:1.3.1

拉取镜像

  1. docker pull mirrorgooglecontainers/kube-apiserver:v1.15.0
  2. docker pull mirrorgooglecontainers/kube-controller-manager:v1.15.0
  3. docker pull mirrorgooglecontainers/kube-scheduler:v1.15.0
  4. docker pull mirrorgooglecontainers/kube-proxy:v1.15.0
  5. docker pull mirrorgooglecontainers/pause:3.1
  6. docker pull mirrorgooglecontainers/etcd:3.3.10
  7. docker pull coredns/coredns:1.3.1

改名

  1. docker tag mirrorgooglecontainers/kube-apiserver:v1.15.0 k8s.gcr.io/kube-apiserver:v1.15.0
  2. docker tag mirrorgooglecontainers/kube-controller-manager:v1.15.0 k8s.gcr.io/kube-controller-manager:v1.15.0
  3. docker tag mirrorgooglecontainers/kube-scheduler:v1.15.0 k8s.gcr.io/kube-scheduler:v1.15.0
  4. docker tag mirrorgooglecontainers/kube-proxy:v1.15.0 k8s.gcr.io/kube-proxy:v1.15.0
  5. docker tag mirrorgooglecontainers/pause:3.1 k8s.gcr.io/pause:3.1
  6. docker tag mirrorgooglecontainers/etcd:3.3.10 k8s.gcr.io/etcd:3.3.10
  7. docker tag coredns/coredns:1.3.1 k8s.gcr.io/coredns:1.3.1

拉取完成后,执行 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
  2. sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  3. sudo chown $(id -u):$(id -g) $HOME/.kube/config

执行后 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
  2. NAME STATUS ROLES AGE VERSION
  3. k8s-master Ready master 28h v1.15.3
  4. k8s-node1 Ready <none> 27h v1.15.3
  5. k8s-node2 Ready <none> 27h v1.15.3

添加 node1 工作节点,

在 192.168.1.21 机器上 安装 kubelet kubeadm kubectl 执行 kubeadm join …..
不需要执行 init 和网络
完成后 执行 kubectl get nodes 就能看到 上面这个图了。 恭喜,你的k8s 集群就已经完成了,以后可以增加节点,减少节点。

创建一个 helloword 应用,看看效果

  1. kubectl create deployment nginx --image=nginx
  2. kubectl expose deployment nginx --port=80 --type=NodePort

用kubectl 部署, 用 kubectl get nodes, get pods , get cs 查看集群服务状态

  1. ~ kubectl get pods
  2. NAME READY STATUS RESTARTS AGE
  3. nginx-554b9c67f9-kldwg 1/1 Running 0 26s
  4. ~ kubectl get cs
  5. NAME STATUS MESSAGE ERROR
  6. controller-manager Healthy ok
  7. scheduler Healthy ok
  8. etcd-0 Healthy {"health":"true"}
  9. ~ kubectl get nodes
  10. NAME STATUS ROLES AGE VERSION
  11. k8s-master Ready master 28h v1.15.3
  12. k8s-node1 Ready <none> 28h v1.15.3
  13. k8s-node2 Ready <none> 27h v1.15.3

打开浏览器: 192.168.1.20:80 看你的hello word , 大功告成。

3/3 工作完成 文章完结 。

Docker 不输入sudo 运行方案

由于docker daemon需要绑定到主机的Unix socket而不是普通的TCP端口,而Unix socket的属主为root用户,所以其他用户只有在命令前添加sudo选项才能执行相关操作。
如果不想每次使用docker命令的时候还要额外的敲一下sudo,可以按照下面的方法配置一下。

  1. 创建一个docker组
  1. sudo groupadd docker
  1. 添加当前用户到docker组
  1. sudo usermod -aG docker $USER
  1. 登出,重新登录shell
  2. 验证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

K8S 集群初步搭建 - 图1
但是发现能ssh到失联的node上去,于是重启kubelet

  1. sudo systemctl restart kubelet.service

发现没用。于是关闭交换空间

  1. sudo swapoff -a

发现错误解决,node恢复连接,删不掉的pod自动没有了

永久关闭swap缓存
找到/etc/fstb下面 注释swap行 重启就好