克隆三台虚拟机
虚拟机克隆部分不再赘述,注意:
克隆后ifconfig查看网卡ens3x所对应的ip,进入/etc/sysconfig/network-scripts/ifcfg-ens32修改1、ip为对应的IP;2、BOOTPROTO=static
(本文所述三台ip分别为:192.168.29.131、192.168.29.134、192.168.29.133,主机名对应为k8s-0、k8s-1、k8s-2)
环境准备
- 主机名解析
cat >> /etc/hosts << EOF
192.168.29.131 k8s-0
192.168.29.134 k8s-1
192.168.29.133 k8s-2
EOF
- 三台机器分别设置主机名
hostnamectl set-hostname <hostname>
- 时间同步
kubernetes要求集群中的节点时间必须精确一致,这里直接使用chronyd服务从网络同步时间
# 启动chronyd服务
systemctl start chronyd
# 设置chronyd服务开机自启
systemctl enable chronyd
# chronyd服务启动稍等几秒钟,就可以使用date命令验证时间了
date
- 禁用iptables和firewalld服务
kubernetes和docker在运行中会产生大量的iptables规则,为了不让系统规则跟它们混淆,直接关闭系统的规则
# 1 关闭firewalld服务
systemctl stop firewalld
systemctl disable firewalld
# 2 关闭iptables服务
systemctl stop iptables
systemctl disable iptables
- 禁用selinux
selinux是linux系统下的一个安全服务,关闭它
# 编辑 /etc/selinux/config 文件,修改SELINUX的值为disabled
# 注意修改完毕之后需要重启linux服务
SELINUX=disabled
# sed -i 's/enforcing/disabled/' /etc/selinux/config # 永久
# setenforce 0 # 临时
- 禁用swap分区
# vim /etc/fstab 分区配置文件,注释掉swap分区一行
# 注意修改完毕之后需要重启linux服务
UUID=455cc753-7a60-4c17-a424-7741728c44a1 /boot xfs defaults 0 0
/dev/mapper/centos-home /home xfs defaults 0 0
# /dev/mapper/centos-swap swap swap defaults 0 0
# 关闭swap
swapoff -a # 临时
# sed -ri 's/.*swap.*/#&/' /etc/fstab # 永久
- 修改linux的内核参数
# 修改linux的内核参数,添加网桥过滤和地址转发功能
# 编辑/etc/sysctl.d/kubernetes.conf文件,添加如下配置:
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
# 重新加载配置
[root@master ~]# sysctl -p
# 加载网桥过滤模块
[root@master ~]# modprobe br_netfilter
# 查看网桥过滤模块是否加载成功
[root@master ~]# lsmod | grep br_netfilter
- 配置ipvs功能
# 1 安装ipset和ipvsadm
[root@master ~]# yum install ipset ipvsadmin -y
# 2 添加需要加载的模块写入脚本文件
[root@master ~]# cat <<EOF > /etc/sysconfig/modules/ipvs.modules
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF
# 3 为脚本文件添加执行权限
[root@master ~]# chmod +x /etc/sysconfig/modules/ipvs.modules
# 4 执行脚本文件
[root@master ~]# /bin/bash /etc/sysconfig/modules/ipvs.modules
# 5 查看对应的模块是否加载成功
[root@master ~]# lsmod | grep -e ip_vs -e nf_conntrack_ipv4
- 重启服务器
上面步骤完成之后,需要重新启动linux系统
[root@master ~]# reboot
安装docker
- Kubernetes 默认 CRI( 容器运行时) 为 Docker, 因此先安装 Docker
# 1 切换镜像源
[root@master ~]# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
# 2 查看当前镜像源中支持的docker版本
[root@master ~]# yum list docker-ce --showduplicates
# 3 安装特定版本的docker-ce
# 必须指定--setopt=obsoletes=0,否则yum会自动安装更高版本
[root@master ~]# yum install --setopt=obsoletes=0 docker-ce-18.06.3.ce-3.el7 -y
# 4 添加一个配置文件yum
# Docker在默认情况下使用的Cgroup Driver为cgroupfs,而kubernetes推荐使用systemd来代替cgroupfs
[root@master ~]# mkdir /etc/docker
# 配置仓库地址
[root@master ~]# cat <<EOF > /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": ["https://kn0t2bca.mirror.aliyuncs.com"]
}
EOF
# 5 启动docker
[root@master ~]# systemctl start docker
[root@master ~]# systemctl enable docker
# 6 检查docker状态和版本
[root@master ~]# docker version
- 安装K8S组件
# 由于kubernetes的镜像源在国外,速度比较慢,这里切换成国内的镜像源
# vim /etc/yum.repos.d/kubernetes.repo,添加下面的配置
cat >/etc/yum.repos.d/kubernetes.repo <<EOF
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
安装kubeadm、kubelet和kubectl
# 安装kubeadm、kubelet和kubectl
[root@master ~]# yum install --setopt=obsoletes=0 kubeadm-1.17.17-0 kubelet-1.17.17-0 kubectl-1.17.17-0 -y
# 配置kubelet的cgroup
# 编辑/etc/sysconfig/kubelet,添加下面的配置
KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"
# 4 设置kubelet开机自启
[root@master ~]# systemctl enable kubelet
- 准备集群镜像
在安装kubernetes集群之前,必须要提前准备好集群需要的镜像,所需镜像可以通过下面命令查看
# 在安装kubernetes集群之前,必须要提前准备好集群需要的镜像,所需镜像可以通过下面命令查看
[root@master ~]# kubeadm config images list
创建脚本do.sh(放于~/下),master执行下面的脚本,下面脚本的目的是拉取国内的镜像,然后tag打标签为k8s的镜像,这样创建集群的时候就不需要拉取k8s的镜像了
# 下载镜像
# 此镜像在kubernetes的仓库中,由于网络原因,无法连接,下面提供了一种替代方案
images=(
kube-apiserver:v1.17.17
kube-controller-manager:v1.17.17
kube-scheduler:v1.17.17
kube-proxy:v1.17.17
pause:3.1
etcd:3.4.3-0
coredns:1.6.5
)
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
- 集群初始化
master节点上执行,初始化kubeadm
# 创建集群 # 只在master结点运行
[root@master ~]# kubeadm init \
--kubernetes-version=v1.17.17 \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.96.0.0/12 \
--apiserver-advertise-address=192.168.29.131
# 只需要改最后一个地址
* --apiserver-advertise-address=192.168.29.131 :这里的IP地址是master主机的地址,为上面的eth0网卡的地址;
* pod-network-cidr:pod之间的访问
# ===================输出信息========================
Your Kubernetes control-plane has initialized successfully! # 控制面板就是master
To start using your cluster, you need to run the following as a regular user:
然后他告诉你如果想要使用集群,需要把配置文件放到家目录下
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
你可以使用k8s集群了 但是你应该安装网络插件
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each as root:
# 如果你想要添加工作结点,可以在node结点上以root身份执行下面的话
kubeadm join 192.168.56.100:6443 --token 15ckqi.et50udit3pqdn180 \
--discovery-token-ca-cert-hash sha256:a23f2c32749a128d653712e33c4045e5932339ddd96e61251348b203cfdba4bb
# ===================根据输出信息做一些操作========================
[root@master ~]# mkdir -p $HOME/.kube
[root@master ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@master ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
- 添加node节点
node节点上执行即可
# 将node节点加入集群 # 自己输入自己命令行输出的,不要全部复制
[root@master ~]# kubeadm join 192.168.56.100:6443 --token 15ckqi.et50udit3pqdn180 \
--discovery-token-ca-cert-hash sha256:a23f2c32749a128d653712e33c4045e5932339ddd96e61251348b203cfdba4bb
# 查看集群状态 状态均为NotReady,因为还没有配置网络插件
[root@master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master NotReady master 6m43s v1.17.4
node1 NotReady <none> 22s v1.17.4
node2 NotReady <none> 19s v1.17.4
注意上面都是NotReady,因为没有为k8s集群安装网络
添加网络插件
- kubernetes支持多种网络插件,比如flannel
- 有了kube-flannel.yml文件(下文贴出源码),在文件所在目录执行命令
kubectl apply -f kube-flannel.yml
- 之后查看集群状态
kubectl get nodes
<