2、基于kubeadm搭建K8S环境

目录

一、环境说明

二、初始化所有节点

三、修改三台服务器主机名,并写入host文件

四、调整内核参数

五、所有节点安装Docker

六、所有节点配置K8S源

七、所有节点安装kubeadm,kubelet和kubectl

八、部署 kubernetes Master 节点

九、k8s-node 节点加入 master 节点

十、master节点部署 CNI 网络插件

十一、检查master节点

十二、测试 kubernetes 集群

十三、token制作


kubeadm 是官方社区推出的一个用于快速部署 kubernetes 集群的工具,这个工具能通过两条指令完成一个 kubernetes 集群的部署:

  • 第一,创建一个 Master 节点:kubeadm init
  • 第二, 将 Node 节点加入到当前集群中:kubeadm join <Master 节点的 IP 和端口 >

一、环境说明

虚拟机配置:

服务器类型

角色

IP地址

k8s-master

master

192.168.1.33

k8s-node01

node

192.168.1.31

k8s-node02

node

192.168.1.32

二、初始化所有节点

所有节点,需关闭防火墙规则,关闭selinux,关闭swap交换。

# 关闭防火墙
[root@localhost ~]# systemctl stop firewalld
# 禁用 firewalld 服务
[root@localhost ~]# systemctl disable firewalld
# 临时关闭 selinux
[root@localhost ~]# setenforce 0
[root@localhost ~]# iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
# 关闭 swap
# 临时关闭【立即生效】查看使用 free 命令
[root@localhost ~]# swapoff -a
# 永久关闭【重启生效】
[root@localhost ~]# sed -ri 's/.*swap.*/#&/' /etc/fstab
[root@localhost ~]# free -g
              total        used        free      shared  buff/cache   available
Mem:              7           4           1           0           0           2
Swap:             0           0           0

以master为例,在node01、node02也需要执行:

三、修改三台服务器主机名,并写入host文件

cat >> /etc/hosts << EOF
192.168.1.33 master
192.168.1.31 node01
192.168.1.32 node02
EOF

当然也可以使用hostnamectl set-hostname xxx设置主机名称,如下:

# 【master 节点上操作】
hostnamectl set-hostname master
# 【node01 节点上操作】
hostnamectl set-hostname node01
# 【node02 节点操作】
hostnamectl set-hostname node02

四、调整内核参数

将桥接的 IPV4 流量传递到 iptables 链。

cat > /etc/sysctl.d/kubernetes.conf << EOF
#开启网桥模式,可将网桥的流量传递给iptables链
net.bridge.bridge-nf-call-ip6tables=1
net.bridge.bridge-nf-call-iptables=1
#关闭ipv6协议
net.ipv6.conf.all.disable_ipv6=1
net.ipv4.ip_forward=1
EOF

以master节点为例,node01、node02也需要执行:

接着在三个节点执行sysctl --system加载参数:

五、所有节点安装Docker

Kubernetes 默认 CRI(容器运行时)为 Docker,因此先安装 Docker。以master节点为例,node01、node02也需要执行:

# 配置一下 Docker 的 yum 源【阿里云】
cat >/etc/yum.repos.d/docker.repo<<EOF
[docker-ce-edge]
name=Docker CE Edge - \$basearch
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/\$basearch/edge
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
EOF

# 然后 yum 方式安装 docker
yum -y install docker-ce
# 查看 docker 版本
docker --version

# 配置 docker 的镜像源【阿里云】
cat >> /etc/docker/daemon.json << EOF
{
  "registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"]
}
EOF

# 启动 docker
systemctl enable docker
systemctl start docker
systemctl status docker

六、所有节点配置K8S源

执行下面的命令, 配置 k8s 的 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

以master为例,在node01、node02也需要执行:

七、所有节点安装kubeadm,kubelet和kubectl

安装 kubelet、kubeadm、kubectl,同时指定版本:

[root@localhost ~]# yum install -y kubelet-1.21.3 kubeadm-1.21.3 kubectl-1.21.3

以master节点为例,node01、node02也需要执行:

ps:这里根据网速快慢,可能需等待一些时间。

安装完毕之后,如下图。

k8s通过kubeadm安装出来以后都是以Pod方式存在,即底层是以容器方式运行,所以kubelet必须设置开机自启。

[root@localhost ~]# systemctl enable kubelet.service
Created symlink from /etc/systemd/system/multi-user.target.wants/kubelet.service to /usr/lib/systemd/system/kubelet.service.
[root@localhost ~]# systemctl start kubelet

八、部署 kubernetes Master 节点

这里只需要在master 节点上执行即可,在master节点(192.168.1.33)执行下面的脚本进行【集群初始化】:

