本次搭建集群以一主两从为例。
准备三台虚拟机,并安装 centos7 操作系统(安装步骤省略,如需请自行百度)。
为了便于测试,因此固定三个操作系统的 ip 地址(设置步骤省略,如需请自行百度),此处仅记录相关命令及可能会遇到的问题。
(1)打开终端,输入下方命令进行网络配置
vim /etc/sysconfig/network-scripts/ifcfg-ens33
(2)进行下图中的相关配置
(3)有的帖子配置中是没有 DNS1 这一项的,我这边不加这一项是无法访问外网的,大家可尝试自行配置。
(4)三台虚拟机都需进行以上配置,只有 IPADDR 自行选择设置,其余保持不变。
(5)重启网络
systemctl restart network 或 service network restart
(6) 检查是否可以连接外网,及三台虚拟机是否可以相互连接
ping www.baidu.com
三台虚拟机相关网络配置如下:
k8smaster 192.168.0.110
k8snode1 192.168.0.111
k8snode2 192.168.0.112
# 关闭防火墙
systemctl stop firewalld
# 禁用 firewalld 服务
systemctl disable firewalld
# 关闭 selinux
# 临时关闭
setenforce 0
# 永久关闭【重启生效】
sed -i 's/SELINUX=enforcing/\SELINUX=disabled/' /etc/selinux/config
# 关闭 swap
# 临时关闭【立即生效】可使用 free 命令进行查看
swapoff -a
# 永久关闭【重启生效】
sed -ri 's/.*swap.*/#&/' /etc/fstab
# 设置主机名 可使用 hostname 命令查看
# 在 k8smaster 执行
hostnamectl set-hostname k8smaster
# 在 k8snode1 执行
hostnamectl set-hostname k8snode1
# 在 k8snode2 执行
hostnamectl set-hostname k8snode2
# 在 master 节点添加 hosts(只需在 master 节点执行,ip地址需要改为自己的)
cat >> /etc/hosts << EOF
192.168.0.110 k8smaster
192.168.0.111 k8snode1
192.168.0.112 k8snode2
EOF
# 将桥接的 IPv4 流量传递到 iptables 的链
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
# 使配置生效
sysctl --system
# 三台机器时间同步
yum install ntpdate -y
ntpdate time.windows.com
所有节点需要安装以下组件 ,Kubernetes 默认 CRI(容器运行时)为 Docker,因此先安装 Docker。
Docker、kubeadm、kubelet、kubectl
# 配置 yum 源
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
# 安装 docker,不指定版本默认安装最新版本
yum -y install docker-ce
# 将 docker 设置为开机启动
systemctl enable docker
# 启动 docker
systemctl start docker
# 查看 docker 状态
systemctl status docker
# 查看 docker 版本
docker --version
# 设置 docker 仓库,改为阿里的
cat >> /etc/docker/daemon.json << EOF
{
"registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"]
}
EOF
# 重启 docker
systemctl restart docker
# 添加阿里 yum 软件源,便于其他组件的下载
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
# 安装 kubelet、kubeadm、kubectl,同时指定版本(不指定版本默认为最新版本)
yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0
# 设置开机自启
systemctl enable kubelet
# 在 192.168.0.110(k8smaster)上进行拉去镜像及初始化操作
kubeadm init --apiserver-advertise-address=192.168.0.110 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.18.0 --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16
# --apiserver-advertise-address : master 节点的 ip 地址
# --image-repository : 镜像仓库,使用阿里的
# --kubernetes-version :指定版本
# --service-cidr : 没有特殊要求,不与当前 ip 冲突即可
# --pod-network-cidr : 后面部署网络插件时需要用到,值不需要修改,但需要记录
初始化完成后,会有以下提示信息,如下图
(1)第一个红框中的信息表示初始化成功。
(2)第二个红框中的内容是接下来要执行的命令,在 master 节点执行。
(3)第三个红框中的内容分别是要在两个 node 节点执行的命令,表示加入到 master 节点下。
# 在 192.68.0.110(k8smaster)节点执行
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 查看节点(这时只能看到 k8smaster 节点)
kubectl get nodes
# 将第三个红框中的内容分别在两个 node 节点执行(复制你自己的)
kubeadm join 192.168.0.110:6443 --token 4l2xtv.rsxmkb5vk86rzse8 \
--discovery-token-ca-cert-hash sha256:f763626983b307cb5681dce2a3669fcb9356c755b8e30d377e74ecd8a2d31472
# 再次查看节点信息
kubectl get nodes
可以看到上述三个节点的状态为 NotReady,因此需要部署网络插件,进行联网访问, 网上给出的方案有很多,但经尝试后,总会存在一些问题,最终找到解决方案,如下:
# Calico是一个纯三层的数据中心网络方案,是目前Kubernetes主流的网络方案。
# 下载网络插件配置
wget https://docs.projectcalico.org/v3.14/manifests/calico.yaml
# 下载完后还需要修改里面定义Pod网络(CALICO_IPV4POOL_CIDR),与前面 kubeadm init 的 --pod-network-cidr指定的一样(10.244.0.0/16)
vim calico.yaml
# 搜索找到 CALICO_IPV4POOL_CIDR,在文件的下半部分
# 把两个#及#后面的空格去掉,并把 192.168.0.0/16 改成 10.244.0.0/16,修改后如下,保存退出
- name: CALICO_IPV4POOL_CIDR
value: "10.244.0.0/16"
# 然后进行部署插件
kubectl apply -f calico.yaml
# 查看 pod(k8s最小单元)
kubectl get pods -n kube-system
查看 pod 信息如图,需要所有的状态为 Running,否则三个节点的状态还是 NotReady,如果存在不是 Running 的,多等一会。
再次查看节点信息
kubectl get nodes
# 创建 pod,以 nginx 为例
kubectl create deployment nginx --image=nginx
# 将 nginx 端口对外暴露
kubectl expose deployment nginx --port=80 --type=NodePort
# 获取 pod 信息
kubectl get pod,svc
在 windows 中,打开浏览器,访问任意节点的 ip 加上 上图中的端口号即可访问 nginx,如下图:
已成功访问到 nginx,测试成功。
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.4.0/aio/deploy/recommended.yaml
但是这个只能内部访问,所以要外部访问,要么部署 ingress,要么就是设置 service NodePort 类型,这里选择 service 暴露端口。修改 yaml 文件,开头位置增加如下两行,注意中间有空格:
kubectl apply -f recommended.yaml
如果出现一下错误提示信息
说明 kubectl 版本过低,可以更新一下 kubectl 版本或者执行以下命令
kubectl apply -f recommended.yaml --validate=false
访问地址为 https://node节点 ip 地址:31443,例如 https://192.68.0.111:31443。如果谷歌浏览器无法访问,请更换浏览器,结果如下,可以看到登录时需要输入 token:
# 创建用户配置文件
cat >ServiceAccount.yaml<<EOF
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kubernetes-dashboard
EOF
# 创建admin-user
kubectl apply -f ServiceAccount.yaml
# 获取登录 token
kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print $1}')