前言

本系列会继续深入研究 Kubernetes 的其他 API 对象,也就是那些在 Docker 中不存在的但对云计算、集群管理至关重要的概念。

这就需要一个比 minikube 更真实的 Kubernetes 环境,它应该是一个多节点的 Kubernetes 集群,这样更贴近现实中的生产系统,能够让我们尽快地拥有实际的集群使用经验。

所以我们改用 kubeadm 搭建一个 Kubernetes 集群,这里是kubeadm 文档。


一、实验环境

1.kubeadm 介绍

Kubernetes 由很多组件构成(也可以访问Kubernetes 官方文档 - 组件复习组件构成),这些组件的配置和相互关系非常复杂,使用 Shell 或者 Ansible 这样的自动化运维工具部署的难度很高,还需要具有相当专业的运维管理知识才能搭建、配置以及管理集群。

为了简化 Kubernetes 的部署工作,社区出现了一个专门用来在集群里安装 Kubernetes 的工具 kubeadm ,意思是 Kubernetes Admin

kubeadm 的原理和 minikube 类似,都是用容器和镜像封装 Kubernetes 的各种组件。kubeadm 的目标是轻松地在集群中部署 Kubernetes,并且让集群达到生产级的质量。

kubeadm 还具有了和 minikube 一样的易用性,只要很少的几条命令,如 init join upgrade reset 就能够完成 Kubernetes集群的管理维护工作,这让它不仅适用于集群管理员,也适用于开发、测试人员。

2.实验环境介绍

下面是集群示意图,当然里面的主机都是使用虚拟机软件 VMware Workstation 虚拟出来的。
在这里插入图片描述

所谓的多节点集群,要求服务器应该有两台或者更多,为了简化我们只取最小值,所以这个 Kubernetes 集群就只有两台主机,一台是 Master 节点,另一台是 Worker 节点。后面以在这个集群里添加更多的节点。

基于模拟生产环境的考虑,在 Kubernetes 集群之外还需要有一台起辅助作用的服务器。它的名字叫 Console,意思是控制台,我们要在上面安装命令行工具 kubectl,所有对 Kubernetes 集群的管理命令都是从这台主机发出去的。这也比较符合实际情况,因为安全的原因,集群里的主机部署好之后应该尽量少直接登录上去操作。当然Console这台主机只是逻辑上的概念,不一定要是独立。

二、安装步骤

1.安装虚拟机

在这里我使用 VMware Workstation 安装虚拟机。虚拟机的操作系统是 CentOS Linux release 7.9.2009 (Core)
我们先安装一台虚拟机然后克隆这台虚拟机,再稍微已更改一下配置即可。
在这里插入图片描述
虚拟机的配置如图所示,有两点需要注意:

  • Master 节点需要运行 apiserver、etcd、scheduler、controller-manager 等组件,管理整个集群,所以对配置要求比较高,至少是 2 核 CPU、2GB 的内存(官方是这么建议,但是2GB可能不够,所以最好设置4G)。
  • 机器上部署的网卡:网络类型 NAT 就可以

在复制虚拟机的时候,会出现IP重复的情况,这时候需要你这边手动对复制出来的虚拟机更改IP:
我这里的步骤是(针对的是Centos7 其他系统可以百度):

