Skip to content

什么是 Kubernetes

Kubernetes 官方解释:

Kubernetes 是 Google 开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。在生产环境中部署一个应用程序时,通常要部署该应用的多个实例以便对应用请求进行负载均衡。

通俗些讲,可以将 Kubernetes 看作是用来是一个部署镜像的平台。可以用来操作多台机器调度部署镜像,大大地降低了运维成本。

那么, KubernetesDocker 的关系又是怎样的呢?

一个形象的比喻:如果你将 docker 看作是飞机,那么 kubernetes 就是飞机场。在飞机场的加持下,飞机可以根据机场调度选择在合适的时间降落或起飞。

Kubernetes 中,可以使用集群来组织服务器的。集群中会存在一个 Master 节点,该节点是 Kubernetes 集群的控制节点,负责调度集群中其他服务器的资源。其他节点被称为 NodeNode 可以是物理机也可以是虚拟机。

安装之前的要求

在开始部署k8s集群之前,服务器需要满足以下条件:

  • 1️⃣至少两台以上的服务器,操作系统需要保持CentOS8.4这个版本。
  • 2️⃣服务器配置:Master节点服务器需要至少为2核4GB的配置,Node节点需要至少1核2GB的配置,硬盘至少40GB。
  • 3️⃣集群中的所有机器之间网络互通。
  • 4️⃣可以访问外网,需要拉取镜像。
  • 5️⃣禁止Swap分区。

基础安装

请注意

在基础安装这个部分,Mater 和 Node 节点都需要安装,安装文档的书写顺序执行即可。另外,服务器的系统版本为 CentOS8.4。

基础组件安装

vimLinux 下的一个文件编辑器; wget 可以用作文件下载使用;如果下面的都已经安装,可以跳过。

shell
yum install vim wget -y

修改主机名

hostnamectl set-hostname设置主机名称没有反应的话,只需要重新连接一下即可。

shell
# master节点执行
hostnamectl set-hostname k8smaster
# node1节点执行
hostnamectl set-hostname k8snode1
# 在node2节点执行
hostnamectl set-hostname k8snode2
# 在node3节点执行
hostnamectl set-hostname k8snode3

配置hosts

需要在Master节点和Node节点将他们的主机IP数据都存储到hosts一份。以下的IP仅供参考。

shell
cat >> /etc/hosts << EOF
10.0.0.6 k8smaster
10.0.0.7 k8snode
EOF

使用 ip addr 命令,获取本机 IP,将其添加到 /etc/hosts 内。本机 IP 如下图红色圈中所示。

时间同步

使用 chrony 来统一我们的系统时间和时区,服务器时间与阿里云服务器对齐。检查系统是否已经默认安装 chrony。。注意:在CentOS8.4系统中默认自带chrony,只需要启动即可。

检查是否安装:

shell
rpm -qa |grep chrony

安装 chrony 服务,如果已安装的话请跳转到启动并加入开机自启这一步。

shell
yum install chrony -y

启动并加入开机自启:

shell
# 启动chrony服务
systemctl start chronyd
# 设置开机自启
systemctl enable chronyd
# 查看chrony服务状态
systemctl status chronyd

配置阿里云的 ntp 服务,修改 /etc/chrony.conf 配置文件,将以下的内容修改到 chrony 的配置文件中,请注意中文注释的地方:

shell
[root@node1 ~]# cat /etc/chrony.conf
# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
# 下面这一行需要注释掉
# pool 2.centos.pool.ntp.org iburst
/**
 * 格式为:server 服务器ip地址 iburst
 * 添加阿里云的ntp服务器,可以多写几个ntp服务器,防止第一个服务器宕机,备用的其他ntp服务器可以继续进行时间同步
 * ip地址为服务器ip地址,iburst代表的是快速同步时间
 **/
# 仅需要添加下面三行内容即可
server ntp1.aliyun.com iburst
server ntp2.aliyun.com iburst
server ntp3.aliyun.com iburst

重启 chrony 服务使配置生效。

shell
# 重启chrony服务
systemctl restart chronyd
# 查看chrony服务状态
systemctl status chronyd
# 查看时钟源授时时间偏差值
chronyc sources
# 强制同步一次
chronyc -a makestep

关闭防火墙

因为 kubernetes 会创建防火墙规则,导致防火墙规则重复。所以这里我们要将防火墙关闭:

shell
# 停止firewalld服务
systemctl stop firewalld
# 禁止firewalld开机启动
systemctl disable firewalld

关闭 Swap分区

下一步我们需要关闭 Swap 分区。 SwapLinux 的交换分区,在系统资源不足时,Swap 分区会启用。这操作会拖慢我们的应用性能。应该让新创建的服务自动调度到集群的其他 Node 节点中去,而不是使用 Swap 分区。关闭方法如下:

shell
# 临时关闭;关闭swap主要是为了性能考虑
swapoff -a
# 可以通过这个命令查看swap是否关闭了
free
# 永久关闭
sed -ri 's/.*swap.*/#&/' /etc/fstab

禁用 SELinux

