Centos7使用kubeadm安装单机k8s
1. Centos7使用kubeadm安装单机k8s
本文精简自Centos7使用kubeadm安装k8s,自己学习开发k8s使用单机版就可以了。部署集群和单机差别不大,主要是在节点机器使用root用户执行kubeadm join
命令即可。
1.1. 准备工作
1.1.1. 配置主机名
为了集群内节点的直接调用,需要配置主机名解析,在服务器上修改/etc/hosts
文件:
192.168.187.138 master
接下来修改hostname:
hostnamectl set-hostname master
1.1.2. 关闭服务
为什么要关闭?请参考知乎问题部署 Kubernetes(k8s)时,为什么要关闭 swap、selinux、防火墙?。
Note:关闭后需要重启服务器
关闭防火墙
- 关闭防火墙:
systemctl stop firewalld
- 更新配置:
systemctl daemon-reload
- 取消开机启动:
systemctl disable firewalld
- 关闭防火墙:
关闭 swap
- 临时关闭:
swapoff -a
,重启后会失效。 - 永久关闭:编辑文件
/etc/fstab
,注释swap分区那一行
- 临时关闭:
关闭 selinux
- 临时关闭:
setenforce 0
,重启后会失效 - 永久关闭:编辑文件
/etc/selinux/config
,修改SELINUX为SELINUX=disabled
- 临时关闭:
1.1.3. 同步时间
集群内的时间需要一致,因此需要使用同步时间工具
systemctl start chronyd
systemctl enable chronyd
# 查看时间同步状态
chronyc sources -v
1.2. 安装 docker
centos7 的安装很简单,按照官网的教程Install Docker Engine on CentOS来即可。
1.2.1. 配置 yum 源
编辑文件/etc/yum.repos.d/docker-ce.repo
,输入以下内容
[docker-ce-stable]
name=Docker CE Stable - $basearch
baseurl=https://download.docker.com/linux/centos/$releasever/$basearch/stable
enabled=1
gpgcheck=1
gpgkey=https://download.docker.com/linux/centos/gpg
1.2.2. 安装 docker
配置好源后直接使用 yum 安装即可。
yum install docker-ce -y
# 启动docker
systemctl start docker
# 配置为开机启动
systemctl enable docker
1.2.3. 配置 docker
docker 镜像服务器在国外,因此国内访问会很慢。好在阿里推出镜像加速器,在阿里云的容器镜像服务可以找到教程。
k8s 的 cgroup 需要使用systemd
,因此加了配置native.cgroupdriver=systemd
。
使用命令修改配置文件/etc/docker/daemon.json
:
tee /etc/docker/daemon.json <<-'EOF'
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": ["https://a79n7bst.mirror.aliyuncs.com"]
}
EOF
修改好配置后,需要重启 docker 使配置生效:
systemctl daemon-reload
systemctl restart docker
1.3. 配置 iptables
k8s 需要使用 iptables 转发流量,可以通过命令查看是否正确配置,一般来说安装了 docker 就会正确配置。
# 查看模块是否被加载
lsmod | grep br_netfilter
# 查看net.bridge.bridge-nf-call-iptables是否为1
sysctl -a |grep net.bridge
如果没有被配置好,可以使用下面命令配置:
cat <<EOF | tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF
cat <<EOF | tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
# 重新加载
sysctl --system
1.4. 安装 kubeadm、kubelet 和 kubectl
需要在集群内所有机器安装以下软件:
kubeadm
:用来初始化集群kubelet
:在集群中的节点上用来启动 pod 和容器等kubectl
:用来与集群通信的命令行工具
1.4.1. 配置 yum 源
k8s 官网的文档用的是 google 的源,因此需要改成国内的源。
cat <<EOF | tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.cloud.tencent.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
repo_gpgcheck=0
EOF
1.4.2. 安装软件
Note:安装完不需要重启服务器,否则会出现网卡没启动问题
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
systemctl enable kubelet
1.4.3. 初始化控制平面节点
使用 kubeadm 命令即可创建一个控制平面节点,即master节点:
根据flannel 文档说明,flannel 和 kubeadm 一起使用需要配置pod-network-cidr
。
NOTE: If
kubeadm
is used, then pass--pod-network-cidr=10.244.0.0/16
tokubeadm init
to ensure that thepodCIDR
is set.
# 默认镜像地址是谷歌的,需要替换为国内镜像地址
kubeadm init --apiserver-advertise-address=192.168.187.138 --image-repository registry.aliyuncs.com/google_containers --pod-network-cidr=10.244.0.0/16
由于无法下载 coredns 镜像,因此需要使用 docker 拉取镜像,然后重新 tag
# coredns的版本号在kubeadm init报错日志可以找到
docker pull coredns/coredns:1.8.4
docker tag coredns/coredns:1.8.4 registry.aliyuncs.com/google_containers/coredns:v1.8.4
重新执行初始化命令:
kubeadm init --apiserver-advertise-address=192.168.187.138 --image-repository registry.aliyuncs.com/google_containers --pod-network-cidr=10.244.0.0/16
修改配置文件,使普通用户可以运行kubectl:
# 切换到对应用户,这里是sun
su - sun
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# 如果是root用户,该命令可以不用执行
sudo chown $(id -u):$(id -g) $HOME/.kube/config
1.4.4. 安装网络附加组件
k8s 支持多种网络组件,这里选择flannel
,因为它配置比较简单。
访问网站下载 docker 镜像https://github.com/flannel-io/flannel/releases,下载完成后上传到master服务器,导入镜像:
docker load < flanneld-v0.14.0-amd64.docker
下载 flannel 配置文件kube-flannel.yml
:到flannel官网https://github.com/flannel-io/flannel下载zip包(这样比clone仓库速度快),下载后上传到master服务器。
kubectl apply -f flannel-master/Documentation/kube-flannel.yml
等待一会再次查看集群节点状态:
[root@master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready control-plane,master 12m v1.22.1
1.5. 控制平面节点参与调度
默认情况下,出于安全原因,k8s不会在控制平面节点上调度pod。不过可以使用命令解除该限制:
kubectl taint nodes --all node-role.kubernetes.io/master-
1.6. 部署服务验证功能
此处使用 k8s 部署一个 nginx,来验证集群是否正常。
- 创建一个 deployment
[root@master ~]# kubectl create deployment nginx --image=nginx
deployment.apps/nginx created
[root@master ~]# kubectl get deploy
NAME READY UP-TO-DATE AVAILABLE AGE
nginx 1/1 1 1 11s
Note: 如果READY
不为1/1
,可使用kubectl describe pod
查看日志。
- 创建一个 service 使 nginx 可以被访问
[root@master ~]# kubectl expose deploy nginx --port=80 --target-port=80 --type=NodePort
service/nginx exposed
[root@master ~]# kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 20m
nginx NodePort 10.107.143.88 <none> 80:32064/TCP 13s
创建好service后,就可以在集群外部访问了。在集群内部可以使用CLUSTER-IP。
[root@master ~]# curl -s http://192.168.187.138:32064
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
[root@master ~]# curl http://10.107.143.88
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>