前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >「走进k8s」kubeadm搭建 Kubernetes1.15.1集群环境(14)

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

作者头像
IT架构圈
发布2019-08-15 15:47:09
2.1K0
发布2019-08-15 15:47:09
举报
文章被收录于专栏:IT架构圈IT架构圈

之前已经体验了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的时候不在从入门到放弃。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-08-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 编程坑太多 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • (一)kubeadm
  • (三)重启电脑导致虚拟机关机如何重启k8s
相关产品与服务
容器镜像服务
容器镜像服务(Tencent Container Registry,TCR)为您提供安全独享、高性能的容器镜像托管分发服务。您可同时在全球多个地域创建独享实例,以实现容器镜像的就近拉取,降低拉取时间,节约带宽成本。TCR 提供细颗粒度的权限管理及访问控制,保障您的数据安全。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档