这是为了支持容器可以访问宿主机文件系统所做的,后续也许会优化掉:

shell
# 临时关闭
setenforce 0
# 永久禁用
sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config

安装 Docker

请注意

  1. Master 和 Node 节点均需要安装。

  2. 由于 Kubernetes 与 Docker 之间存在版本依赖,因此我们需要在此处安装指定版本的 Docker。另外,下面安装 Docker 的命令在 CentOS8.4 系统上执行的时候会多次失败,如有命令失败,请多次重试。

  1. 安装基本的依赖:
shell
yum install -y yum-utils device-mapper-persistent-data lvm2
  1. 设置 yum 源加速 Docker 的安装:
shell
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

查看可用的版本:

shell
yum list docker-ce --showduplicates | sort -r

查看到的 Docker 可用版本如下所示,红色选中区域的内容即为需要安装的 Docker 版本号。

执行下面的命令安装即可,下面的命令为本次执行需要的版本号,直接复制执行即可:

shell
sudo yum install docker-ce-20.10.15-3.el8 docker-ce-cli-20.10.15-3.el8 containerd.io

安装完毕后,我们使用使用 systemctl 启动 Docker 即可。

shell
# 启动Docker
systemctl start docker
# 开启Docker的开机自启动
systemctl enable docker

执行 docker -v ,如果显示以下 docker 版本的信息,代表 docker 安装成功。

shell
[root@master ~]# docker -v
Docker version 20.10.15, build fd82621
  1. 接下来,我们还需要修改一下 docker 的cgroupdriversystemd,这样做是为了避免后面与 k8s 的冲突,下面的内容也是直接复制到控制台执行即可。
