「走进k8s」kubeadm搭建 Kubernetes1.15.1集群环境(14)

之前已经体验了k8s和了解了k8s的基本概念和组件,通过在katacoda 的演示也基本算是在实际体验了一把k8s,但是在katacoda,只有10分钟的使用时间。所以最好的方式还是我们自己来手动搭建一套 k8s 的环境。【老铁内容过多,如果看这太累可以休息下继续,完全实践操作,100%绕坑】

(一)kubeadm

  • ①官网

https://kubernetes.io/zh/docs/reference/setup-tools/kubeadm/kubeadm/

  • ②介绍

kubeadm 通过执行必要的操作来启动和运行一个最小可用的集群。它被故意设计为只关心启动集群,而不是之前的节点准备工作。同样的,诸如安装各种各样值得拥有的插件,例如 Kubernetes Dashboard、监控解决方案以及特定云提供商的插件,这些都不在它负责的范围。
相反,我们期望由一个基于 kubeadm 从更高层设计的更加合适的工具来做这些事情;并且,理想情况下,使用 kubeadm 作为所有部署的基础将会使得创建一个符合期望的集群变得容易。通过将集群的各个组件进行容器化安装管理,通过kubeadm的方式安装集群比二进制的方式安装要方便不少,但是kubeadm不建议在生产环境搭建。

  • ③环境准备

至少需要cpu双核的机器,不能单CPU

系统类型 IP地址 节点角色 CPU Memory Hostname
Centos7 192.168.68.100 master 2 4G master
Centos7 192.168.68.101 node1 2 4G node1
Centos7 192.168.68.102 node2 2 4G node2
Centos7 192.168.68.103 node3 2 4G node3

docker的安装,这个是前提

sudo curl -sSL https://get.docker.com/ | sh
sudo curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://b81aace9.m.daocloud.io
sudo systemctl restart docker
sudo yum -y install epel-release
sudo yum -y install python-pip
sudo yum clean all
sudo pip install docker-compose

docker的Cgroup Driver和kubelet的Cgroup Driver不一致

docker info
# Cgroup Driver: cgroupfs

修改docker的Cgroup Driver
修改/etc/docker/daemon.json文件

sudo curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://b81aace9.m.daocloud.io

vi /etc/docker/daemon.json
{
  "exec-opts": ["native.cgroupdriver=systemd"]
}

重启docker

systemctl daemon-reload
systemctl restart docker
docker info 

增加dns解析,所有机器

echo nameserver 8.8.8.8 >> /etc/resolv.conf
systemctl restart network

增加host文件,所有机器

cat /etc/hosts
192.168.86.100  master
192.168.86.101  node1
192.168.86.102  node2
192.168.86.103  node3

禁用防火墙,所有机器

systemctl stop firewalld
systemctl disable firewalld




禁用SELINUX,所有机器

setenforce 0
cat /etc/selinux/config
#SELINUX=disabled

创建/etc/sysctl.d/k8s.conf文件

vi /etc/sysctl.d/k8s.conf

#增加下面内容
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1

执行如下命令

modprobe br_netfilter
sysctl -p /etc/sysctl.d/k8s.conf

公司内服务器域名解析总有问题,时好时不好,很烦,这里直接用hosts做解析

vi /etc/hosts
#添加ping下看看这个ip可用不,找个可用的ip
61.168.101.240  mirrors.aliyun.com

  • ④配置国内数据源

yum install -y wget mkdir /etc/yum.repos.d/bak && mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/bak wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.cloud.tencent.com/repo/centos7_base.repo wget -O /etc/yum.repos.d/epel.repo http://mirrors.cloud.tencent.com/repo/epel-7.repo yum clean all && yum makecache

  • ⑤配置国内Kubernetes源
cat <<EOF > /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

EOF

  • ⑥安装kubeadm、kubelet、kubectl

Kubeadm是Kubernetes集群管理工具。
Kubelet负责与其他节点集群通信,并进行本节点Pod和容器生命周期的管理。
Kubeadm是Kubernetes的自动化部署工具,降低了部署难度,提高效率。

yum install -y kubelet kubeadm kubectl
#或者跟下面阿里的镜像保持一致
#yum install -y kubelet-1.15.1-0 kubeadmt-1.15.1-0 kubectlt-1.15.1-0
systemctl enable kubelet

  • ⑦关闭Swap

Swap是操作系统在内存吃紧的情况申请的虚拟内存,按照Kubernetes官网的说法,Swap会对Kubernetes的性能造成影响,不推荐使用Swap。

swapoff -a
systemctl enable docker.service
systemctl enable kubelet.service

  • ⑧初始化 master节点

