4. 快速安装 Docker + Kubernetes

本章讲解知识点

  • 安装 Docker
  • 安装 etcd
  • 安装 kubelet kubeadm kubectl
  • 问题处理
  • 加入数据节点进入集群
  • 安装网络插件 flannel
  • 安装网络插件 calico
  • 如何更换 CNI

<br>

安装 k8s 有两种方式,一种是用 Kubeadm 快速安装;第二种是用二进制文件来安装,我们是为了学习 Kubernetes + Docker,所以直接采用 Kubeadm 快速安装。使用 Kubeadm,用户可以轻松地初始化一个 Kubernetes 控制平面和节点,创建和安装必要的组件和服务,如 kubelet 和 kube-proxy。Kubeadm 的设计目标是使 Kubernetes 集群的初始化和管理变得更加简单和可靠。

希望大家一定要动手实践起来,纸上得来终觉浅,绝知此事要躬行

<br>

1. 安装 Docker

1.1. 先安装依赖:

yum install -y yum-utils device-mapper-persistent-data lvm2 wget

1.2. 设置阿里镜像仓库,Docker 默认是国外,建议改为国内的阿里镜像仓库,提高运行速度

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

1.3. 更新yum索引

yum makecache fast

1.4. 安装 docker-ce 社区版

yum -y install docker-ce docker-ce-cli containerd.io

1.5. 配置阿里云镜像加速器

1、首先镜像加速器是免费的,每个人都有前提是要有阿里云账号(如果没有快去注册支付宝注册账号)

2、阿里云登录:https://account.aliyun.com/login/login.htm?oauth_callback=https%3A%2F%2Fcr.console.aliyun.com%2Fcn-hangzhou%2Finstances%2Fmirrors&lang=zh

上面是登陆网址

登录好账号以后

这样镜像加速器就配置好啦,然后启动 docker

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://4u6ad4xd.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl enable docker
sudo systemctl restart docker

1.6. 检查配置

检查加速器是否生效配置加速器之后,如果拉取镜像仍然十分缓慢,请手动检查加速器配置是否生效,在命令行执行 docker info,如果从结果中看到了如下内容,说明配置成功。

docker info | grep "Registry Mirrors" -A3

<br>

2. 安装etcd

Etcd 是一个开源的分布式键值存储系统,由 CoreOS 开发并维护,是 Kubernetes 集群的核心组件之一。它被设计用于存储 Kubernetes 集群中的所有关键数据,如集群状态、Pod 和 Service 的配置信息、网络拓扑等等。在 Kubernetes 中, etcd 是控制平面的一部分,负责存储和同步集群的元数据信息。

下面两种安装方式选择任意一种即可:

1、yum install etcd

2、使用二进制安装也是可以的,参考文章:https://blog.csdn.net/Mr_XiMu/article/details/125026635

<br>

3. 安装 kubelet kubeadm kubectl

Kubelet 是 Kubernetes 集群中的一个核心组件,它是每个节点上的代理,负责维护节点上容器的生命周期。Kubelet 能够根据集群的配置和调度决策,启动、停止、重启和销毁容器,并监控它们的状态。Kubelet 还负责管理容器和节点之间的网络,确保容器能够相互通信,同时也支持网络插件的扩展。

kubectl 是 Kubernetes 的命令行界面工具,它是管理和操作 Kubernetes 集群的主要方式之一。使用 kubectl,用户可以通过简单的命令行指令来管理 Kubernetes 集群中的各种资源对象,如Pod、Service、Deployment、ConfigMap 等等。

安装过程如下:

3.1. 配置 yum 源

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes Repository
name=Kubernetes
baseurl=http://mirrors.ustc.edu.cn/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.ustc.edu.cn/kubernetes/yum/doc/yum-key.gpg https://mirrors.ustc.edu.cn/kubernetes/yum/doc/rpm-package-key.gpg
exclude=kubelet kubeadm kubectl
EOF

3.2. 更新 yum 索引

yum makecache fast

3.3. 列出所有可安装的版本

yum --showduplicates list kubeadm

3.4. 安装指定版本

yum -y install kubeadm-1.15.5 kubectl-1.15.5 kubelet-1.15.5 --disableexcludes=kubernetes

这里实验安装的 1.15 版本,因为想使用 docker 作为 runc。如果想使用 containerd 作为 runc,可以安装 1.25 以上版本

3.5. 前置操作

1、swapoff -a

swapoff -a

2、关闭防火墙

