Centos7安装Kubernetes1.19.9
- 系统环境准备
- 配置主机的host
- 关闭防火墙
- 禁用SELinux
- 禁用交换分区
- 启用br_netfilter内核模块
- 配置Kubernetes的yum源
- Kubernetes集群安装
- 安装kubeadm、kubelet、kubectl
- 安装Kubernetes Master
- 安装Kubernetes Node
- 安装CNI网络插件
- 验证Kubernetes集群
- 常见问题
- bridge-nf-call-iptables contents are not set to 1
- The recommended driver is "systemd".
- The connection to the server localhost:8080 was refused
系统环境准备
所有Kubernetes节点的机器都需要做如下系统环境准备。
配置主机的host
编辑文件sudo vi /etc/hosts
加入IP与主机名的映射关系,如下图:
关闭防火墙
Kubernetes的Master与工作Node之间会有大量的网络通信,所以在较为安全的内部网络环境中可以关闭防火墙服务:
sudo systemctl disable firewalld
sudo systemctl stop firewalld
禁用SELinux
运行下面命令在主机上禁用SELinux,让容器可以读取主机文件系统:
sudo setenforce 0
# 永久关闭 修改/etc/sysconfig/selinux文件设置
sudo sed -i 's/SELINUX=permissive/SELINUX=disabled/' /etc/sysconfig/selinux
sudo sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
或修改系统文件/etc/sysconfig/selinux
,将SELINUX=enforcing
修改成SELINUX=disabled
,然后重启Linux。
SELinux(Security-Enhanced Linux) 是美国国家安全局(NSA)对于强制访问控制的实现,是 Linux历史上最杰出的新安全子系统。当一个主体Subject(如一个程序)尝试访问一个目标Object(如一个文件),SELinux安全服务器SELinux Security Server(在内核中)从策略数据库Policy Database中运行一个检查。基于当前的模式mode,如果 SELinux 安全服务器授予权限,该主体就能够访问该目标。如果SELinux安全服务器拒绝了权限,就会在
/var/log/messages
中记录一条拒绝信息。
禁用交换分区
# 禁用Swap
sudo swapoff -a
# 启用Swap
sudo swapon -a
# 查看Swap状态
free -m
# 永久禁用
sudo sed -i 's/.*swap.*/#&/' /etc/fstab
启用br_netfilter内核模块
kubernetes安装需要br_netfilter模块。 启用此内核模块,以便节点上的 iptables 能够正确地查看桥接流量。
# 加载该模块
sudo modprobe br_netfilter
# 在/etc/sysctl.conf中添加:
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
# 加载文件参数
sudo sysctl -p
配置Kubernetes的yum源
root权限下执行命令:
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=0
EOF
Kubernetes集群安装
安装kubeadm、kubelet、kubectl
kubeadm
:用来初始化集群的指令。kubelet
:在集群中的每个节点上用来启动 Pod 和容器等。kubectl
:用来与集群通信的命令行工具。
指定安装版本为将要安装的Kubernetes相同的版本:
sudo yum install -y kubelet-1.19.9 kubectl-1.19.9 kubeadm-1.19.9
把启动kubelet,并把它加入到开机启动中:
sudo systemctl enable kubelet && sudo systemctl start kubelet
安装Kubernetes Master
运行下面命令进行安装:
sudo kubeadm init --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.19.9 --apiserver-advertise-address 192.168.91.151 --pod-network-cidr=10.244.0.0/16 --token-ttl 0
apiserver-advertise-address
kubeadm 使用 eth0 的默认网络接口(通常是内网IP)做为节点的 advertise address ,如果想使用不同的网络接口,可以使用来设置。pod-network-cidr
指定pod网络的IP地址范围,它的值取决于你在下一步选择的哪个网络插件,如果使用的是Calico网络,需要指定为192.168.0.0/16。
等待一段时间后,Kubernetes的Master安装成功,打印的日志最后显示如下信息:
如果加入集群的指令找不到了,可以使用下面命令重新获得:
kubeadm token create --print-join-command
安装Kubernetes Node
安装了kubeadm、kubelet、kubectl之后,运行上面Master节点打印的加入集群的命令,把Node加入到集群中。
截图中的两个警告是因为
/etc/hosts
中的配置有错误,有两个主机的hostname写一样了。
按照提示运行下面命令可以查看集群的节点状态:
sudo kubectl get nodes
可见此时的Master和Node的状态都是 NotReady ,这是因为还没有安装CNI网络插件
安装CNI网络插件
要部署一个基于容器网络接口(CNI:Container Network Interface)的Pod网络插件,不然Pods不能够相互通信。并且在安装网络之前,集群DNS(CoreDNS)也不会启动。
有多种CNI网络插件可供选择,这里我们选择安装weave插件,在Master上安装:
#查看k8s版本
kubectl version
#安装weave
kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=1.19.9"
此时再查看集群状态,发现就都变成Ready了:
Weave-Net是一种灵活且易于使用的Kubernetes及其托管应用程序的网络。Weave Net作为CNI插件或独立运行。在这两个版本中,它都不需要任何配置或额外的代码来运行,而且在这两种情况下,网络为每个pod提供一个IP地址,这是Kubernetes的标准配置。
如果安装Weave Net失败,查看日志出现以下错误时:
Network 10.32.0.0/12 overlaps with existing route 10.32.10.0/26 on host
可以参考官方Allocating IPs in a Specific Range进行解决。为防止有人打不开,我把内容粘贴如下:
验证Kubernetes集群
执行下面的命令,验证Kubernetes集群的相关Pod是否都正常创建并运行:
kubectl get pods --all-namespaces
如果发现有状态错误的Pod,则可以执行下面命令来查看错误原因,常见的错误原因是镜像没有下载完成。
kubectl --namespace=kube-system describe pod<pod_name>
常见问题
bridge-nf-call-iptables contents are not set to 1
在初始化Master节点时报如下错误:
解决方法: 按照提示将bridge-nf-call-iptables
设置为1
# root权限下执行
echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
The recommended driver is “systemd”.
在初始化Master节点时提示如下警示信息:
这个提示信息的内容大概是:当前的cgroup驱动是“cgroupfs",推荐的驱动是"systemd"
解决方法: 把Docker的cgroup改为"systemd"
- 编辑
/etc/docker/daemon.json
文件,加入"exec-opts": ["native.cgroupdriver=systemd"]
,加入后的配置如下: - 重启Docker服务
sudo systemctl daemon-reload
sudo systemctl restart docker
- 查看Docker服务信息
The connection to the server localhost:8080 was refused