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等一系列知识点的讲解,并且最后总