目录
一、环境说明
二、初始化所有节点
三、修改三台服务器主机名,并写入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集群中。