就是kubeadm init,后面的参数是需要安装的集群版本,因为我们这里选择flannel作为 Pod 的网络插件,所以需要指定–pod-network-cidr=10.244.0.0/16,然后是 apiserver 的通信地址,这里就是我们 master 节点的 IP 地址。执行上面的命令,如果出现running with swap on is not supported. Please disable swap之类的错误,则我们还需要增加一个参数–ignore-preflight-errors=Swap来忽略 swap 的错误提示信息

kubeadm init --kubernetes-version=v1.15.1 --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=192.168.86.100 --ignore-preflight-errors=Swap

上边报错的信息已经指明了缺少那些镜像,这里面明确列出了安装需要用到的镜像名称和tag,那么我们只需要提前把这些镜像pull下来,再安装就ok了。你也可以通过kubeadm config images pull预先下载好镜像,再执行kubeadm init。知道名字就好办了,这点小问题难不倒我们。目前国内的各大云计算厂商都提供了kubernetes的镜像服务,比如阿里云。

注意老铁们,因为我是从云端下载的,目前我这个是1.15.1版本,可能大家在看到文章的时候可能更新到1.15.2版本,一定要适当的修改,根据提示来。建议下面的写成一个shell脚本

docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.15.1
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.15.1
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.15.1
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.15.1
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.1
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.3.10
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.3.1


docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.15.1 k8s.gcr.io/kube-apiserver:v1.15.1
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.15.1 k8s.gcr.io/kube-controller-manager:v1.15.1
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.15.1 k8s.gcr.io/kube-scheduler:v1.15.1
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.15.1 k8s.gcr.io/kube-proxy:v1.15.1
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.1 k8s.gcr.io/pause:3.1
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.3.10 k8s.gcr.io/etcd:3.3.10
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.3.1 k8s.gcr.io/coredns:1.3.1

shell脚本的方式安装镜像

vi master.sh
#把上面的代码复制进来

chmod 777 master.sh
sh ./master.sh

查看镜像

docker images

执行master下的脚本开始初始化,成功了

kubeadm init --kubernetes-version=v1.15.1 --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=192.168.86.100 --ignore-preflight-errors=Swap

在执行节点上执行如下操作,初始化一下k8s环境。

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

kubectl 默认使用的配置文件

cat ~/.kube/config

  • ⑨ flannel网络设置 master节点
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

kubectl apply -f  kube-flannel.yml

所有下面的pods

kubectl get pods --all-namespaces

默认的普通的pod节点是不用放入到master节点上边的

kubectl get nodes

  • ⑩ token 和 sha256 值 master节点

如果忘记保存上面的 token 和 sha256 值的话也不用担心,我们可以使用下面的命令来查找

kubeadm token list

 openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'

  • ⑩k8s node节点添加到master节点上

添加节点镜像
可以通过shell脚本的方式,跟上边的master是一样的。

docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.1
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.3.10
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.3.1
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.15.1


docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.15.1 k8s.gcr.io/kube-proxy:v1.15.1
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.1 k8s.gcr.io/pause:3.1
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.3.10 k8s.gcr.io/etcd:3.3.10
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.3.1 k8s.gcr.io/coredns:1.3.1

vi node.sh
# 复制上边的镜像拉取和tag
chmod 777 node.sh
sh ./node.sh
kubeadm join 192.168.86.100:6443 --token ukoxff.qwxf33of4dievupw --discovery-token-ca-cert-hash sha256:0e11e4f1e7ad3906551599ef052ee9eaa86a3cef7309339997ea1ecc2f44af23

  • ⑪加入node节点后,进入master节点查看
kubectl get nodes

  • ⑫node节点也想查看

复制master节点的~/.kube/config到node节点的同级目录下就可以使用目录

  • ⑬查看master状态
kubectl get cs

  • ⑭ 重启k8s的服务

需要在master节点进行操作

systemctl restart kubelet 

(二)kubeadm 清除

在安装过程中存在安装失败的可能,如何重新安装这个也需要了解
推荐把系统环境清理一下,每一个节点。

systemctl stop kubelet
docker rm -f -v $(docker ps  -a -q)

rm -rf /etc/kubernetes
rm -rf  /var/lib/etcd
rm -rf   /var/lib/kubelet
rm -rf  $HOME/.kube/config
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X

yum reinstall -y kubelet
systemctl daemon-reload
systemctl restart docker
systemctl enable kubelet

(三)重启电脑导致虚拟机关机如何重启k8s

所有节点都需要哦,进行下面的操作

  • ① 需要关闭交换内存
swapoff -a
systemctl status kubelet 
systemctl restart kubelet 

  • ②设置swap开机不启动

修改/etc/fstab文件

vi /etc/fstab