kubeadm init \
--apiserver-advertise-address=192.168.1.33 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.21.3 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16

由于默认拉取镜像地址 k8s.gcr.io 国内无法访问,这里指定阿里云镜像仓库地址,【执行上述命令会比较慢,因为后台其实已经在拉取镜像了】,我们 docker images 命令即可查看已经拉取的镜像。

参数说明:

kubeadm init \
--apiserver-advertise-address=192.168.1.33 \                  #指定master监听的地址,修改为自己的master地址
--image-repository registry.aliyuncs.com/google_containers \   #指定为aliyun的下载源,最好用国内的
--kubernetes-version v1.18.0 \                 #指定k8s版本,1.18.0版本比较稳定
--service-cidr=10.96.0.0/12 \                  #设置集群内部的网络
--pod-network-cidr=10.244.0.0/16                #设置pod的网络
# service-cidr 和 pod-network-cidr 最好就用这个,不然需要修改后面的 kube-flannel.yaml 文件

执行完这个命令后,后台会拉取对应的镜像,需等待一些时间。

如下图就是拉取完成之后的结果:

这里我们继续回去看刚刚拉取的日志,有几个关键的信息:

通过注释,我们可以看到,如果要开始使用集群,需要执行上述框起来的脚本:

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

下面的kubeadm join脚本其实就是将node1、node2添加到master集群的命令,这个我们在下一个步骤使用。

九、k8s-node 节点加入 master 节点

这里我们只需要在node01(192.168.1.31)、node02(192.168.1.32)节点执行,我们直接复制前面一张图的kubeadm join脚本,将node01、node02两个节点加入到master集群中,注意只需要在node01、node02节点执行,不要在master节点上面执行,否则会报错。

kubeadm join 192.168.1.33:6443 --token ailzq6.z3r7d3u0ov225p99 \
        --discovery-token-ca-cert-hash sha256:45c01d464d97fe9d14d42c91b629bbe561aba2508e9db823f81b00b911c8ccfa 

默认 token 有效期为 24 小时,当过期之后,该 token 就不可用了。这时就需要重新创建 token,操作如下:

kubeadm token create --print-join-command

当我们把两个节点都加入进来后,就可以在master节点通过kubectl get nodes命令查看当前节点信息:

我们可以看到,node01、node02都成功加入到master集群了,但是状态目前还是NotReady,需要安装网络插件,来进行联网访问。

十、master节点部署 CNI 网络插件

先从GitHub仓库下载kube-flannel.yml:

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

国外站点下载很慢,经常连不上:

安装:

kubectl apply -f http://120.78.77.38/file/kube-flannel.yaml

安装完CNI网络插件后,三个节点的状态就变成Ready了。

我们使用kubectl get pod -n kube-system查看pod状态,可以看到,状态都是Running运行状态。

十一、检查master节点

使用kubectl get cs检查master节点状态。

我们看到controller-manager、scheduler的状态为unhealthy,表示不健康的状态。

我们需要修改配置文件:

  • vim /etc/kubernetes/manifests/kube-scheduler.yaml

将 --port=0注释掉。

  • vim /etc/kubernetes/manifests/kube-controller-manager.yaml

将 --port=0注释掉。

然后我们再次查询服务是否正常:

1)、使用kubectl get pods -A命令查询所有pod是否正常运行

2)、使用kubectl get cs命令查询master是否正常

3)、使用kubectl get nodes命令查询node节点是否ready

十二、测试 kubernetes 集群

在 Kubernetes 集群中创建一个 pod,这里我们使用k8s来部署nginx,验证是否正常运行。

# 下载 nginx 【会联网拉取 nginx 镜像】
kubectl create deployment nginx --image=nginx

# 暴露端口,让其它外界能够访问
kubectl expose deployment nginx --port=80 --type=NodePort

# 查看状态
kubectl get pods

通过kubectl get pods和kubectl get svc命令我们可以看到k8s已经成功帮我们自动拉取nginx镜像,并运行了一个容器,暴露端口为:30140。

注意,需要执行kubectl expose deployment nginx --port=80 --type=NodePort暴露端口

测试一下,master和node01、node02都能通过自己的IP的30140端口去访问:

  • 1)、master节点

  • 2)、node01节点

  • 3)、node02节点

可以发现我们的 nginx 已经成功启动了。

十三、token制作

node 节点加入集群需要生成的 token,token 有效期为 24 小时,过期需要重新创建。
创建命令为:kubeadm token create --print-join-command

然后就可以执行复制上面的kubeadm join将node节点加入master集群中。

猜你喜欢

转载自blog.csdn.net/Weixiaohuai/article/details/131686649