kubeadm 方式搭建 k8s 集群

本次搭建集群以一主两从为例。

一、环境准备

1.1 三台虚拟机

准备三台虚拟机,并安装 centos7 操作系统(安装步骤省略,如需请自行百度)。

1.2 固定 IP

为了便于测试,因此固定三个操作系统的 ip 地址(设置步骤省略,如需请自行百度),此处仅记录相关命令及可能会遇到的问题。
(1)打开终端,输入下方命令进行网络配置

vim /etc/sysconfig/network-scripts/ifcfg-ens33

(2)进行下图中的相关配置
kubeadm 方式搭建 k8s 集群_第1张图片
(3)有的帖子配置中是没有 DNS1 这一项的,我这边不加这一项是无法访问外网的,大家可尝试自行配置。
(4)三台虚拟机都需进行以上配置,只有 IPADDR 自行选择设置,其余保持不变。
(5)重启网络

systemctl restart network          或        service network restart 

(6) 检查是否可以连接外网,及三台虚拟机是否可以相互连接

ping www.baidu.com

1.3 网络配置

三台虚拟机相关网络配置如下:

k8smaster   192.168.0.110
k8snode1    192.168.0.111
k8snode2    192.168.0.112

1.4 硬件要求

最低要求:
kubeadm 方式搭建 k8s 集群_第2张图片

二、开始搭建

2.1 初始化,在每台虚拟机上执行以下操作

# 关闭防火墙
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

2.2 安装组件

所有节点需要安装以下组件 ,Kubernetes 默认 CRI(容器运行时)为 Docker,因此先安装 Docker。
Docker、kubeadm、kubelet、kubectl

2.2.1 安装 docker

# 配置 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

2.2.2 安装 kubeadm、kubelet、kubectl

# 安装 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 : 后面部署网络插件时需要用到,值不需要修改,但需要记录

初始化完成后,会有以下提示信息,如下图
kubeadm 方式搭建 k8s 集群_第3张图片(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

节点信息如下图:
kubeadm 方式搭建 k8s 集群_第4张图片

2.2.3 部署 CNI 网络插件(k8smaster 节点)

可以看到上述三个节点的状态为 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 的,多等一会。
kubeadm 方式搭建 k8s 集群_第5张图片
再次查看节点信息

kubectl get nodes

在这里插入图片描述
至此,k8s 集群搭建完成。

三、集群测试

# 创建 pod,以 nginx 为例
kubectl create deployment nginx --image=nginx

# 将 nginx 端口对外暴露
kubectl expose deployment nginx --port=80 --type=NodePort

# 获取 pod 信息
kubectl get pod,svc

kubeadm 方式搭建 k8s 集群_第6张图片
在 windows 中,打开浏览器,访问任意节点的 ip 加上 上图中的端口号即可访问 nginx,如下图:
kubeadm 方式搭建 k8s 集群_第7张图片
已成功访问到 nginx,测试成功。

四、部署 k8s 可视化管理平台(Dashboard)

4.1 下载 yaml 文件

 wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.4.0/aio/deploy/recommended.yaml

但是这个只能内部访问,所以要外部访问,要么部署 ingress,要么就是设置 service NodePort 类型,这里选择 service 暴露端口。修改 yaml 文件,开头位置增加如下两行,注意中间有空格:
kubeadm 方式搭建 k8s 集群_第8张图片

4.2 部署

kubectl apply -f recommended.yaml

如果出现一下错误提示信息
kubeadm 方式搭建 k8s 集群_第9张图片
说明 kubectl 版本过低,可以更新一下 kubectl 版本或者执行以下命令

kubectl apply -f recommended.yaml --validate=false

4.3 访问 dashboard

访问地址为 https://node节点 ip 地址:31443,例如 https://192.68.0.111:31443。如果谷歌浏览器无法访问,请更换浏览器,结果如下,可以看到登录时需要输入 token:
kubeadm 方式搭建 k8s 集群_第10张图片

4.4 创建登录用户及登录

# 创建用户配置文件
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}')

token如下:
kubeadm 方式搭建 k8s 集群_第11张图片
输入 token 登录后,进入到管理平台页面,如图:
kubeadm 方式搭建 k8s 集群_第12张图片

你可能感兴趣的:(云原生,k8s,kubernetes,linux,kubelet,docker,devops)