# 修改IP
[root@k8s-console ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE="Ethernet"
BROWSER_ONLY="no"
BOOTPROTO="static"
DEFROUTE="yes"
NAME="ens33"
DEVICE="ens33"
ONBOOT="yes"
IPADDR="10.0.0.13"      # 需要修改的地方,这个是我这边的IP信息,请根据实际情况进行修改
NETMASK="255.255.255.0"
GATEWAY="10.0.0.254"
DNS1="223.5.5.5"
DNS2="223.6.6.6"

# 重启网卡
[root@k8s-console ~]# systemctl restart network
[root@k8s-console ~]# ip a s # 查看ip是否已更改

2.安装 kubeadm 前的准备工作

参考官方文档:安装 kubeadm

2.1 Kubernetes 使用主机名来区分集群内的节点,所以每台主机的 hostname 不可重名。修改 /etc/hostname 这个文件来重命名 hostname:
Master 节点命名为 k8s-master01,Worker 节点命名为 k8s-worker01

hostnamectl set-hostname k8s-master01

2.2 将 SELinux 设置为 permissive 模式(相当于将其禁用)

sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

2.3 关闭防火墙

systemctl stop firewalld.service 
systemctl disable firewalld.service

2.4 关闭swap(避免内存交换至磁盘导致性能下降)

 $ sudo swapoff -a
 $ sudo sed -ri '/\sswap\s/s/^#?/#/' /etc/fstab

3.安装容器运行时

这里我还是选择安装 docker 作为容器运行时,因为我安装的是Kubernetes 1.23 版本
后面1.24 以上不再支持 Docker Engine 作为容器运行时,如果安装的是比这更高的版本可以选择containerd 作为容器运行时。

yum install -y docker
systemctl enable docker --now

4.安装kubeadmin

配置k8s yum源

//定义kubernetes源
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
# 重新缓存
yum clean all
yum makecache

安装kubeadm kubelet kubectl 我这里安装的是1.23.3版本的k8s

# master 节点
yum install -y kubeadm-1.23.3 kubelet-1.23.3 kubectl-1.23.3

# 启动kubelet并设置开机自启
systemctl enable --now kubelet

初始化k8s master节点

//查看初始化需要的镜像
kubeadm config images list

// 下载 Kubernetes 组件镜像
kubeadm init \ 
--pod-network-cidr=10.10.0.0/16 \
--apiserver-advertise-address=10.0.0.11 \
--kubernetes-version=v1.23.3 \
--image-repository  registry.aliyuncs.com/google_container

参数

  • --pod-network-cidr 设置集群中 Pod 的 IP 地址段
    - --apiserver-advertise-address 指定 apiServer 的 IP 地址,对于多网卡服务器来说很重要,这里我们选择 Host-Only 网络的网卡,也就是master节点上的IP
  • --kubenetes-version 指定 Kubernetes 的版本号(和下载的kubeadm版本一致)
  • --image-repository 指定镜像源,这里指定的是阿里的镜像源方便快速拉取镜像

Kubeadm 的安装过程很过就结束了,它会在屏幕上提示接下来的工作:

To start using your cluster, you need to run the following as a regular user:

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

意思是要在本地建立一个“.kube”目录,然后拷贝 kubectl 的配置文件。

最后是一个很重要的 kubeadm join 提示,其他节点要加入集群必须要用指令里的 tokenca 证书,所以这条命令务必拷贝后保存好。当然,也可以使用 sudo kubeadm token create --print-join-command 来再次显示加入命令。

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 10.0.0.11:6443 --token m47slz.ch7ddh9t5p0ry1vz \
	--discovery-token-ca-cert-hash sha256:9df0290d94969794b1d34dc2e3704136c101c4f7c1a09062173927c430521b60

安装完成后,你就可以使用 kubectl get node 来检查 Kubernetes 的版本和集群的节点状态了:

[root@k8s-console ~]# kubectl get node
NAME           STATUS   ROLES                  AGE   VERSION
k8s-master01   NotReady    control-plane,master   14m   v1.23.3

你会注意到 Master 节点的状态是NotReady,这是由于还缺少网络插件,集群的内部网络还没有正常运作。

5. 安装 Flannel 网络插件

Kubernetes 定义了 CNI 标准,有很多网络插件,这里选择最常用的 Flannel,可以在它的 GitHub 仓库找到相关文档。

# 可以直接下载这个yaml,然后进行修改
 wget https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml

它的安装也很简单,只需要使用项目的 kube-flannel.yml 在 Kubernetes 里部署一下就好了。不过因为它应用了 Kubernetes 的网段地址,需要修改文件里的 net-conf.json 字段,把 Network 改成刚才 kubeadm 的参数 --pod-network-cidr 设置的地址段。

在这里插入图片描述
然后我们安装 Flannel:

$ kubectl apply -f kube-flannel.yml
namespace/kube-flannel created
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
serviceaccount/flannel created
configmap/kube-flannel-cfg created
daemonset.apps/kube-flannel-ds created

kubectl version 查看节点版本
在这里插入图片描述

6.安装 Worker 节点

如果成功安装了 Master 节点,那么 Worker 节点的安装就简单多了,只需要用之前拷贝的那条 kubeadm join 命令就可以了:

sudo kubeadm join 10.0.0.11:6443 --token m47slz.ch7ddh9t5p0ry1vz \
        --discovery-token-ca-cert-hash sha256:9df0290d94969794b1d34dc2e3704136c101c4f7c1a09062173927c430521b60
This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.

Run 'kubectl get nodes' on the control-plane to see this node join the cluster.

在 Master 上查看 Node:

[root@k8s-console ~]# kubectl get nodes -o wide
NAME           STATUS   ROLES                  AGE   VERSION   INTERNAL-IP   EXTERNAL-IP   OS-IMAGE                KERNEL-VERSION           CONTAINER-RUNTIME
k8s-master01   Ready    control-plane,master   14m   v1.23.3   10.0.0.11     <none>        CentOS Linux 7 (Core)   3.10.0-1160.el7.x86_64   docker://1.13.1
k8s-work01     Ready    <none>                 14m   v1.23.3   10.0.0.12     <none>        CentOS Linux 7 (Core)   3.10.0-1160.el7.x86_64   docker://1.13.1

最后我们尝试运行一个 nginx pod:

$ kubectl run ngx --image=nginx:alpine
pod/ngx created
$ kubectl get pod -o wide 
NAME   READY   STATUS    RESTARTS   AGE   IP          NODE      NOMINATED NODE   READINESS GATES
ngx    1/1     Running   0          30s   10.10.1.2   worker1   <none>           <none>

小技巧:
在使用 kubectl 的 Linux 主机上开启自动补全

$ echo 'source <(kubectl completion bash)' >>~/.bashrc

重新加载 Shell 后,kubectl 自动补全功能即可生效。 若要在当前 Shell 会话中启用 Bash 补全功能,需要运行:

$ exec bash

总结

1.kubeadm 是一个方便易用的 Kubernetes 工具,能够部署生产级别的 Kubernetes 集群。
2.安装 Kubernetes 之前需要修改主机的配置,包括主机名、Docker 配置、网络设置、交换分区等。
3.Kubernetes 的组件镜像存放在 gcr.io,国内下载比较麻烦,可以考虑从国内镜像网站获取。
4.安装 Master 节点需要使用命令 kubeadm init,安装 Worker 节点需要使用命令 kubeadm join,还要部署 Flannel 等网络插件才能让集群正常工作。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