一、前言
本文讲述从零开始搭建 k8s 集群,均使用国内镜像,版本均统一,使用两个虚拟机,一个主节点,一个从节点,保证 k8s 一次搭建成功。
注意:Kubernetes,简称 K8s,是用 8 代替名字中间的 8 个字符 “ubernete” 而成的缩写。
二、Centos 最小化安装
安装 K8S 需要使用 Centos7,每个机器至少 2 个处理器和 2G,这是 k8s 官网是要求的。
2.1 vmware 最小化安装 centos7
vmware 最小化安装 centos7,下载好镜像,不断下一步,直到完成。
先到官网 www.centos.org/download/ 下载 centos.iso,如下:
国内的,直接选阿里云镜像就好 mirrors.aliyun.com/centos/7.9.…
具体安装可以参见
其实没这么麻烦,只需要配置磁盘这个必选就好了,其他都不用配置,不断下一步,最好就安装好了。
2.2 配置静态 IP
创建好的虚拟机 ping www.baidu.com 失败,需要配置好静态 ip,才能连同外网。
输入 vi /etc/sysconfig/network-scripts/ifcfg-ens33 然后按照如下图编辑,最后 service network restart 保存即可
BOOTPROTO=static ONBOOT=yes DNS1=114.114.114.114 这三个是写死的,那么其他三个 ip 子网掩码 网关是如何确定的呢?这个和本机的 ip 无关,只和 vmware 的虚拟网络编辑器有关。
vware 的虚拟网络编辑器,需要配置子网掩码、子网 ip、网关 ip
首先是子网掩码,一般都是 C 类,配置为 255.255.255.0 ,没什么好说的,然后是子网 ip,这个子网 ip 要受到子网掩码的限制,只有前面三个字节,最后一个字节为 0,一般是 xxx.xxx.xxx.0,这里子网 IP 配置为 192.168.100.0,然后再是网关(就是虚拟网络编辑器的 ip),网关 ip 又受到子网 ip 的限制,前面三个字节需要和子网 ip 一样,表示是这个子网段内的 ip, 这里配置为 192.168.100.2,其他可以配置为该子网内任意一个 192.168.100.1 - 192.168.100.127,如下图:
配置好虚拟网络编辑器之后,再来看静态 ip 的三个字段,NETMASK=255.255.255.0 没问题,c 类都是这样配置,然后是网关 ip GATEWAY,这里必须和虚拟网络编辑器的那个网关 ip 一致就是 192.168.100.2,所以配置 GATEWAY=192.168.100.2,然后就是自己的 IPADDR 了,要保证两点,在子网段内 且 不和网关 ip 及该子网段内其他 ip 冲突,在子网段内就是 192.168.100 开头,不和网关 ip 及该子网段内其他 ip 冲突,就是最后一个不能为 2 或者其他用过的,所以一个是 150 一个是 151,即 192.168.100.150 和 192.168.100.151 。
配置静态 ip 之后,就可以用 xshell 连接并操作了,不用再使用 vmware 敲命令,也有 yum 命令,缺少什么都可以随时下载,比如最小安装没有 wget 命令,可以 yum -y install wget。
因为我们的两个虚拟机需要作为 K8S 的两个节点,每个虚拟机处理数量一定要大于等于 2,每个虚拟机内存数量一定要大于等于 2G,vmware 默认是每个虚拟机处理器数量是 1,内存是 1G,需要手动设置一下,
三、K8S 集群搭建
从 3.1 到 3.6,所有机器都执行
3.7 和 3.8 只在主节点上执行
3.9 的 kube join 只在从节点上执行 (测试 kubectl get nodes 在主节点上执行,因为从节点没有. kube/,无法通过 kubectl 操作 k8s 集群)
3.10 集群新建 pod 测试,在主节点上执行,因为从节点没有. kube/,无法通过 kubectl 操作 k8s 集群
3.1 更新 yum
3 台机器都需要执行
yum -y update
yum install -y conntrack ipvsadm ipset jq sysstat curl iptables libseccomp
3.2 安装 Docker
在每一台机器上都安装好 Docker,版本为 18.09.0
01 安装必要的依赖
sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
02 设置 docker 仓库
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
然后设置一下阿里云镜像加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://orptaaqe.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
03 安装 docker
yum install -y docker-ce-18.09.0 docker-ce-cli-18.09.0 containerd.io
04 启动 docker
sudo systemctl start docker && sudo systemctl enable docker
05 检查 docker 是否安装并启动好了
3.3 修改 hosts 文件
01 机器 192.168.100.150 执行两句
sudo hostnamectl set-hostname m
vi /etc/hosts
192.168.100.150 m
192.168.100.151 w1
02 机器 192.168.100.151 执行两句
sudo hostnamectl set-hostname w1
vi /etc/hosts
192.168.100.150 m
192.168.100.151 w1
03 每天机器上都要测试
每个步骤配置完成之后,都要局部测试,这样才不会出问题
3.4 系统基础前提配置
每个机器上都要执行(机器 192.168.100.150 和 机器 192.168.100.151),如下:
# (1)关闭防火墙
systemctl stop firewalld && systemctl disable firewalld
# (2)关闭selinux
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
# (3)关闭swap
swapoff -a
sed -i '/swap/s/^\(.*\)$/#\1/g' /etc/fstab
# (4)配置iptables的ACCEPT规则
iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat && iptables -P FORWARD ACCEPT
# (5)设置系统参数
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
3.5 安装 kubeadm, kubelet and kubectl
每个机器上都要执行(机器 192.168.100.150 和 机器 192.168.100.151),如下:
(1) 配置 yum 源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[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
(2) 安装 kubeadm&kubelet&kubectl
yum install -y kubectl-1.14.0-0
yum install -y kubelet-1.14.0-0
yum install -y kubeadm-1.14.0-0
这三个东西一定要保证版本统一,一定要安装这个安装顺序来完成
因为 kubeadm 依赖 kubelet,如果先安装 kubeadm,则 kubelet 的 1.23 版本就会被安装上去,然后再执行 yum install -y kubelet-1.14.0-0
会安装不上去,然后版本不统一,主节点初始化 init 报错
这才是正确的
及时测试:
kubectl version
kubelet --version
kubeadm version
版本必须都是 1.4.0,如果版本错了要删除
yum -y remove kubelet
yum -y remove kubectl
yum -y remove kubeadm
(3) docker 和 k8s 设置同一个 cgroup
# 编辑docker的daemon.json文件,每个节点都要执行
vi /etc/docker/daemon.json
"exec-opts": ["native.cgroupdriver=systemd"],
systemctl restart docker
# kubelet,这边如果发现输出directory not exist,也说明是没问题的,大家继续往下进行即可
sed -i "s/cgroup-driver=systemd/cgroup-driver=cgroupfs/g" /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
systemctl enable kubelet && systemctl start kubelet
3.6 配置国内镜像
(1) 创建 kubeadm.sh 脚本,用于拉取镜像 / 打 tag / 删除原有镜像
#!/bin/bash
set -e
KUBE_VERSION=v1.14.0
KUBE_PAUSE_VERSION=3.1
ETCD_VERSION=3.3.10
CORE_DNS_VERSION=1.3.1
GCR_URL=k8s.gcr.io
ALIYUN_URL=registry.cn-hangzhou.aliyuncs.com/google_containers
images=(kube-proxy:${KUBE_VERSION}
kube-scheduler:${KUBE_VERSION}
kube-controller-manager:${KUBE_VERSION}
kube-apiserver:${KUBE_VERSION}
pause:${KUBE_PAUSE_VERSION}
etcd:${ETCD_VERSION}
coredns:${CORE_DNS_VERSION})
for imageName in ${images[@]} ; do
docker pull $ALIYUN_URL/$imageName
docker tag $ALIYUN_URL/$imageName $GCR_URL/$imageName
docker rmi $ALIYUN_URL/$imageName
done
(2) 运行脚本和查看镜像
# 运行脚本
sh ./kubeadm.sh
# 查看镜像
docker images
至此,上面的 3.1 到 3.6 是每个节点都要执行的,就是机器 192.168.100.150 和 192.168.100.151 都要同时执行的,在 Xshell 里面,通过
3.7 kube init 初始化 master
到此为止,两个机器 192.168.100.150 和 192.168.100.151 还需要没有主次之分,还没有说哪个是 k8s 的主节点,现在 3.7 这个步骤只需要在 192.168.100.150 节点执行,让这个机器成为 k8s 主节点。
(2) 初始化 master 节点
kubeadm init --kubernetes-version=1.14.0 --apiserver-advertise-address=192.168.100.150 --pod-network-cidr=10.244.0.0/16
在 192.168.100.150 机器上执行,然后这个 --apiserver-advertise-address=192.168.100.150 这样写
会得到一句
kubeadm join 192.168.100.150:6443 --token 7oahxf.bk0rywevgu0xjouy
–discovery-token-ca-cert-hash sha256:4f84a48cc41343848d0b2f807c38937bc96d3d43e821f06b0c143a5282a38204
一定要复制粘贴出来,下一个步骤在 192.168.100.151 机器上执行这句。
初始化完成执行后,继续只在 主节点 上执行,这三句,如下:
mkdir -p $HOME/.kube
cd .kube/
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
注意:我们所说的只有主节点才能通过 kubectl 命令操作 k8s 集群是因为,只有主节点上才完成这三步操作,才有 .kube 目录,如果从节点上也完成了这三句,也有 .kube 目录,也是可以通过 kubectl 命令操作 k8s 集群的。
(4) 测试:验证 pod 和健康检查(这两句也是只在 master 节点上执行)
# 验证pod
kubectl get pods -n kube-system
# 健康检查(不要怀疑,就是healthz)
curl -k https://localhost:6443/healthz
3.8 部署 calico 网络插件
k8s 中,网络插件是为了 k8s 集群内部通信,所以必须安装一个网络插件,有很多选择,这里选择 calico,同样在 master 节点上操作
# 在k8s中安装calico(这条命令很快的)
kubectl apply -f https://docs.projectcalico.org/v3.9/manifests/calico.yaml
# 确认一下calico是否安装成功 -w可以实时变化(看到calico都好了表示网络插件好了)
kubectl get pods --all-namespaces -w
测试验证是否安装成功,这里的 calico 两个显示 Running 就表示安装成功了。
从 3.1 到 3.6,所有机器都执行,3.7 和 3.8 只在主节点上执行,接下来的 3.9 的 kube join 只在从节点上执行 (测试 kubectl get nodes 在主节点上执行,因为从节点没有. kube/,无法通过 kubectl 操作 k8s 集群)
3.9 kube join
(1) 在从节点上执行 kube join 命令,如下
kubeadm join 192.168.100.150:6443 --token 7oahxf.bk0rywevgu0xjouy \
--discovery-token-ca-cert-hash sha256:4f84a48cc41343848d0b2f807c38937bc96d3d43e821f06b0c143a5282a38204
记得保存初始化 master 节点的最后打印信息,注意这边大家要自己的,下面我的只是一个参考
(2) 在 master 节点上检查集群信息(node 的正常状态是 ready,pod 的正常状态是 running)
当每个节点都是 Ready,表示完成。
3.10 新建 Pod 测试整个集群
(1) 定义 pod.yml 文件,比如 pod_nginx_rs.yaml
cat > pod_nginx_rs.yaml <<EOF
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: nginx
labels:
tier: frontend
spec:
replicas: 3
selector:
matchLabels:
tier: frontend
template:
metadata:
name: nginx
labels:
tier: frontend
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
EOF
(2) 根据 pod_nginx_rs.yml 文件创建 pod
kubectl apply -f pod_nginx_rs.yaml
(3) 查看 pod
kubectl get pods
kubectl get pods -o wide
kubectl describe pod nginx
(4) 感受通过 rs 将 pod 扩容
kubectl scale rs nginx --replicas=5
kubectl get pods -o wide
(5) 删除 pod
kubectl delete -f pod_nginx_rs.yaml
四、尾声
从零开始搭建 k8s 集群,完成了。
天天打码,天天进步!!