## 暂时关闭防火墙
systemctl stop firewalld.service
##永久关闭
systemctl disable firewalld.service

3、添加以下内容并重启 docker

vi /etc/docker/daemon.json
{
  "exec-opts": ["native.cgroupdriver=systemd"]
}
sudo systemctl daemon-reload
sudo systemctl restart docker

3.6. 设置 kubelet 开机启动

systemctl daemon-reload && systemctl enable kubelet && systemctl start kubelet

3.7. 生成 master 节点配置 kubeadm 的初始化文件

kubeadm config print init-defaults > init.default.yaml

需要修改如下配置:

以本次实验为例:

advertiseAddress: 192.168.18.129
criSocket: /var/run/dockershim.sock (注意,如果runc是containerd,这里需要修改为/run/containerd/containerd.sock)
imageRepository: registry.aliyuncs.com/google_containers
kubernetesVersion: v1.15.5

3.8. 提前下载我们需要的镜像

容器镜像是一种轻量级、可移植的软件打包方式,可以将应用程序及其依赖项打包在一起,以便在不同的计算机上运行。容器镜像通常包含应用程序、库、配置文件和其他依赖项,以及操作系统的部分或全部文件系统。容器镜像采用层次结构存储,每一层都包含一个文件系统的快照,可以在容器中通过层叠起来形成一个完整的文件系统。

容器镜像可以通过运行容器来启动,容器会使用镜像创建一个独立的运行环境,包含容器镜像中的所有文件和依赖项。

通俗来说,容器镜像为容器运行提供所需的运行环境。一个容器的创建运行依赖于镜像。所以为了运行 kubelet、kubectl 等服务,我们需要将镜像提前下载好

1、查看需要的镜像

kubeadm config images list

[root@localhost mtuser]# kubeadm config images list
k8s.gcr.io/kube-apiserver:v1.15.5
k8s.gcr.io/kube-controller-manager:v1.15.5
k8s.gcr.io/kube-scheduler:v1.15.5
k8s.gcr.io/kube-proxy:v1.15.5
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd:3.3.10
k8s.gcr.io/coredns:1.3.1

2、提前下载好需要的镜像,这一步非常重要,因为总是会因为网络问题导致镜像下载不下来,从而导致安装 kubeadm 失败,会比较麻烦,所以我们提前将镜像下载下来。(不断重试,直到镜像下载下来)

kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers

3、查看下载的镜像

发现下载的镜像地址名称和我们要求的不一样,因此需要修改镜像 tag 保持一致。

docker tag <源镜像> <目标镜像>

[root@master mtuser]# docker tag registry.aliyuncs.com/google_containers/kube-apiserver:v1.15.12 k8s.gcr.io/kube-apiserver:v1.15.12
[root@master mtuser]# docker tag registry.aliyuncs.com/google_containers/kube-controller-manager:v1.15.12 k8s.gcr.io/kube-controller-manager:v1.15.12
[root@master mtuser]# docker tag registry.aliyuncs.com/google_containers/kube-proxy:v1.15.12 k8s.gcr.io/kube-proxy:v1.15.12
[root@master mtuser]# docker tag registry.aliyuncs.com/google_containers/kube-scheduler:v1.15.12 k8s.gcr.io/kube-scheduler:v1.15.12
[root@master mtuser]# docker tag registry.aliyuncs.com/google_containers/coredns:1.3.1 k8s.gcr.io/coredns:1.3.1
[root@master mtuser]# docker tag registry.aliyuncs.com/google_containers/etcd:3.3.10 k8s.gcr.io/etcd:3.3.10
[root@master mtuser]# docker tag registry.aliyuncs.com/google_containers/pause:3.1 k8s.gcr.io/pause:3.1

如果有个别镜像重试好几次都无法下载下来,那么单独处理:

docker pull <镜像名>

不停换仓库想办法把镜像下载下来,然后修改 tag

3.9. 安装前检查

kubeadm init phase preflight

如果检查出来有报错,需要处理。

3.10. 初始化 kubeadm

kubeadm init --ignore-preflight-errors=ImagePull --pod-network-cidr=10.244.0.0/16

10.244.0.0/16 为 k8s 内部的 pod 节点之间网络可以使用的 IP 段,尽量不和 service-cidr 一样

安装成功,同时将内容记录下来,用于纳管其他节点进入集群时需要使用

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

kubeadm join 192.168.18.129:6443 --token asbo68.bunb0zumpikzw6na \
    --discovery-token-ca-cert-hash sha256:e60461a1a452e3f3b6804bb5a3a3595c85c48f15150de75f931e014364c35630

