Kubernetes 搭建
环境准备
- 创建/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
- 关闭 selinux
apt-get install selinux-utils
getenforce
若输出为 Disabled 则为关闭状态
- 关闭防火墙
ufw disable
安装 kubeadm, kubelet, kubectl
apt-get update && apt-get install -y apt-transport-https
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
vim /etc/apt/sources.list.d/kubernetes.list
在该文件中加入下列源
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
apt-get update
apt-get install -y kubelet kubeadm kubectl
以上指令须在 root 用户下执行
获取镜像列表
首先获取所需镜像以及对应的版本,然后从国内镜像站获取
kubeadm config images list
获取镜像列表后通过以下脚本从阿里云获取:
# 下面的镜像应该去除"k8s.gcr.io/"的前缀,版本换成上面获取到的版本
images=(
kube-apiserver:v1.12.1
kube-controller-manager:v1.12.1
kube-scheduler:v1.12.1
kube-proxy:v1.12.1
pause:3.1
etcd:3.2.24
coredns:1.2.2
)
for imageName in ${images[@]} ; do
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageName
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
done
Kubernetes 集群搭建
关闭swap
如果不关闭 swap, kubernetes 运行会出现错误, 即使安装成功了,node重启后也会出现 kubernetes server运行错误。
sudo swap0ff -a
初始化环境
sudo kubeadm init
若要添加特定的网络插件,需要配置额外的参数,例如添加 flannel 网络插件:
–pod-network-cidr 用于指定 CIDR(无类域间路由)
初始化完毕之后,需要执行以下命令,以便使得 kubectl 能够在非 root 用户下工作:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
如果为 root 用户,可以执行以下命令,实现同样的效果:
export KUBECONFIG=/etc/kubernetes/admin.conf
应用网络插件
flannel 插件
sudo sysctl net.bridge.bridge-nf-call-iptables=1
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.10.0/Documentation/kube-flannel.yml
–pod-network-cidr=10.244.0.0/16
calico 插件
kubectl apply -f https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/hosted/kubeadm/1.7/calico.yaml
–pod-network-cidr=192.168.0.0/16
查看 pod 运行情况
kubectl get pods --all-namespaces
重置 kubenetes 集群
kubeadm reset
重置之后使用
rm -rf /etc/kubernetes/pki/ca.crt
删除生成的证书
查看某个 Pod 的日志
kubectl --namespace kube-system logs <pod name>
完整搭建流程
sudo swapoff -a
sudo kubeadm init --pod-network-cidr=10.244.0.0/16
mkdir -p $HOME/.kube
rm ~/.kube/config
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
sudo kubectl apply -f https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/hosted/kubeadm/1.7/calico.yaml
运行dashboard
从 Github 上下载对应的 yaml 文件
https://raw.githubusercontent.com/winse/docker-hadoop/master/kube-deploy/kubeadm/kubernetes-dashboard.yaml
修改 yaml 文件里的 image 为阿里云的镜像:
registry.cn-beijing.aliyuncs.com/zhusl/kubernetes-dashboard-amd64:v1.6.0
在所有节点拉取阿里云的镜像
docker pull registry.cn-beijing.aliyuncs.com/zhusl/kubernetes-dashboard-amd64:v1.6.0
在 master 节点下应用该 yaml 文件:
sudo kubectl apply -f kubernetes-dashboard.yaml
查看 dashboard pod对应的 IP:
kubectl get pods -n kube-system -o wide
在浏览器中输入对应的 IP地址和 9090 端口查看信息。
搭建遇到的问题
1. CrashLoopBackOff
查看对应的 Pod 日志,输出以下信息:
plugin/loop: Loop (127.0.0.1:49443 -> :53) detected for zone:
解决办法:
su
mkdir /root/resolv
vim /root/resolv/resolv.conf
编写内容
nameserver 114.114.114.114
vim /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
最后一行修改为
ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS --resolv-conf=/root/resolv/resolv.conf $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS
使配置生效
systemctl daemon-reload
systemctl restart kubelet
2. kubectl get nodes 没有对应的 node:
原因:主机名冲突。
解决办法:
sudo vim /etc/hostname
更改对应的主机名。
sudo vim /etc/hosts
更改 127.0.1.1
后面的主机名为对应的主机名
3. CrashLoopBackOff
查看对应的 Pod 日志,输出以下信息:
dial tcp 10.96.0.1:443: getsockopt: no route to host:
原因:iptables 规则混乱
解决办法
systemctl stop kubelet
systemctl stop docker
iptables --flush
iptables -tnat --flush
systemctl start kubelet
systemctl start docker
4. master 无法访问 node 节点内的 Pod
原因:calico 插件问题
解决办法
采用 flannel 插件。