之前已经体验了k8s和了解了k8s的基本概念和组件,通过在katacoda 的演示也基本算是在实际体验了一把k8s,但是在katacoda,只有10分钟的使用时间。所以最好的方式还是我们自己来手动搭建一套 k8s 的环境。【老铁内容过多,如果看这太累可以休息下继续,完全实践操作,100%绕坑】
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
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是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是操作系统在内存吃紧的情况申请的虚拟内存,按照Kubernetes官网的说法,Swap会对Kubernetes的性能造成影响,不推荐使用Swap。
swapoff -a
systemctl enable docker.service
systemctl enable kubelet.service
就是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
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 值的话也不用担心,我们可以使用下面的命令来查找
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/^.* //'
添加节点镜像 可以通过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
kubectl get nodes
复制master节点的~/.kube/config到node节点的同级目录下就可以使用目录
kubectl get cs
需要在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
所有节点都需要哦,进行下面的操作
swapoff -a
systemctl status kubelet
systemctl restart kubelet
修改/etc/fstab文件
vi /etc/fstab
将文件中的/dev/mapper/centos-swap swap swap defaults 0 0这一行注释掉
记住执行完命令补全,需要关闭窗口重新打开才生效,否则会报错
yum install -y bash-completion*
# 添加环境变量
source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc
上边的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"
无法通过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:我在安装的时候遇见的几个坑:
安装花了2天时间,总结了各种坑,就是为了让大家在学习k8s的时候不在从入门到放弃。