3.11. 检查安装结果

kubectl version

[root@master mtuser]# kubectl version

Client Version: version.Info{Major:"1", Minor:"15", GitVersion:"v1.15.5", GitCommit:"20c265fef0741dd71a66480e35bd69f18351daea", GitTreeState:"clean", BuildDate:"2019-10-15T19:16:51Z", GoVersion:"go1.12.10", Compiler:"gc", Platform:"linux/amd64"}
The connection to the server localhost:8080 was refused - did you specify the right host or port?

安装完成!

<br>

4. 问题处理

4.1. The connection to the server localhost:8080 was refused - did you specify the right host or port?

执行 kubectl get node 命令时报错,

[root@master mtuser]# kubectl get node

The connection to the server localhost:8080 was refused - did you specify the right host or port?

查看不到结果,需要配置:

echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> /etc/profile
source /etc/profile
echo "export KUBECONFIG=/etc/kubernetes/kubelet.conf" >> /etc/profile
source /etc/profile
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> /etc/profile
source /etc/profile

再次查询:

[root@master kubernetes]# kubectl get node

NAME     STATUS     ROLES    AGE   VERSION
master   NotReady   master   10m   v1.15.5
node1    NotReady   <none>   11s   v1.15.5

完成!

如果依然无法查询,那么看看 docker 状态

systemctl status docker

docker 是好的,那么看看 kubelet 状态:

systemctl status kubelet

发现有问题,那么根究原因,发现虚拟机重启过,重启过的虚拟机需要再次关闭 swap 交换区:

swapoff -a

然后重启 kubelet

systemctl restart kubelet

再次查看发现 kubelet 已经起来

4.2. 发现有 Pod 处于 pending 状态

kubectl describe pod coredns-5c98db65d4-pbctm -n kube-system | tail -20

查看 Pod 状态

最下面的报错说没有节点调度 Pod,因此 Pod 处于 pending 状态。

查看 node 状态:

[root@master kubernetes]# kubectl get node

NAME     STATUS     ROLES    AGE   VERSION
master   NotReady   master   10m   v1.15.5

发现节点处于 notready 状态,可能 kubelet 无法上报节点状态,那么查看 kubelet 状态。

systemctl status kubelet

发现 kubelet 启动异常,原因是 cni 有问题,即网络插件有问题。由于没有设置集群网络,安装配置完网络会变为 Ready 状态

<br>

5. 加入数据节点进入集群

5.1. 创建虚拟机

我们数据节点在上一章节已经创建好了。

5.2. 安装软件

步骤和 master 节点的安装一致,安装好 docker、kubeadm、kubelet。注意,这一步不用安装 kubectl。

yum -y install kubeadm-1.15.5 kubelet-1.15.5 --disableexcludes=kubernetes

做好前置配置

设置 kubelet 开机启动

systemctl daemon-reload && systemctl enable kubelet && systemctl start kubelet

安装 master 时最后的回显信息,就是我们用来纳管节点的命令:

kubeadm join 192.168.18.129:6443 --token asbo68.bunb0zumpikzw6na \
    --discovery-token-ca-cert-hash sha256:e60461a1a452e3f3b6804bb5a3a3595c85c48f15150de75f931e014364c35630

5.3. 检查

[root@master kubernetes]# kubectl get node

NAME     STATUS     ROLES    AGE   VERSION
master   NotReady   master   10m   v1.15.5
node1    NotRe

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

云计算面试题全解析 文章被收录于专栏

本专刊适合于立志转行云计算的小白,有一定的编程、操作系统、计算机网络、数据结构、算法基础。 本专刊同时也适合于面向云计算(Docker + Kubernetes)求职的从业者。 本专刊囊括了云计算、VMWare、Docker、Kubernetes、Containerd等一系列知识点的讲解,并且最后总

全部评论
网络插件要在连个节点上都安装吗
1 回复 分享
发布于 2024-02-06 16:55 河南
加油
点赞 回复 分享
发布于 2023-05-06 23:21 广东
多多点赞,会变好看,多多留言,会变有钱
点赞 回复 分享
发布于 2023-05-08 14:32 广东
都🐴🉑,下次一定学习
点赞 回复 分享
发布于 2023-05-08 22:40 广东
终于解决了安装问题,谢谢博主写的很详细!
点赞 回复 分享
发布于 2023-05-09 13:16 广东

相关推荐

评论
6
4
分享

创作者周榜

更多
牛客网
牛客企业服务