shell
cat > /etc/docker/daemon.json <<EOF
{
  "exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
  1. 我们拉取 Docker 镜像时,一般默认会去 Docker 官方源拉取镜像。但是国内出海网速实在是太慢,所以需要更换镜像源进行镜像下载加速。编辑配置文件,修改镜像源:vi /etc/docker/daemon.json,将下面的内容追加进去。
json
{
  "registry-mirrors": [
    "https://do.nark.eu.org",
    "https://dc.j8.work",
    "https://docker.m.daocloud.io",
    "https://dockerproxy.com",
    "https://docker.mirrors.ustc.edu.cn",
    "https://docker.nju.edu.cn",
    "https://dockerproxy.1panel.live",
    "https://docker.1panel.live",
    "https://docker.1panelproxy.com",
    "https://proxy.1panel.live"
  ],
  // 下面的这一段视情况添加,是我们自己部署的Harbor镜像仓库,没有删除下面的内容即可。
  "insecure-registries": ["http://[私有库地址]:[私有库端口]"]
}

修改以后重启:

shell
systemctl daemon-reload
systemctl restart docker

安装 Kubernetes

请注意

  1. Master 和 Node 节点均需要安装。
  2. 上面安装的 Docker 版本为 20.10.15,此处安装的 Kubernetes 版本需要与之有对应关系。我们在此处选择的 Kubernetes 版本为 1.23.6。

从这里我们开始安装 Kubernetes 的相关组件,首先先将安装源更换为为国内的阿里云源,直接复制下面的内容到控制台执行即可。

shell
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
        http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

接着直接使用 yum 命令安装 kubeletkubeadmkubectl 即可,安装完毕后启用 kubelet 即可。

提示

  • kubeletKubernetes 中的核心组件。它会运行在集群的所有节点上,并负责创建启动服务容器。
  • kubectl 则是 Kubernetes 的命令行工具。可以用来管理,删除,创建资源。
  • kubeadm 则是用来初始化集群,子节点加入的工具。
shell
# 安装kubernetes
yum install -y kubelet-1.23.6 kubeadm-1.23.6 kubectl-1.23.6
# 启动kubelet
systemctl enable kubelet
systemctl start kubelet

设置bridge-nf-call-iptables

shell
echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables

Master 节点单独安装

请注意

Master 节点是集群内的调度和主要节点,以下的内容仅限 Mater 节点才能安装!!!

配置 Kubernetes 初始化文件。接着我们使用 kubeadm config print init-defaults 输出一份默认初始化配置文件,使用 > 操作符即可导出为一份文件,方便我们进行修改。注意:此处默认放在~目录执行。

shell
kubeadm config print init-defaults > init-kubeadm.conf
vim init-kubeadm.conf

主要对配置文件做这几件事情:

  • 更换 Kubernetes 镜像仓库为阿里云镜像仓库,加速组件拉取
  • 替换 ip 为自己主机 ip
  • 配置 pod 网络为 flannel 网段

修改下面添加注释的几处注释:

shell
# imageRepository: k8s.gcr.io 更换k8s镜像仓库
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
localAPIEndpoint:
  # 此处为master的IP
  advertiseAddress: 10.0.0.5
  # 默认不需要修改,但是特别需要注意的是,这个端口在主机的安全组中一定要放开,否则在后续的主从机器之间会出现无法访问的问题。
  bindPort: 6443
nodeRegistration:
  criSocket: /var/run/dockershim.sock
  imagePullPolicy: IfNotPresent
  # 下面这一行尤其要注意:必须改成之前通过hostnamectl set-hostname设置的主机名称,否则会出现无法生效的问题。
  name: k8smaster
  taints: null
# 配置子网络
networking:
  dnsDomain: cluster.local
  serviceSubnet: 10.96.0.0/12
  # 在serviceSubnet同级层次下添加下面的这行配置,无需问为什么,配置就是如此
  podSubnet: 10.244.0.0/16

查看k8s所需镜像

shell
kubeadm config images list

在修改完配置文件后,我们需要使用 kubeadm 拉取我们的默认组件镜像。直接使用 kubeadm config images pull 命令即可,命令的执行目录需要和命令的生成目录保持一致。

shell
kubeadm config images pull --config init-kubeadm.conf

拉取镜像的执行过程如下所示:

shell
[root@k8smaster ~]# kubeadm config images pull --config init-kubeadm.conf
[config/images] Pulled registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.23.0
[config/images] Pulled registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.23.0
[config/images] Pulled registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.23.0
[config/images] Pulled registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.23.0
[config/images] Pulled registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6
[config/images] Pulled registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.5.1-0
[config/images] Pulled registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:v1.8.6

为了防止在初始化的时候出现tc not found in system path这样的错误提示,我们需要在此处补充安装一个插件。不安装也不会影响主要的功能和结果

shell
yum install iproute-tc -y

初始化 Kubernetes。在镜像拉取后,我们就可以使用刚才编辑好的配置文件去初始化 Kubernetes 集群了。这里直接使用 kubeadm init 命令去初始化即可。

shell
kubeadm init --config init-kubeadm.conf

在静等运行一会后,终端会给出以下提示,其中红色框中的命令为需要在 Master 节点执行的初始化命令,其作用为将默认的 Kubernetes 认证文件拷贝进 .kube 文件夹内,才能默认使用该配置文件。蓝色框中的命令需要在 Node 节点执行,其作用是可以快速将 Node 节点加入到 Master 集群内,注意 ⚠️:此处只运行红色框内的命令即可。

安装 Flannel。前面我们在配置文件中,有提到过配置Pod子网络Flannel 主要的作用就是如此。它的主要作用是通过创建一个虚拟网络,让不同节点下的服务有着全局唯一的 IP 地址,且服务之前可以互相访问和连接。那么 Flannel 作为 Kubernetes 的一个组件,则使用 Kubernetes 部署服务的方式进行安装。首先下载配置文件。下面的命令执行的时候存在比较慢的情况,实践表明停止再试是个不错的办法。

shell
wget https://raw.githubusercontent.com/coreos/flannel/v0.18.1/Documentation/kube-flannel.yml

接着我们手动拉取下 flannel 镜像。

shell
docker pull quay.io/coreos/flannel:v0.13.0-rc2

等待镜像拉取结束后,可以使用 kubectl apply 命令加载下服务。

shell
kubectl apply -f kube-flannel.yml

在大约稍后 1 分钟左右,我们可以使用 kubectl get nodes 命令查看节点的运行状态。如果 STATUS = ready,则代表启动成功。如下所示:

shell
[root@k8smaster ~]# kubectl get nodes
NAME        STATUS   ROLES                  AGE     VERSION
k8smaster   Ready    control-plane,master   4h18m   v1.23.6
k8snode     Ready    <none>

Node 节点单独安装

请注意

以下的内容仅限 Node 节点才能安装!!!

  1. 拷贝 Master 节点配置文件。接着将 master 节点的配置文件拷贝 k8snode 节点。回到在 master 节点,使用 scp 命令通过 SSH传送文件:
shell
scp $HOME/.kube/config root@这里为Node节点的IP地址:~/
  1. 随后在 node 节点执行以下命令,归档配置文件:
shell
mkdir -p $HOME/.kube
sudo mv $HOME/config $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
  1. 加入 Master 节点。我们直接使用刚才在 master 生成的节点加入命令,在 node 机器上执行。让 Node 节点加入到 master 集群内:
shell
# 下面的命令是在执行master节点的时候生成的,请不要照抄!!!
kubeadm join 10.0.0.5:6443 --token 90i0t0.nzpbqguxgnkz8rma --discovery-token-ca-cert-hash sha256:68a48020b59bb8bf55155557936963002d9d63aa578b5b87dbfa768ed2402fbb
  1. 如果刚才的命令丢了,可以在 master 机器上使用 kubeadm token create 重新生成一条命令即可:
shell
kubeadm token create --print-join-command
  1. 安装 Flannel。这里的安装 Flannel 的方式和 Master 安装执行方式一样,不再赘述。

服务部署

到这一步,K8S基础的安装算是完成了,接下来在kubernetes集群中部署一个nginx程序,测试下集群是否正常工作。

shell
# 部署nginx
kubectl create deployment nginx --image=nginx:1.14-alpine
# 暴露端口
kubectl expose deployment nginx --port=80 --type=NodePort
# 查看服务的状态
kubectl get pods,svc
# 最后在电脑上访问一下部署好的服务