将文件中的/dev/mapper/centos-swap swap swap defaults 0 0这一行注释掉

  • ③ k8s命令补全功能

记住执行完命令补全,需要关闭窗口重新打开才生效,否则会报错

yum install -y bash-completion*
# 添加环境变量

source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc

  • ④kubectl logs、exec、port-forward 执行失败问题解决

上边的ip 都一样所以命令失效,

kubectl get nodes

需要修改ip地址, master 和 node 节点都需要配置,全部配置

vi /etc/sysconfig/kubelet
#master节点的配置
#--node-ip=192.168.86.100

#node节点的配置
#--node-ip=192.168.86.101

重启服务,所有节点master和node

service kubelet restart
kubectl get nodes


`

注意:因为我是用vagrant创建的虚拟机,需要修改/etc/sysconfig/kubelet,如果是正常安装的虚拟机,可能需要修改

# 所有节点 master和node
vi /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
# master节点的配置
# Environment="KUBELET_EXTRA_ARGS=--node-ip=192.168.86.100"

# node节点的配置
# Environment="KUBELET_EXTRA_ARGS=--node-ip=192.168.86.101"

  • ⑤ 如果老铁也是通过vagrant创建的虚拟机,你绝对会遇见下面的问题

无法通过svc访问其他节点pod的问题,pod之前无法通讯。

原因:用的【VirtualBox】虚拟化出了两台 centos7主机搭建的 k8s。在组网的过程中,我采用了双网卡方案,【网卡1】使用NAT地址转换用来访问互联网,【网卡2】使用Host-only来实现虚拟机互相访问。【flannel】默认使用了网卡1的 ip 地址,而【网卡1】的NAT地址转换是无法访问其他虚拟机的,从而导致的问题的产生。

解决方案:flannel使用的默认网卡1导致了这个问题的产生,所以我们需要使用–iface参数手动指定它使用网卡2来进行通信,这就需要修改flannel的配置文件。【这个修改只主要在master节点操作,其他所有节点也生效】

ifconfig
#enp0s8 有个唯一的ip

sudo kubectl edit daemonset kube-flannel-ds-amd64 -n kube-system

修改配置文件,指定目标网卡。在打开的配置文件中找到spec.template.spec.containers[0].args字段,添加上,注意只能用空格不能用tab键。 跟vi编辑器一样

- args:
  - --ip-masq
  - --kube-subnet-mgr
  - --iface=enp0s8

修改完成之后输入:wq保存退出。提示:
daemonset.extensions/kube-flannel-ds-amd64 edited这就说明保存成功了。然后就要重启所有已经存在的flannel。 删除需要等待,他会自动重新配置。只需要在一个节点操作就可以了。

kubectl get pod -n kube-system

#找到上边所有带kube-flannel-ds-amd64-*
kubectl delete pod -n kube-system 
kube-flannel-ds-amd64-mgvp9
kube-flannel-ds-amd64-xpjqx

vagrant创建虚拟机搭建k8s,官网的解释

重启所有节点的k8s服务

service kubelet restart 

PS:我在安装的时候遇见的几个坑:
1. cpu必须是双核。
2. Swap必须关闭。
3. linux的dns配置后,没有重启服务。
4. docker的Cgroup Driver 修改成 systemd
5. systemctl enable docker.service,systemctl enable kubelet.service 必须enable。
6. 禁用SELINUX。
7. 配置/etc/sysctl.d/k8s.conf 为了方便网络。
8. 安装kubeadm、kubelet、kubectl 数据源更换成阿里或者腾讯的,否则需要科学上网很痛苦。
9. 关闭Swap。
10. master和node都需要下载镜像。
11. master是不需要加入join的,只是node需要。
12. 记住执行完命令补全,需要关闭窗口重新打开才生效,否则会报错。
13. logs,exec命令不能用,记住修改配置文件配置自身节点的ip,每个节点都需要修改
14. pod 和svc之前无法通讯,就是因为vagrant创建虚拟机的bug,要更改flannel绑定的网卡,找到唯一的正常的ip地址。

安装花了2天时间,总结了各种坑,就是为了让大家在学习k8s的时候不在从入门到放弃。

>>原创文章,欢迎转载。转载请注明:转载自IT人故事会,谢谢!
>>原文链接地址:「走进k8s」kubeadm搭建 Kubernetes1.15.1集群环境(14)
上一篇: 下一篇:

评论 (2)

  • wanghao| 2019年8月15日

    当前安装的一套环境,如果我要关机,再启动这个环境,顺序应该是什么样的

    • liming| 2019年8月16日

      已经设置了kubectl自动服务,开机自动启动。k8s开机后自动启动服务,根据机器来。启动快慢

  • 发表评论

    电子邮件地址不会被公开。 必填项已用*标注