Kubernetes 安装与搭建

Kubernetes 搭建

环境准备

  1. 创建/etc/sysctl.d/k8s.conf文件,添加如下内容:
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
  1. 执行以下命令使修改生效:
modprobe br_netfilter
sysctl -p /etc/sysctl.d/k8s.conf
  1. 关闭 selinux
apt-get install selinux-utils
getenforce

若输出为 Disabled 则为关闭状态

  1. 关闭防火墙
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 插件。

发布了16 篇原创文章 · 获赞 0 · 访问量 861

猜你喜欢

转载自blog.csdn.net/weixin_43864314/article/details/89493038